pax_global_header00006660000000000000000000000064140562453230014516gustar00rootroot0000000000000052 comment=4a310ebb0f2ba358a5ab08db07c3b9afbeb2bb96 sphinx-panels-0.6.0/000077500000000000000000000000001405624532300143125ustar00rootroot00000000000000sphinx-panels-0.6.0/.circleci/000077500000000000000000000000001405624532300161455ustar00rootroot00000000000000sphinx-panels-0.6.0/.circleci/config.yml000066400000000000000000000013761405624532300201440ustar00rootroot00000000000000version: 2 jobs: docs_sphinx_book_theme: docker: - image: circleci/python:3.6-stretch steps: # Get our data and merge with upstream - run: sudo apt-get update - checkout - restore_cache: keys: - cache-pip - run: pip install --user .[themes] - save_cache: key: cache-pip paths: - ~/.cache/pip # Build the docs - run: name: Build docs to store command: | export HTML_THEME=sphinx_book_theme sphinx-build -W -b html docs docs/_build/html - store_artifacts: path: docs/_build/html/ destination: html workflows: version: 2 default: jobs: - docs_sphinx_book_theme sphinx-panels-0.6.0/.flake8000066400000000000000000000000571405624532300154670ustar00rootroot00000000000000[flake8] max-line-length = 88 ignore=E203,W503 sphinx-panels-0.6.0/.github/000077500000000000000000000000001405624532300156525ustar00rootroot00000000000000sphinx-panels-0.6.0/.github/workflows/000077500000000000000000000000001405624532300177075ustar00rootroot00000000000000sphinx-panels-0.6.0/.github/workflows/artifacts.yml000066400000000000000000000006111405624532300224100ustar00rootroot00000000000000on: [status] jobs: circleci_artifacts_redirector_job: runs-on: ubuntu-latest name: Run CircleCI artifacts redirector steps: - name: GitHub Action step uses: larsoner/circleci-artifacts-redirector-action@master with: repo-token: ${{ secrets.GITHUB_TOKEN }} artifact-path: 0/html/index.html circleci-job: docs_sphinx_book_theme sphinx-panels-0.6.0/.github/workflows/tests.yml000066400000000000000000000026651405624532300216050ustar00rootroot00000000000000name: continuous-integration on: push: branches: [master] tags: - 'v*' pull_request: jobs: pre-commit: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Python 3.9 uses: actions/setup-python@v1 with: python-version: 3.9 - uses: pre-commit/action@v2.0.0 tests: runs-on: ubuntu-latest strategy: matrix: python-version: [3.6, 3.7, 3.8, 3.9] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v1 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install .[testing] - name: Run pytest run: | pytest publish: name: Publish to PyPi needs: [pre-commit, tests] if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags') runs-on: ubuntu-latest steps: - name: Checkout source uses: actions/checkout@v2 - name: Set up Python 3.9 uses: actions/setup-python@v1 with: python-version: 3.9 - name: Build package run: | pip install wheel python setup.py sdist bdist_wheel - name: Publish uses: pypa/gh-action-pypi-publish@v1.1.0 with: user: __token__ password: ${{ secrets.PYPI_KEY }} sphinx-panels-0.6.0/.gitignore000066400000000000000000000034331405624532300163050ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 db.sqlite3-journal # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # PEP 582; used by e.g. github.com/David-OConnor/pyflow __pypackages__/ # Celery stuff celerybeat-schedule celerybeat.pid # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ .DS_Store .vscode/ sphinx-panels-0.6.0/.pre-commit-config.yaml000066400000000000000000000015771405624532300206050ustar00rootroot00000000000000# Install pre-commit hooks via # pre-commit install exclude: > (?x)^( \.vscode/settings\.json )$ repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v2.2.3 hooks: - id: check-json - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - id: flake8 - repo: https://github.com/pre-commit/mirrors-scss-lint rev: v0.59.0 hooks: - id: scss-lint - repo: https://github.com/mgedmin/check-manifest rev: "0.39" hooks: - id: check-manifest - repo: https://github.com/psf/black rev: 20.8b1 hooks: - id: black - repo: https://github.com/executablebooks/web-compile rev: v0.2.0 hooks: - id: web-compile files: >- (?x)^( web-compile-config.yml| sphinx_panels/scss/.*| sphinx_panels/_css/.* )$ sphinx-panels-0.6.0/.readthedocs.yml000066400000000000000000000002571405624532300174040ustar00rootroot00000000000000version: 2 python: version: 3 install: - method: pip path: . extra_requirements: - themes sphinx: builder: html fail_on_warning: true sphinx-panels-0.6.0/.scss-lint.yml000066400000000000000000000003371405624532300170350ustar00rootroot00000000000000linters: ImportantRule: enabled: false NestingDepth: enabled: true max_depth: 4 SelectorDepth: enabled: true max_depth: 4 QualifyingElement: enabled: false VendorPrefix: enabled: false sphinx-panels-0.6.0/CHANGELOG.md000066400000000000000000000021721405624532300161250ustar00rootroot00000000000000# Changelog ## v0.6.0 - 2021-06-03 ⬆️ UPGRADE: Unpin sphinx v4 👌 IMPROVE: specify post-transforms by format: This applies them to the "html" format, rathther than a subset of diretive html builders. ## v0.5.2 - 2020-10-12 ‼️ Deprecate `panels_add_boostrap_css` config, the typo here (no T!) has now been fixed to `panels_add_bootstrap_css`. Use of the former will now emit a deprecation warning. ## v0.5.1 - 2020-09-22 👌 IMPROVE: Make default label font-size configurable for `tabbed` components. See the `panels_css_variables` [in this documentation section](https://sphinx-panels.readthedocs.io/en/latest/#tabbed-content). ## v0.5.0 - 2020-09-15 ✨ NEW: Add `tabbed` directive, to create tab groups! See [this documentation section](https://sphinx-panels.readthedocs.io/en/latest/#tabbed-content). ♻️ REFACTOR: Move from CSS to SCSS: Under the hood, sphinx-panels now utilises CSS compiled from source SCSS, allowing for a better development environment. The CSS files are also "hashed", to ensure that documentation using sphinx-panels will not show old, cached CSS stylings after future updates to sphinx-panels. sphinx-panels-0.6.0/LICENSE000066400000000000000000000020611405624532300153160ustar00rootroot00000000000000MIT License Copyright (c) 2020 Executable Books Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. sphinx-panels-0.6.0/MANIFEST.in000066400000000000000000000010451405624532300160500ustar00rootroot00000000000000exclude docs recursive-exclude docs * exclude tests recursive-exclude tests * exclude .circleci recursive-exclude .circleci * recursive-exclude ** __pycache__ recursive-exclude **/__pycache__ * exclude .pre-commit-config.yaml exclude .readthedocs.yml exclude .flake8 exclude .scss-lint.yml exclude tox.ini exclude git_rebase_theme_branches.sh include LICENSE include README.md include CHANGELOG.md include web-compile-config.yml recursive-include sphinx_panels/scss * recursive-include sphinx_panels/_css * recursive-include sphinx_panels/data * sphinx-panels-0.6.0/README.md000066400000000000000000000055541405624532300156020ustar00rootroot00000000000000# sphinx-panels [![Doc Status][rtd-badge]][rtd-link] [![Code style: black][black-badge]][black-link] [![PyPI][pypi-badge]][pypi-link] A sphinx extension for creating document components optimised for HTML+CSS. - The `panels` directive creates panels of content in a grid layout, utilising both the Bootstrap 4 [grid system](https://getbootstrap.com/docs/4.0/layout/grid/), and [cards layout](https://getbootstrap.com/docs/4.0/components/card/). - The `link-button` directive creates a click-able button, linking to a URL or reference, and can also be used to make an entire panel click-able. - The `dropdown` directive creates toggle-able content. - The `tabbed` directive creates tabbed content. - `opticon` and `fa` (fontawesome) roles allow for inline icons to be added. ```rst .. panels:: Content of the top-left panel --- Content of the top-right panel --- Content of the bottom-left panel --- Content of the bottom-right panel ``` The `link-button` directive can be used to create buttons, which link to a URL (default) or reference. They can be styled by [Bootstrap button classes](https://getbootstrap.com/docs/4.0/components/buttons/): ```rst .. panels:: .. link-button:: https://example.com :type: url :tooltip: hallo :classes: btn-success --- This entire panel is clickable. +++ .. link-button:: panels/usage :type: ref :text: Go To Reference :classes: btn-outline-primary btn-block stretched-link ``` The `dropdown` directive combines a [Bootstrap card](https://getbootstrap.com/docs/4.0/components/card/) with the [HTML details tag](https://www.w3schools.com/tags/tag_details.asp) to create a collapsible drop-down panel. ```rst .. dropdown:: Click on me to see my content! I'm the content which can be anything: .. link-button:: https://example.com :text: Like a Button :classes: btn-primary ``` ## Development To run the tests: ```console pip install tox tox -e py37-sphinx3 ``` To test building the docs: ```console tox -e docs-clean html tox -e docs-rebuild html ``` For live builds of the docs: ```console tox -e docs-live html ``` You can also build the docs in different themes, by setting `HTML_THEME` to one of `alabaster`, `sphinx_rtd_theme`, `pydata_sphinx_theme`, `sphinx_book_theme`: ```console export HTML_THEME=sphinx_book_theme tox -e docs-live ``` For code style and SCSS -> CSS updating: ```console pip install pre-commit pre-commit run --all ``` [rtd-badge]: https://readthedocs.org/projects/sphinx-panels/badge/?version=latest [rtd-link]: https://sphinx-panels.readthedocs.io/en/latest/?badge=latest [black-badge]: https://img.shields.io/badge/code%20style-black-000000.svg [black-link]: https://github.com/ambv/black [pypi-badge]: https://img.shields.io/pypi/v/sphinx-panels.svg [pypi-link]: https://pypi.org/project/sphinx-panels sphinx-panels-0.6.0/docs/000077500000000000000000000000001405624532300152425ustar00rootroot00000000000000sphinx-panels-0.6.0/docs/Makefile000066400000000000000000000012011405624532300166740ustar00rootroot00000000000000# Minimal makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build SPHINXPROJ = SphinxCopybutton SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) clean: rm -r $(BUILDDIR) sphinx-panels-0.6.0/docs/_static/000077500000000000000000000000001405624532300166705ustar00rootroot00000000000000sphinx-panels-0.6.0/docs/_static/ebp-logo.png000066400000000000000000006657051405624532300211250ustar00rootroot00000000000000PNG  IHDRAA&sRGB pHYsgR@IDATxyeu޷<\U=H>%[EJ XRDzdY"Ac[q ˶b+ @?,S)o5y<};ԭ[suOi}{Ykm$" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " D OiD@D@D@D@D"Y3/׹7BPcڼ$x: xÕnpycff/@4~:3 r<=KPJ{G@"hتd'=KSmڗ҉X"^"5UL;*|i8e?\ZͳziPPJ [#UiW-&.BHJ{D`ܣU ބQMPc5P70`9ϔ^ (T;]ƶJiZjՆU0rJ-/W1YYR D4fLܲYÖJFll1RZ/F9F@"hk[D@D@D@Zx/؅+Z̵K`Q0pVlKE:e_ť* /ct!E `4LX 8Bi j]wŧkP'`EXvްr3Y_=Cw3i`YHwi:oi /Oy|Hʆ:M%BK^E*SD@D@D@Dިy7gǏ ;|Ws%q(nޙ†ڙZ{  RE"P [KyDN@p|*-j~'yJFKk5*& \_kC[m!+t}_o,!fˆVa¤Sf4^cÕ1 } _8v:]du+= GαZPF9__mT F vΎA/`)׎ H  y[.j.Pȷ^ަ L.hQaqpeZZot]ǵP@T*78`qhyUaEm8 CA1p`񨠠p(kh 4 pVKλ.˕ jYrFu? {RϝSw !D$!8o{R/ D" " "pX 3lp)vE8.PͯX2}n1.taa}x611hGsP%0wZia;q:Ro-DޅnaCȵ=[hq U r-n99ڟԘ; vM/^m @@LIFDws'ح:3!" " X-Ⱍ\[ܣV Zu\!fh)#r1Ƿ!ZglHyi ek xF4JS)b.l԰rꈲրay~(hq>jGB'9gaN$sN9[qR jb 7ߓk'% 'Zs~Vh&ll]Ӓo:"s7D%(uvc~|r8K-MFV*6Cuj -/V2M g[ykCKN꧈>7΍ vr !nR ke4aZRv;Kp{Vvuzi#y}Xb3G-3X*'I@"h7i,8)Tk*hKXvbeBu{nzP]* XtBIBYoBm`T򙡟acǕ<A`g0a9 ӆv6EGˍktBǯj?ޕVH퍮uw!XF"Y]j i':rR.~7YFcvf 햭O@"htK VVz+C:L gP'~V2,97^( 63 eDP`  SBjؘ aS^s `Y !rTPDX[:u"khWǵC{ Oc$OU$" "0049HLz{~َ'+%7.iSЅ Khi@ f\`U pJsF3^FP'p0g7[BQؠ`d4 0dߡWx^`C\\_>dzED@vH`M**j[}' uB"}F'ET48Lv_X&=wh@0zZ;keDGcDE(D0Rfy1@%X|q 3_İ M~0OAeZhAl`)r:78DD@BMN@ql{q2h!{hdcn ܜ19S&n1 醆S4qM@`Xo(p t*T᠜|V+:ʥ< 8~:A. iXjBиeA03{HjN_׹IZ֢튡>vmXJ]kED@!x!'N1 ѐboޕ[+A@"h?(" "pH PX,8;2 3D󖗺-,N.ŅhanM(" ,-5Zh<fa@]pЋK%߂O {-4gYPl 7ҙ֔"1 Q0)~8{CWzdYi7)wl+oô[DG5 t659iamr-="E@D 0W.G0LX*t3vx0c(M:=l*xb?8büyH`O'"-s}jVnR kLCa/1 ВS*Bq\*).y!^ieDO$/Ti`][Yw])8saob#&-rf?t7CW]UHJ 䉝81n)DA~AI_xj  yP`Tvkj."ȑIX-bJD@"" O/9w4W_js%_̩G\ĤM>޾WD -87B1Nj75Q5ÑbT7p7~Դ eXl!pc1nhj@xh 69Q謚gm6;ر\k)u֡K|9S7`YgZ}*=Yݚ@qc6w u;{ *`@AR6]r7ʥߟ8AzʖݱwڹDz/*TCok'*I;Pf.hrVyP(3֟,05'r t nPݸ9;W~ճF-4W76 6:.w ԙ;y7? u tf" 'naxAll쇱@+Ӯu*PDY%~a*_|;ORu5ly90]B(g6YHv_S/sQȩ"AhUNb(5Nذ Y/N+A,71 aϪݼuwao%Y2\6X`:8s>CA˞s>PY/yafSg^_=gC4 gq5P>xK1\#Pٷ0f*YS:(AE^x@P k}t'i0 AqP<2l]JXghٷ l\#t˨" " ཷ~+z?dhr+AH0D L@'OiD@D"_bn_~;m)w6(>yނN`t A<&y>%M:uyq-ڌ4!=ke H;rPDi#0o=.y\ VeNҹSp{g>.3R#6B=ڃ'b3džaVIW;QUF$6}" " Lb?Qd"[v:,66 Իl\D@D`ދTuKgvܨMO .+1ٶdRڿ yδ劀N'+咝+0&ǽ"[ (Xor;^k@ R0ݯu$ijG^dΟOOPb2XTs c8Зh?:<KKSwT|-w x{Uk6 |=t=dއ:ٴYD@D` G̈?bO&,O9n++KGHg|u5B?+wla{2NP &'_[<2 6[ז,F]"" "oxo1 p.]6,bԄ50Bɒ1DܦR:Q_ 6ҹWs}}<ܠ^{ M q%'@xm"`4 D! m (6=HD@D@^N~*[&i K`5(W'JN@"?U@DI#0gvְ|]8lZkW}E@D@[MP&Fvb˭xA|ӕ4VZ|E"@" O*K׊\ԫoܲZ 0 pc^~sPE@DY!@9^ ٳlr DENsPnrbN"h=]"ht" O6G5(o=}78saq@O6^D@%7l2o6ކY6+WaT_RNDb(jrEprROTLUF,ڗޭOV7 &":|Xr8oO{E@f\x%,܆܄6Ҵӓvd%!s1b)oB* p_S<9 G ?Ɵ߳Ck o>9j*C'*G#!_*}2 a> #{ܕ6Ab5-EPd E jѲ1AГ" O6S*}BkoۧfFO6-<;+n4082n"cN1b>)qa!@Q kojh2'Zc L5jqރ?{K@-_."'b;5{;VE0ŕqPxН|hi:S4Q y o%*qDAH L<6H6wtgzjN[c3p(J0V'P!,#BLAq Y| N<lX~7Au #@ ENM x>mz!| %sz,rcԤSK_mm'"tʬeҾU{M"(ĞPĖrV:v7USIA;S(+kn ^,'S(+PDi'Zfv;EU+t FhȎL$mh*˸XauJRZݪ۳Tp.]Z+~>'Z %(:6ѷ.r\]}& u:'^ܣO}V(ӱJ1`ȿ^ @wUc7&r σt /g>9no2~sCCp׾n P=x,뚋<h[P.|'?:Ͻ0a_촍9oEW[,,96]啪T\YQ̷S嘮{?#gx.Cd&au( ҙBGa|ŎKC1!T~o:A+[޿72|_𬽼·ڽ"";h:)VO7KvXNflaj^]Evٸq[&fl8fO@%-ΐe)Z:ܐZM; Vb :T(vSGUE y ;~|fgb!5'F BAu,ۗA[@`IE@3Ge‚o0Rv7".lt~HE%@AÉi3w2?_gr{/j}x!A瞛l6LO `j}%<ЋY+UV+fy"1<ɕxHuX +Epk\bFi Fn;@CE"@8ZL6PH e"MǜQ;~4mZ"uP#XTsR'ѝ. i|~ 7Xj-n .q*D,2~Nt#Zuyg!՗]Xعs @ٖD? 5@Xt١!.mqaFW HuSDp@bֵh!WB=!xԶw ?OV~Yրxb.{ܗL!tv|: M 葬 aI&&ǼG2vܨݸSU9[[-KM 83Y{ʸh† x^mTw`b gFd|n5i\N#>@y~(m(,t6;NбȲ.0BM+}! ;ԵKuk=l_}Q\sEeqb'x8nS{E@.ĴQ?Br5h,#  -u* +REx[Z.9@  J#)׷h6G #mxwkv>тe u# t\K" O 4|+敮b |kOt1@k}Wh[%; Ѹ;=g}s/VЭ%Zqv=>>fc63r&Ơ ej8X xB*e/ oc>G:!Xڧsڒ=zx.6Z` T&@2h?s eA3.~7_4,Q{%Z޹Qh4dI7ёpeҎL0PΖ ~]\ 1>fg1Sw@D6s79T # PȔMc$J8 jmʋ/7?Q8\S4 @[8['E 0xCbjS}ΝqQrFsbyTi#vwZd;?`{ЛGqBMڙ ySS6$} 6KiaC2Q(3}Ӊ!- t]_ϝԩq>i=)R:Kj^b`hK<,/$N""pX1Bb Jy`<2q FM@Csxv QL+JdҮ\t zl"ԟ(\Gpk V\ 7/m̃+/g{ ؤ??"P`j Zw#CW%ӔK}N(" C0|wn~7S4 :A4h}7bU7Ý] Goṉ:xU 潥ܷv-#B\nGU"" {N Pcξx17oӞ^'xqΉ6.R_ˡ;"}I/p+cg) eQAmxv{](Iڅs6W6>1krS W7xUUY~w2}ovoV" "pYyhs^A <$E2" ;&n @A.YX[ = ls|:cX.O=ǰ?"<v &|ۆqHGe+UFV3Ntv7sNL4tjbΟw/EPF}ZC o1-,BfhqHZ,"p@$|ZaQGaV2xP#"CȜ?u}y$ZTwvN!KڙY&i326I .Η/LhQk זm6$"$xyJ/gny7nweaXl>y6q[aٵQ+"%hljj:7] f&M'#vt(ؗ'˓J$: 5)Voqۃ N vAEi[X*rbC=S.5ngm8Ka7֨˭B=x,`Zǰ(AD=֗_}F;I:eQKX|:Q|o* e|8Ҿ؛_^N&" h?L tBM[7&k"5ާ@9 'xr}JӒnG`PN5b]Go}Fq9@A~8kh?w jn &ʶqq֊ݸb;R n\:7g!'ڎ`A[oZ* Y-a@բаWߠ ԫ/ʯ$[DOl`~k8p"tٹU-4y&Ej._.ULňnbbB?z@ 8>bKCI$@77.U8)Ka/1o-vtc^V^ln|c9 0Wx - 7N'W¥lxwiV`j`,B죂OGv&Oч7 af싟=jNZ:"-aWo,m,SE 8z?u&[(ªloh7n ʎv*, M!cQh_&xMt-$T(kp6j4];j`$upL)^i#T7޸iO_<: 6KF@"h0N%"۴%>*޸5guqw~8]D @q`NHƁ2o[=os;Z~4(^L,By+_(1_˕ ;υN:ТIFjbHŒHf UX+B !^}S-julc?sxg@gyDFߙ 3MCt}j>@8߁R =^ڟ}/#0C06Wp!033eǏbm7NP/GY7;|s#eX*ts7Ϋ2' >x 4- n\)f:/vZ?_;D H7f[Z,_6@-Fj/CPiqe;]D2% (r򵘭faŃ~@%vGiPa["hZVq+6VmA΂L<6XƉޜݔIE\(/~戝AX鶨3/ -w_y˶  Gm}+|}sF1P6+:o31y7g1v lmVyx-A- 'Z Dp_ہJY?]5A?v^_9"V@~Îr̙A_4 AAQeK7VٹE=Nݿo]3]λ_bGw#nF D78iqH8&GUdzّٞD 6aBXw*;5^KGԤE nv/f դ/g^yE/ň@e$.a½Y!W%}]Ul}α&v찝8uh?շ--ԝ(ث:scʎDo9X@J~j~|o |;7?]B~3}\ Bk?|o?J |wX*t?{B@"hOP"P+ڗ# WG|| ou'֝}=`WAKoʐD!a4m2Yx  ^LaIjoF Rɦ0g=P5Hk2UɎ;Yzl|Rl3*TNaca%nxj(`ZEa!~@㢽w.# nSTkܴ8Arm$vҊbWڴD7C!i!%loO K'W}i"hܧ#;w/_{wmzzS~![' ԟ<B V>_BD yO†(~GգkR7]ϼ!(֑ NDSC]h%  nΟ>.wWli+=CrQ m sZ=>6 VdoJKs>iI~. s߰c rFC/ǏV.p@G[\*"Hǩٙ?jS%w]`׫E@D`VEˤ|7nߙޚ/;5y(2|wj*ND@#^_`?7-/iVl$yg'u_ts(- Jfюkh{H|VX٦%K#8#cm'yhaZBQ c,& 7Kkc !FA8U!8v\Ho\Ƿ[XZ=_(:[6֫nl\>^,b0s]nK9oQ9W8|~ۭn[e4]|%SqZOERD1 o >~!k/ |9ꄍe~ݼUr~M*zh]D#l6:z¾:?o_v}w o:AsO\Ux@-;v|H(y R5=J>ث#vVM?P6b6(7_KXac? `7Y46aܟv.*hY@o>g}ltcv8nI!@\kCeWX@[(Юg{< dK'-5ؙ (9 AV ` XB$6>6l.D}x q]<*6^ηo-/ya%3? KAM?hd`8RTjE^xX7v%e+F5,G W`nHXb/n2MKrn-:@h-Kj51#Qg#v7yN^+VF:;wK>HkB #CR!A()%B~jŢ}+/ݼ} QCC#et- J6!ܮ9桳$6 a2\ TŻikp]'N 7v蹟9;k7udä $v88pAѿwg-G e2|Qڈ Jw{Mwri72& h"g2vd2(dOcKsw&\cɜH.̒@6mOUT2:dE"hp @FhrJn*蒝Ftw^+ TШu ޠ8r5Q/R28 k W&m}^}{c {Z:Sp&Ô? =:m#.%nrAObt8b/|nqv֜5aYugξ;~B[zލ={eH={Xx3p3yqM'ާu! @~\}.ţ'A"6d cIXfurP/x +60bͦQDb(Ԓ=ّ4\pfSGa@ԡq 6L]b/l.qBl Z%_-#۩MOfVloB!{,Ka[X:R Z,՝tݣ%n ]@!^| ecHU \:E>(Mimbp{SC9 ݳNs?do +Cg+퐀Dp#C: Of>M daUm"hQ;ZFic啊ݺ 1:3bLbC6Gse{{8vN`SitGC?P^(Μ@tߺq;gWCZVv#A E|A F٤Wαٷlc>o4PnqWKGtm˹[sֶ/8DJBoOrNq 7k+-lGqmI|hCqo{[6k8ޱq))4|c"C%09#916a%ޓMa|ƂUyDsB5qǰ!_-MO oI<ΤW\9YXmh!6vOM24l:ɀ+vn{F%h?ne`Be\GnwQW,xQpbP"lS EmXvDK_^+ܑ$@ ^%Z߲x,fv֠O6x@k߹siK'_a=:CYމ<{!{v ?gb][i;v YuE_|k;gآgFGhUѡ$4/6l(%`ibf.d5&?nxF6$Z62aZh?!Xk)գ'e9 #^ #QsdjlYVp(wAWV@ vskFd,?Pp!hREUi^nU]>RAt§e-Gaj4VE9~6wfKx 7 ~Ձz> R=B񝝝cI j;\OI38K-.YıJ߼‘fp[' uf:BD ]b^_8e+a|lg ܦeXZw?t/|GpZcؐWe;(Z*7Q?+i#=7CE J UkFF6)F#ZF &e*·@ 1[Ȼ) @Y-VԌ59 |N%``8Z`&<2.-7neV)-υ oZ(<O쿄gs Tz7L:bW.YMn}W^[6x>]GoabQtq&FcYý?AxN::-A{\dj8cS,죫0qݛȾ~ox"$!\"h]DhxꃏkGwZO1sxIu4z^ a 3oWP{F?_uJ7S!Fc A P4>8va8q{6P9i06t<\ѽ;;G qۙdgf-'-1jfsN}){98拝iypPN8 ,Eޥ^Pk5I<`͕Qvboo]{_]aYeaH"h,m`8s8.O_kqŷR>KaL㚏`E=TaXkl 8nlv_2:;׽3%;8c z|z%0dh N9le[il8fy~>o; TѴeR[TA;3(7]<3dǏYgEP<9?ij@Sh8Wu'X[>:d }MS+ cFCn.+t,MWG a+yh*$ݶD#*"'4bD7<TэaXhyE@UP0֖4B;㒯?ڄLM|Q\`g&=-&ɠ.t?uGߏ\oZT9Wof5%EgL_QC7YoK/*{) wGs|%r[*<.ի^Qz&RCCCM,lF_>K @~l?7&g.}rGB4ɟ4ZwQDRXZ/+Is@s,_Eʋ b=٣޳˷MaGqm^e X*:/AhIo5Ħ:  t 쥪3@WWVˋOnp+OsK&EOe-4V ߦmZ uPH ɒ/|% b&]J$NA ̍2@)V1:*' lG=44B`}jf,"phfb9Z'côϏ@>v'7/\H(˖ً5#cy`}E6*[,N-!,r_ @#H^ߕ鹑uKd'ZBUz#,CCRᖿNo>v08PB<0Z?g ZS 89vk->Y]~s)@ @| 4Y[fvV\1<\ Ű[Q,\ٗA6g;X_dDxEO-j-N]O*lGIYZB9LE{/.H,7%B?}ɣ޿ws6[_mm?7A7L} n ϭf_ސBt IǙ2_\F{b :x8D@W퇱\ЬD9n(S$ -[4疕lH^d&7[.Ny㯍+-i_:8FBnߙSNZ6w2j% Q /4'Eg|Y";45S, %NN.ObY l{Iۡ\*pwL%b哧0+3.MtjqCp\~8-PĦDAtn 蛔$Ydz`m{WS6[JcOSAa~  b%8z$'+ ?# )RV1dL2/+%Ѳ6글Zmq">q].s؎JeS3k I tb#Q.{dL^ Gc4b8a*F!:Fȩ{wG#U<ڃO#c^\uAаɽ~9:/_O땤2c#Υ:QEMTd<>@7Æ~)?%=?P* ԄG4C,qC]WcɇO²y_~/% ڮ{?hz:ߺUdPAMbN  \/7SwG0oRe_ڱ2T@mc.5t3"ٚfQ}ch 'ߘ>`);\P^&#8;?3-#aLB ]5=1hvB /?'Lh*Gm~EϏ!ϋ7Q9CVZޮ%IKLc݌pVZh JzS[< +^G$>+Py Nk1 Ķ 6aO7=)wmlq↍7R;UQ晆-)_be7ck汈a},!,rvL`=y>[[V\}QQ~h毋%fd ޘxs s8͙]u#N-Kݲ ӷAa/ y| W L,jQ]O #S~|~2OwQhrJƧ9lYֶ`^OFi" 4"tRf 9<*-3Ej]~Y? ?JY0#?ܐ_ 5qn+ 2t4B6hqE]}?8+vSnjϙz )4kobc{X [t!8YNȡ5Z>:d ZR~@Rr?KnyK ,'(ȼ;6I (<j٤@ h!*@8,z]2,/cX@719!p:WSQjXnb&_e"aF~Ch ^d<;iE|NU[k |V$ Pݽ3)w\-q伺=yo-d2y @3_,⇛J[tS ~qc'^9 0BRXzkn 1hPP'wc}-03ƒ0cs%NԜX /.!-#߷JFAM/ōVW$|A<~< k5+C}MxnRh&ʗ϶$ O?5-48C CGOv&LNTJ LrǛ"BjA`C4k0{|De΃M| X_(9='j6m]Jn\#Gδ[jFդ1R{~We԰>UnQrotpR]0m\`pu053YuAA+2PDC䢼z$`3Ÿs57@8V/:Na3/΅>8^;IJ''Isd(ЊC⇉!.) +Ơ' @wMdՊ)qYZ{"!Ϟ)0}fp>˝;cܤsFIej(0MƳ_Jq8@EA"U_:rX~Ze-?hW`S P 'J\T,RR_X xqAQBՄoFY;zIyJū<16㖵jjSX_3;ua~F Q):7cy l*պ#&_:94 Y8lnroM!SwC!Nza%zv8]K79Dmc̶_4nL(x!28@ˁ,!$QhT}-q xV%VchOU7$8l$'&]yGv!H&xVZF\E*za:uͫ%-x~p;!gAFGѐH3 ?[qyFvS sAZ KSA|nOM)y U+gv]SyŶu"C>~smlG [n_[}b#(yRb7~ؑ@Y_nk, }~ܻ7U d&ҳFjm(`(peSG?\C$_ڙe 'V[S̷@3 VX@p IK` foN0!g^&]iYB hf|YQC(l &lB[R`J\InD #@Ns)P 7:4?-&`3@IDAT*b'Qɂ:9#_EA/-q &^yJB*1h mVCh k\t_JN ͑|"*q@Com&+6*ž~ubLMLȽa ;o.:UP&`y]*) eJmsֈJ0>8#i|~Z61E %윔Sw2#M_j25S{ds!hP`()H/_ekj"VsICی'L 'j+HS|G @nŒ82q Mɕ`|d \0uAAP_eb3 8aΫK7ze#J&,o28Q>?KM'yy/߬" 3 SVIQx.NěȜ6\k2?AxEU:7xWb05ۚvʭP<8uL u]ص\; "Imy!wM^i+&tlqտuu}_ 悡@b {CĀ Vd  ; sJBV 4H`nA䏸ٛO zQkAS=R@w[xEj\ަ OZn#2Q*SN<]> Ɍ?'^4Yi@HZ GSiRoWZ'~Ų/^Q 瑱cik걾|6EѬ|2=AF M?av$զO t|F-ذkw[nfeWۦ>|rGx/WYkݴwLC\pȬUxddFCE\a*%šcgw_ĒdcfklvfQZ) m>pw9`b@aRat P ϸ:aB4yS89&!$.YM!M*nN=C$8AJމ] ?wA#mco- "^`(uB CrB8 V欄Zf?]GbպQ}W&'#V W&eі^?S (=!4ARVP<;C "OSӎ#enY#ݼ>356ofz."bX.gۧffnsPf8S2Ÿ'!S2 VG$2Mk} `Mѓ?|>tzd/63&  =ybBlHAS/ P8! QUbiLMpdFUV~ Dj2,?*>;9YgY@`ɲh` Ԯ}|Xf&0pݗLOvE7kuA '-Hd\n A4c4q+|\,ߟ`X!u=7B+|Q=vkZ VUoMy٦Dh|vK LDW2٦(e Fc$؉9~ ϶2DibB4@0 BW;J옼IۨcWb Mf RAD?,NhN݃4@4g+ey1*LǨv^Yt /c#Y^Iwc6zU$ G~  F۶PmOfE^^D 9"a^/Pƴ"9=C CCNA>w߽,} gd=EsҭA5j O7A @Dsc sBX7):+ , S=K4@0l#iCٳF&M`':TAf':1 @,px$V4R=a?Rf;,D$Y7g($]/ gdzƣU]$[\zuk c!֞UI[_nqˍ<Ŭu#g*m(`(0 oB |Oe0[/|;yy%N;m?ySrǓ@qt# lf21*ٰe#&VK ~Y,/|v@ t42>nƛiNhsJe0Gx\~8ny4 M()S8jN_u#m84c#kv1jԨGݠ?|^ܓT6SE< @C4$ia(0)Ǚ|YإC0]92hN.Z3 W ,8"ދXfvD2EAH#+uB},6!gnzo|ɏK6rVdܓEo q7xh~xU`[UWNэyZ0B>T ʣ{ah:Ǯtщ,[_{ 4Xϫϭ 7X @glGb+gU"#-|??1,ttXia(`(ДVg{wdT=[7I#5%9ٌg A0x?5+ .y 3Q/MߕT0d#GEdK<ck&F- P?@-O IHI!!2P Gtv9]m?ޫDmɈOǹߝ.-UWТ& {`V&ƽWS~@ݵWTrz6#(6;[;-+[Z7'=3/7"mU߷w4%  Vq-Q_Wh8z/+RkWTg19& \ds.„'iuS RV'x8o!"9-3 մ(T_Faܞ<3B+نf#Yj!KF%j&qZ*%`r!G'Lp٬k:vi٣_CT;B) SFw.c~0~%5>u]]=t)hr&ׅg|et!vZq>.@+%_Fayݸ[Rpc{4L96tu mj Ж}. @+7؂"+^Z!7A7 M h9˨X_D汔V_lö6z/Ij%=Y7թT_s|;)|\)h5 B aFщШeJz-P"PfdWOڻJ\.$3HWVGMKl~}nqa(X Q=B:,{LF{ fN~&]$ƥM6w3@TB<׍@sn~Z̚X2E狀*;51O@fc%4/X^|y ~y`GRn1#\;@!Ey>%Z{]s^XA(Nڧ]HuAѐH޹]< qrCso &5ICGwb㴼IQL% ӻ-{,nr V9 c1 '='j\.+Y^&nEy8b%JzE\zI?&*}!(='c>?T^ޯ!EWq 1?'HBbvD 'RGCDE< TBBRjV7r̓F'nE}lկ]_)^I&diZ1D2j ~T6X[; @S8՚BG]<|Ќ݅чdS"C@o臯WjZL*]K?.,O pi:I3IF5{a(@D7)w ;N͆['_ ܲ N.@`cTW"hdҗZtU e C̠3sȬ6qhMz22=ZM}NcCEE505Co~;A (9;C}쫯Ĕn=-8[J9_N50ADM80>;^ee3_NtG嶴ф=5{E`\g?G1@Gs2/'zqf_XLO!c!T$C&SnO`IS>}}+Gg8&PP0"",+'.h<'EPK)A C R~@SV=yL !3jgtv*nɜ ̘.F|.* F !j j.M$lP8^օ#>;!%?%2}ޙ)!ˎl_|,j礱 V6ҲO4WZB jw>X Lw_zY\ k՟]mxͭDFǢ]e(@2FjNf=IE\h@oD{D%[OpG^[1z~%yS zSY#&b>%j('3: *CHlOc꾔/JgcBpw9`ohᠾ(/pao?L69z:4Qփ&)LV;+@s (߾tZOʞFQ\̓NlX>XP\nDE0RAثMH{Y&| sNddPaUƅIQcEŔfepسBM NVڭ_  @ɺL*zBV֓%8^D^ΓlI6vRSpou(qJ)cŝX2(Qr%5}89핷QLÊ# \:'%n4`` "T)= 2 4 h`(0 LRO~$4^Nϴl5Ѐt !e9p$x/5&*E Z e5xUmZ# =!-c1] K fqVɼ,72&ؕƑ3a'Pׂrg&$^$"}HDb?,ac;'[ DU AAKdw?P>yz i++_|SrDU?Q[O&vk}CR'Xw5d)QٳCmR C|nb>'O~#{{G-V]Ns-=ewRGާN<4*+458y]B `c -É @:#EhOl+J5pI_ !"UJ )'h:AAu `"D572 ,POЫ KԻ)! dX;rgzeXf gK3d9UG0% 5,^'M&qgp4BpJ,ZtVVr/րV3٩:d~ K2vTvcg<^ خ^GQ r221;VI*ޏ0(j~*eVIYqbǞZVF]w5D!$UCrxdd@d.'ź2u苚/W*݁OFzpFuYJ:]P-Дjʺ{z rhftJ<@"z˜uuW ~sA ;ACݽqWC`X%S!$@QP&%LIQcEk3edF%Z`#h%7#>CVxl`t;[LUC#QxpN(`+)AGj@b"O솖|C8>E@Jߝ( }^DZDX" @ :b雕zV~H Gܻ8b&1vUQt}[M _"9snt4 fip"hJ!HS|  \bQΛI/l<)ƭwBv tNI*PX)௒p @?0M4Y&<%/V#p'aʮٗ}&h; r?̚2%~ "8| 6zĀ7)!g\& e9`*d4y h5r?"ѬHU6Y?-a"LiUuVR%[[Y!#LeĥOwGY,CAC۵aWCW퍵gO7aYzl&~]E @F t5}7kn:[՟jꏩ)ȫ5Bdmad5=5*`@\X6[ {2aa>C>QBF~}e5?Mzygts[fFwO={@wӫF'N!x*~ ` M!;̼DF45|` l`0-/%~WOVt0x\!WxJ}yha?,*p!]|>2[2 $8j‘_MDIٻf)G|0'#%_niTw9!8u?b咥iV~T\vc /# gV \?I$Ϸ|XFlW\i-Ed8]A 6=dPQioCڀ)=i Bss.@쑽BzrǛ/Du2`}8oCƁ ?+G| ,c$ȁäRD+Bs^FMeE%00H\Rpd`Ɂ8 }/t/TJLd@/bMM"X֥Xw _vJM5qn~ǁ իCh/1k"Y'e;k8䒇핽cs3;kS"CS Z.g߾VW=*-?S4 ݹs}P cTapjnL6'0`wz.ơY6^K.ɆϭhMelKt\Lr[' id5ߴԟ*^D @hɣG3 6=(1b ~1p{+T2w6=]_inY$5A4_ @=(3f!BV[$wX fYbiΦGYYɓ5? "d @PÂW>@d=C* %Tc'Œ"֫ڕʪzmnmٝ_d?0x!t]m=+e'Dbw^|| AlLsAf44Bwi@)V#~x|ȻUW`|:өwN4 Q`)"wFS'PkvssO𓃙T>#ehi[O&_2 a:3ة#ά2,6<,6J_"0Mq )L+nJ<|ؙI NV~pH*ZݮB6LY"mRv,N5t;Gy)4?26H T'ݪd[ݦ@,G=@tuNXϬzMhkQv7~^Q}.7Π(YڸʡogU:;Y #dpbq]ڟ*{J o^5O-.^*:8UrKЩ;˄%-`(!?PI~`R'/U] @!N'֓ufmln# P}x,MlvC/#'&;ڞ3׌4=ke( *y /X$H%pnzԭ+oEcm(`(`(pX퉼xzC cIq*0C`-k1zu\ٌ(̨>F rE}3v8E&Ř ȀhCY)\SjQ4vZr@o#1JJWؕ$&GCU_Uݵ]SMsy k~j.hu~R[5l+gonc"$]pE'(FMt+ӀML U-^\o?|q0 nM]&oPڑ殹X"C~z&+`/A Ӹ@yBA;+ 0@u y֝B˨d )Nx!qi^Njeۨbk<^_=K6['eRKi?kzv9<-ᰬliZ_5 `bue 1%0(_ X!<{.CR~®?o QK6cZ: mAMz20K?%s#wgSlRT@[AN-gD(w1y@*]UZ7b,i$J y SK)ራbC(8<yQch`&[cQXdMɤ ~jwXa^)|8-~CnouN)I埽~[I'B cigB?T5R #VUgϢJMNb&VZOz?g ZQj'g==ZwyF ۳vM)+D0xrrכGaKcagѳ |' sި|-x(B2)euQQBL } lf n)}]&%ow ҧ,npv.O"J̍J Ye+ߺf^(+f%³?^T Ky;)bĤ,~+JFh®mNf+/ ̌o;pmI #nan4AܻmaCk+Yٮi[bsTkm?ZnzdCN2CƱ?v닐 3 K.%j3$Λqh5 P鲕dԕA0Ԙ|! @ B"g)y}rT /x:j=6h%!ϱ05w W]8N'C+*kRb3T5ao[^B鼼k^5t`=y2#a]g߄v!QP/vv4=M5lعUcuHRft :4P"ϖ_`Kv,v@NF'EkF pY-*noA:]9Y}0`ivޘnQ܅NR6` J_ vnĖ3FF^0OROFbI)z=}8'!e%MOHp_ JCLS*97 vN:/BSjG9Vbh6f=&NRyug-/Pl1U:ڪGAч_zIC /_: qEutiC)4v;M .D8x3L_|7o`)t\[iJՂMd.s-P8tL{z&ЙPbg:!(]zٳ,̿`f=eR o[?4B Ԗ,4>)y@1bi@EqSzM蔵LH"o <ΒroXsbT&L?җm1KZ 77-(M`^1[yf'k?y%T|LMU]ɬ\_ŮxR͛M gvh'(سmukm]!Uny9fsdAM ZS>隤P«dFzTۤɹM&svR@-\c-'n-'? -u)ϸw $mʦ)WI^&Ti,* z8GLΏg_ZA+8MjD |(hfyu-QiuaB:3USj& ))9HGgnۯyH1?ZV Ef]QRX-Gk\3ߵVR>syd'AM R Z~s?VOE0vlM-i4qpaNt/O=EW7T' q#V1΅#"cs;;=4? 0NJ,2Pq vЏR*I@ezRަƀ߃[Ym]~~Qj@?B% D(ҚzЅ~7DoA~x{e;0[F@2oPB0M|- ~q75LA1-BMLmereyiFFGmM(Eɱyw3O?/ #X{:@N52/JjZI*)`-trgThah@x2A( ;e{NP2nHCTЌ#@7J %Cᣙ~̞u ^EЄz@1gOJ)4+A(b h|ou9o%? }@&J/{/|DzgBpqw}ǜuL@ Ű|IfZiF]~O*s8r}̿[ /];M{B_l (ql_\A} 4P0#'{rM*EFW\pMIK*5gб0z%4ʇ@wH84!lA_)qD@YuqhX rTFv .G_Htiz uԑU)oZ&]8p>=[xʨp~@+-V (X풕P E5~4q/Y`agoq ’WB~yLQ?wPJS6$ W1VfX퉜jz>dzvF*92Fŝon(HL΍Oo^\߬Jp\TP 8tOJO#'̀QmI{DVbҶapwkBH‹L}1(/%\fX`F%Ȩ9ۊYN Me^"}+ l⺄"<`Vs2 0B/V>|m3Lo0;WSʩty$ ˖):_sa3xlR)`ߊA1t @%^QxS0@? @ q6/LohsL@4I T*C4 ȏvR+Oe0--_KQPhi; zYO%^csMB rF4h ql떦5WoAWM9˽y/xcIJul,-+/O}dk^ÔAԛ-vAfyU ~-Q{,^x/O( B7 VU DNpp;CNH %/xE 2,aiym䁮C ll_pBm"$}o,ڍ6:12lWCfg=,A bZ \] ڠ6xXo;Wqe8}|jpk^E66P4DT8CV?x"U ԓGO#Ha{M[n} |?/w" tn>bKРihCG @hFNW 7$9+Bz~0rM30K @|\0ۑ-y< @b!9!n5q61Xv>s8X;V^&}KraD3 jew{qݪIGF$;Mswb\Ƴ5;| ߜX:ÞhM ZP:rx(f7 /^o`\5 +T| u,4Hb]҈?`cƆeC~((35 $V$!pQw@TL/@A ^gR  iιL2z8Srk,2 hh7|Pj~@ڟ J38}HP=a{[Z?;1 @; 4Ͱ;/Ade!K/Y̓4y\Ϛ.$u;a^8DIY1hoPCc˜CCA[J&%鋗#[;cڋ(:A2aL\rYLas&QQI9 yoyf$)BtP93{Aje ? eV}oY[}{)`V~,/MH}A|}@ƜAFEE(V)lf˓!T26YC&5PA 1? nՑ|Ff>ޤrMӧ|wJq5\h*Y}55֬2bY-T 0M-R b^:kd[Cũ=rdd?4HȄ??@~)b~vH DjUݒ fsHŵϦ cm"hz`u  ֞QeHՎ&K׼7@YX[I2O$Љ6v4S0[Z;sΕ|I9Em&ȌC[IJ^ʟ'rMZ.Fb$nH  N"T4O`0-)V=m*wg{ÇIPCdk;~{N&\YY #BIs`]oҀQn"^Rz\Wj /4ip)8N&dnq Ry%稍6d}+m~HH6a8˓f`. ȳ &PVPZTT}6}\E0w3i&fghu!eۡBo!QeŀCmљ 1IƤmuVqwVk\.E o\;;50 -Gr7TayoI #(G37JaiFj~S/vJV׏ip }9'YeWEdf.luۏ[3PPQ go~=/XC'd83OPk⤍\t,Jr'yTf Nx[I;gg㱮fPci;r2ovtJ_a.]J#@j+44zL>~=f0_EA|e AۖmSA`qt>cHQ qeC8vD7Uؐgqwh޷UCW4% L' ^<|8+#!rÚBBã}h, .+L|01JxRmnV^]FM7|Nz2^~M8^B o$%9QJRH`1'7P@ c;p ZAog%OK+#sG3PQAԂ;}N| V`hfYC{B"44`"WI<զY$v`q7L?htMernʎP<:)\ >X.!4䲼}"A~MP'~YOdf.~T5NFjEsP`(IԶE;/^fGiS;W(_ A(jU:I,3A5 7bgr2Uqa6=L>xss*aOK4OO+ZmӬŰ0Y>n "1@˕]pI! }9]?pa X=}m|Ubw=wȑ`zUi̸hG+WUfej)ؕWj@ȷP"U/bR6 iJzrn]NElse47 -j!h0P 7sٺ %+$k"ճng2eG0 hD};Z= ׮;0q*4[ JQ7 iy=` $17dF *֗zWQW٤9PPS j]M"?OIR橛L+5UEN>w쭺Y}ǭ);ZsE>hJdRXew7/k;8֯Dw |#.⶧~c QY.T7~[MarqRZIߍߍ'Ƽ)p\x4':Ռ!7^2=SYD*w:|\jpXכL Y[X}s(4E}Xx L+Je P2a_vA}gMc#Sk/K{of2a&( 2H RP|  ("="ɠ$  _a2yYY}ۻ]\שc]}ru/gιϹ*TJ$nK1u f; eklSz߾QѳS> nnnݺ4.ٓ-_kFw5<$m//ZR Ai(AQ`Ѹ'ɼ"kp WZlҘNVTReO?tg& B͍4 QjbŝtDM'L=λۃ}#E(!L7sԶ uVo F /=¡;&;!1 +q<>if=6@ `ɻڕY)g{E5?1vYQP@+Nsͦ{-ŚoͼfڻG?.4GtL[ wLKs҉1sLN]յ_z)fE^PѢ>aTIciD`ng˟`KR)D--!:U7բv#~gd1Rj{Of=~)Ou %' (;hD;tz$IڒMP ֞v@w٩=s:䌂άwQry9KE_gl2՗|Lz1n!B}`&zo|Z $/_4uW'њ&&w(mpFR Ai(P`$F/Xv}6Rw:}0ͤ:#zߢ,E ݶ4;' DB3鄻u=kvKf2.vҀhRҡ1ͦш9p00$[ `~.fkꃗ^k{M# mR^9޹m)H[[ݕt*Jƕ•[<$!uJG}W~Ezݿw]kF0$vJ /\hůFvڌ} c?(2KK膈/ ^zW^۪-tu21}#>AE /T$ي%iNBM~C'mI `3$Wۖ$'gEJ'ܵK?t?2|47%QW0CT=p% ̆'O[H$A6@$AEbR0rP5Աb:,!%$HI8q柆1,fD[vq}ّܒ}ЦlҮVX4H/ 㫡1IWnxgxiW2as;E},S @Pu5K{6EstB򒼘R8!A-" )n4>[[ێgz^_ڃKv٨`zo* FU#x(߽$$H%9XY/)/| L%+͖*ZVC`w'VGwi:~;d{AE1#I&G5\fX.ZXtE0ngM.8lȯl>˘īXtՔō50(SZer2K(북PhӞT؝|S2K񲛉oKMW6i[[>:~HV^t#mwew^)P|pYGY! ˽$:TrZpwn' ~Q@QԉEX*7>T[jǜ06SX@gHC( ~ 8%޶(RvW[+e߿=!В%aq K%9-0} "uxe ׸U{_h/ImHӓD O﫲zXpo絾728Dq@ tT!RT┻:ҷu|-)l! ,?ݛ+dWw%SSPlGKugC?9G Q4( o,.W_>ROg"b" pHa! wd/5B`l5 HL2+-#Am90cQu}ne27%c(U+oYgwk̍I=$@$CQʬ@TjU@-@a=bt["jpmU%A]d|bz5~) Y7Ō{9븋̚=Co7, X Trwe?ugL6JSWy 94(woc./[O'';4Ei/\;W_$qmAcK5U–OS몤d*U8e/,iv6 y*M-R<'b>H Qal# ˍl/?|2Jg|н~'cH)k7ɩ Zf\%c4K:TXZ)g[c{VsYQfܬX*OYJHWq+nnM&D>X:|:^s7h"OqGeGfyU<= G) &ޏ|YeČGv wgH@s&<armFu2J]P A]+5yr˟/Ė )T'a4?yBmT:mP5 7`U݀ skMd8V]TTb^+jR *AZ)D%5U}VT՛ ͣQ0 %%h_w@m`ZD)yy/aS ?]xۨu-i{Y!+鏖s=lk U,a'j.o ?l-L.(xf##I(SLS>n)捽4}kz/]^=;<ř;>#`#>~˭m{iwt˛#99wNLt"Ԏ*ѹ?HK>{^kW 0/4Akҙ&S @@-H"zj#NLwzNצ4RA$ڃP-BA3NtPuK+E7/g o%|ldI& wߦ2gWF6n4QLCIRzi[.uMdەlҟׅ{*w %;}h@H=S̩<ʍK%.!OgC1x<' >!wVc g./{Ԅ>F~CLOL@L@_ͼT>쪛mb'.>Rl8U]T3>$O{*klqSCottt^ D h/=_.$5њ՗/~m@LZuɵ%uH&0ƼޏЕzokBڵvs#a[J#&բ{( oW*{OBPbmv/g2B ^.DMИAR뙂ImMu?lMw\u k@$VsBc\B:q:v t$c90a^9o䆬Uyi3*īP;C*?R3?+ z+@ĸsGvtlwg_s}ͯ@6'vf9u>*g-*HJ0ߦ>I7!i\I *.[s؋L~] Mx\FZLa@QdZZ/'ܫҘ@< n}cƞ;vsOݽ38arly KXe8DXMU8RP)~Ęu3WҺ?\t="Ԟ.وK 1wmaK_?|klyIffvag:FT)lKSGr8quj԰֮.߲rBpZv oAVѰjXwŸ_o}޽x[.Y\o;|ZlC鰄Ga}`DqWm a7p/4k&'+@2*մQ 6"_oW&H%ܚ7 d*f{] u[OD2n\`hf2iߟsf<>%+H*^6 }OE@?lGKјă_ 9x^N.9{[7bSR}SS޶% [e$:7*fu-!19I2ORn'7lA\j C4H᪻]swݦLTMow2HVV1&ҔH *=W ƵTU}HA>)=~wKyo2ܴl<@fF'D_#<h@ZFhPJ+\~Ncj:},wNccBdW''܃;rP4͉D ?ʝtI*\U8{R:-f/=dݻ5Sbݩ}5m}bCrr[sF(kppVjk}:IA>ئzm dHL2Hx+OA6Y oxoY8.p8*ۥ(6H=gj2X]T0V->&z1+Z煜jc=֒[TwqѦqz'XO|$Գ S$5.I-K"kv:ڐևj" ?WI҆b˭t sZL*.oCXt5"5ɢ"  H/7n}ƴ:^_0~WWawZVG9$L"Ľg6C rbduW3 ('"l[pѸbԥ^!PlTP{l_g<}5U"C6# ߺW?@ +p5!-&4DTYNa)TAK$λ"t>\e01P!z2ɸrJP TH^JuzYybUH,@*U9iWV^t,nywOY-$Hzg N^ɘ:V!U)wS-#EmM *CaOiG#IJv\{5{~tEuEb~K(G~ª!hzCH ;r)zD{egM q\RwMrnr%[HF0N7lK97&:EI(#&1nDRRrfxk֭*SM{s*@XI{ato0c]카I734_Jsd<'3>,U!]/=v{)8S7ni=t!G;@:$Tt[DD%niOo,_-|^Jq1:>OCbs]&L(0ỵV0|ޖl@Trmn)Lܷ$ZE:c,j+8.z搂A$Ce7`f gnK;3"7ja\~4nmoGeٮ4l! ]v\`, 1Rì':JF-&smzRV *UDUΏѿ;&<$I6߽s91׼bOYVle0FA˫ {6-m mYcQqCrg3P AP+79vMϗ4A>"E; `3! J[cQ0H :M!MFRlcnڷmv8߮-5Юv8F|I?)A(#joh67َ^B $Qcc :oyռˮfsƀj% ۸VǺg6k=5qt6Ft ]1)6+re(GW]\Dk!y,,B9m! {R/żQ=ݥ- \jCI9r? v? " g# )0ja}"ط+0Nk'އÙ߸Te'wF=y~IFn^PCt[vz2%Ĕ9FTOӬ>(R!|ؐf PyLN?WK#^l"PB@-V}9~ˮFs8R %u7,lTEne\-$P!eQq-ܺm+ҰfRKL-?{7z8 m;ce*Ϝڼ$ fQyv~*٢TJ6_t:wm73=ͺR u @֡Qs>l ,gY,0 \ A8!9C#6 aN4(R[,T`=g5? w/ӁUr06dK2IPWES1ݻʔ!Օ1nP bRojk׬\ x vPP+8}{eSH:0 Cۚ{jSj *k%ٛ95KR3mW8BF r(0P hV`?Zuη߽3OiR@4Y;wӊ3=1nqpZwIIpeU*[ƵxI+f?ޠ 3źd .L.qa,0.TwX;IUp(b]Ph}UPM͏@u$@A%4_IM% JepeƔ9㖨 lkJ\ccu1v(I# E>ѭSw;ϵ1"|V^;ܙt(5U܁K[‰ʳ !kݱ΂cr@ɤR#"## 97)h{}_dZ+ ҿeӓqsMi'4<;T ќƸ{ZK-wl@6F\-`ݧ }B>B\"n6UaȭUq~}G1'$e„yu6uYK)j]+o$Aq[Y&:7c4喪ڃ B%&PEXb<,<1aiqG} pplBDv/ūUB;YQmz횼¥w~! s*s!Qu" RR[9CxV#MLisRbvFݕ t |,xSe51B&Gq_*R*m~֕u<5/cǤx 0igRwJA@btś]wsɂK !DZ|X9\[.;Ny3̨?,~)5\uSI*wBb]GP}$RKr8?j^'.MRb OS,;}gt8LfɉoVjv-at¬&iq-l^nGCsu^v_R*QTZ:Tt_D@V<y}p^55L(u bz~\0AJ`gR˙MP21")L=+KYsM1'+Wﶌo4n`0wK,nXSR*]|sXT1}gaQ@93Fwql(K0-z)k w+dv3m1zW+;:')[x5PU <I+\W6._. CynARq7$(6\uMoIs0~hs;j Y- } ܚ8OH| vi1?5څn:lC T<SUWf˓ʹA=+5jz6T@jo\w׊f7Gx1uSfMM*gcRmvj-TtC D CBEE8K H Ƿ7v/ymo s(zk:pw҅s3g XRLɤQ!PVq O99Hޤyme+꿤ЖbQ!lXfE@iTha2sasf090+si1Cni9/̲{*rT$ FzT !$N>Iާ aHLJAܿ RrmȭTrWE'Tf`LL==ߙ}'eoP6CC[$wSrKRVPT$+֒ r.VK vM6JOc *r%vP{;#.ђqՈ"0SaLqS8eڂcq_RL&%eoV| ?5-/,ž{k~ GQ͢7.Ks WZ#b?RA(r1V)4~)Џ?C_Vf*Za`&W3wdZq&L#u<+뼜o!4@U~!1qqeBǽgE#c$Uɴ;!/mr=~8NnexLXo] EiRJ)~{ g rn^lXw{1I9TL硚bDBNF`=w} ,D"Ok+՜#BSUI z8.pxRbnj\K<~JYyC9K|&kvaP0P.qݽ](naU>KiZW@$TDVB6vv5l}m*P8" 4ĈLpXn3# PC: zQ&vBr#,uְ~gyu MM\MI %~$eX^nLJJn6w㉲ t,USC+Ȩ R،6'PGeͨO‘zsi5)L I%wiyNxaIoBҮy{[yc>q:~xeRON2K%S{嚽F#Io).g8Y">O~zIsvO?91I^VBeN5=\uSl$Br1,|V)s0" Q!;pAnj"i |ӷ;sc)Aw@*o)W1~pIH[Ucwo 37ci42=&re{&&*z/cnA wtKc!:c:G1HV\Bˇ{/jyw3/y}]+ٴɸ6='{~JJP9hW>\N._DIv]dI``fEs7&h[vzXZ^~ 0(lK.Bc(K+E1NI e.M1~~Kf/t%o4~:KN'QfvIŇxv2zxvHi'9Ņ /. q6v<</G{jvlƆn.% $@ߢ@AMtK@'(k]VRssLB2IOFYE]啦OTHlpx?fGVꜬ޼s>5R5M6@q;vRZo{kQn[J`<mRR2w٫v"M|'EE.{ܒ=*Q/|KRP kEϿz]zhR]Nw$K cvnex^*@p0&Mmu&eZڕuVh*WkEyI]כfk0T]vu-Z+qm_ιʨagQ/¦ᥤL[ #tT|fˇYrw׸ tĜN*XQ@IDATn|A$NjHz(>BPB i!/14jٸi&76!R@܈$AMT뭆&ڀG*q"F X+s~ 샠EK:[ SN}k)[ӎOMeZRJIVK.1"DԸ$fҥԶjޭUb^jH;B|}]Z|R f8Rxڌcc-niQRg56u&"ڐaT}T.'D.Ϝni|"p8}@PeQg h%ܟ$g?Χ?[Zrt>9zI'1DM\ J0V.?Hժ,O6h~UӍDZ+sY/Ieq? .QAr4WG8`cOGs_, !U([w[5/jt䮧FzӍ$u!C~]ȹ7Q9"WN%٨ 3|g$ƞ ZGwh}h\]d#1I^9l{!E]Çc vg} 3ݮlwJ,wL̓[UM0HzF5c8W(0<\wWL7Cѷ v]s0V 6~!!IS\N]G%]@WY- =FQOENN➼mѓ.( IK}Œ<ʬISo+Q3_/ ?B/ vW ./1)w3ME՝%OnWu>-g0Hؙ67o򢕜$=U`Z9O0ԓ lgDu^1*#>Ԙy7f ekR%cA3[(n I>cǂb@<)`ױI/ƐX ]IliHMsc3?xaU [MƮ5B6o63ȇq8# nYZj"5> Oca0vr^lݸ3^FsIkQN;5N{!,d3}NO.)23tw25S̉z;H%bϮH0?3Pak@ gk/{úƗ$cC56 &Fݽ{Stƽׅ( Q,#  :[_};_N|[ fJeoԎ9 0 =LT`bP댙9<sD*koSN|P%Mղ{tCv5S}%)xKb9F?cgȸ8?q` c@Ќ43 K^l:jZa]S-#\b +)g(чԗ,0h9G6D_@g^w3Rx PkCMQcfXцg MD؁cސ۶bkRjnQΗnN)"  ml5~?bAjR-š 39vX=c"1wkWEہu1hҿtȿoh+kD]?~~x.-B4{J񄦱{tĄBf|TuІ #l7ȏGa~n?e;u6 1Vhfzo8{ KvQ7oatN"H6pdt;7߬@dr$C\M+.-$4"+䵼_S:R \I :̗x>;}0Pؘt5- u9Ipjh𮧥sh\ *faQqtI7Et2J=&/wK㖹މ)s~#S/Z5, C C6q|vUNĝ|k?%h'0# 2} g;iMMez2?MobD Q:a\j/xJ)Ɲ@ ]yk~eQ$@&2 x*]1>OA螼I]Y`hXh_2 i\=_(rA})0|C/ ҆%'R-~)f203ɰߩo{`xua[@C'cl@u+q^Z& nBAS'EOl*X.lD +Y`(WR2LPfuIJRKCGK;, 4#BP{b,9nR<($Ѣ>4<AғǶTP ЦMfmq|R$긼Zrd @lԚmp1Zal>om1a0g[^ܵZ4B֖+!C,H m,{Sv1{JzܲA{AP AjgD.(HG|՛U^hY0HVۇN 2(D餷ؖ~T,vz uT׋ ZT}ZUjE6v\҇>=6Ȁ~ĭ8toIԉbtksT6vZФM;C|`k@~ g'(DcrRPp՜{%4. Ţ䈾rWsT('qVE}mH:zҪF (ى.b\Ay@rm#X^6+26h\ABh;फ़8 Iyļ!qRʲRau^m2iD?/9,9pOWQlvȣ$ƤpROO0Q훃9SΩO۴TPvl! $+&ݟv<II}7E?LQva9'7͗b00\li{ Ih(38H =AKssݔT tA]nT^p^,1avaݼ&Wr5w2-ѯKV rn=WzNچR @ŠI2#olHTm<5D+#RK e>{BJA(G R[thXR!)Ҟ񰞁y[+UH]-м"Knr45="n'ƥ'5*B5H>ݰ X8@+6[^F3چz'A?4ךq 3^rK+ѐsͭmك9"toPjCYb?D{}}H$nnnB6+ f+1P'b'o_[mUZ60DƼRӏ3V~2oqWLkWb#\^aL[wz63*#nAEi; lLO$d[]NB`*gu;?هᖎ)ѷ;e/??!]+>G8+\q) 7}Znc=u`kWuzn~f/nyeͿIo_y5!Øb_q[r#G`(554&F__Z/zm; އM{ 1Ok`\f}zo}zwK1iH"V֊vz V~7ȼ6XtnUdYyVr>Z:k8M}L\]/abRidt$Yz;*}V0ۈvr>&)PD$3-۸ۆYqɊUW8lH@I˫Z]Ϩ,fESnL }o ɹjo+Mٱ] 5SIշz36`au A$Lݿ?j]?v{*aͻTB僩ݓ-wImvl@D-Աi.Ϳ_^ 8j:[aA&l\ҟ{7sbRuz =|f1 Ֆ52 2,ֶ/-M.Vl'}Hzzy!\Q ϼ\0}ޭݶlZPIC4㾛BR]cT ʺIpQ%#/ylR$Uͤݔ/.)XZpQ'2&Qp|l{_ #$ym $j>''QoU2Nx?_ AjƢ!&?hׯͺ˗eF?Ğr0 x]}sCI`jWκq*Ǣ}`W>U2&Eq ߳]?IZȪSy `oR`OUS"y*UMK 7RC]:y !9FLM _-/9 _qi3~ձ]>{[h~ܟ rI%-kTz]̜4+x0BvsLe$IC˒UsZgB[QYsN\o" ~l gSnP$ RϨǑkW}㥩ƎxnA>{cO&Cp ZҿYnߌNIZ-t?qɳ=S A0!@WX_YZXW1,dCeIΙqdΘA .CZf]+&NX~Xie% 8P´ev0.Rto ܆wj}دO#/s¼zz %wW] dI`<ri X#Nh(Dek<&ڤ6ӎ&_UAqMRw7U"Q6o/xQ@@p:?͊3wb6;5JjaUV-:zCIP)P*|6ڹOJTs6ION7RzMltQtӉ)y8:_i4d wJ7Kï^/0 iTFL|IA|)g8DY8DĢ},~gbt}rw~?5>Uop)ɓ~3I<=bA@" f u[?0y'8Ya}zʿ[}8 mYw숛IJ4+GnRYRqlB줰 \=3m ^.s$H:0`o;H myc~Kowo΅Ɋ#TᰧÎkh5$dƓ=81ٜ~Q %XD&(0%lLhf1wv`>N+֢b<FpYhqb~Z5;y90LH&4@i1pYqÍVܣfﲨ7c"xR/9l;e%I4m ﮩICtRlS`ԴRL 1d[n<&1Q-π56vlCχJv~Z>^PB-BK T)ϤXϜmIuZ␜_@SB%T}}ݧ^"\*χ#Ҟ&qEj/66KQnOO"\k&ͥ 9۹!:8 D TQgFwӧv_2#0IrҘ4;qC*]ڕ'qU.R(DS ϲwndN`X#b;TNgR#ě޺v- "dc|s.ɋ;Y@萛YkUW嵪)@xj{z wkO4, ?2sq8rJhz踂Son+V5q } a8'鎏-@Mc9Q ^s!LP+PίUPdw)vٚ7>$"4HFyGhRUV _\ &KևNc4R$+'Y<V2%H'n^͈9˹Ws); w˫> Mt|FMg5˾+&Su?YsO^M"lqghzv۵'&)$0awUg 7;`:\^A@, -v*dI7YdZgh 8g ok^~޶Im/Os)%~XUvBlwxHs$Li*DV|UFMW:3;n5.qd'?fܓڈi9ٳR{Ip|[^wEt[(>2&Qݯ)dzeym.#$w>#0[y6{`e |r''|tjB،z@~I@hyl.sm?Nt?"բWBgՔ7e8Ks47ciN='3(RRI~hš,ƍn_卩LJ~4!N]AT?5vc (m7yع":_:1,t5p9sR:q_뭜#ɫwM$4s%B7mpf2iO>o||%h{õ`CFX@ʬ۷ܥ9!ߜ/L䠯_agz*~@{)]1 _qS3Cio'I&>J 7ZK|[WbX CV#mfX}LbZ5l!Fd6csqV ǎ.;0:fpV܆TQˮ\ AwvLAK&X3zr@OK{_`@?5w7'g./3],msy9c ~הpxH瘂 ݚJq]Mɴ@b2JU? 5.$5v+hqfc/st[)iZ̡hL'nc`R Ob }3US4\RRwg\VϜ{tttZ@iQ:*磤F1Szuӯ a~a͡Gз k7gQ^vԙl3EDGyp_3DeRiwzFYx:Kkq$inqÐ0fDc2vKɈRDgdY )}MN>|+$BxiV`z/QIxJ}nn:!{nKؐsT{Hg44&t6@!gk;nW 9t==qdw ֞km]BucT14@߀JuݖG.lBun~3 4T>xp]ÿke]3"gFElI/on֯[5gG/qX>1\pX/Ϧ,_~ðy*hl"]kj&x78=0=]cko`|&Rյ8b\`2;toK>ym_(#|t`\s8!H+ո_'`0D-wFogh.)H6pExJI@pT>Q9DnM p$:oF\eoj):*HOD{|~g^$ovD9pflU*Dlz6TBﳪmuZJ, ;:un8Yz>|\p x“zA4 8|,1tѨIq~:M2S@NQqFO*<5բ3YzZĨɑE.&EN&7KsXB܎5ݛcbb͓J>d7lPD1 }Xguet⧼zGً11og' x-ðܢUזu?$BC_v {iŹ훲!RѠv\ὠqHeο=k(AcdMh/INBǕ_0#9. LMPj\̐("݂̃}o*Oc {I$}bxP2JrD") I#ۮ*]ɹwF p\:Lc8GVVjnTrq9qlc?1^Sְv`HG?Kg&a\[x” mFR}J35y{r@PQqpzM]A׌<P=C1ix (z*~\߻cS3ץSl$+iASrC% +r):H:5] R6! ܌8i8ceEb#z VLrsXc-kXkI¦m,u(ƪlRoޜM@~3~%3]ޭ44'v7:k+jރY75+Ξ"4Fy~Wݟ^t/XSY@/0`,@3Og%"=! :TB~!{o u?*9mAUj/~6~T *P@7é<ߔKPwux c|` f9}}T@pΛzZ @N9u;A'@ӓHjüAlŢb G+x P#dԅ\$o/AޱTH˕-3 CThLyPLȅgšE4pݻ7D* D&?w'շ7-$[)My|},uhrcdYi-#:>] D tP`/m?]y6R22 z&E *D ױjZ<;WI-8@Us $YMt$dӞخAۋJH=g*a1arr>aRNZnv. 3)Ng)~vO2&8 kgpH]g&,f ٰ Qm$v8RLILp]ѷ U7+8a$((1=b7_e59{8btۧU7')ޞQw㺗BOR݁=s 5it6w*&[ܕCE=8#tzJ(h m??[YT L2i p{u90* fjh<12qU0ɩTY.,QDW~a itgN*xޝ0U[߬t `1MCK&y: BȘ\U:@)| ͍aE";Tjc@]JE?zKΜ$~<Ǟŭ@z[qHUmV05ĻH]x fu>+䒕3紉k^o-7L}8*kJ+,yqiY6Xj79([-nݻ;)EQ?1H D hԍ($voh#ٲ+k 0`mƑ-V8wEV.T[f'F\x m`D&u֨[Z%',32C\vPIUӨ9CR812m0fj2Pcl&0&??R $@8`^N'vFjs|,m @`4Q`f# V6'.>ԇ9!5P\?Gܵ]'߀1yD5T.Z(z0s ]gjT1T&wkYCUBΚ[ިOפ WK'͖nҌ{XMB¿.!+#d(3#}TFU^mY.bbc245fC%O7-j4NvfQ%[[/[,B|[yL3nt̥/|:>jh(ravPL;aj@_,*G!$-8`_;q\ {as>|HN D'6{@]GeceQu+%Dك+Mx%5OӖU 5=|.UI*ҫBjLCÛXV{Nxܛ$njӓc6*x ?0MZ#mh-hɈ.x`c;= ߴ vXEqu=!#ѩ Aa㛩@egk'㟋4"4h G"˹-ϮoG~7`j\` lH&6 -l]۾|;r638Hf+[vyaz"n\ILZI:eNVOP{VnBv r p K8;5 Z7&i;&!=rC1|l|Pd(J5zKG͊qZm<dz=Ԝz[N9uNhnc͂dّ%͵$j#A+5X+A nXBO,$\o6~/_~C& 5p665ׯJMr4p/~=2<;yq:9'# $*ϗ/טּ, 0adǜԜ/ݟv /H'?zIn\1tP|vo g I*GNPɺ~9~*sIҹQyfos?I^ԁOZ`Cr^R{:^+$yfZzyQ@h?ΜIBa@Nd 1-$:xOihzħ/ f$F BFHh$"͌@tު[UYYY{Kva;;p8lGߓ~l">Ux1P>(؃J]wX7KXž=~4)ǚZ{/u@ES8J) /XKۥ,{ո բFb ~x i0IʻSLO_\empK )NgIIW2Rz∻%N - `UrNnw4ܮȵzCNGwDq@]([ 6d3AGj8۹;hmlC{&ɉyǥ/1L͡gЌ}m zM8Ѝ š{ͱ@`ʺ5.6X<Ik&u|<;Q N #TT&&Y޽O^X4֝ M{&x8;2DHߞBR)K%w~;EleN6y,c񵪀`Lwn kSάR 0s!b|'mIJbODXN'HDmXD p >os86@ b_%BaͲҪ[U[4@ " ," M}q"vxu3mcΚy;\XYܕy-$bVG*֗D?dsC&]]|_tU -PǨS QSGn0 4Ң)+& goFj@w;v 1Ə5kvD< +TLbi@ר~tNw08J %5ę+ݤ*?0ym7\[ ](v jpP܎?+7ؒ6#tc< 5 h!r[X.^̖kG1 idOH;%Z^5-F%qb|'LEn8c}z@08S*.Rhi׀{75^^Un%ǗGBQWY`i>&TCc_ŕS AW^Qz@O ˯ A$&$UTN*dc|0b}<Íje=1worK[ d0&A[y)۠m틙ϩ~1he9y7L蔵Z= ߨaoо3nz*#A9nnCT_ԫVE $ڱ/0Y#J 1 3??cUѯ-{GhcVְ喝9e]רVzr;ioQ{ڄwGҨ+\2g!,*hA@)36nYTHݵlan4It·r0=5? ߽կhȨH/ܳgkIVu&7EzAÜѤqo.&gQ& %uSDB hV[_}\[6Մf@LUmIJ |#z&;iJeN?sM-|xX"\q!80d/ ;xa ÊCXN3`kA1)8; O8-uLji;X8bJI u}I]k20&5ᔵamPm/KBŀwy"Gov"4@^O"*s]@ky0/#z,pm{̽13(7!U/Yy dw/0 X1FBrޔ&T0Go{̍FuG$uYIy`X@8B ti%0˘lI0.Y/=9'@ԾA>aߔ@Ma _ҧ* -݂r+7r ͊BTpBN3Ťuz(UZyOj! u9vP;*r07(C =>oحh>qmXvwEo Ra,.K~<|P}KŸl D )}') X0e>)F?ZY۟wSݨqy2[rnu /GQ.dG= h`TCB> /+Wzs)zu!dfwwV!ᷪ5.D~Ƅ6*a%Z٤€L:!F H4 <#~8Œ_-n6$»wˡ x!  մu6pz#j0H5qRuH4z%/^^pw9>ZY}^jb:va(RsT-lH7;v3uǼ⩝l?&jMY*+G6MemI>p>Qǧ60RH>FUsV!~?i]m-,~TsX'ɂľ1nؖ؟!H:Q AWF=D@oZn:WLj:A 1V;aֽw8/Px3f׸[ri.sQkUԜZ7oiL++b~I+<*Q0ߗW'V'$=QiVti±!E@=i:iT`H89lk nso~bmyC{'?o 6>QRjHiv9'nnl1ci($i *fWԣP.!9IȰ_QQ5EEwZ\ iM8 $ŃrK1xM - z)zOX$iCGiwU ט#{J@KU }TءYE4d=|4voVߍ]."tcG?/ܟޮ˯KOf?ÖԂ^J+v00J0G,XbŘ״r'EY&VVB{e"Jvw\`H>y=a'%7Pf{CvR+P60oHHz`t}6H;Ww 8e{H2.9<8x~;eWs^pwTGZrG:/-!Ƥ$ˆC TyGU1i ]hH}CTW`Q{흪$HAY\O@R}B?Qҫܓ'nj;wiL[Qj|WϡqjmԴ7м[D* !xaT|2VcJ~wHYKo|;WAa(=}Ѹa\s2'׸Ke;'XfFϝ'3aE T5vOTrd|ֈ6ъiWM(7d շ[)oRecԶ꼞[B^c^)Ҟl32.L66~qU<%00HVdS† KE*ʹtIi0~5JZ{8P n;vӣ AR)N(唂zB%㭷yRRC7Kz7--=L/*yWEwq_q^h խZoɅ>y$?%UlH-B:ծH裀Etdt4踰-8u?_%R"LN;wvXl.OJQN D ;%R 6" p<OjȬ//W?{c+.S3JB+t5M~b:e@A[/Ts6ݗlYgP(\,`0% Ax Qh1;ƞ\-kM1wj.>gSYA'|d(n>(* y&l(m~B\[>u:O}7[Nh~6C4&t SZpD 3prf@!BSs~@xqeIV >&'kk/ T'O"ԭ5(0,[b< lJF%nx3y0 [v7ͳ}8|#Fr]xHh$ #]b[)DTqd@CNA#@9c:)-iO\^~?1y4&GlةZ0U|q@ՊQMji?;D,Z^NV^1X'Y!gҭɕ4-F^eX貶X~pt.>ЪP*=wSɋy{ټ ccՇ;:%{q5)"J*?K&bUMQb D +'P@.Z'7os7}$Ru1loXRBg: ]M:UۻNJHI:k03*j[|}K1vѸ|j2#&ݻ'Vd &4"m/m\-c>ZU 쵖Yb!-j7<3PvAa#$7$@x&t(7eS/ag|mm)\^ ՞&hmp+uLԇݼcI<Jj+~{NYUQWH0%(OWHrZs oL[f( <64{Z괗FF&ĿcdCm֖Z@cZ/(-3g#gT4w\AߠmOp_?2uD1_l9XtѺs/zҮVM~3} F,Q w$8^R ?/ h&d# RPa kFIBYzkگ3TBjVn{%[eCvOkMUHհ6Zi& df3>pσ!~'|9rlg GUfe ˯>xLj MS3D8>ي~lb>ߐƼ$VlYǪ]}l*XQ_@"m=9cN]G_G6[ 71>v)'=oCjLvmivGlS=3 9}VEܾ!xe J4i@iԉ]; hˬ?W̻wŨuKu)P#Q(Op ,d#):}d mL5LNp0Qh09|J펹e/-#GݭI;Cv=/?/pڎlrv!^{fAѰI`N ;zf"0wnd.e2W/` Gےx:ֹ3UFgUfީS8AB͋ *'!r, ~5Q;frcH6+r)h:P0m!۔񋗫W4X6',EL=T<&c>tVdEwsX(2ϗ+bQ).a +D3LTSSb. "&Y!I?y?VL 8)]7yݖ1HEٕ' Hݻ5{o^lK*ye肖ePl;5r g6RKpwK9[ KǝզXB[Ib"_BD&{'l҈wDD_+5Qx_hPji3ZҴajrFA ~^M%TOinF߰65>ϸdC'("er(A.% (k{m*F.֌ΒDF IN 8%CgI;2SѤ9}\?@SXD[qRL2*;PK"mF/ekKԭ@Sˏb'.pF/򐐊UJ1ڜ 0VHQƖ<$ 88sHc5NxyIڋ]Vݾ_F[Zn1ŔԈ{hIN1y0) |moDo+uu?!*rc@PQKoUc?}ZtϾY6{ 'SVK ގG~H Y՝Z_MH5#ϰͦ3a4YMAnxU$`ey ~3q 62Ug oGq\{U(+sc*<xOv RpAnWKpƄ[P 0&1N c'`LɩXi?7!.;8-Tݺ5J 3[Q RТ(; ]݆?ONm{ms)DuSmDy2 Z-Wvngg5u\aDդK0 ހ&+&ze8Çp=us wᒙ 4yWOo}O~ A%B!MlQ:hC=T`h.9sA=" ~sͧUCf{Y`AIwְ6wo&(YWy4~Ǐ n߉A2iyPII d~-jy`~enϧx}=v6Bv:=z-.Ln}4}mu>Bm r 3kXQR`ϗ&! HCGa?}c{{'Ġu{ m?ِ*"U6zY򯱹tZE)IlQEjkli4֎5 Qs6s}YBYM}qEȽ|؟NIgoݨx@`וּûЁ mi<}IhL=.h%v'?IM! (nMPwO _ͭ67M0*Ni26 K aHɷ+*")y)3nnfHL Ayr |A1(@ٹW$GKa>br|TOHׯ}j0UEZ0žq=͐m?u*bg=:@0F_#YM6 }%)u+ 4w+4v<)ش2 eSҪ!340t cR6d8e7 tсq][ ּMkl~ùPAè{ŹTK=K勒vU iBajRѡwh#Y&[DJQ5 D j,o(^+Vݿ7kN6\mGy| G_<1P `lfpgÑeH{2'?171>Wl[D=:IAǍ|H'4~!^6oX¤Q׼O8*X>Gs\mrI>-c&*b6P E*vjKwylQi~3uy26}ls(w̻U/*7+ir*|'HN䰄vuz(AQݷ;gS+ZOOdܧNIrO4(%ބޅ޼ιmډhFbGڀKd8ѝ^@zzzAv~{P ~4v"Y٥J=:GmJ~hF񑤛~@w$i Ie%a^omf`=YKoKTAҺO Ia8(-cȰ$Qc# 90ʃ[0s#Ct!3R }l<# m76v݋ۮ,鼋5Kوa4*܈Im빌{^S A_GQ/7 9j-))VONrC6;9q iUC1N#|wX9OKnnFL>vy=V#o+dfnR=NGej8x] 要m>mw Q7bȈ$iYKȜv(󅥜劗^lsk3J8# %9%X?O+gbөORawW*py8E뷀`uIq^.ؕGA IPF^'ǘ`G47u[;.yN+_c?64櫭sccCϦ0hFZ>Ov7Кzn~aMC0,0OH u۷miK<@d D dDOڃrSK߼jl]N"&HJ{ҷ`짉 f4n[MCpo J5"ot{RnWIЬLuS࢑hz{#HBwO@YhvP\ҕT/Ȃ?*۴98`C ƽ`@ոNn@сI%~u$aiHN 5@H*q1b8r.ϾV8)~t)(F;MtAےiPӄ{t0]yXyt2a&@|Ĕ+NʥϷ  #b OcbgQ2̟NC:T*[O0 `;5:qf[TUg$4r {W/]%C D.H-/wM./.#6TX\xT}S7 i ١}XҘ+5֪WP_ڧ:c鼁t**}&($iPE9#A1#Ur,G5!N kgk^[B:ѱ7)ެ(gA-^-Rq76EVlBk͒c$k|~HHG TouݲDq͙gbL[- >jҐ,@i m(Ɋ %WYIM%_@d3Kڢ}V`Pfx A?lBcƵog |۱ye$G>|؞Ft4< `.W)_@C<'*f6X׃vqj'JsN bΓfwL#ԏkPw{Pq ==i:$WngRM .761@:9^HR(޽=j Uw-b6&Yl_6+^h1jPɓqp>C~^Ih$s %()CON5*FaFܣ3bLz{9ӳ@PV]PߍKp/.yFck2>p% 5ͶO:lD_C'M)7#av01 |GfDs0&N 90kEyig/z@ޥ0+9T ټP-r]$#юVwǵ)cVF̵L<7?vax3Z2GO tԄxB5+thkV]Vx΄V{2Uj;Y;x E"(t$@gUڐ?5 mv:2< ž}Kc\`WrIFťG{` $IMLݖ=f3:KC;n=@P^SÖ(\:}4'zV^ӑ`}G^npw‘ːf#D(qB||mmɑyuhc۱rE@Â91IwfjMi46n?=KlEoWeßtY[|4!`2/LhGS= n7[<"^iQ +T,8 ك)#?t?ԾwXnz=Q6Csڌ0Ksb=n[(%2T~~(Ճ}F |ZvgBiE`/KŌ䌋nBLtN Pzy9@p6 bQE#J/HJKP:ڊ<9Pm$`H@VXW% i*#KԜȾ ZI|==ph\GM Ünrz09;dm[ ]]sŬ:Mޑc ~0ϬA C[b퇽&ǝvm[dRR\I)_+ 0AYNOG>E$iC^v̟~:Ş@}Z(scy^Z9!}/5ɔ{xVdFN[/ݎ@P/V׶(ܔF狮\\7V /ujȎM`&`30ňyd4;5h D(g JP-V'=`y3^L=u#V_>+KJ1(04'baLRYm۾Ke%.kL>SE1S$#* E.YKn*w*]r]IջUPa?%# s WսݕZEc.CKx&4n;z߫#cP@Sڬk8Տ ,q0Rw|^2ׇ+y qspT?u٧w/+w$3i3(iX6HmQmEU U9Cc< R(XaƸ6HŶ0eɽ0^iX=R^٫WE~eK}OcEi-M7{dq v}u}E<pĵx޸&!f~ִ&xlEs|39=rIXh=ci{Ui,/F6߄룩ֺ 7+ 7\Q1NQW!HP+I#[kw XbxJSh"V>|8T^r*4qөN)%ؕh_Iwk7trjm9&V5*AȔzp݄vz  "y aObh iVZH$þ1MFĀbs${/6|(/)#cX=&^o!񪌡?tG  dO֫%Lis@ k{ [S> _%cb(]%)W-lx]%G7^//a9YZꟴtJ*ݢ?8ntݛ@Po[(k`>7~4>?i* 0bZHh04ep@FjaCFlX,Uao+@5Sbx /^bSm+;{Mꍞٟd4jeOܤ;l'rȢRdLqr,Lvɒ? 4wΐ v+RۨDYC58˭W]UE 0TKB-wwF=bYE--. >>7/7o  @`B$E d9zPD.Vj|~%x `L'~dLuucr;|l''6Jl +;& c`"xl:rbd\=b ~(>wzmBmLg q~Vgy|H=ݱ_=vGpHHGa謗)^(R`G^bgoO]^UA$#ԔsP-u"⠣Z؆&mܭёчe=BL4l%hq-TJ)~:kGm! bl^_H6VmfoX >`6/67(YIfE7ȥv)׻0;GH5G{Z~#4홤ka#o@IDATGAC:CZ={n~8bwX@)JbJ2󧴑 A$RB1%u""#%f8I\ $D@z9Cq:3ؾZ;^WǮ(1ģ3-/ bφq>0+S#cb[8:S{2+/l-XrDz?ekWK' %X>d|ߟ -XF Xp-v.WP$cnt5Qg9#Nd,u4ftի@P\S) i`u(oof_^j4c<#yj}@EN%Ґ%ICdVĤdgčmQўY63&e%;Q}8<8rok^X8!HARwgv V<:>"u kv~7W2fh}":lˁ쳏!nr;)7oS}4}Mۤb|VHP'ņ{vۭȍ5?,:JX?Tv@߀I$Tϟ0~/mږ$QZeN hcRIJJTݠ R Ü}عB``.#Th}G׀t,WٓBCeAZMʱ1aĐƮv1j7&ų/@PdT hkOO5nh{7fK̛&$pTɊSך#Cr_߀`DkAiIÀJx{bK{خ S> qО=0& +U~"4lbX [ldnw`IjpБ{1$99=RSKkJ{Me`0reʥg0&7 9St;I?p"?#Q=2* V ⱽB"FY[a_wd:ߗ04cj%ېÉ=68`S`awWc *cxcO YpMUvv=O c3V$eIQMCuJ T"@}䦛GfkP8L85}+ӫB5!Kx0wnOiMYKѭ@z7 ij/[ð1ȝxWz&@$LQ+zΘ1~OHI˕09 k Ӄg= "U_jLȹA 8i1y H1M,| r {X[&LB6l݀21PPMJ)ACUq:C_堽R5>t-$ FN<.#8*xGj#e)(^&J5sw uƠ Փf` x95 937Ʃj/)hD RxB^e?@cS&ieSg=:]'G 㒴>wCl,;,?lK]]?++(A2P; hfPG>FG>x8%i+߈=mڌ×x~i;w0Hr-4P?1ЅAt_빧 iWm0i],[YS**01j)sе9mTjotRrJjOPwF&_ P$eOF"0k?5g#[`p[@3aT}]kE&ͶcB#GibmUI/MO({!aFKVFb%m(=>iI7&1k\5kEs- d 5IK")Mέi6^=1:W[?O4:1) jҺ+KE4_F`bS g`<>y4dRIIBg#spϸӪ-w$ h5 4EYe}*{: mX!f8gh,=~<[J#O@P?5/|j1_~rI4 øaqFcǞ~uhi@2[`3G?rc\ gɍ l5/LkgZ!@WpiB*1`;H'5g&) 1τGU|}mV(>-8 퍓]U^a׶mWT*q,,PSwecv71pd𾤽J۞'2 #e$7!hsIeHnu)19@l$ْ{삤A {ޓϡ]\3ː<\, i'Usgzd TxPAZV?|tCGe3$!l_h05ȻԎ9ssb P#!OR(EM "mTah bAs<x>vp98!LA} !_+}t&$aEto;.{ y&}5id!p3G3fo~hy'RuU_y~Upg=eeU1.G{MTj RKJʭW3nv]x6NV^Z|wb 2i_:9`\4tH62nGTtS a_a ޯI$Umq@~t.G$M[\XH^ w';+4@\$@H~qϘIl/ݻlP/B7i%nơ w}/^4&o2(Xp44V <|0^Cc*rwR ]Qe^؄xzڳ XO5qnm?N?NS18Hw6~Q,mdZ AgD 5#[R[.Hǻ>N_=Ƥj$?A~f7%IɈ@LFQGZlM E0[t`!I\&2Ve92ࡓb`:“R `bw0.4/{]a%uև.Y>dNmN)[VeÃݘ`ϥrF&''$͈Kpa)3Ybq-]N{UETHJx>!`ԥFaj"-IАӣqA';pn>M|QdH!AΉcJK> }C"Qytw_*rxXK xM @m%ńaܜGK,1GɆC>R[d%[Z@2+ipFn+>8?.Fcޚ6B<Yjx|pMxϟ|ϤHQMԳ- r| hX O}ÿ3<7gLo#{YP ARרi7U_ޒeKy~wiOۖ:6 lGa3 jl?k63]`RL,®43`~ I Pv:Z^x|_@60 6CeTΎE9Έ?iIE&E7'5I0d ~諒*3I!m9!qKI*_#cb}U ĔeA UNNHs +05ưJX*&T)nI5k\t 0E;hC^^B*pR׫.%qPKg<3W!hsϘ4]k|ʼ"OC7(i+! C=㭎IJܫ |{gK fH_C͊6+֑:;mƛ\s<:~Q6Kܐm!ޘdxֈ$>8?ОO^TGR&߹:]iHQ>5] \X4qkCklY?!yZwCh,WoMyP1Fc g?'i[}^+ OSm^H1t[0lg+77/[y!36caA@w|@ GW1=ux~M{~0ԂbavR{wG }1I[YHZzXYO:>-@UB{d$AcPgL{)I~4`*-7Sgל/(\.9TyO(!18M{ܖlr{I+E ^pnqG+<9y*?r#A V3ǽ&YIv*_FDo2)3Q%j( e,c޶h-Mʒ լV&˜C1| >S8}(SrYP~_7z {!z:MJ )ͶnDR6\|m8g䞶 RJ)eH H}PNBy0;HqgZXv>Y1I?6-!75CSJNdAHx!ւrv''}AnQ2|wkZ,ʗ9[>-Py0q+<; ~P9$ /|$#nA7ˤv.K7 0&DzI̦󒐔L 1 joT_i$&%AݘKc-QylT!0T@P 1XiX =xI?с?0m"NUv?yyۖ$;C{5&H5>>Hg@;& q=ai78;W\Xx!mAGNzoK[gCi^hzKF[*Zjp(*ᆝE{bΌ +Tp)F[ȢŌ&:#LTQGv1B^`B6* Ԙ=vN#Cރ)9@&tzh ROE=;R>~a_[wo߬Y}9 ἑ*<= Çf_o#"ԏz ʴ^I%/抵}BUp [.`yNr &  Tiۼ:)| ؊s0GbAd4"oo8@mHv>SΔ%63RyK(a?,֫xkCҞԯ[2/qURjg/ʉ8nVhK|XCS7qՎMPCIE6)\/Ҹ@b+?% @99D模$FI xYz[xXꯇJ+ӏ{9#1ir .E"'`Wjh#YyT=hV l8=qQ=EZD} G;}#tcЄ6F]I2#UY^B|^Z ii |Z@Qz+ܗA8)A.[91;WIa~) M0\!y!hRdiyLzù15cDc^3-hTR yyBR3( 7`o YZ \ON|fJbr\LqԀjJi%U9p >I %Ĩn*Q0ք&7-?2JBAŪ#@.:@?~CmI\ɸr%u U:\m++Ԫf&SnLh^:FX#p@p4{S$@y=,)\z B2&ݱ=@O 3,P}%IqD̆ 0W!"Dcv@/^ePã]DitWg^vX; U~jMIF~6I?y+݆>M~4?dpo}ZYP AQת ڐ:/|'x5YC^ƷUP@uZTŮ$?mm$1ys|pC Ȱ+ J*fV;~}c9^װ)* F^dM@#ZQ*g Uf(!=cHNzqqb|j`T64I3G;TE QNOMVF_fW@%JzqZ-# !%:_PzB% a[||=h@HG=u tA%񲰧d欙9s|oտƿIDw<rT:k@==Fm[^^xvݏAf>gs/EQ?RѬ6H*OwsitGztXXwxDn+tyhƆ?uC1~)~>-[~w󛮢EXE9sL 7PvWT(y #M}RiHSH $$@2KmٜI%I8B{cɐV ?nx׉wRT peM>+# |C17wcݿq\WD!3Iѽx['AwCsyx{ ėwCR AZ}Z.l ,-o?}:ǶO7x\3đz0$rNZG"*ni;ڄTF 8<@ZĜtOt51)$MVpP,)Pqw?셒0e+!2<|RRә$ti\u+nMK1?)׾,&=[lYWHݪ>QfRdcb_Q$"L!g!54DxW Xs)SC:R\ qMt'&4lwveaPlv4xR*6P~"EQdJGH.!W{ :`Z^~\Z$ A{XeYKWҊ/ xP^ʹ׳0~9&4 m¼N~{ʦGmfQH }r"|2qߵLHBQ?N}FQ.ؚs{+!UaLZy,h`F2&t$j9:k\L \jOlOJA|H>n-տ2{ ږ;1,Me7&M+{& HU$<aPb6pDJ;EN}h|)BIZ)VU_`/3*0"[iL6vU~fVz]R@xYypbV-=a@hC|UhnH`I^%o%6Nyhx;T~R "L[sG= ]۪v>/rP_LI`ip<qIU(\ D :rQ~*o͕j浏tQCyCf⢢#H ȃpɝ&U'~@6w؟3S"д@0Tr<ӯXM6^gΎ&;:̴Z०6~D{$`o <`o!`$@"i~{=CyZӆYޛHm];2戜[tmll [LBH nda,$BBB[$(6rw~w߻\Y9g<;32+Ȭ̌"ω5Q`l_ bBBD2a![+-v`nlVɋ@ eoțݑP>2'lhxdOQ#3$z C\3G}FPy W\,okB 37NLhj s]v{wl)쥻zwTwo o1@H@еo_AV={cx vo.yjw7w 9omiu83QTI^FneslcojMy1h1µO3 FqjȷҔ i*UQ@R R|LPRtm7Hf Մ{TqȴAr s-0<*fi.6*VVnX+u\70۩ᾛ2 !:pJ.*&`CiTpͻϽ-Re=?EwI^VSQWL o%AL!QQ1Ev@+e~C*ڨgM1sGOnhĦBJeÕb^v;~>ssGyǼ}k{-.@uik\}k5v=7ރ1~g?z\oׂ!-"%+@$ ! 0m$k (w"YѻCP8]'bgriIr5F{HQfkTHl%}>+q$lcDjmb<ĴʦwwBR#$nJqfŵjeש@Ald6-Y8DRۣ+W6 l=KL{'\!1CȈm>iս;:A0?Kx(R R R<+ZCx)dH6jۀf@[Grk 6Dr)Qr*XlGWp]@uw 'IiЫ쉥a8?u?36h{{^3+57+E_*A *ySXlbal.X"4|5+{n*/5 j\ZJԫĨʌˣj=ʈ"yϷB@HYohKʛ|ڬ&`t Rgv8Ug?%-V;.41J-C$iqV`/h|TJjG)*R"1J'56I og"/v蠳 y9=(jHv6yVCÌлh*sD>W%}Gg9$Vͻ ([a9fÇ9{3tu@{ _=Ccg&zO?\r눼7K+LnTE1uĘE1ܤTa 8Fi]; nrw-ū6W77WER $A6 7Vm65܅[`VV#|0"{mTV+^6״33-F e)=8iKtUI\5M%+nu)$FgۄgH JߎH4vBSH$`hXZ2tXSJ=P/j Huԧ$yΚP]5/i&HTb&}R h$H+ke79J<LפNTSDRT_~➾,] +MNWgR^YoWz(b=hTdv7iͤnx1G[2%]/}Vy*3Yswp=Q~|~Oa~M,2k^+Ҋtx*_I}]e̴o"9HбNh'ǨR  fWP'X5w cl:03Fvͥ$TV`VHVH{ k f&(3UCB%9Ib/e87l7;#4HH|8RN% m ُ M"e %40LQ<EpNڶ@RT tPmRs(YҠ,{'q2 4W -%Op!Ս,iܹ7fݽxmmqmEjp:j{ONF$!jݽ~f4~LL S=?Ak]bK';"tZԇE0Tj?| ;LQ5f`hF57E:_#JMPPjИhPW i^b+@^?HQG^ ssI*+H,ǖ1ک35uIF`ƸTv.6#fCOw9<5PwTōS)@ URN)/Dܚk3Lmt|+}'LJ4=#n[HsIџP@{x<#җln" (〮T3cSb1$B @WAl]He{"HB瑺Ip'vF]8jt] 0Z8D(2li0pL/3Syw8j݋sn@5hX媻[plد.a`koQ򻚿UbʢGD sI,,í1ɼ[Ua8Unm6Vq{utېqǤ/.D;xk0؟zL+گY,MEK۶3c5q6;QuӀyBҀ@ON'F-ݦ,y"۪OİRV%SʪiuuTA)`38Y' L9JPlpuܓZ_{ś{^/&On՞%H"$R!zQ A׫=EmbE{[ˮ:W7z~8~>bD䏶زh¡~1=Eσ(j1z:;5P 'nKy=8 >A`Ց9lԤV'oBuhvR1iڒ6F*\ -#uXn6^u As!I~fp0A̢xIʁvmy8YX wW$A3=NUK-RUO1EDڝ{ #l¤T/U/{׽M$ّ[wK+%s;jI5t_9w$pz&ZRjB +PCGI[T>Sc>-ڲ2t$Ep^[R1#uqS'˱R>u-"vwyNWFe˭_'kneecw73f?,Z$$T# xop@Zb2c?-Pc̅FC>qt}VjNꨧ86<1v % VWƉB BqĠ JmN;vg; Kb͏@RD$[&`=]R+ck õ"咛F W&A .)blPHq%ȃ\LI;fQv܏)tv;zg XcvY;Hy샤Bw|+ )*br{o R񓛦̄{W]'0YG(C. [EAs5 " c6b@H҈]8#A$6H}_#m@]nGBk0pђPsq6Y NZ. 8Jw r }jEe+4~E UID1pϿU6I6:1S\ҍC}D9 ] [C.ET>m;Z@ $]>$#$A&}䤲A{ƍ9wno()umSg@@5/^4z0ݻ=M &UpSt D hD*T0խ/LbT/adѹ Va.c~-&Ai @ ʥ~ 1)XKFRykKx*ځ"Oqia0-m&N- Q I]M^)[J IH}:n׃N=~!EeQUZ>JvuByi_V"g w`n>lo):h&&zbPoLΫ$܋iQ9W/grt$)lxW7ԴW_GGu[{|ml*h$:kϹ//(FJ8a@IDAT%sn@uk+\ujҳ[o>4, 'U@w\߻;Gn VˉTO geR/OlNd /8U^@1WHϏy@O 15!±#"bQ+5*oo :pBOkIG>|w˹; ~+@E8'Q59\ G8%y@>.[i]ɛ1a%bJfv)?2ߧ@-OX\7x9NMݟw /aNN'l>vv˵:kQb!@Ը;'#SƘn,N73T/!3@H6ow:Ilj{]6̌-B_Œ_\&FI81:& y75(\rL^mm+FsEG1 bki7I>%Iw.IHvr_I))u=TZHkm%'42?B~NbRLP:^SşA߿=1v2vB]$M\Px3hAܯʡjmqI[\$VWO>㲼iM@k)]{6pvg?:YnL43~@m+S3$IB>-d-mV{w®O>zG-ZE;/{z!<%م#apO`eKvep: S}T̙O$.]b Xu68p\+8/2qs*Z"yF]2ױ"ch#y[>>'rQ]@><$mC}xW0%w&><&rL)lݥHW:Ÿg϶qQ q”l,/Z&'éN.^fb?z)W~ /xoޙx]ڛ4+Lka#xt:Y͕goAѡvYu"{1˪v8PaKWd n>]1&ٞ`ۨQZo߃ Rs=y2(.ns-FM KMĘ"eIb 4xJ7ٖ:oT+LVU>%RRѱӵRSoR@Ԗukݹ@W@-%][(~ePm@ js06i:Q@F/q;n'^_Y„g{/1 ^49A$~Pm"87B%@i r2Ͳ"݇]8 n= l,NnTٕp]5l9 qmp 4ɀ&cv OSLz<}ʤeP܊֩6@0y;ב8ri}X0xk>sS_ bF<,YQ`/K<}{je0Yi:~? P {%2jP1l64b[ eꨕd"b51Vn0GN0"jRwW^wI$WgR[Uo/nqnZkd{7g#w_M"~RKWWvFͩ +pO䤷@9Yrdt] x2 CU؏scn~nݺ9Ny7#aF $&X[oя޹mҳf|a <7P@_)o ni"hyCߢsh|j}nY]h^-{z9r--!ꊈaFtBk|b쫍?j@'dQ_ 06|{; ?z=TĨðw_Gyy8ʢ 1[DG,nwS%|?#̧jp/$ ۬9>qkַ(E8 D5xpT! 픋:T}#4&*(Q>U Pwx:~uޣ(vuMtŮⰢ\iᰢ=Za?soO͗E؛7cƉ[,{Bۻ,oH.#ϳn `bJݑdb`wpY^6҇{බ')vm(yxId&kݸ5nN=sڡνn:W{?(@ÃB{:,s\q[$#GkG h[ifG .^bSs1ՃA{r""BB fab!EЗa ox8/ I@n rG)i)`@ULB2F0:^J\:soL.INF gO) m`)@ ZR]j?e-≘{pM_us,yU|{:7]y>)l62}./f'ݛ[X'_G:(%L=dBS<&_Z3,z#': .I/] *Lf JJڬv]; / O:xOL#A nO jgwEon?d)YR. KbhYqх|Po՝zsup q2 H%+; .=4o~}.h9x=wL{| JA#:g7 -IͳW,kwh,}6̺w'ov_DREi*;.jSF̄zs\~7- Z=ag\ib P5RHRE.y@ynkoO@MEUqCb&wwofg?ʓB~7hG~ }d]ѭnB\N 8jWU[+ iaqݼ)4 :{R ' >{=XEwF8wsyDE}B)@gW?*߮31Ɣ\hIϘ P6݆_c-6 uO~2H&S 7({ٝnPT<8l GGLQ@cT$!BTTv5x"#t%x>m *۳V2%=~/K)fUyTC!I оjҋHkj;Snv$/_DOzGo]5_567llOvdԭ- "q$mQ(C#:=_ t+EGʥ_(v ?G{."sײ`8BGRw?l%0K*xrEA4{D)"ҠȖ8 2G)F5=5"[1Hjέ5syg,20@377##58-hN^l\*/1ă6//ߖMz8՛y1)UhcOcgQ{8g yF2&.u+Am)ڣp6Z7č*},rQm\/6ݿۿ޽[˔ew/o c*hq-ԍ8T&.b;Tݐ+g SQ8 |hm+ qVܕqWLZj=늭DzxK[2 '&T%P5Dy@2z&6G:$Z0nWzcT^D wq #?wwd~["Jp!+L߼eBg(iwr+K% o Փ5 D hZ+'bR~Uj!L5@BȨI,Io M O,뢫) qw 8,d]P GlAm<@?CDkx,cniz=|_CRЂL$]+[˹|.2ĝw'* e٠=@ 7Vl&.= m$D Aͩ@{as"̺~νTj}ۼ8tϾ]w;m>[B_>ru~:>q}߳S A#ΟL\g }ӓ^w dѼ&`saW ;HHBz ;ї3$icTVGCԱ:v>Md7k ~I'B֮3?~=z&ݹވ[J+ʛT2n6̈́hZƕas%HمYi0%3~li\SW6)jԤ`u>)}QEԲT{`b g^d.m۷Yh 7N-7nJ)RAQ("I æj-/~e}|)/"9˳îyl;$,$G _Odl Vn:YDfXffNNj>©;&ڣyŷRt޽3CϤyyl@߾,º&I[ >y'ƶD@zo;f[V?ۿm"ޖ5 VMaa*ܻzD]rBDGnٱM@&p`BW;B<ѥ=y Cb=onuO}t&g/$Ru~5޽a]b!~U\0Tt&/zh17:B=rm5GѷIߖv# ]VϹnf>IW۶%@P1s ޤ{T=6P=mG?2IHX uz'/c =+eL~Ζ'8 )T, /'B32hU RLfr߽Ј wq"^ ZZqϞ.Na'h%@$I8w.;lNQS AQO8W #rp#G!ӯK%zA6Kh$$&P Һ"--f;Q]rT1cn &7N4HҨɍ@]yG`282IоwGuOs:7LieZF1|؂dlZе*ˁZD ハtGS|Qo̽lԓ& T6:Y\a wU(a~6{}s㹄ٞk|&C5fJZ6*-{*$@mx>e I5~57p36ι Xh,khgޓͣ5޽{-Hnr⩃;:藑@F/;|Ͼzx &)i2<ꝋZĦ|.9"&.M6;R[bQ *THFQ޲.#r1ɹvݵ+iM#iIJ YMjoq.ZpT2u ߎfUIZhEg%@Rжhw&SmQcCAhP#z BIhZ/o@K2$: TVY mo;DžV{+jїl),fGSbMOe\맳%|#CqV*|c8m횫t:(a2d܀%j+ 4*1i5"Í^ 0*-')E"WT}$:I%JIprȘݏ^oViMY{?2P=ЙL ;>[C\DdfJ `<բgOxN-]T[GgP7pHP*E6+X \IF 1QV PE 81DWۘZ2yP8IP6WEG)ةoPGhm-6v UU{lur_E)@tNgqr q;%/Ak`mJ؈s#x<57AZc a r/RDQ y^ NR]Q*RSn*wHZj~bg,*[61 1gc'U DU:Rw+UnC;іLH2{/:(Ck^guL7f,;-J!`oYR/&X{(ҎUs?}BmZʽkχ$oWF9&SIwfcTnɴIJ&S=7PT Q6ZqgƧWwo Zݨrijp%I@C 2mz DQ)GuFEU*{xj`ISK!99&8j`O=~|R$b,Y-tSJFI$r 6%~ 뒎W!{ZԠIZPq+%ioZ]1S5T 譭CFJ wHIWmLP'عW=f3%7joXUWEHH@83 W_ qyͪyXYV9mco@zN%xʓq؅V)B輄A+@k[iQGRǎAG!ĴsGR AG&Hfݯ /|Vu[ww\q'et̔8٘*abo$Ĩ(7ccվ0cxlq.b*hP!N$-JĖ* ӝv;0˶Q+, 1L0 E4zcE5;I>c/zzPD:q[tW5T*Hb^?Iqi1N;Vj?GTK^k4&?bErU,#씩N ;2 {iƲ1'[97xe YZ Ǎ!5GTI0+@athѷ0dO@3gu/iӈ4`Hq g.*yu8*jHEbgCΡ0ygKsx,}%ys=G+V_)G iK!WǍ{r *6'PͩuWͳwn/⃨Qh D hD,cU'>4f~;W*{oGJ  0-+L|?! -u7@M"5`QDA}!  tM1qM`G }RJ ]N!,&-bҞMmL)԰(qgߘҍآ[T4C,1@0I1MQlX'Œ7t#{!@&l*8Q$q zTE@k<  t%/%fR ţi2XMKn6T0t~B|@ge|p߾ާ,]4ObhBN/Esz\cGFl^Y.긱T>Lg]IX*48LOD0D?rMxH!%j6<&ܓQk9tT5iSo%{n(1nn۝4m3ɓy\ņ[wc2Qp D pDWOAj=Z]Lknmuv46Wz'~h0x̻žFejv;0i!> ۂbcv&Z@JNLsȫ.(&V[8\mԚ>H>5TF6P{$=0{#Il1TH$p~bG-8Y`M_P+e~4 <Nv,g+jLLW\?bF彰-[l•v Ϡ5O`7G s9cfp?$k:C$y^ױG0@a_t% H+H[ۨ:jЭ¹4vC7Tȶ?{VL?t;94jy D ,ԋݥ{;U?U{}ujN% \췛Na]~w|TFpYM,i@ !*pY^ .'Z8DmS^aaUJ],rxPHl+lOd#K鏼5Hkz=K]힜@&[U6\o3Ef'8hr^ĵ{lfSu"|=?KIP5䮰,4%4 5@` >dS5{ϧXjbTvHHd kKdS(^m6[G)ZI/#i K4R)AB\`K\SL ğyb= L n~락=J]nTŹ|Aͥ6ޙ.0đN[x/-(yI,7 t鲨L)p< yݴ0JTe9=$ZorHn*m&8={>e0(gf5T1r1wεkn)j^X**|Ҝ@e@7 IEΤ#]NQ3[vl<fUչq qv~dRS]R WL^;t7 b :}(p8"t8]P`չvFG?z j9lbĄE>U9ئQS~f , /vMJϣg\Gu2lU@P oؿAfh/+Iꀞ&B6'WJ|zrP'ʥ}¨ -9hjsAU2Z&#j?[unbkUTK6[$fhCT$E:yJbL@'8r&ܒ`YxG8~F1r-ZٽxSoC~6F[3+*.IbxSIoj39 ͺ*}&oyh nG161~ w[UŔr~ZRͽ~A'aԏ<(>r4K\vvXdz'ef}- @P 0IW@5G@PXc&/h_GQ%ڮP 1'l=JF/PUnEa%Rk/#u*?@ofAʣ'ĩ/)'#DRŹ.0VvB> q#3ߛ-ԳD8:.>)-x̋D$LoNj{OG=yuK]"8jpY !L61dL=-'f1ӊSffB*ボٙkf52@B*rPX!Rzl'ށ6յDzS' *,&oHc2#jG`׎ )L@5NTmy#1jcQh%BhI[a,\Ru{%ybმH/|柃>]]$t+͆{b6w>"=}-Y8̅Vpkf Q'UaP ;f&Dߕ gRm+H\s uڸ{Sw=&t"7w)>卒u̅t \Dzc'ͲHX}/!Nl&Ja -G+ƅvvbw@N񶶽]sMQ:Hpao%Hgn!sw>=HY1yV+"UY(k5ljHY#g\dƐAITMIUaI<ɜE yGXI̖W+jjuIӆR=[!{c΋墷 )pO>_tS8E t5:Q}CQL`D043Hs 9禧ϙ bQo D oRE7 LM&q ~˗ښ wۛ³=*~n:yBܽʝM[`  S%7MP)~a"F/JIZtbKBl@WHgEk3XEbP2Ҡ˻4YL]V ɡM;]C8o#G̐( ٟ#F, Tv$JfG0\bd`ILK'|=,bw*ջv@;3GuKb+:jjuN(` DU*rVq^4/ߖC h(6 6o)O &@E 􁟉FֲIMk^0-q OO;\ν! (P AC;T~Uu~>~yvq 0]=3g?{N>zu1+8jKž"Nndn!SE 0; cnuQr1Jׄɐikf6Pz$E(z}li3(()]HTIH$B"pDVŸ"1?HL%/FCM慔Hה8癩fX6> ՚Oդ?o';**p~\q+ D"%ږFLYIG}IMN&|ecy_[<0m uT.fy>6?$Yϻdw_DX#+*5õӟcO}`'DEygw)f\Yџg7'K< $?3;!d$5%_cP:Kz2UAM ӿ*MiI36c7]GPC=Tp^$hmlfZ %VӥI">M$:;ݨpqeA94-6bUnq ۆLH5&'l6`XkGJ#| ܶ4X;KG&Ꮩ4qJ21}"K D71F5$YBGCGvGHHG7]ϖON'=v>'F/E?:>Z۽xڒbztvF,Wu8@3Sb!8=;"g?U?W,{:a:kV9kΟyIzHҸ h"=#1)"¸]ПBsV/6Wm-V*ޫ.{o8ПH*X@c07x8+n :PYRyU1t 85F=zD ]\q4?@|[p/ܛ媹*Iָӂm3KMM>: ` H#we5 l`B\M$aH{ FqE35R{Grws^)Gs%wL볕α8US{ufȺo#9^ >уG X\nd UE7>^O]@F O|bѽe!l?y~촢旞_%+1|32^H^&Qy%@IDAT#i'ul>#`(w,?APPa5CRSBl SR#W~^X߆JR,x$SyTT))H$21B5-yJ\Wֳ^eMU8!pPT[GP6p-$̃{A!\i )N]D=Ix$XG6wnry]cv&SIS mA~1$ӷP{0 B ԭX|;fJ 5>]2C2  eƛvƢ}dbjpHG'q\'u&R{8Q` D hb5]y͹_.uv+3ީLeMh.,U?¦V[k1Up~nʖlż5Uo%TdHV~P[d8@P>ݙ_}2lcSM(!*)6LBdAXHyLQPT@Ӻ_ne$oۅ9C1K^΅w\T] TNE`Lg-ĸ OPKq%PF{t7ww}\)T%폟DV#yT.T7oyArXOV#I*-&2*9$@suO()D(&`ܮ'>YC n IL2 +>虏,&\McH"t'@u.il6m\਀Yٮ][JF>[mubY𼈊T9Ngq6YtQ RR1[4DI$h /BRx*V8A9[Tr#/i\~z7zfsaK~<7#N,ny59Q\D[[8DUP1SFmQ7O]PI}7O:h.DQ4@i6b_h]wi_ A,[PߋELӝ^!RtK=H'Nn9 عTsUex@UtIDI.kGRFL_Яt Vʓe34@R啧a:[H䥬zA3A_<³vIQd)8 rȃ&{T A8:\>!mmG:HjunzUAO!uXc7)UH}Gs0BZgX3wc.c #*+9Գ+kSА9T]/x{xNa2yDA)A)6bK To_/_xU=-Ln0sΥ 3; &jn; I٥"ڎmat]S@ԬI+pF0Ċ)oW(@s0hCH2&򨆎du%k"1 ,@-jthj&16y *04.Arp )vQ KIDƸ^(s IjAXs"9ez ,ȩ`I#6Id_%Z) <ZSzIxVGe=  /} msq^e1׸qrIzhnutܺKcZZk昻us37|oDS Aݵ_Y^OZ+1DŸS6ܔ*X`OS\JNBռa .)i.KUٷҵVKYV`KE,>%) t=_g[/JA!fٌuT1vvծ A4&;9OGgZncPd>6ƫl!lH}a^(A Sd9VbC(5JOK|`s`L9FÉw " XMh*g538VòkбH6AQ6jpuvE1B(kZroz{>9FQ0$)Ҡ"4KvM~7f :=Ŕ f3JԹ^bU\hP$R1qCs{W7>F]_'EWI}(H4wOJ$;!vkkdǁ _<@ۤC(V^{~3=7@-(?OP)_e^`k_3VP =l, joSMao3>nX[V= \m呂\Ia 6FD `c h?\ h /ϣZnd֑%MveX)iy_VÉ@oʳJEK4RRJSh?S_7H\oݚtwoab\3bll9պiPI&m˦ܓGs8/qá@Ck |j5[ɿ7[شw86ޛy@P{~g684L@REb7; @Xߤ#I }]1UbN.u<#phKÍ ;8@S632 ]LUӈ.ύRْ Cb02sxX;gkw!U@OčaHP1yBy6,1j[1hyP@SMsy Qao/L=;gG}X粔Į*Rt~0_jo\MZb TO*,O0DdHDF}0_ עcDaP aq)QמGo]{SaH _Lx ѹ \E0NSA%N^d4`IN&}21ZZt~]!2apq D:j3ŋM\iy^_Fgݻs-'oU~RDQ AC#h^zWkO޽_ѼEG#q u)nڵYi 7tҥeήW&KUl&ZDlɳPߔvl?oZYI L$%bm! 'Ra$ VLy#F>벂px#l#kad˫ϘQB,;ɖ[A.p#i̍R(I\j*P`D@3u/E'%쁌?Q$&;kHcn_}_ FbnN{%C ?ݦdI4{*wOآo! Tq-yu lnF ;'"xe-0fi)wI%S3r\):N55/̣ m1xn'?qX{Jr{x=`Q:40U ./q0kTXgf{ͫnqKD_@&FbOo-vnoG) OLSI58BlVq.p=IT6)f> 02 q7USK&YUrjEA̖Yc.R8s9ߒC: 06Elϒ=ǛFvS:K.eYy! XlCHF#G\yS8*r)0 8HL N`ƍD2v?)<*0XC[!c:'! Xʍy%^Ë]O|=yF:@  i[1]Q-Ff8BRk%PK_0mY^?B'&?+1AR~h}I $ϧ3e%MZ]ʨ؁4@A픍u$-d-0s%Q;ѵ% d8@~,%;{5^/Os֯mIrY`!+Z]1ϐCX HQD9:0B〞i6Z֨)X#Q"An uw L{m9^L H D $A'N_BNf9`XR>LB`1,&vLI){0h.եW%@o*I亀N?e\g%iE;-4뉴>[Pc_V[?DN!L5RM!{Dy~Ϻ?7e_>@Pyǫ/@UotQ)]]__#.B.B!xe݁qo~cPkL6k1bkz4k]oyZH%s >ZQV0 9ksMu$Qlϕ0ZX( 96Jdw2sn.#6gVh}Dc_&Ns~uxm;946Z̳iKCC:n= M;ZᚁhM4FKD~{2`^o|;ZJf㨠@Dlqz%wޗ`dH _bOW̻|@cQSI¤h5GMWpn;ןvP/jӤ&*Nw.cz辽I.yS8O 4F'j7>-*$THƐ^#xglbb~ N=%V,%XO&@ )LPĎZ&uOv'06.[M 97 NyD3Uc_b֗W4je͓lʛW, o +K'rVVFa Y*.9~O$NЇ<0Hثp6 ͦטP pՉz((D($u $oݢ~r|x%M"Hx"4v@s~|i<̴Rܯ}˹-_(Y YzTnmwpw[]l4DLUBdW4H8JiעwM7!^dQ>A+ pH09DʪiIP*} qkDeSЮջ"IVi4Q^CѻQ6S?^a $!Ed,~'}Hu|0کdN7tW1cu71ڋJ5zP"k@5Azduim,D#Fc{ڝ j} *1fgsΝ~T{Jeh=}ZrO6"=E#g{Ƣ[ZHd=1VyB  t D,aAi/3,>>bgKbf6ß[BbL^Y& _ Z.>;[f!m @hp8&E@3: NRDߕv9rr'(@P'8hy0n {ooE`lͨ0&VIhL_/#iʎx%qn _/%]""7S(reyZ߂vزJ̑v@tZz (0%*n>]psfv> ĈdpʌNZhB,UiQ 7V}XA! ͹ՂM3B .[M"zXYFۅ?xSvmݸNP.a^A4lૢ[]Ǵnf}԰mqd[Rj'r{>k# ta,w=\mW+b+b40%xPH" ÎF #$H'vN~=\#0Bq/Yrh.mzUI{("ܨy  ̻fE*Lm&pщP^8 a8R@ 9|8Wȏ ^#Lk -_r D*+hѤۼ!?2|Z׷j D٪#t0iZ򨧫iof񱔻{{溲)PR(򥐵?3z]t _& +6Zzhˆjݚ8+{h(%u* +^ b䝮ެeLvb"ZL* $M22ZCQ'*\ͥdCEo~G EiS^3$?{[H/K<ۄil<#hhi"_n'h^۟ېfh(ҀRF=Zvϟϵ7( qgf͜K꿑ž$L tr>5 ]x#gAq.iügd穄ޢEbE!/ m9O.LdӯwEVeַC A\4> c%:i!(`+|IxjU9@y%h!hC%UJ3} GWEi̓h~[W 蝔Yޔr)Eע:,>N@3?RGa>ӢƦL'իy7g R%S ]2%{Mlv>J|s$1ʊb_(VS<4 GõG7_^z>2r`%+Hɯʟ]kTke޴iV~@PV6#jlS4@DHK*Pb~n~>&-4,"p]jGߖ(q0D"M_Lmѥ9EZs"F;16v8ҞG(ދ];ۑ`6Jwn=6!U)&͑Li% {y:I.}\*/ܿZ 5atj^&Kz)|edl#+b{jfS`V,,,¹KSh.lɐhsOjL~ݤ ?OKLfp$ڟDMa3,aM `r$;>ܼ(G(c^F w (YmfNzb()yܫz@ʕ4{q@K۫vQDm 832{^pAwiQNgs6 4^(!@K@{{GjVQrՋw?~vvFM1 u@>ʖtUdH$:!i 6534{xr!.v2!HN/V?-MQ?q MH4>ݡUE8EWܪf.a 0v$ZLQZzݟ~?U)? nb\~d×[ԃx]?~L䞽يMIpZisg>0#-a[33KtU5CzkdnM uhJD0V|ݡ̟$MQsALV)D6 @R_4V@ET 0-u(d+|z~N@|,Nd&Z* zqaݽsY/00LIuhzZj~ӧU3*e'[unfz}Csnr`.vK@AH~V܇?,}69lFi+˛4$E3'jK8G*SjE͠21uާ5Q>{D`B3T@~.٧ubIGK? $0C+KtQ'TIʏ- FZan >j/# ڟrڭv=dX՝kAIBCK&rv"7i/(^%+EDHr3$ 6:/ޚ+G r]IS3k*pS⟗?ޮ8օ( 2w%K;;ﯥ<_H 7&61+>Ծ9/~ծ:Vua jNLoʕ".nOac2ճ\gy%@C eL% ̥\,򞡻PBRa 7FDX)L$Ҵ}Ir&1ܮ$k6&8B pM`" m1&?Gt_7NdrDsQ~dzBo]ZC8st'Q`2-ۛhnɑ%_.#Zу@ө]Ю;MHB: !tw?z@9=3_g ūho1] b_/$zx@[}|\z֝8uKk&V ñ"yrtG2oI\]7/!@c(@10j~w%ftWښ3QO"h mF+ɽM@ ]||'0ZHc bHFN'S>%t=M2a "Y0 4c .y6EO21yݴ;Ԡt*:x`M0"i|oрCM]Dk\iT6TQמ&?O䄻};c=-N_\@u>qc_>w@p[UtG]a%Sz6> ! tuܗL_z{LK1G EN_V;}Nu|-dj!0!Ål YK4~}5H $!x-RFc0Ҿ0(4B41̸͉N"n I߮)3+䎻qs@U"T} P͎Ӡ?)"1F=a4 h']31>eqFu,5'm-ЛunD܍DșUQNх˕[8QtgtMR7 t7oάgM' t Bu*$Oʍ7MTL2y-J=WrDQ̘DK)&՚z7<$uM11ʠ&hښ'Tv DR.E}⒲",Y>D.l/G ad-!\1u#u' gz ۩F5Ti >MG@HEe-H|`J6lܩ6hAϛh\Gwnګ~~>͉=`;EJo/Bիni9":m NvMG}]* ⣏wW0Z_ڿHZCR B*dLqV#Y0 m@II7*"\V4F "iF=ya ;Ÿ]ǙDL'@$Vhvd%vp۬eEKaǀ緣ڑ)tvNzCBTWQ ](=dw/Dɩ #8 e^ޜklǏ_mqR9"'$$沙"]@0 /%r??G&Z /ؕdД In{Ae׆"JY2"&p)/l (ajτ m{P_q齜͍:HvJjw%(@ ,} PD 7~^cENfo2(L8<ޞHYhmhhT#Rfr~O֎x@;ekDӵ Ǩph;p] 2._DOFTct#zf Rozp(U Ur_`B XY?Ya5Ơ]'GMy\NU+ErŮ=uBJ3p3hA]3% C.IU_s )?MI>7p=s}{JRzn[DC&? @$iAпhjYDB2>]kBѰɸoGHq@*ķO/`#>$Џe̸ܻ1IKcQ6JGmA_lKhhtl%vѷ/­ro~ gݥ@Aݥ XsIo|+0h,1 M~}0ΙĐa 53xo>ф 4$Sly%ewb PF3;8tg~ >HV7>-cIJ$c3Wx!L @AD$ϵܖAe"MitN eHGS@"4 ['a'@ ?pH  Y\$qSs e NCFw٭CG9.;TO6]""h<Zd Ls`c. Q""c)f/wJ7>ׯ7%*9[̪ >M@ ,jf 4% GK2!,2NZ|AP=,Ⅺ%~rCY\O,ڝ_{D j`Q, Zc`]' f~@Z7t`j݂Jh裀$J{snIm 3aJ5 *LmzO>K=^N& 7,D-1ڭӥU46|+Q ~!ᖖfܕQ:]ΐ_Y( i9~ʷE0LPTFο!^M(Mh:8W",c@s1#B]1ժZߛrF@~M =Mg@ 3@M'uаee  jv-4~@8d h 2n:RPԻBY;*uǢ  ţjK|Z7+&3ɬsk-CO9HWuL\\}n)&@f+'?zl#=?b[@S u}c;|mYQvV|TO19Uh2`uᔇT !7  &h0O'L ~@iL5l:")aIQ3{mԋnƕj g0+yRKx&~>PslFGP 2T:J)?ڑqE⯲'̭Mw=Wphz/&!J Z} NdBѾHq^CDFߛcGm&Uh'R~CK M'r|bMR1F2wv"W\!} Q z@9_ۭgn;nn:tÄEnkְ:ekni!X=8p=P[ [{*c=(_\Uà Xfg*Gi"LھvMF@~@h"$wEڀ^$>`^h3PQ-#{=X[%zsKt2{Gs=vKHMb"8(^wީa|=*T$#Rc~o?bR\i~-.ɱI#$';J^ $&Ŗ=73vߝM\_?O 2fI=:BU"ǥIwy7m pr,ex9Tiɲ'%ԧ~s,D#M+$sJ]*$,{:_n|S"A"F)L"i$42]]4)-d0ZY"d.^UE2Ĭ Q^J#ͯ\@;2C@IDAT4Ҙݼ>~3B?Fe؎ w+:VJm[z\>!)rkεwl<ܞ%ѶR@)@PbstV1~{S&\XWX35(>IHFl_L ʖVT0@-U4A3hƓh(AzUK&U?q,gߠzk+JHq:֚\Nec23 (e<r*0h"a)bUKL`48(Fd8YPK~%V-d}Ie:G0G;1S%{٪{8AG#G"P;ns?[:BQn: FG~ʲq##Ε}^o@o)@Po ?E}{>r_L1 sh4-%0{~β_$܍: =N.ĝ{~/V^R_R͊އū5Owu#8vO.[ojrݽ;U C! ꓆8;Nթ|'E,bp "vErkM+|x"AJ|ZBnS  L  -)^&QrX*nTnﲺHi X}_|Y@@/%BE=Ore)Z w&Uvs 0g2MX]5ĉ(p] "4JC(m5-(|2@jt:Rn~,7]O^XmRC#4!jS)fD+.GU<$v ܱ)c4I@H㓝reLbB%RMprcq~^XL2OP8,C; bG4Qe;Ob |C4ajÎ̢Y^K2> =.ײ,XֈF/8 kO[j|Z'CG`%8,}Mÿk`)6>☓Vm۬wWߩSj $N} P|tJU}9N&z% ӘU(# %&Sg{4Amg}i(S@DI=Lx~~ݹE ˛=9쩝BQ]umeB8-#1y(ET/2rwnM8C # GqdQٯ+w ?;˟{JHlYxAN98~ͶK-Mfur6-`w1@v%Ѧ@ zf?gEgqhNެ;wʘ(QGx#] z]YZtޚ x*鶏5\ O-ט-/xU{v< io%m"~\2%:Vv ޙq[) B d{DMe'3* /5E@̂6;ƽѧtm#~ `" xjK. ICWRx}>ӧkl::6ћ{&Q5Q#fIATSN$!$ODPQhY6&%'3% )e?%R8q ոiR #bn*Sv[!:QPIJ( VYģp&j_C J>'6O4=9|\H4?ӄ6Os { 6R>Ji+F[ t_bxϦXF%WmFl7% XCyIihX@A w*DPPZ0P;iƗL '(Ӻו{Zʻ @8?#M"z7QUo^_rWшֱuh) ˕Ʃ\EvyE#fil6S}E˺l1 )P(@P5 ngϪϿxUiUFL j.|TFd)sh/)/;ZT!E-L HHVCֆVl5h1)t6Ya%GFF.'hՄ43<3- 7 v[TGHixW l'Q7%)!\WYh&^L|d(A|]&yުi{ΏLH(8=N?ʬY\ 8fg HJwlsVF#$o/QZ4Pgį_2x*vuua3H`Xu(x?xo'H}@ND)y{IQc]AuAd7BᾺ6vѶRG%bvm--%kciw6Ep' Op1~RV'+!l  ,[1LKCԈodкvy~3 O4ZK+Ǵ!#<*'A3, |.1L|?F+ޚ|c8\ZI6co&kF"'zIMQ\C Kq ETƅzj- IAgGUv] 0TEULfvGy Ca /DP^;9j%Q=k 66k/^]^:pe {3ZcN|<(U Uremo&_\/=s-*#hM?}Cs JFhBtIK/o@ xܯMc:3|>s9i}AxGhˠ!Hb╒%߆ѷpl}[0 ݒf y zlOELhvdU |v*_@7 )/$7 `k[4ڽ Oo)iG= ̭U76MZr5fG>/Y=5  ,MU~9}Wh&c{,+ dH$8L)%}oRs_([PHYD f3B՛{F5Z j+Kƾ91`%)ZULfV̥1^ϓrz Rd``GIqft5?"|Qd$PJ S8i B# D)TJ&V p!9/k m:khy4i?=&370puZq$6# zRȻr޽ qmd&z{훨 x};h&7?F7vRܕ 3%` Z Q+JTdgAs҈R@|;U 79s;oXG3z(_R47H^ I-JZ$sKnv.^(w Ϛg j'M}y)G|+ߙ_qJ 1f[ULH&e6Bؖx^1SE7!&lk sC Fƌ WAVGpЩ"`&m(g|= -D_{/6Q|FQeiҰaNg 5v0S+.Sď.۟U)iyD4 wQku_lR|0C4<0/[St%ʣ"S!p3YB#)~@KLc66AZ !QZ6O%Bڈ?1)i?i+>7[GG^n'm[@Nj\t$6JhV6O>>OI 5 ) 9O[/DͯF*$+!m+lT)Кq(E79xНF:%ؘCz6̛Dg͙6o28g/@s&cF}My` %Xs *+ڒd:g)vk"8Sy&/ <|DNx}N;?}B*m9[i_o5 ʢ#3)O NTΐ:OUWKq ,cAqB?I!#AgǗ2b4ߖ(ҦjD]$ xq_'j)~kD, ^z|7TmđS:(`էyv~DS`{Vr7/Z\kwssy )꣆Yq+"Yfbr$+s4/@ʓC<\U,;~p&4rhyfۘf|7=ѽf?i>t˰'WG\[g=-N!Ɍ#}O`$N~o^&( چ{΢ſlHDV:.9.-#>lʽw{R3"|@~@A 2T ?Wk[%$ l"Fo'2ɉbNo@{~b~5H8|si7D%=qCrD!g̮QM@룉5|B#<}~  r>kmmvdž:(A-mao/K>:A\dFޑXպpQkdD?88{&*(P2lG)uXo˳t)vt*ͷ+C->m4(w<$F?vkoN7*5 ?SW MX5UfgI8&E+rf-v$'goگF =vڊj^ tK 1P"VGgUmH <иX?F(! 1^ H]w3WVsGzQ>|uiԬ7ܣG\&-PDܢA7~}O/.rAK _?>kCOW ?3xZ 1\Md7g0]W`t%+7K-rfm[֞19Qv?zׄ Hi`W*=`Z v]}Z|1뚨 &N hug3u7f&@zY]9J&0p#zbxַm!DjdmѪO<"yBx~ݽ;&Tk=Al.=|&s-kշ_9G02F09kk?w %k= c > YgEr1m94b/ m~? {J@+5y.?HSk&oIHVNY5S9K2EUaNiWßQ"1/`9ֻy7?2_w_>.F:?~瞿`ËDc`V 3nޘw, {@~@A=nZo4~=q,CgL'wvh7Eh2-9 LNXGl)Wx-8 R ϰPE &:׵U#8V<Әw KP=ęϟmM;oxD ;(M;տƔwޖ.X:U^G@!Hx7rIBPѦ@G ==%S)%ٯ!9|x~";'ݭ{%΃%hr:XO/Qu.˾@ㄼ)35g:HU)n]@TY.6UOBev!I*6(AlUo}C.7e쌹c/LcuG Guk~z:(oxߣ7ĴjR7kƓǼM4wjQ"zm_Lb$@ 'i ȮݿRO$v Mi-ql4oIX43~x_xѦI.\HR| ~oIK@uP( =[^nmQ38ӷa7l; 0-qBAu!CTPSnfܬp4'AE{]vNlZ@*n>y,?xʎeֻˍ[nf}OzD35?bcѓWlP(#Mn1vvuBS @kxAm j@QN4SUxI)(BiܭUPz?j OҨQ@sh57=vnϺ?ikf{}w89 ھmP!uvv])?@A@A=h%N\sU?x/&fz#z"x&2٣( 7b/ښ$,$@! "{2LhFTGxMD0aFգDL&ܵqw@s Sru:H`Ĩö(Uyۛv> vNpgHͲd(0xUaQn MP?nS?'1DMSV/) D~p#yl4cA?SecT͆{+?Aso;:<#EO\؅*("Fݮ!xO6wǃ|bUbĶE91" \.QdKl-s) ˭\=PS@HJpt+ '@|padT'0Ete !kEq:ZY)^ge*6RnQwkA1so/qR&o#nҙ =2 q ՙH;wfVZ h٨ERF r[;,I}ar,n;I,{0lj}vŀ6K޵BPEPo j|IP21|p/7%RHl!HK9}Sm? m O4̥HY v gO1fٜR."7Ȇh=~DgzhQF ve-'LQkNBkU3{r˜͎ݣ J't;J`iNK/biջhST^)-\6f;:HwqBO_+<4?1_x<v?M,|sQg<gT75ƿj˭-:YyR͊Tݽ{ew3tּ@.JPޔ~+ŋO|csFijM`VPRv!ً-,wJ̝Ɠ|pj E D rP%"\rƖ/6Mm!ԗ^?N? \b^wﱳ}/}}sV![z |VĒOϖ;SH8 Xe Vƕvu3=Bct R3ߠ2&tS-Zs>X EI9Dw״NDž82xd׽ *QFsg͇ۘ~!"ͺC_"a'pvP+1.>4_s?S_Ս]V_|ʷ>o+YYc=99>AIl6c)'$1 iTmd+;o 8+l|dpStMCq ъʄ4lE{Fڮwv: sxGom7ܗw]4yGi'Il.!$0-| fҥPՑZս7~6<|Si"bUD/$}LZdZ֬/0@h DYIJ{PdT-*Dx? E"WB:_._б=E$j.J՛O 0qwb؛j°7 G$g&sYvwC,RTvD҄U=z][@W?a±'㉘ޒ*d2?( Zs9\J~g}vH'YĒY\ (bY'f@|k4k[xD2L1)HrM4AB_{|F9o_yϠS@VB $_~k4( idIߚ~p/{SDh/'ΚS~AkRtMnɸm:[ H9Oɖ]B \ t m']N7ʽxΌM~]F@&2_ u$Wu7R~` YDMs) yFEd"m{±78שѮz9(p$Ƕu)&EaEG Q<*GG5:5K7RŒt>P/X!% Obm⾼UxmΑ7ݵki_6! .{ L{gg ѫ3>_~iPKxLM!j;ю:L eEf/ 9^F#@`ZQFbJ:ͅx>"gTG տ!<-gOWm]Z)<>Y00eI ءNY_zJ:L~@Ib˝/|Of$$a>r50?+A]`zIZS?x P:*"+廀ѳGۨN}޾}SM*=ZbO?f@IOU %G"#;<] 3!X#4 i=;Mkz|/mmwR$n%. htDGU|g ,ŒfQI]D2ɽKs֭1fKmO(0 mʹw>1u$I`+YbJ+#S}Y4Q!?=(B{j@PD@`"5x`!|JieEQc_f%V$Xo B&=7*DK.I 7)ra^3ɚF/i+v5C-@4iZ{Mt?Ǻ5e,1#2 PB:1[nr EfUuQHq}[Պ{`~^[_9Rn^rsslcٍ֛Y`R %rϪ{~"^(btk;u_JVژ-xKKQNfR#2ƭdOAhbBJ~co\QjWESE} Zڽbʗq; 6_j`GJY!mPeBYϔ] 0Ik"?!PHr@$KC3}[y#qVP4&* 62;oTm/&[w{i}˨vDtбѣ]L i~8rAA;+1ϹO_L@MZ`S ߦs*V/^m0WLNh""t"_~nᰑlX\z5 5T$Zhb'X~[L VdG?mJ]9 )bh2^yXϹR >3Sa]VF2Wf-@{&^]7Tݍ'jn@Ƞ9pEVRf20L՛Jō*S~>wRxkJ4uC]-JxYo(i- <͛Wrd[R:vݻU- Bʦ}QT 6 dTիه9hXlm: m[*iYGhfáVqG35#y VBrdopMzSfy/*t0៣MSM(XZ;\hbQkUgVRw/ڬj%6eVҮĻxKdrBpu)Jb' M$ nw/ñY\2U piĎOә>n҂fN4)iQ]jT_#x৯R '+}P/C97Ad" My)ELej`D~3M6 q;SpOh'P)@PZqqw{}|z6eH–>⺚G`i*hɐ"e `a|P0lST?]bXm/Y+gc$6@uu 8$+Wɠ>@__JDƍ5ʰ2\ؑw h%Qbu?&F9 eETن42# -cҐe fj)-+7SgP1_6FE?zlyaƽn%CMɨbRM2i#E93Ǧ{vn RXrxj= @A@AhFvW|{=$Hzb(oJ,Hkǯj>ؚ ̩xqj?z&$P@@ǰݾ(@X|GEmˁTbZVHY)Z" &o"[e)V-G4(aMkF4Bl5Oh4V%I;zm%`UPJ &cU^d҈Q8#>cMیa(NGm!1F+9FBuW#'=?z-<'6ݥnFi}Zw^?4 d&ё[AS>w^acc$@@AhJ׫ӯ] vyC>2~Hؖ!t%z3u5pOK P!LvORGHTWQD9NߢsY)7/D~i4I ۤtT=Vȳ53*Z"S $)q-Rvɯ۔MqkZŸL2O`#+:W`_Ƨŀ*T7t遼Df"QSۿdDTXW}6M5c}#H|'4נʲ79G'P`H(ICRWcѸO?]w^#Xog4ȦG$#0@;kO皤$ yfJh!$H?<*(Pf*=7^sO4/ {t唙VrYGTRiĬ}?Е_)ɿJ8*qiS R%I""R@}8I{s88Z-~qtcT.C QO5WF3Hݾ[Oٲwx uŤ ^@& kpjz]q>% (4yx)@۶Tty#NOI NtisyxYEʊiS =|$keW;릎H eiGג &riJ>m)YE8ۘ['[@]*@1t 6D#`FHϱKlDS(4B)¶h0UI3)NR@"cܲGS~owjOK@9N՜f8]2SL3jIPQ4>y)Rk.q_]m2)Fƞ̥5xNZs5fkZ,V:e6@@Ah_EQt{{'"tf6-@#^L1ѩI[e 6;u6ݨrըErSD E6F@IDAT)&/J9@h(H~8 a҆ {ݚTQz\Z=BqH0ߠ8efj PM@Pjފ]HxMD: @AY#!Ob? zћ1]08;b#jQO% R{w\>Ӳ" Pu:^TfU恏꺆%QvE@^)>D8 !^B<lW,Ld#SV&͎A ? l7$FB#TXҽ޸k)ypt-X|ڧq[ re)/،~ CEМ@?܏ܿot/W$60GK[6tV '2c *) <)AYY{-(NEJF[5^aG|J|gP~v >4ft,}IgMh/~|oSZ&b (^pʢqcerdP{_l-inqj=u%7;3G0\  vrF՟' ׉Htz qE8:u/4@Ci$pBUYY1{'DE֧< W l:vG4 +~=BOr>"j$$EmXMgWA/Zpf%I"C?(~?/l :na6s95 {O]9VlSSf W-hB Z tʦ$'~~$٩kLąHqc^NWb|.T"]# e^@(L%c$F\I\K]iLz!;6A8W]|H?2ĘЩ صF]IrګDWB &ږ|eP֊XWD]ƞqHDWwcYw17u<DMŏWNц횉%x-p g{L|݁E0^2r';/^VZ`1(/2ġ^cYA K0LUZ-Lʬ~ݛ аO y%>B4]{HE|ܒ2F(&R0# M "NHOc)tny1ԗ0LsE[U#CQ/>[q"'>"V&ϐD9 ]v˙d;C@@>m4Ղ7K5qp0sb9yG_xG ]͋"%JK>^D4Uy FX-N_r̈e,SS#`T<+W#a 0 fr57- IR~۲kcѫm߆>_i34)nn/⨛OR3Co.ˆw_p N1X7+"ڋdwI6ͼ'x`ɲ5alH#$˂![3lXFb %/i^H6lU,Vk=߉7Ud-DTݼv#ND8'Ή SR=fʸ}bC#e\]_?[wH $ӓ`G. $.l:d]?DvW@t!G|<xnP =qǜ7jq5A) cavLД :- qg'J2 ˁbry0!.B`ey6++El|t $zݤy >hB]{q 7z>_#F zEn&^n}>~JZi]fl#.TDcD{,w 5䫟›Yc"Ft l}V Kj2';Q*c˺8+m޹$qKq ;l:H-eB$oWTPe1TB#qG_ ~^2m/:$`3Q>0ciЄ <#7z*bWg@+|+# dmGtJ:uj}pWH;?ԛe|Gư{eyC 7$Za7KD,'x,b@d4rZ{1sZeqz'H{%5!H .!!.yʐ4>D9R ] ! 8jMIIvG/Ɉ$Wt,aۨjh pb``TP,iB TӘ,:!9@j%EbURܼ`]i;h;|cv,tQ21B{pOV}ų qTAgjk?t6Ѫ 3LV /{gk ~|.:xvO~ʖ^㾥q*{)RcPD&O;v/ڇ-–(+!! &v{k% TSkB;֗P~qN .̊xG)icJ!FNo]x.v!BrQmܖ9/y!ymҭ",6m&lxCc( 32-1F * ^(J+<4[ 1 :cG9S#IP&œE3y1Rz=%+ArIS=r?K-_weORwc'$@[ZkP颻u󜛝#7xD(y#;֥+'Õx;eKxmq{퉆!J5_+p}=;nD{e±]qACybe  F )I6niK!g8HjIG"Ϛ$>+Sb|Z}ҽd*樦*r !=Cdp ƺU7 hgݚT}Tj-]o 0A -Қ?$ׯ_r2ONfǨC6a+[ncSRa.iStzIi JPM  dy0AV[5suq"ܥڅyaHa8JHa PEITi6*Td ) RT;J"o[*Y5Ø%*H yYjn7%F.fK6/%eʺbŝaYYJΥs6m\cq f/o*8>͹+a $VC.'Pn! -Us̠] yg||ƥE8AHUYl?x~fs[h!wIog۔;|wB|)"" JZuf{eDrQWcKxt1iO$H}rm =D:' xQ.mݟ1@+YI~ LF}24FqHOzjU},Ubj深'Y̋򊲺%6ʞ1mS\,*TpKi\rO+sn:JRl4*(ʧ„i r_y :JcMN_;/fϝ4w~5|  ͝4|-J5kV'Y=,. T56l2RwpOK3YuVYu wU%İ$vo^0=9AĶXM:8y*ObNI2 WpLGj1AayVLgb ; ze7nu2X*eh%,؃Zk_D=`g{zx ds-/љ`g%ywLc!@dpKwt`{u*xo&y {@i a@2 ưI ]HuiY-;U(,:F C@i@P/igϦ3Lz%}Soeqls|>V7K帆D \NrMgHjoKs+1A9<:({a7j_Bވ}D!5,0_<3Sc!;˯׼gGSa@ݸ~]wB_Jd<A8+jpFxn}ˊJ,?7f.렼B0@8;W< o&:]lԟF!RdouXHDkBߪbz&3y")В`}?vR>PAڲrm5'V:S+0t0G]>c~=Ƭ繒Im,I4֛: DLdU`w^,}nIjdh=cFȫ9oܸ$pF{U1n[{%mIs,{oZtsWMk ?~1IZ_IPW "R{GPQ,PFGH1 SP+fsV2vlowC> UW&Lf$ ۡ"UW]6uKy&-6?-LYT/$Or"JCY bVK.1@ 0A2U> #34ژ)1@2m>&H%C zTPCtHkv)ł{AqAo=k5wGF $0 M;{]6sgZgˍ~ؽܨA5yf_Ñ*b~`v/mp6ֳA/8C;>qCm]Ct~[gؔmsvb;qmcr Ō$(KR-Juu=*UP3n>7Ί kR6kb1PLƏ q㋤IGB8֥d4cQ}lj]hvYBk}Az/^ЁfN8R J]>j$!*ƣG%?Z#(PD`h3X3AK2{d[BR0+aԛIѺU[?!=M̨@59[O$?q tgR͕ug-jى;3ϯɫMa|#B`flΰyw_W! n48rYV`6LR)5Z 0q0h<".IOQc1_ڌ̉kU$YJKXUW^E+nnأ&F1A uf[M ^g{#kq-733)3YhK{e $d Ͼ+]ba3Q:}9Xv7ƅ4%TL< W~D,ٓGP @CP9hF{7ݥ-wf$*ʟ>I*P1 hC|&Oe?! ^B6 "ėڳ}ARI[v` c " m˓RĄ8t*  9€8N +HyyjI2}z~ڽwkTY8&8RݽU#S:->;YwW/_p/dĄ[RxG%$$RuH_+U1?91 ~$&R?'FXFcGIJon< j3i;LzOۄ:8Uُ7`2hنWCcË?}Sl Z qڔ&R{R5ɇun\˝=zM+V0; i_5ZwmRS?C Xa@T'dЀm}ƄCdlũ?RW٩W19o705BfdgMQ1Jb̏tӣ%D1}npKǶ.K;>Z./oS0A^K:%ɉaAǞ<c>cxs^}k }ړ# %nH֐ɻ_Eu>H =L/9Gy\уY!+uяěI*{UT"#c!>)ݟ=VR6!EK;L dg|g(y-,pWf-?!>$b/EI0B5Ao̙}: O CUw<+gb8u4cRWd٘q$ʺo~azRjOPIRciWL䬪k[+b`*E"+yS{?%1@Q~^]ው~h?*Y렪5!8"kpS|4ګPWշZ0T0_0*a=y*g)bP^k7.WJ?9+DƊ n8wS-OPC±?$2>]c*Őv~~"#tء:X.j #Q\]8rߜxjHft0¦:kbOI*+iJO떘5Y1[^:hY{X6I:4"` |#*FnAJ0Ds,bÌfU1T2"Պ&dm-Ɍ I.x镟:~P3mDޥדING t ;=7n[p4aFa1iϼbܓH@glDl/W~}ͻ_=|1VB` -{ַGOl}ߔYI#*{lt#&43EնG6 50Cr%,x?ރK5~Y Ϊ !HNtb 5"=&R{)LJKm .8XEyټ C:Z͋6RM[~z 6zJZ%Xma9*ySb 5t6p=R.# u kcn8O,Ώ޸Ν/j!b [["ƍ!BBq QzBB,̩9E1@s2V9 ^'Bc q|n]O>yU(< 7}FTo0&*~i`ޅ HRfq)w܌s̽޸=B`!0LEѦo?]w>>=9NB `}@(yit㋠Z1U Ey-o_0:3Vq'7;/ ^ Au4lHpϜ[9:/ʵe椱٠t dQ=Š ҽ&IPQLhTf"a/QշY}[%]˄TPTSlT\ ScS"+#>A*t,aA3_Bݼuڝ:7ꐇ`~5f, m(BK;{$os̸out!0y&HDvfyk߾J݄Hhԡ 9Kԇ}7섹G~OE0͍GaJiF)y_ƛO$mmֱجԑ Aˏo@Rl~۝ !LnB5zrp+BE`l=@:fSWÛ1@0F̿81f I)3saB̋H!A}"axL*& no&EHf"Vx`Ȃ2ji=qRǜ5)蔌 riɼL~dK7T"6C2Ku΍L1x `Jק`v HɐSfv[~`skĩ&~dp[|5YE8%yE8mI5>d3.iOEKRc/b;؊v CV`&{I`ZBޤV4HDX7ec(}W&܎k1J/jKN鼚vLR(:SG`ŗe1;_\tLК?+DD՚9l}yևsR] l:uP'E|<nut5ģγ&wB*d4A0wE**gJ:$ꊲ. ^3cHqE(T–d6W"֔Q nPcATM/yYg' %bHaGC{Գ+ǎZ["d)wfӛaI+ eraoUgn{jqMoq(ז,bO'B` 0rLPrwVoR )QڋzoG R0%y&8jsLUO.1J[k>L7e:5'uꐰ-u7鐈rm̼(-T\%":,+1BK7_8E;Kı&¿Ԝ>aOiν`T+24 C1fE} ϧ0>ƲO%Ҹ;(oIwYwj3{UĺSxo:OvIR $,tG?0̏V b|]v͟v3/]ae5/'[w>8Ydjp>`M_a4FDHH wJ|Yy[[ߨ1h%ŖB"@/ !'Bz$3oxY JwءL%osM#䆏^-ԤX ˪ڔΘܠ)E)JLTS3E>8th21/ gBe%οs<Პ$F۾IC95zY+&ͺmjoJݺq]X{\[zSߖA>{C+z, ,޺.^p/Ft!0LP׳% #B=Ų =?,Kۋ79ٿ`p9 %6Oj!O5Z!?,q~1d*434]hY}@FpHd2%of >~N5bTʔ[*OiOФ3U86G7"=b-1fIVe/f8wjnDhn}39gKuњ4XDAvȓ'^hLM:?-V(B!0LнV٣swU=m5n'9߉F xPZ&#5ԇĦ@n'Hx5fAd 1=W]\jNիT̺3Zo,H*TOUPY>}$lmu0*uAA  O4SY÷w\=69ďFO2p'<++[WrNtw“:;wW/*{h;s{뭉P<@' r^?^k|_&", ~x{CeT4!Ȍ|Je]V IЦ2\QotUrfPٝոZU&2 SںtPA6W1G~;Nh~QKɫJT!IRFDD OG A^mK?3$ )~p!61?jpw&]qB@]a[ UVt6PIE.@heVBh˽e#ϖMf~0c 5cޟvt?yRmfJ.䦩!#thŸ cB$VPe:ޫ7Ҕy!6}oUmIcѨhж$,7W՚57!a+s20gj`u/{Kph6t>PIe!¨Dgkp0Cujэ2sfIAS=1oᒮ ǟ iQ4:YӭB]ŀ6 [%JF 7F4Ƈ@woM~ԯ1G*apMrZ`(8o )˄;/0ղ;[ ILMNV ʲÈ,QRҟ6)Q8o۱&QJRQ^)J*Zt#(:G2@:ntV2Rq!m"G6jIcī W{kU뒬!\oLM?1F@p2AcmL?)IVjD~}&(@IDATMh\^{u&d@ QORBHLJ%pWFjPU%M5Y `U1AU'i (Li:S-MdGy1Dy $3ѭ5~#Zt.,n4VfsY+$  &J >=8;˷+NÁxF785u_`^V+Oh}hK<>}K3zoܽ{RhfUU*Wd"ךsnUbx@=׺Pqr?~mK+)+ݮ uUׇ>]\$DWjq 5R{^rٚ)I2)I&p+n 1D 5!l*ܖ9HOU!S 3OC׺( Fb-B , ~ "- a ѐ{KK}ϖJ: RعW mb֩If!]@ 0t 1&))~w=zYjVA3Ky~HEsvR r,0Ϫjb8*MLhp+pu%p/tФ$CBgkR}2ײr2-7)=D,C]3}]?~@й+:U~d[3Vkʭ<WF;pdw !C韃f)hb}U73)I 'GQ'Óu؁CUl?=BxSLY Gpʗ;B<;Y!!C:êm`^Pt>oHM#Lމ5̇nVeZ5,knMj\^'X&>UGL$"LV!BRWqT`^ FYScޒC}Q.ڴQd,G7Kfj]hh#ZS:hƺr!_`z[<ғgo?xX7+l p &d.N?xzK#FCm?w^?Zr묳PVP|Cs!Al=w`t畉bg,piߍL(tF#1>RyHRse^$ {6$4iQKLMM QÝmKN2I~Iz8f駤Z9L,a! cReGݖ$@`:{=@ |x1O^/Ϙj`!ٴÜZ,ݛI lE`@a:L@'B%tn BExF3gݭw'd\}č.B B`/ uٽtgn/}&4"R>ۋ a2F0&ؐhŰt5~ȲDKtiAMV+媒L3갦 NGc{sF*b֫nI'2Z~ $SQFHʠ't׳eTF 8xN驂QJnʖ҄@6NBa1g/ XׯfuHP1A_|R|ĕh53@0BED@gl0 ' 6oeBf*g 1>3[XF 0ә{&,HGҡmY[lw-ˋ`LV3+ M"UlnWMr鬻x 4CMR}_ =vi3y̹}5knj8}C`hJ+~>pO,kךum[/#FLɴLT^u7:2jLa_DB"gtTdA{2P^ c0Y6j%Hm!4U>^8̟2"c*wѥ!8@ ^:wΦ1 f;0j4^'}F߾஽StSNgen Ʒ=!0Lr^;w/=u YH! N=F4&aTP1dǦ^IX`i# ,nF]d!NSM;geĈ-=o1F7t˥/5э8h[XXtׯOi_#^תVݾJƻI??IK H{}W1@Ę 17-}8 _^KdJpJ7lG1J@n`PY /dªzI^=gJxd|7~,^XK[7;LV 4-h*ؿ fc~/{.2W=\G-3=p6M*v9qAJ(7g,[7g\~*GD1A[}^i}Ts?=UeC f:@#`ELE)P)B=ԙ_3zLjb3<!~anN<$-.MSdTmU'Hʐ}N[p+8V':Gɂ{YЏm`Zݹ6uڡԍA9z 4_ffsNߘ?ѩED'wVwUq֣Ջ~Jw .^30a5{Nr$cc +%7E 齮dzg]@RY>g9b'PVܓldX1oA j,52 e-;e:Eo].^*BGPZ}C?|l"CK𞚞r_9_y}@8NLWTg~ǹ/E@^¶%*WG01"MOBB' 8\K ze2gqV\}; 1 q Y97?'χ .V =V|^ .ʵΜqNgd3CĘƪ{OO?+ny3nlaMB^->P1rC{o3(mFf&c9hN$+y"\SHAQ'>.LR0èF.O.7T\~ TbiwƔSj4*V>H$!ړ@zu.B Bu pbLйs{r|^]u>[[֐u*И=zuDD@"X\ sa+(1cl!UOy -ax)N@*mͤ_fK1@`p})| SUwvqR6,O'u{UX=⫥5͙YzݯqGߋ1A*VKںW$Ff?zbo~U!?DŽ( tؔHg*!%ś1G L",PD!'=Hx&Ym}"ypfvR#Lz?䕋@@J;3=!Ĕl??$}QWUǧo-*ŐCŅ3r=c?)Ǝ 6u.I[ 0~/}8J*!![oǮJ=$^##t ~»yE0Tdͳ9 G] "\^A"Fi=<2-'_H7iXk u(W΂ߙG/ 6!n A0DRk@I@ sm#abG6F+§tN/axdk׻k:=VI3:KPH7t0FaH_l`ڬ왧$o3v2?&XQ=3*8i\wg;&dbX^|T}zIg:}隌;ɜAZ׃ R5LJe !|y^Pdzog!!p 4[VjqH L<3k]׿Խ?IE8c@fJt{17o09|{6;Jb@8#`́#Ddi=yG!;.tBpCa͛ݛ I ǹ;W`D7 c8H%Gp~*Nkn\fcbE!!*&h?Մ :XU^;RYW r10jMz%YLzqEt]-~۫4vN>W1uz!?+zXKX?Zy`?>f7# YJ-i;CЖ#ݫU]T1fȈym5d:^Ȭb Xc U2ো͚kŎ3@a}0bHQTw&@#}Y?z$^a 9t#h8!]#ŀc@Fl`?M҆v5ٴZ+, o̐5:Y*ɾ#2N2<8eR abwx_+ʥSnwv,0j EH R~0CnܸNϻX2A!4"LrE_/OIjQf٢VUE3@ IvEOjVZHJh > rU0kLUb*W#c Jߩψ2jKj$Y1N-)@T)-_ֆ@yxEigo@y&E#bΖE㱒ΤJLepT*<^h@F FT &ЎIH,ERcŘڗ?pt(B s޺erCO=t~ϕ/$ ΊRSڵN[T|;hG #UϗT_h%&(ې wrqSSgŌP2A B.BM~~ܟ$GTy"mzND Ƅr=3-~p!s qD q)%#SW$T`oQ>0J}$=Z\jn8F)Z n s9덊UjQu3Z(ck 8zFߡ M̍)Ș,5?R 2T3y@_ dī%oviγym{Oā{iEpog;J U7D-NWhO1Fz5)EOуV0B{Ss0u nbV!1H%M7f-{-wSBp̑b޽y77>mU3FD\?DUqcr~t};-s122y)%uM "mC9wMR_ 6"sS2=) DK|eZչժZZw|{3xƴ W-*U=Fյni/VkB˜+1KVR8n1EF`SңOxHJ6GPָ/醿1FV &8$Mwj|ؖ?$> /. CJ^+_!)v0 fjYIݹ#d0}ܥƸsg۽X+i< {C \6J)SS:Knvƽ8[<9E* &[HJ@/NI! qD%g,f$P#.!K]Χ uA⋧p3t\jSQ"Uâ;P^ͺߤJI?l⛌񔉗 PsGL)!^Lz6?B1{Q<1PuPCBz)^M *xӯ!~^0UH<C\.2ZѤ2~E{L(\Q):Pq qo?vI|;Vzb= NQ[%>}!0FHRzҿZ~"%V-&xK,7f*[@<2B*= b9XC[[nqaݼy "ܱ; ,6yCW*Aq2W8p uŋ-9W$2AR7;u:Ӛe66d9hں:޽[DĊӞؓի.dyڧ~GI!Scu* vO;Ӈi4N/yxv.(2y'Yw0U0G%Ƈxw_H-YUJ'[#h;?7n:g*;||­j 3? .8(|4 LVNn_%c.B B 0L\1wZ䛿?v$qaIc2BSo߽^Xp{x߽,VȾG$]xBZ3 tBЪzlD֔G&O1 IH<1V0O#!?{&q0NĞZ]aPۓ`M2NQ)3)W#6VoUr8f܂WLHP-$n` ARF I5 z%򡞡R=B'HZE@PhIJ U>wBٓvY~R]%-M׋e|,6nBp=)/e}FDM+-H3K`p hsgelo>R ֧v0pSWlӝ?I ^u̖iݓ?:xE:-?&7<#FF~+;ݻ-`W{EĩΈBk}@֧JLg,ZH,MÕkX+=L㯫I-}ëFB(JyV5ZQ$^cX$~G ]=le ݃c+@A;YكxqO& iH-S phzW ;C> ,_ 3jgۑIaÏVd!^MMܻ/ ;`-I~q 喞oviT_ʢ߿*LO _3B B`?h&h!*훿sqjZD vNfYH̱w?S?T8Lnxv(K|0'.v(o?\p'n.!"3$ 7/qU>!5y5? a nڤEfJ&K`$I2)C8+3J,"_ bLJ70H4Lwe=&vhli RYm?|C3@%W~헡CG ^-)IFjs" $/8ٟE"|'N8P*KŁ򈑇aSNO ?o Va.0|t0rnt@~و.LuwԜzu,e""YM3|):)yq/A*'PMp;*@f/lş !}!./A9|x0ivZ?-$90Ia2& KÔr6&nHo|#=./O۬E B:He9;;J)v&>.uo$3UƤ(FUro͌S`OR&QB6aa09&W`=B V2cYP*\eB=  Vȏ -2 ;U'FEo'$g1ٳ2"ȗ R⎯u;ݩ.CŠnaI)Hi F˗Ϻ+}hr0y<c ,P5eޑs B)o@aBĘ֥s3wKֿo/IjYn$F)Q 2d?x}7ءO6JfrE (e}rwmENt)=C?.M<ý7}Kw⥟Cv۞{ȇ[n.p 2&DYBUһ8'+"'k[r>%~sSXrf HO3cz=YAT"0̰ ge|<ʃOE(?%-Fp7g=.3K`X&q mcDW\%{O:gGNRP7c>]~-C> Kf[/j08{ۆrB/iwsŒw'e;.dJKlDn8t!!px!/W43~Qqҫ^ȻOݼ~^ޓ1ZX( ,wڄܧv*#KrxK4wVǯ|!4N_o:{=wVt{x&|G!{"j%!q>WZvAIΐXildwD_ wnqΞBJU@ y`"¹T`xa$LJxdM" 2BDD8)F.4!c_bO`$1ӣ'8*c Q!%u0`&P$^R.[T3@73Y/eJH:Y^fq䞡"eɷ4IzM vE=)q%=x$0:׺!oU;^8;n䘼nXr/75^^@J]qƨoVo̶rMgH""'.f{/Ld>ޠ7/~Y{""F#o{'̰BiA+^Ww6yt7)1ԏlyEDtCI1b ;i<~W~.;y2gH s'8CxqAf«! 21XKP j 0U$DU]j]0W0,HPEEP?J ce)1Seq]uIoʟ?&)`ʤbLU0LkFTzQc(7l\)9'ec'-қڏ; $$D=/9O̞}_C=)ӹ^&#O`dEHU\:_t=jzN _՗MŽ-ddRNAW/g]¼X7V>B!6?⏾nZsgβ<08I7 Gi?|}3naŅ'".pė6j끑G1?$[ [*:#&E97Q~_qٝ|&>ED :=֟7>}{ڽйA^5 B)` B j# |}gf4~B~!!z)%x6ga#.PB;z]B9ÏxI3 izeNJf.=!_-(p!oHi'4!wA8]ābf8 Ʃ=TUI2QN[ˢ-'*I$R&]RffB0Y^")$[BCT=A BG^/QFWK$4'(Xs{H({+uo =X p+= lקoD/q(x֕yeȳgNBYx~];ycrm0o) ꫁?nqv}MܟǘP1Alr=տ[o}3cL\FBaH)Vd$?ҝxӽw]|bG`7 )###cG~ 2H#m: 羗 qC{HӯgK/(]e=xrߎsj0*Ř}|KKI Q֤I}F=LtɃh Μ9 (C?) u`6\2L}%3Ѩ0YvHT$ZVa3gF^Ko|lxq时W.oIyZV}EE{]^X n0ݙSbF},Λ:3ֹM$;/%IB٫͕,q)ߡ~xUwz>(̺ʃEDvtGV[cOĹ{˅O šd; Ѹ!(-ֵq˯w;._|,~(.B B!1Ӈc$ͻ~N~ P^J'I׽ycP* U w_~e6ycw=?x8ʇf0T,л1T5Qgcϝ0̫W'Q@C oF(H$jqS; '^`(Wu 1Hz0?~-0K}'Œ193tttKkfVfUk{ߍxYkf"}w_~-!hG&vm76lG?ViԪLO#c,S ]5~_%I&rhD"Uv) K@E@mGF~x>1Fw$Tf a6ނ!-sxVOF1D 'R I%%'&mmQ)c-dA!0'rKJx6]E dy,άZ&95 -s7!K P- ?MzF( mGDγISO IWֵ$ZW2;# ߷WwkqzUE`g"Pmۨc;{.T.&ٴ!Ck8D3ye%BX~$M8 eHt{xTD*G?~|cε9AZT3'X p2j+0H=U}mk0U$HN$aI`n9%a#Q) ޘ{$\!ǯ_q3Yp&o|bf<Ħ6JylYUq"mIaqݓJa^ٵuɣtBvtK׋}^ǞhvM(E@Pv.]+Lq2-:D2 56g-䮌s2j  Ő(DV?ITFQ D)+0U69\)[@CCE |PqŎǥwi,% &tfgf> cv!j}#$ 3.oPF+]@`[}7gi|~}j cW_`|VЛ 5&ǏB-5`и$ UE`g!мʶφ%9+ɾİf80l# |W;e?.m.ѕ6/dl|Z>4̜g3~9\4?2!$^.W b{9XK CjANDi:S4sv~$A6?,{K`7ӬS+Niacjlt4gϝ<`&>sx"bs㔼 fR+]E@P7V_wVgZN맭S\mwW487vO եeYؿ R'0/ wugi]{ޅ[q sĮz#&s2vm pTQlԄǘq7K~wI1#_ey)(w y y=$WE@: m!8vީda8!<,^؛Bb^뽛.38!1e8lQ>* S 6|c,F)zb͸F>&c(D"'\_y7 wxј{'O8%k9sKB]ܼθLRHPE` "9=Y}3.jٴı V$/?㤝k#Y܍GIfKiY\ZEF{#Lm f-$E@Dz=oUŝU,b[~E@PE"˔pk ={`'G=AGJ~8C u ?0gA?6tH={ǻ%k h"3v "Bňz[B7nEnqi!5|wAtq?վפ?"(B%ABH bL;d Z?oznq4TQ&&&+"agb[9Cl\F~-#A,(E4ٶb֪,^A ƭȭWryg#^~ WE@PS8*ʪX,^])BVb?tIVҤ=T4#=J8(&GI,!owG\)ZP;ǽ|ك0`PTTCCGgUev&'m:hz4?tr%DhR("l@p)bfbƲx""Duٰ M)pW$nlqۓ{ "f]D łRQ#ό* 'JGjWh̙BQ”2RjY(.XE@PFQG;,1 .6gL.@w2%pmx(~(PDcwc!g A:9PviJ<G(;^U' .^Z"(D 8R(pxc[q t 쿪tTЩµAGvz/}iEhRE@h4){\6GG__KI[eLUR`8!zjjIUyy D1wE@P F{2AR) pI| X- PtQnprNP%@Pzdd$v=?nGE#S}ml/,IE'~WA5܋эIl3]!H"29*_˳&xN npGZC}"(7Fl2=gu>6lVM|&3-gN/\#&Igڊ}<AQk='4"pBQdnN"qy؅.<2$ڋ]v~;BV>`J^ 9s)-TsL(".N? Y9GWG+ 3*nq ~n휏XPf4\tӜdK@{ama9p=ņ5PP+;Ǽ2AD Ncp!F+_Z8dfԕՌ9sEKr,:v,ͭ$NPE@kp8#œs4tj/H+rrT`g5 S0n=/ł| (q=P/CZ󅧟p:2Z)g}aUK:[Jь9ђ,@D8GXF%ӨSE@P!98?D"A{eyՌ`䃇tsôD<ymO#A gdi9Иhh4e:.n[S(F#Awwɗ:_zatu& 7fuE(,'&UzEB-W^E@PGL1r􇤳KLMNKo宬},C ъ)ļs\tNH( 2 (۝ps򓭴A(Em-[ttNnxؙcdž:EE.IllFqb] Eb[rc$4)"("pgu:=]a;:,%ɞ`):ҏz w֦.]\A>e+JvO#YO(2b!Ȓ@fgצd j 4R/&E@PnA ɡCkŌ\\R?r0, "}q$0/2IS9+{fg Q"(DžzN.x>$ӳYS6qY\Cu]I] 8/{̉ѽfPo]-I*I? "8B38;h^*}A@I:0'QcKO9z]N}:! ,YNt nD)"܁eyrcrI^zq9!ɪvmԠXE@PJ8k[\"v-ic,?ѳkڪ\tlwGlZ!C'rԅo0&u"UPDc+vGN=^܇6lv$l0`J(]qΜ8ydEtW/Ge19X WE@pǨ 8=A%n|<#+kvD syjS䕘]ՌwNj 1wג$aG/X~RS*B@IGg^| HȘxcjִ&C) Krcs򵯟zY!`b4/N%VK=ӫSE@x8xnsp굱_֌'2͟ ge׹9aqXkoC2C¼Cdx$6ofAy(%A+?.$O闟o##&ZjB!c]kL0=t!+ɩUyK[P+H=3^Z2hD!hAW7~E@PU@;s)a0vs߭'!☹f "dV#Ce91Zl8GoDEyXcl-yV%([ q}|ci,!gϿA x<j'Tl wx'33۟_+YYl9:9$("1k]`_GS2<8 p΍]4ӱcwō+8yX\1]/S UC2,)C}+2pOu]Iw&R U-ZW;C(>`2P(!$1,${ǚ7Ja"(7p\aXɕ+Sw#]8?t\jW΂qO93Țq㹗ʳHw|fJ[E@"$/ "Ϩ?͕Ǐ&^8?~t) Jj+q u Y…,`2F~ -c7o<z%XB)E (dآM9ϲ5 74/k06F?9=)K9)!Dw $$B6MYܼF9X81"O<&]*YD WE!AN "]C 4=.A㈒߯qGPmy ~\7+eoX.(E(}B@%A- RƧl+# xoL ,"~15:LA(t+QFdlfhr`hcG +5I5"p`?. +BW|7^~y탙L)nWbQ DN2((g2e9sn\yr *RF_"Q"(6B )?sN%&++ Bys&+.8.pOW#Hiz| W`c4rVctϰӱ_yW0E@:íӪmڒA|gz^|C$8Zs TRÃTVo]W_&?K@85m ׵]qWE@RNs0g=F-vΝ_bqSy^/mb+m3CSi}BڴHLa,U=:q6QGP4w7f/,M$\6\Y^| =$EËq\s(c'48W`PI±a( S48☣=7+E@P]?>?ѸȵE}GbݝTG.  {cgvvy3{rMffx<ܩ1E3JiHSw.qJ8E@p..!*_rǽ_$'J?EYiEJBvm*`Ad]9<`uz~U|;m=h9-q qtmX8B*"lUH>~*I ?I?6 PdhN~eyJJ }7шX+*rmܳ!8 u<'A<Ɖ LH(JA'SlM(%Awr^}cs99z+􅹸??e)xzV\#j8W@+U+:}nL&8__N<9 2((tL͜y;wE:E@PmĻ߻GHl7S&Ԩggz3rHKԘ$LJ[`H?>ޤ)PdV;R"2zܭ8)Pg=l~rUP6J3Mmɲ:BB ^~q_tLLA :֐yB6-H~QIj:`mOOOܚܘ']q?U><a ?"(;$F*/hTΞ3 C"d/G& N|> 8;#rcJP*!ƹ`HP.J_O;.tɚRFPJw1$]hbTgNvh88p\i_R[s# ALfCFO.,BIƯ/ҚLHˉ'Fڥ=!B2uT;L)GPE` _Qٻ')OE\pIHlsOˇo;Ō,,`s72B~2VEH ={$#h([G[sh"l5݃o#/8cc?Hthh `eiɦ zW܇r v+JDie9/NAaIʋē= ZWfk|CS)"9ɷ~n ȩSMɾ:$O<މ ;~/qh5[mun,u Nqc?VG\>T? M94FPJӷgW,?Wh? TP(TQƁk:qd:qfrƚ+g%V3ΣGR2d 8ppgn oؠ ܚg EE@|gb^r}r^Wdyu|Q\y=oO=]@r3cɩIgKؤieAjpiW;ntݔ"!]70"kk]~>yA9x+VX!BX2,Xo92$Dn@4"(@D2!&+۾uXz"ƠI~~q\pcV]b3Ak\ΞUZFS1RwOq6+}.GZ/+D@I}^VE3iهq x7.?Tϝj+ U*ڃ W]rCQU"H&OSQHdK)X۳<{ta+bsJsq xf`Y.PzE@PuwS[oDdN{b!yAJ +UJܨCGw*㶚sŶ.0U%^ҹk£ 7W͍6lݿ.jp5 "PtB^]BXq>(dwz{́Bg.C*ɀ2`ag "8}ubIޓx,"ȭAz'=]I$^QcIz[}\+l 6ºT_E@Pp}n;=u]RmG7.yhZ^xaDFw`U$@,՗ ҲJl ,0`kh h8L``|~aB T-t#Ɓxsy-^6=US]J^{ V>A.z3#[WE69vx;n$&}=$j,ֆJrCe}'uWKU"(/OٗH\׿qM>=s2 Ϗʁ?9BTE(7&m9η ՗|L,ݓ h16≨|?z2ȩNP* "_:V?2ޑ | '/_8Wሩ ҡC%DCV(",\!<2*p ~vEBՆ8XT]M$&uڢj:v\q)4DPѵRMiLzO"`~1w|~I$8t{ ^l Q9~4)P%}#\?(A氿ð)cmέZOxPh8IOPE@( ڂоncA'f{::Dۑѩ]/^MX ,QukB!kI)k%CM*ɵ9u?K,&GUeX F P4&Q,ED `>I^#7BDq%I*0n(>!s93MO4Fr:?hSIePHP,7 $y >h/~& [Th>z(fb_e^^\}Zw_ҵ6}i"l /~İصGW&wy`T'3"?%0][>$rZp>}>;>r)\!F;ʙ|Q( %A[KycO~j[p˧Φ.]`!dj$=GGn=F}zmz&ZDkL,`FbUG|Uf0A& b 8xH@b ACr@1)y҃0u $(&F%Iax 7 ڇ(% ]1!A:X2D M$V$f5yzX3 ގG4geT-"?bFE6%LY+C M0_=1Bq.ee*.F2v{*EI9}{v%dH1X}-#k]Ӄ.&s_u -@Wix~=~~tէ1ÖIENgPW^E`{!mL|/ȱ3g93B邔ɳ=~%IJumN+~ M;NR.J Sboi-Xt$A(UXxE(bzHp jp\R"52|XLR) GiT~AV&J3$"F"f13(j(=V 7\8Nøx>Ou \0(Ncו׊&tO"l t=+8s+d|lV"v9q_^zaTv M_w@۵eyq)ra-'Uч{#:==jE@ؖpn N/˿]G:z:?szhRBh:w+A1n>:-wI7zfqҷV;X*qPBqj jBZ D2 k'[ mC֏`W/r2JL%Q/k#>%Hl U1{H^&mhDVmq#m­1=đʗfy|w wbωɬ6ڠ*ybvR?akPoӑ16Ը遃Ŏ|s8}RAoE`!^A6A` 6u;=\mKƓvzy459-fa Ȩ53~E1 () n`j{x)ja5և<,JEH!Aq.f%'YqlF;ۆ*{Gk~$4_*~UXۃE> $C[" OI0w Q-a d1SpbA¼7L |!E>Sg!:`[wEcru"5SGg ۗņ$ES_]'L˳OЇTwƓT[13]ɩ1` b'gOʥ܌+I[*8(%AcAnI`ddp#.@o27T8sd3xTCw?㷚sYZI,8AT&[AjVMa?ܤ[:@:Y 7™'`ifn6S C%/s`|j/ ׉U@)df!ad5ɨA2c GaT@b1xallw~Wsxߌ C|5ǹiVpSGpͤL'5vFNبN;4"wo%TJ>\!2/ˣ;YBQ>w1X8IB&dqqhް6oM* G޵F4LP30BE9.eGƮLnf DIuѷ(%2<=;|;]@kV^۫NsSF [Y (!I$L9)\,e=c 8HB}|HbX<=SHlJhp" *JL8Ae%sC/h ہyoUj~$1=Wuu:S_+6 x|&Gu0sv2եit ka;_,.5O,!տ.,tbŴBIy}BKZ􁐑%!YyPl-RJ򷳉cN*߈~3׆wWWv}fF*$D^J(WcZl9$Տ77~HտzYzymv{[t59|ݬ7;=͆ΙL(%2̠<LC”>A#0̜\y zyq|C"E }38Ga RCvèĐ&RFz| ȋQ<ĕ+Q1q sy=LU\,J^n'Dq:\>Nk[M 櫋ۇ^z=yK<.sI&&f~y!MwovaEz5>YZ哹gn!I[{$W<ԍD eHR/qGa{!( yS(QHp)ib>0LS}/iE@h`*z$L<.I8ɢzF,^1"\e΄&WC 7Y#;LCYwkGVt;'kX 8svE^}g'Ͽ0"#QsQ5|߻߆+W2}嵙Wɗ v76mcK?"Ë~Gklu"]PIv6enq^M`||uR&ʅL$kk%ɂ16ͦq-̼J`%&j(qӲFU7t6 姲[C,v/oM流nKKRlN-lߟ@Rٯ< {gHk&)܆؍mP<1b4y KxJRmT݋XQ P0 %<# b8̘( Hdz 1CH16R)%o+3|LJ&Hpԉ~~ΩqS=&a?Qi";xv_z7*cλg1n QJ-Ac5rw:8rXtfO޿:s㌍_/*);v}~u( %A ve`0HBc`ྑ =p\痗ջtVeemIrI3\YiO`h!_(|Ar$V :)&~vRkiv*j'lG 8!F;s[ϻ#1Mن8;إՕkvQ(} a}1BR$$v76[vS.[K62IP65DIqyx?Q(Y7A=PLHcm0#IRi)yF]_3"8* uYX>) ܳx$N#VMCWƻ4y_?I0ߥ76IxI2C1{^}]ӽj7 &_Ƈ|nܛTbϕʳo%-kaUٲ&o,|W^ Wlپ RAv˞=1nQ)&PԤF@I~iF󏱒ryO(/S~,r*]MG\@:-ki)$`OPz-IQ.͕:5geY#=P,HR ܤJBrpfL69ae~ָVĚL; ]}4 LLF:UG2 ". :K9, ],8ZAnB2j1)chnɤCW.^80{MS*a!=JiÆSjze*-(zr5{@0lYt{(8~?'O>:9< ޠ(ik#P+A8~ sݣ <`PϞ*>/43b@땡^,`^Rl]Vi.)KFJ?573c :[ݷXÇwI[]aS(;%A;[ yc(5*j:WgR4ʥ62AR,eӭ d粙lQ.08Q”QAdR%/ȖH@0}cqH-䥵ĭp' sa!Ҷ_5Dx3Dae٘讁0lR/(_t[8I%r^6#q;M >#9'(>  A,^*z44PۃxEa@APSShOA.%ŜިFxi"]P]sŲFզ6簰m ;f̹+Xa3G44OƉ/[@°㭁&n;ۧ DuWgV2ݬ^857 fj[6nEy%4ZR+EB(1j Õ+i9Qhsھ}00#{S@?!Xȕ,&@)P "GrI9*<CZat!h>We^2&e!a@|vKX*SݓD 2L8͕>uwo=Hxk\Dk֧VSq v:ؠMʃao$My%^]]nOFHھc~0pF!)-h.#hrH(T(nWðj}(Jp.$VFi \I,'A_9_:}( ga6 LQ3 z*IDAT!|1]_i>1O3N˩/Qi7sizhߕs|Jk\ٶ4^ɴxY>Dfv>>$ OqHUR)^Ё=3en09?e9waD iܵN&${wG+mUE!έ;?;=%w ~G 6X9| NcX|n`Zc@fCOR|-ĕbΎ1̐4M 9ѺiX TISe_ɒ(K8`AW3OMfY3DAؿlfi檤i7kDYM(tU@'#> !վvnH :aS* olNޔa3R R~NiI/pdV 2J'@(bhY1XD [-6Š͉+S242쮞O䐩Gx>Ų1{0b,7rxB"xa"*xQ@O")cxC">n7cLO1[ mQ\'Kxn9G@J<. .<!Ł,mEfB3"2>QV-E ]d$H+TfʅB|wzL0VMRTHLFeϪt엊)FcDyF~Waz ʣ#~kti8GSyJW\eҰ^aӱ8vݽ"'ށ|Q|e93/yAٿ/%mp廫zXqI?wnX5|*2+9<,rRFзP&Q72&ڶ-&I 0#4cG\NEsf 'p(Ct s-Y"a'g6Y $\ H^l/,Y~(pG$8 N:9P[Vy섃+OiSd7[WF}+\K(ݰu)͕L%'t5p5Od^^w>B]3-U$f*x 0)5M{nb2%i<yavMzA#L,AA\y f0ֿQ|mۻ#1q=+x]Xo7./@<~y#Jѕ:L\s|:/il@QoQ[潆wWGT~_]}?Bxp5(C /m"nL=cv%#7⒰ف62dz7FPK=ɟZ1 Q D>L1)3's`= t@g>i2+4$h!e[=#QνL$O%Aعi9sAO80wwqD)IOdibWY  m.;b5il\FaZ׆)KJ@Tn&cJ +=?bܰQt 0T[/'4D%`H {(۠ BQqP)) ]/G** yJADI%Wɸ'Qۃr%EIFdȚ>~H+A¸` חYl%:}> PR^{-%/LͩN>yf)lDʥϣbk3X{WiddȠx\D PWvy"} ER8F79 8MpV`wi*5Cf+ ? ΨQ:h݁IT,=0Z_ %eC/g$M QP+"V!_ Pɣ MS5ʌA3A$JN"3 2a@Ceӳ5|N sZE n3oS]6LN I S5}#1"d0H*CO?L,R)b 8#A-DS0fa\IxHb0ׁt8'*}aliOTۋ\(t&<\j{A ?S$Jlđ@ +A C ^"9⇇RU'&^McYgݥޅotEFFMbXI)9svR\;O;9 PR!ђˊp,XϓDil(j$Rlyx\^bW$An&p|u>ǻdVm )g5B?tȸ^ Ju4 &$)3ȳ떁>/+ 6ɮQ" P 4mA6)$NcV] )a"ާ ,MT˒4 aTq SØך'/a_S#jqBj,ʽPh'(4WnVo;wag":3KqUjK4nw\\Zp$ԾG{M0 i؀gfya} 0i,30fܷ#H\9A0C!Mf)i!?1D߁15(*)qD'2s4?6*rP|o^fezfR^yeN&g:d{pe\cT-Ḅ3/>m!hM'm'y| 4L7IQ"PͿ@m" KcKpΗ V L0*EAZ3xжC{1I'sqtK*;+`Bq)‡$E1H¾) L`$)9 þ'602͔'˳bkt Ob偵 ,4Q E|0W1 2vʅP/DJq> τ$ʜ 'kTc',g((Kz8ib /e({ 1Bu)&27?}qlu:7U3lyl񝤵;k)yyQ{Wߔ[ 3u4LLB! \r,VǼߚWƊG7cLnxxobǽMFzu>u=N O)xOl?'e~!sFȑ6GW dO͙ K6`瞕;d#= I:M]E` Ф!O([r$J\8\xP’1;B#L0gJ2Y\YL]/Mi˗^(M!l$(2Bq2" q`ʠ+K︉ai?O7LB]:kBY%sU"#ȓ%Aq7*"Կ. e,) K2ewJ:eR9^4 䉪{EΟ s@٭'4 8K0&3Ov@*D@%A;KGR"={~~+*.0][CJ%,c ҥBUH89GT2 {X,Hp0.W3ic*},Hw)}*bH+{RLVor\L=Q6flx5ՔؕѕyRlrQ lÂSyJ02fVz -&Aou 0 5}a,ae$yxycz@#zU֤4CFxx쇩ԧ(;%A;gS-7ML?.CEqt+Kb2 t@({_!ZqdqyE8e rǽQBiSdz8) Qr P,͂yHQbJW;#AZ^4Ys NlJ8Av&JɎ%+ c=Xɍ#?co?LTi ;|g.k0m_MXKw+~F6ɘw>+D@I^E`#@*zzLσP|? Y^>?x͋k lJKa%&^$BݪO2Ń6i$)^0d  y`Q $NsΓƕ+#DTZQ#2&H:T1 ҆Ʌ^؈AN#2Tɾ3?K?G}Ry[K3;gz[v!:/򋟹dÙiʂS!@%h*fnY@^P?u_ׇ>ylY\ ~?AqAE1$A#a+͹Sv5D5$=\h&]tHpڞk  O)?C|Lmں[]+?'WqJGGĪc wKCG<}u|Q:@}/t[ǼJML!h\n x.Ǩhr G:Z?߻ 3jkAUH m͹)e9 ơXII m/$$&O?-PmtHMÜ(^_Cw~qIRW4ٰ_ߘ;"@o@&L`0t3+_HuAb N깘uZIrXӹӎ.yTYR 洩 4H 3 pUyJI➸3U|O'$W(\i% ޶hz9sMFv&]ܯUܮ+4^\I۪G:`ÈsVZ$dboeFZw 4KBA`A}s l47{7we|iM䢊I* ڹ%>ќ/7{PjW :@'mQ :I +ڑƗ"UZvWhRM]~>|G ߙƌnh2\U.-7ޯ_5 L!h_@ <1K֛g~>r+/_^[Z *SьFSFAaޫMN,/35SrMmMʒPO}2UfY?y` 75݇P@t~O_0&~*NަE۔MRFui=u;TyIA^_lmlV>ШppɮxF;~;\8wP8{1>: OnY>K''$L(t;lqAFa^'t.^*x&Udίfz9]Un$idPcQUYxT=4Ps>*T6 Vaʓz4?gBu =~*j3]?Wį}?!܄0}Ά/|48c@UZ_ Kϵl?zgHQPfgKgWx[GE] =zNJ' 㰥qyt@Ri1.Gin'er]^;NQ?Wv:pdm>vWΡ,?|܇|z>~WgA9}1 ŵtK=mYK96 M~G5 LN)<)ӌP3=)e3Oom,~ۓK9$P•9D9L^ㅪI~1;WzIO\m<ڞ&}f{ Ô;8yPˁ)UTvW'Շ!Jx\o;Tab:?טJR4_;7 0( N*-եA(8)iPy~}m0~N !oR꿤m-y3*0) U}:R@Bx*QiD/s=UJU\aڞ'E. 'Bxb.S*@/F@( N&Hj9O) ?t)&̫M8iQ'QE=^[aԩƉ3++?Rw4] K:; d3TP~t{E^{*g#W (&Y,\}v3,,ĿmY@`zF{9 ~cjR޿|.Bt}- !3Ɲow/.r%7.ˍ~x:    p5X1nAdz@@)7'憸xg$cA@V5S #                                |t|2@@TƣbޛE@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@? ^ؔlIENDB`sphinx-panels-0.6.0/docs/_static/footer-banner.jpg000066400000000000000000002220031405624532300221320ustar00rootroot00000000000000JFIF,,ExifMM*C       C "K !aQbqr"#123A$4RcsB%5CSDdt&6T?!12q3Aa"#4Qr$B5b%CDRs ?lo'rfXF~N%/NTx"4W\ hQdO:6w.V#-@ʷ/lw x "]cHN Ŋnn IpO4ZiEe-^{3i(b{׍\SORKR-7KmSOnSIZH=uPfH-obAPGͥF,*ȍJ.J\jW!C>;)l#ִlvGExDK)r[#y]pV^jp[u<1)YEv[v-D丣}K5 K ga5yϚE#4y,g c1L\јiXgS0B?MQ)cYFސ҇1+m4b[`̋|>+B15lpIi!w˞ɯRRX;[M|0Aܣd 1290.ޏ4hXtFyt;A?nt0Kήjbx_e/I#H┎y@tMR1T$EVKMh9y$|?z8$[:}4gn|zyI8)0wp+P~_y(0cy n -{(?Tx(4ݰNdSM5Ü΃0AjUze'؛ CM<(cq Q "ҍGqTOR7$@*t^ܸEpI&įI ~;-p~dk&a_pU Rf0W# ;e~ Z5QW #9$f !xBH^F6pZe{Tm:~({Gi|%-1h4\H͸ {/C(J']rvluz]txȦuWյiIޚxa|SrVK9p~<]쵴~ {nHw*upY?Ii 8LJi\3 CoDg1r7l !|vKi152+\y?r`sN l@Cֻs&@\Q/;œ[NFUZ謏Botvb)foY-gzJ\Q⦨AvF ⩸V GA+?ڦXlpFIuU:=;os[pIE|S_'}f`o$ѹH+8.C>jKO)XD败*p=~}֖kS(9 ,S|KDt+HrP)|*UfH:1S}pQ'r=+j}qZ1:@JqK4G}8VHbb-l'C;Kl m[\*!bϼҷ#Zj/.2B`j-Oj6IL WQ/@qTqG|`op-;ۿ*Ko2T0AKBsjCi\1TWQ4ky [AK\xoʴ@똔ͮa.YJjm-*֌gfS V\=+,g+j q@hYi>3ӉHM"]O}B&!r\1`M/1_TPMO$16Pמt5[a~T?p=LZg*p|udmK( D;!d6H  dyV+RArnz)8(9QHeEqB?6,*vX:_O!,eҥMXf s y9cR<XZpL~Tְ#L0)V_krl;Z(3rXfo< *"S9? SD3Eն8gg(y8qBz^Ioa> TͲq2BGN׻qu^/1%hjԘ9GEcD-uR.Lwo!Y2ry`Y.[ϟi2 & F?ea?l␏~Jtem5IsX/Oҍ dYYx~;r_({m=;>RV!IW}'0ϔw{R=zA]rP(y5/[\}1-A4R6;xYL;Za{0<ʺ@`cNfffT,p<&2/d!bfRJ!ƾ88$-8*k':=s්A5;h#SⸯKck+9W-7Rm:HCw'y2/1dGu2higHGzshRfCֹ7 ]jm#hN=~s4/D=,UV5׎|Sx}QZRxfG5ܮ=tQu[A@{],4 vg Bp|G{VS`X Kӻ8q N8逸ٸG9rw#(L ÊIL7C Y?2s)<л.j3$dn /1:<<'x) < -V09@#L >o%5x+Pּ!q9UULU^/چX8x=MivzHNӿZ>N?i9K}Sf1L9vGIe. Α5C(徫P>Pov\nT[ݳR֒X)t F98|n7- RtZ[ "~Xsґo-' v"}!GV@Uel`?s4&M<aQApp2dR)#n>|gCYWX:*wܒ71Gxf#!K Dh9O)M CRx`uz@â4Z}`fcJFWQp?I;FlrK"{#Ebo4Rfz\CE(Y@rbCUSd|{F/m+3Pu)ܗ=a蒛 'qNd鷹Ul$$] ޷ F˓F3w_+Kut'pPR7;`h 0AtL ZhpXGțYZ Uj šHodSU%!m쐳6t7!MLiG0KF.lZ-vOXCt܃ ѡ)^asi+G< BxqAo*U4&벾%qLhMxaO:3N)|U0|r[8lx'GqR({ؘ:ؗ^x4/t״Rԍ!Lv78>jEt7 ]^yί!"|aSTV0 T9MSEN sş-N0G <۱G(f15I{!6fzG'Lq>n+Z_ zVNˊ8Y@Rr} ~ _?O`JV'8{C"kHNjwWb9İ"6;aɩʨY8Z795MUXk`+r" He3'lA{]"/֠g%)hC-:DnK;/rI0e*IR Uy6L#ebW<(]I1=RYAb7P;Q-摼%vr\'ZLZzi-)4c5='e*J#FWag E.0s.򡧱凛7fپ 0gg.r;-+ϴ"`]d\xGP'Jqƀ?!]ߊ/Zw yIqZR~XT'*QoIO[LIYi 40E=!!%,Uwեzs&EW:L&}O'zS#VڒG']I?1IeQYWS9A}Xu%rPC X#HhT yQ^Zm FLd i x/xEB88 c,Y̡"7nHRC3j Mv*~oWLF`"O #1~Ei8R ˈI)!!'xn2 "6/hTwYqAwaFHjFm 5z'`k `:%CA01 PcQU*üK>8jj*Y (p^Xdf z/c.)蝗lK` Ɵn H8+Ԋ|DVW=]`~E'H`~y&ȣ3߀J4FU6!%(_DT#[v&QYl7{O7#cƇٿBcooY-r nfcGwF uTPx?ldk#U?WH(Iޖo\Sݓ&M&` ̦/ݷh/M7fh,r0-;5$mbv)&:KΡY8kWx]x.sPhRVNP\䋸/BRruL 5ڸPɣ]#ߴ>U)՗5)yGj,Ot?ķ;kdme_H̏T_fႣ(kj89@Pg.?R`&e5 rxϘ.K4hY֏7_"jƏf$+qJ;]NDQ!l1ע1,y]O&8^w$;e'[ q=@?~-^^?~(\ =qׂԇorwG꠿A#۷׌ZyF;;c7T"z[#BvpF9M*ٿL)q <@LhJk~%13C1Z} 9)'x).+dtN91(;wŹIiMPSkU@)#;C5F;5e&[0nzC!&a8~u iSn`TWk*wchTn ZVIUSZM=5)rtUeIJZI'ǧ3W#$_)GK)41pD܉&9D~bƘ?I@E6ְo%w!+=k 66$'lqUP@nుmG>(oqS{z`E=SVhD!ey㡄t !H`Q._ fk9Y,MeF :ov.z  JX[6МB`鑹&)0z6Iq s JoG1 3ms1#tRr^(5kc(BR/:0Ԃ(n՝ O ިDD:%{tjf)}AbzG!zHyC?}kv~G{$٘LoUW%o%vtPw+@.!i,A4޲tuA#  + _pܛtj i|QN@msdqKyRV740 샊9鼜 `O(fְѵzgm3!̈́әKD>`S2g;<dH*]hq8XQ|Sq$rA>}j ftO+r+G4)Q£tS,~ܫ9;!lH>%e@&5SY?TA+cNE M 2{)íJ8ը1FeDfDe$F4F#<1B=1F͎v(r4_`3]TdWhAYr-1$nUNIY%jzیV 95q*^9n! f%}Xy&-_EãC|@3őM]XT&M~9܎*tݸTYkڛɊHM )5 R6|pLנ7߱jg&JYrb<ӕq;!"<6yOq &r<̯wz\< =X22U[V[0gtXn \W(ܛH`;ms',K~bE!Vru"Em/p4;\kQ74zXg3JOă⛛4{6OO+rCzNDeոYPU{Y-H[K'r6pSOJ`6<^1 4Rpm}SD:Cd0F;/qberSϐS!Yw`i%Z('Dɨ7ST "(| PZz$A8!#R{,+b,hjBgwsZ$9P<(2|232B2!*Fs<@:UEepP,3Se/i@8miܞҌC0ۚ `C;So^ 7j3ky߉NB⦢[-e$t~!9&hNn)iNJe⮲5#>ֶ#a9 la/B#cT?Dc[d U`tԈXTׂaBdxLf'@ Rl'9 N68hI2AԜ d$*f nw򀾿 ; #dm_^_y䙓MR+jSR^ #=!<iVFN g{%`Ϙ/,y6qa!|nNj1MO#)7;\JSG^.Wf 'ꖏLJǖ1)9pS5]se3hYǜjbu rE_ 鏙7!ݼ]Xg7MIWȼ tp CnH)'4\ЛyLi4g⧦nxmQ@FPt0ScR7 {9[M!4G{$ sTIҸ~"Ow\Pls0 Ib vqI@hUlZ@ѕ/G.]I򔐶,{qOda{AB؟^+FEnܠʱ,iv D;@Zal6XZL`h^mIs4S0ϚE/V¶V(d"3I}0H4Bo{U38VGdʍ/Gn%<-$+Es\9Q1Aaly=-c ݰAJ@_0MdGr(NCc+oSQ,9Iv&Z6+,ToyģIü<ޗQYH{I#N>k3LT.PlfjzM/=ԈӢՙ;%vw\u0E^(0@g>dXGof |E%l0Tdmda*~S T$FG\F)m#?.u}c+^E_̌1\?prW#aVE#c݆ڟ-t07c֢ MFzz!!d#zu MeT&TOI=_S_-I<֛NT&ݍ?1y,9G !9x%!n۸a@qP*k'!%οj].cRw(9H)p~dٝW$eCLCVpgi@=YVҾM`N[t 95׹Q0wO橴`7Q#7K8PZŽ/NW,L$ D蟙1sHR⚉kARXbdeR1b_Ƨ^=RR_xmR*:gٹH~x+RmqQf{{x.(* #q8M!,{0kb|SתC#P~كȕv`-v҇ $+wZ= jJܨ>.;&y|=Dv$JxWwW$wWT|hS9;EBPw- ~fPw%뷒C  ba؆);F8x!)Hw} c.kxSHb.Lerln+@-hʏ6՚$RVfͬmn\lbjީz *NYJj[_&)l5+qSԮx^^|&:Gꞗ,}RO\ zVâ8<.!&m~!5*y1M>Ȯ)IsKoi|Nj&BP:|\{:GvTy+EDeT?DWY msi5 l-yS'G=4%XsqL[V hnN=[Myqrf^서ї&֤$+ BO[|SA-|ӂāt*|); X7 DȚ AMcmResZBᝍ B^ 3.Ǵz_A<٧LBVI0G`2@JU _ZnB+~RȏmUD! JF/4q,T2y>w#4}L #ƚ9țŸ2j^=L"0L M[6=?#89ӓ/.*|3pKˎc. bb9uZӯVh]34;InAոՋjVJ4xXd,e? g]߰@{a/pԜ_BQ2Rp:>ҏǯߘ.8`GA0^#)o&AՃSzI.ĩ95Ճ J1ݛĤY {DjX$2=4ۉFeq{A%p7XRjDѱF`XvN7ծa<ٌJ,{z7kwEf9SY %.aԙf-Nt+:)89&E 2Uﳢ7Qg0^qVzSޔ\wqKpkKs=Qģe8 a?ĤSdx"Aޕ`wq ݷSciܹ(y|afH BzXa?&?S\Ր ޻g,v8NÆ#gMhʌ2?iKtlk>*A5`’lo_Ƒ>[*"̮mku$GG聼'!wL8WW@2->r}{e#` uN%tgܜY(ؤq(RģQJ.S=jN"b!QR\h08u}Dө-{(jvP`nU̓rX[^svk'84VD3gb ࢴR^8[OUQqrynJ#ʛ`тo)AYEbliT2{6pC6~`fs&}QH\,|F~sB| NIYi@c: Xc؁ _'q C Hw0肏(>pۚ:VK*H.EQ?gSm#el}ɭ#P;ШxBMKGkI1]*5ʻx˘Iԁ*jqLO8q%O)]-,A9-iا[ԒodBGע 3_IuN. b" NΛpIh&,8;(8gS6JBi!9 X Ѝ/`g\yvZ@kBjPVXUt %u < ތ; +X^HtQ!1X+R.};/w'az0tlUIɃ{?Jw'CR]@GM{4ه|S ]m@+⤚pzMn*R1\3,E_Tof ĵ9O*?De0CWdU5gȯhis+P(9gڴoBiCFlĞPWwWBC;'[IXW>;f}WW@ÿSձQ˿PSr٣Uu{FH˄_1OmJ 蛲 +;s`zn'L];!Od$3F e=kZ.&;b[5ޗqGi/%O-yvuz/zE=)mzyg\F b*uAְ!#:bNev'\#SXˊwOYw4B:Aj3{N0Cam},TGԻ UxʆOnSFV^\dL4PcS{L,$ eOf|s k=S/\?CJ{RT8+Gz,{#L6R<;_2fk:M?CIQ:Y#><#ipC5cNsUrm*]\w<;G1,YT7'O9D৾tj5@k *}<[EYrr#+!vޖ^[iNd[0'd|II~tGldA^hx=\dR2S˳;jPV\P\:hx&G:UK3Ng@H{G4V nh7 eG4 . iD#i|ڰpB4b;R y֋,q7Q X=mx"H Y^ DUA@{rXy;Flv. ].רI8T GiwG?3W%aK_i1EHڎB7_0sZ1+M䩙%0ŲGhRJ.#K[T8Y6حf9,ߊMw$Ud95&#Gq[e5Di_EgqJfMM;6)cIqMEmda7/ [}8\++LRm)W@R1rcDbG5`Q,=;r #<ܛ4utN & f,a8y&|uBZ^t0K<j٦{4TS^㊓PSIz)qߊpIܠgj}.MK ÆsUK@u%Ľ#0sKFohJhn0I;c2C_P"f8OwH ܏[ wR|Nf1}d8;ɧrSlyLRmHzVcx*&gzge ξ1F1yAϞ7޵fL47p+5tCH#Xfaq܎7; w aɘT-6 sDqXi")pu7%P4ty NM-"v*){^8>!XB)؄=›>؅JTL-A;'ڌpKLuP q3a78KT#hXPz@>6x&e9\aԌjO1Zlѳ2jT_&c0Lʞ8v!vܺp&6IRDPgl'D)rq*X]ayĪ꩚Sw[E74 &Ԏtx1Nxc^sHVɴ>NS]5PTHg:NQXnLA{NFI @}اA#.NUShkw'@ps'nN:f3NvvFw^w ]vƪ:EkKaMJ|Kp(9Zg(и],jw(9`2`ԖYNDr!=f&F}g7i]I! ڙB|1LG}7I4&>ӈU2œxu#"_Cik?pCiiW5pCdgw: !0_xnhNKOԥ޼g) 8o*|Jj Ġ,Wr)WVVLY:'%.sNum o$X}}d+ =N'}D>6x.5`z4Fδ}|;ʟ8:v^ъRhR=g,=bR}-n9NZyqiM s5wR0eT?, S_)_9͞*F5L.eO609#ǬNⓓ(k 2:R@dыlm3%lԞ rtqUEK(FMw.5EkIic#G+zܡPS"E&e:zxmaɛ3USjςf;hmrYÔv-g$Zyh^ai93bI}ӹ;1cCrhr2I;h<2_+Z;R})AvȏhR&?#J0pA㯀F=M*b_JkցAm:kboŷUCS?R&Pπ8fB)ywe?c,崬93i3`j~)PzXu)' a) Q -# ۈYY-7 Xb o" \\LLϳ7 3WNpS7e]=ڋ*1ĩYB Td?4SSJJ$4< z#/xX#ߙQ/pLsEة^nrmzFs#h 0/бԋ(+2ѝH,!wƏG7:O{a1@=OމdsCA 7o &-Bga?6?Qok-MuR  > b&VYV;Dn(k;uzj1[-(H{7YIxgA ΊNpѹUKPz#GӛP%mɇ[E/.)өT2H7-.~R-oE)6OTÁy~(,?N>,d#^kz2滗HGKD]KI&ɧpV"d^M˯ERnK#dB1~9cFA)VDxT`AHh杤+0 _ю!b]ܘmr%O?pO-;HBNNܢH\UAdGk:]uqTDދm0;d.2ӽT4)1aުEY&9!mL©0iP;R`tP?~=F\1OCm98)C1Ua`9ౌa]#\83=!L60Jf.9#aUGw!B8v8%"L=+W@*O80tMQ#37Yh7W=2ڣUCNWǯ-D`akp#\uvC]yW'aٔOXS`Rd;;ۈHԟ'qNֱXtr"_Z2Qa83knTt:O5/(<܌rb`u54h;pMh{ H:5ѡbc&JrLA#ɰh Gip!PRG֖ѐJKbܛOĮAܾ{6i~RN;c5DAb;҈~rܝ-˒_( BXHd`Ŋldo{C&S7/=e39<t_[ꛛ5<ñ@aW]'IqYa=]5en_Mu`Waz/48 PcseJxoNg?(HvO$rO8;N$6fIg\U)>s_T_bO=wTC|ޕL|T"[:(+ζ`bEb$x=+^!6,mncwIpʢѕY(Pهnǰh;45F\-$bX56 7A"‹G7Gx=aJ6)M#͆8WnH#*!>`Tss]ԹщI9sT/J(\N/ckkA#H ObtU2 N˜9ՀNSM[dˠvļ~o({)1*opy`T!_]3 914nLO HbpSn5 4oJNZtb aXNd9g$Z@sSdSj?K !|Dh)YHE)zO@xтCFypB5brEojQQ ^K+fA_%xyNd|cJQ9r_Fz֬vk] ǓOoku98<Рv! `-/1c/ˆzSE8}\9{|Y6¤#c8*5]׳pR) 7QUR qHo+r=E9'O0Sr ,yR̛5"||l?Bcʾ+M1>R2CwʔRG@^PZ78Q^+Z#]k|&"znFXGbp4uǀElr)\TPFu>"K|2ze7 Bo8\ V6♆i2㟒 j@j{%\Hv'dS979 7#8͚ZLPgq[ʋYMi+ʭ͇ SI3GM]F\#*D;!',yo*d`U0|d%%xNȱz)>PzZѕ A(fq'9]#6CcڧZ. PX}SZTܜ)W\g#9`p9qTOAh sE"'2&+ EU^v`Ue!mDܯKk8A /#hU8)N`SΩ4Ha޶"ְd^ :myJf0(曒9蜗{0IiUL2dz?^?] Zݞ+ 9v+,SzA4|}s1+卥xSħ: 1#KC5'4Wf}ˮDעm;i,uy'ڑr!xCC-wo *vV]X9RuU%4 x)O7_chI[M<7d &byo#H#Tk|s oCyt:"t=U6hNQ~N4\2m~%DX8]DȟUSS<;) ICgvKw:Ñ?|mFNrN^J"̞;Lz(BWE| <FF»7[^1ai;3GYgsh } !|E FsaqS"݃I2p_Uj@'t/'7>K'P>&y)]飿[՚^wOMF,ནOQҧ㛟5)k)'8 BM:ߺv6p*ѕv17lV x'su&&mݓY(Yi>鷰W=6J<|>WbhD@?.a e4&j[V2>Ṫ^cJR`r{퍰 \H_?;T9*Z+Is>+p{̲b2|[}Sb޶.b,Dnb1OȺO׌+7 {Vq~*_nmkQ~w7J f쵧A+ Gqܚ4yRy|~bA q?2.z!qH bDĠc,Jc*~.JRZghnc)-;C>Kf:,}$^ќ β31*n'MN'>f4\@ZĝۈB<ܛ)+&Ke4ʕ?$MKp )s̉ALAweM` ╙6@7ФFHu'5C=z-ft ;.(!m-E0z]KuWZ2?rdߥTHj_%F:\ +p] PQdO)O8fGXGK tnIqLe`j)yALy/z(3 E_XaoM;ͩdK('b9dUr6Em/*Z%13i B ϟAM- FprAVPcqOD=31SHM覒;'=[[" _&';sd^hSs䁉lrC=!gg&vJC5sTKݬbE(~1Ң;MGMnC79(TE3pBiKg#G¥{Cm,+iZҔTϏ9OZtJ$y.+˰vLNܼ!~ҦP_ʈFf(1A֏*:W^+>`*G8}A-@}>Yrk[~`{JoGi{/+gNdNXӉUfliѸ),t9H{< T4^ Mן#ӛY+c(fZ ̑ ̊2iF+2}ؘ.g b%. bR5Yp_g'WƁIm KHLJ[p7ctjT!r&k7(WKh}w#ȴfVTKn$k)fc\9iW[S0+mͱE+yQ 5Ǘ^1J>!2yR9FY|8mtޘ G\P*XbblpЮ{: zX+Mx)ZWH2z.ώTs ^g:4sxMIښZFeSނ6;W&,)'kEnP\#PE Qg$^TB|{WٿM)ʩZ9n(, twP~L*섬%`uJi2'ąBuU=7J莰k]kFW8Uܓm`)lH]V8A#@ "hD3Q#4unRH`ȁKۦPNna}=:GʄdhwmpT$G6!S*-CG=Ɏȩ[ܨ++)} .{(Z#Bv\w'=8%9< FNdLSݯ[>WrU%qE:D]VLRE WeCitʌCr*<3N `cf?/ʯCVܸZJ6s1+!iEɖwr#H#JQ].Nԟ(9-}w5-܈uufm(@DA8]Frw8*pHGun]Ԯ3Jß% A7=l{Ɛ4^MI~GyF95ZZ7SuSF0jx#غ_'[%LqbS&[ʪօ7c鞉ؖ#GfhܠD(Q^mkov(1J닱DxNcSJژž67a4;_Q6ޱ/|4~՚ϖ"m#t/Գ un%%~-yAPľU_TlAe/D3I 99̱4dfwһjeAs:U,g(a݊ NZÂt}urfP,x7D:(a!†j0_c/胣߁S#9' jPv8n*tvӒ=IV Mʠb0LY'dky>gP'-٧>XhD.K4ѣԘ$rr䆓}se\'ApS}3\}JA=(HE`ӽxvrUT6Cy`䙮gp4 0? vezļ.ΪɘvC-S3RJZ;!|q>`\kk{7aJ9*j|{o*<O8{!7UЏ"G!iZDP"9&qHd5=$iAwF :I&-X.`}]`utMGOaY¥FjR x%$Lkat#pJJw_1SF^\s=_ԑS/8B\vf%LAFX3Lz;/gcXgĬz4>ewS'ʋS ܼ\1""\t֍ Epjo9$'e&X+[MɁdAq8#ҋ@JT(FuĠH3}Qn*Wn_|ѻE)];%[/mM4ݖ*3CJ3z!s'Zyqv_Ә~湾P!(B!:9ྻ>|x"j;.AS9Z u5*3pخ0\0'_ZjKBn>JBuO^m?Ba;O|f:| . B?+7k. qS[ql(=3'gaGPxWP]o[YB6r?sB P<3f/tQəu<_!FjF.>TI+}Ec%B}<&)VF svp\Mc-hr} Mڢ;O%(84'jywqSyW]p2w_I/cWLJKG5p7*:Ps%̄Q5K~vkeO+?i6.f!i$LގB7_󓝤*O7fE8']ku juPwWS'g2A+9^~OԐgj TА벦s7-}VV`L8?*5xE)p Wb{i+3O1A'fQ'bMnJ:~Gf)I C$kJ:Oˎȅ=~׏9<>λ=g[Ɂ`UF1z%hP,p+ن/)'"MvG\(foՐ3&'$jQs#ïJSKCw;XOԍXT"|2<C\vpFD\o4脅|8)vE?4.G!@ʣY8~.WrpK$og'873/\&CZr_tĹfRY[вWܿ_E%+KO|{Ǜ]E$># b>!W!7Ri3 fAo0{0DB䞏4 e9>ŃrN7~Grj  47%+M Z7rSlO{@?(Z΃BdxG+xYa w>F뼮XW^)(ۀ⎈׽4wp.?.rg~b4hw] EN5g#8n q"+_(N;dpR7+N]jb♒>n푂Z%LHvHw%}$kݐӲsG͐`+d$1o#t6#ItMJXMpJHDɩ_g]0_aijOTam'5֚Vr\-K#+q?j9R \<(SBRw;檫DgR4jUXKuiFW4sVyKSV{/WjtwYmAvxKR#8/(p-.RE^*/MVSN0N<n=oԃ-d20Eub TYGu3G9Ί󤨻Pv:ٳ䙚7/zh܍Ȱ@yx&&N| Q?;iT3h& ; _+,.`JlB˳Ĥ0+Ia /';C2G%i=R9>ǁx;&y&P'5AӪ<+˱Z#VVK_EنL=Do\l8;HMm+!øT2/B=SCf;g~!v F^mGroFqz$4ԏvõC6N$zjR>zkϴ#% 0& TIEq*b`;Jd ~Բov!} Zx ~gSO*z|m%qܚc3ʆRB Ryf1O(mDnWu`Vr_q >枳$'l8L;e*:I ]aCOByR~!0f l88H9{"4Xy>L-&|򗏙)nтd0n9ʊDN*!d_#.93>((6;ng@5p޵=,JK #;LhwhÅf!fЮ!sMk~RW-moӖɻ! 6qZ~ݤ y-k5zGI^\P*ف~,8z"*7VAnMEJq=lIGx5ySV͝dthkҪIhg@2N@] C\you %u(kr|CD=>Rg_4yϔ*K̸t:Bά oh?SHKBdmjx2hWrW+34S6xV2(={ycٞ-}SHG4ΘSg]ɅbJÝɉ ZttδՙAߋJG׌VnIǻ r?~7vd@p 8ǴKcЭ\Cҽ0zxLWr-x+lgu{y Z(y.! œL[MCN0S"hVf~$l`74k9d~͢8)g%Viޘx;e\s#@ebPIش1.u?d`C~`)lõf@M4/sx4y3LG5-P{yfp;ʙP]%T\Y8sB3`<_$[HUfVB@^}Q!6LġXO;e<SJ_l(Ѕ'bLbPYIwiAͶאK@w$UL2tц R`P~eYqOp85$I3ݑM<1Hɟ7#01N.|Rzz6zCOvpf7Lg dRi.r<8n(_"KWrNE59 )xIV0OS[sh35F T4f_BqOA'ʁqHv)'jopIeDt Wr͒l»O: SΗ> s4)Iwweo鱆xQ0_"cPe1}L '7 @R J55م]xէrb7ݞ+Ҁ^0Z@n[vws1C_ Wr_?.9*(OKclq 2Ӯ1RJCc"\#^sW7(3FĹf pPOJfrH@ޒl2}DC{ȇ gZɖ7t.vNPNQ1qȬ^{W "ZSAu!D1)ycG0kkK;J_sV[ݾpZq183owhWsO|)蘖Ѝ%wTԨ_ ^ѹ˲>aSbȢTby>͸! ~UgA*%+Z)Vxnv.޷ ۂ?4މ%l2؏7+?.+d[%Mvʏp 'N-1)["cgjhϒqF>"Ƴ0F[S;rQʉZx mbEU*N7ǎ}j䝚7/dgJjb +Qk)\z[ޙ©Jh8-@^W`vEM9;},w +ӶJvxhLįOioTqs%䁔C9su S²b#'o hMaUC3q@6 }n)uh.9P"t߂Q>h;乬Ծ۰\OgYbk(3tʜ>zxFc;xy:A>}ӓgۘT'NWx!X[~yI2-Rv*I£8}il{c*E<{RHp]}bSǿA$K9:󅼝dMn8 vDev*"u*Į̐g"%Zk 8 Q?{ ;ruI9b%nL8VWP:Դ.Z# d&E“0bPw.Oxљ(r+(]%Z?5q(rs6z3x#Xޥ.!z*iLV(p+ =!ONAit_C (ͮJR^I@X~Ϫb_xcV8_' v aDGh'%U=r#* ~CJ; SD08&fc{%2m)xJa5n!oL`TlWÁZu8pD\iH9;5t,Ģe&\N,e@EB>%Ogm毤ρlKLҧmrFH[`b]jG}Ho0R e`bl'#en Vk;%;̕V[}BD྆WrW"8/4z*jCF-;,AC0PX1nh;Ѣ !JemXS=ԑnSR`^1Hmnz\QͼUk`PK U& JW)#sS3 aUo4axB>w i!jpƓ ʏe;ն.RTtq]NC]D%[P1PM5X˰h 2沎X( e$]ʕx)UZUTA > `F> qY;JL`6Hi&pGho㜔)s:#S8-Q7Y^hWV+ҽk.|(c>AT2\9E#R.)sHMQd{O2Gu1Jp;BFO9W "CR`kmܴ8O1ZsdM uU$ pm`.~fz0h d?9otEɉa3[]͘˲äCf |[i~&nJbR]f8lq*BӌKPYgZAGDۂ܀+ăkbBZV8bdqMƳ1Iĵ(nXUN`+iHEgPi (*kՒyd7'o3m$2p^T< ī1G])XdEXB$GFF̠Fbfy9S1Y  H-7&m@<3ʗ`a/a*,60fq):"si)=)|w'=F*RU"y-]eF{Ϫ쏹uԟy. nB6Dnsa/O%'ČB-ap٬*߆!n9?ºb-eḩrַ%q͙eT4ށbF~jQ3 UCȣZƛ#58󊛾ž1ܸ3Y-cvۏhL<ܕT.S[%_Q* a޺ɨ݁Sv>رrNΑXx cY}Q-vfmLaT|(P0>u ;'r\Fu+d^zq+Rϴ@?9^ˆ bR2)x;aF O}5ٟ#=jLWsiki"SDR /kITUl,HxG3L@4Gr4j~h9PJܿ I 9EiqANL Fd et]{2}םTПk[W$$!nEm^yɊ'?iE ;bY0Dh䟃N8=s8kq z!MKIpD:#Jkf5NR5ĪT! `^L9]ݯ64y:7qQf&㋸+2m͏?)uy/`{d +Yp'^pLC3p{`FO$%;̪zʁTKk~!}fADK泔A hHdVU~9HRJx(&;3QsT BPVjT(:h;10);m5"vv 7U8[nLXҢw01i#z̯n .:p^ç+D^| :Ԫb`ܹܽN_-n)cjGlPIk/)(?#?yOŴR p&<1/eQůo v9BRMMRisD+㶑3S]8 W7p8LҢt:};3nG ;Ұ03SErc P.h`BF4@M+J|L4iB=jWJaXE R&M`Vϟ74B1lL@DiEo@~t^@W ֵjIǟi`C9NhBdgʥ-8!avH1;D7:Ǽ~m;M,0l{AnCP8SX"PQ·Qq![S^+<mC?߈^ vkkI^Q" oYwhekY^Fe_*Z .)v< @yGD )-! HimEԇW#Fچ?20MaMh,?sxWOeЀ!sOeaWTԓ|n][r޲QrSvǸyi8*#Yv|Z ms#,f,tP]9$k&RJ^kkY0h7ZhPSg|@_Nvsp)< E(o ّ#\)ff= a(y}N[!8 ?2%ڬ{#u?2O5a5*{[ܸ"<_S '~E">>پsعTj_lKf "98(ILHGH] b^qKF68)1ӲV][zvC~R9%5ͧWCCJ>I!enU5yDk ‹>[pO@4|Jx`<7;K BCI)kh#{`W̊s`WIYZ󒵢,)n {"LJ▘fpE9h/2TN h[gHG\PήYF*OFDAGh(HX?`$K/c.iܩeoCYFqîh&@JJƲdlK/̩Uy0spLKإftG5viO\Ĭ rp>` I♉͌Jt (w]ֵw 4ѢǥR2Bdf;-lx򛑴v!26nXiX# |]ʞZ,F5 9$u eriS5ݷa ?9C 0#:9(B ݀3i!ʝpoJfpt;`4}v8d'2#/fV׊eA:ޖ:A)pB޹-++ezy܋ Փf;[=۷XC\uRgN4|; I{ 3[ЌCyD)ZWzc 5Mg^+7Ұ:?VIb1{Qlr({ P#[ cYPRjx)'NˊA(jM9Ud!"gnBikq4h}Sc4g47/ޒ|*qD|>qBifk1w+[Ħa@}P52LU9oVZtp(<+R3z&+{9pKqBn)3^p TY.#dc>Ќ ih♖' "^SwY_%vLo9=oJd;9L|ϚmpTf.*IXj5$qm&M2 fs<8Kߟ0dN\(@;Ojl{TG8/,+3*zJԭWf4%)8G))61K>ד-&4$huLSQ^Cv#1 ,19dԏ!& W}4>||85LRgIt|6>mhmKXцva<`ހ,=2\)wsބNg~4scU'_W)q^"jbM-|U1s_ )dIQSOZll'k)#@?J[%É,0boWpCD&yi&Ng7T8*+}%sҟġkbHNBWaH&pS쓞awqD628PYN;mI^S}/&dd g띕N+)vK&L8Ytb$*R}ug$sِf6k8400к#}aYNv\i5,ö4Y׻$-ʻ۹x;Nĭ4 fu0!qZ:9 *y]K7kZ`=xc9XSx4Tۆw8Õ3ɸbU< qW U&Ei{=(\ЪL`oOPtxg"njbTg#EL;fp]עlv'v)f'6,M+b?# <`,MctĬW=TsXv' %qnPt 0yP\t/QWVz(?W(˝C51TtX$ircv_*hi V>[{_ToN/P퍎 6c(^=|?zdya݂=g>qVI0sbjp]kMS<ݜmj{*s^ hR=tɷ"́_ sF7XZC hC;N*VTno>e~dbyO4=8oOn䟑o)Fv=,#J{&Ze!6j^@F b.OE]7(hǑHCu'|?z##/(pLRNQ2x.i;[l7I\Ģ> y(iaw$9:Iű 9RayR1#J =#bRo0QG>7^Hq(3JmJ^&z@5ⱔ8 V݊=5qԺ qR:5=Ds384) F+3®HK,wZʷa&KNS7*7Ȣ@4ncpDQ.IlN>O#LD═=)7WzmËy8\(X?藊inRG n31SHqJh;m .~О/+Ͳj&ӎ ȁqLuwgP`1F4}N%)w߀;)f~F4` EKf`Ti)7w>'+[e Hs+fl :nDKl{B觓Zm`uˮ^U(g?KK&ڇKSڟ "cJ$ɬ]u#~23,pSTg_#G6S|F%u e%OR~O"MǸp+E]3 įAM'r 0Qƌ?Dc >f Kf]ƨuaUS,Aԟh84%Bk x4*.[?vhܾl=y[d ݨ@_)0joLVvQ~! ^ 4~íH9;eQ{xX5txt][NʧOw5}Gh{PruYժđZOxMr'?6S21u8VR8Y@_E#͢bB;SRƒl#b21Ѯ I`E9 xmCetj<{3%Tw_-{{)YkM!?cNK"K HϞBM3.,j&)Fff\B9867@kvA뵻<+!>&(ga;&>.'Zqsa7#QYx?#<*+H!Ex.!d7SSՐ8曆iTA)aI[2=a$fٷI(Bh` iF[FfKh+k?fR5U5/+^7ZdByю"D d1dQPL!`7Y]pp1)A7 "*Oͷ(q;)38*4Yu7+6IiTkT)10GOxxڌi343Y6O=LDNCӏ"%\1T-FS(طqK#޷Ta N A>xTޟxBĵpʹM)'֨7)iXW=7%r(Z4GŐ~<^ڱE`k;(-0_N?"D i$g X-:t~r`y3WPSc}N2e$ WJ̏Rs뙍)93 _#wO[.5E*?#E_iM R.c'T';!"CĴ tT~Οxc-M>N)48f p^LY;xCqrg.N^E1ݑqYQ\G?  ;jޠOI>lFCS&8;D$̇ǔ f ZMfjƳl`1U/ g"D ۂ44AFyV J)1Ô)(SlvT%-{vBX72]{!FʊI!E"i/22ֱ.kM)*{w,`t^QJ`y(~i!nK}M:d%9Lmt gx~TQkHeO+$yF dR6D7j{zSjN':#>o%g(]E?kR71E=al=\f V(+Rk 8t!~ QූAѯpt&yрQg{F߈ի G*W 1c'FTmQ :>k!xL"b'`":Wmq@ĥd{@R^*V.JThء#sT&,C];o+AazWƄffmWˏ3q^+`%dxyT/v<#Dž?)JIa}0)YG_-;w5̯_!CFx> lgNp' ,δ\_G#nOڇ/lXg9N60ȐT<}>/?ipܖsha18$T31K߹D;GF30 !ܥ^&#WPv䀬6QD+Y7F$MF0r_=+/u"(!pԘNԮ!dc>Ѝ V2F%_ц7xY{e%LMY4rSqʢ "f<r{.ྌԾwRn;Ϛ-i_=a@L41n T7R`Ϣ^( 4UqhLA7hbP D2Rn5/oaG\z@D[6÷b9E *9uo6=7<359;_2sX,T`gE‡)B)Qhf]P3\u$ w8s ;:z v\Ԍg?9MfBG?qEYoOuqR:@t Fh]~~Q۸^"ay#yA¶+(5 uy3 l!T;BNIk$yCe=';fK!6oV+/:KSV7ѼV+Y.ܑH\y&:f (mR>NEvpU>|_,㝡G>p.Ay3NG5w-88V[ 1{q6N)#]G$͢:ԏ@˸hMbӽPB}}CB$Ү 3ɛ`-C:v[Ә3b5\$*ScLHyA &'=v5aDI{/Z=^3k{Wx;[G< f!-j9kVO$E2n/>KOYu=j / BIݓ{F)M$mhQ+=罦?=Ltl:+D5 ӣv8-_K<N ~,Vଋ\ᙥ.Ւڒ{3YLQ`_cf!u~'}_%t)ccH>HpJOdJ#pH^Sa I{G3Wȿ#6н~uއ8k>pZl)IcvknJi'rPs o]5íXHA.g`;Y)0ݞ ƨ짒3pTҋ ,gYGNA31+u ƓrیU< VxⰣ^=5lw{i=1JbB63ngprBNvqKm%!˜&r~wnh.Uf&>BY]΢;RgYS#%^)0vFǓ QL]|ۚ0QszY]"FU2uRa6 $qW@|T&EY o' ŐퟕvBRXRy\AQfsUg:ঽHoV3"ꑄ-aTt@H4a9Pp 6[KĞSLM @݂ɗYE GN;N0޿N(0O6b7r%h c3_%ETo+?aQK:Wj[{OJ;JyuT ;?0L&4HP{1oh9P԰xu\A1 w<`p5s8&iuQdѽ)2k6)' { 1m*D:a-MuyYܩvMZz.O&ۉf'cj3)ɾFv0bk)&GPK\cw"D@#FEnKY,+d@в X-I5ҫe+cǺGcM%FJj_O,i&\=,yR E ks؃Ե1\p΁#CEC8~tp+nm3(}F\{Q0ɍL Ԁ${,5JM}8.AySF 6XlH~ePo*3քXWI8.ǒp*{4'헌4 XĴ m|.l!bT2kʱPb̻<^!5)dƶ&hMǥȘ lkTdC2VgMu?ScE0uz;Z4xi(esyӑ ]ݺ@0*=Cja n<qq8&XrR x9KoABv %!?*c"w Rӎx>TF;ƈ)Pq4'jkڎ yQl~8'pI r\k13-EgnCPҸN̄sQܿZGϸp-7!+zks<$l?}kӞә2f~*MR}!n{(v`7ӸrpJ[׳m9kzD׊j @q* )+FLZTLc)ds]򯚝5:CbM[*nW#iC)1PݝGp3E5 ٬#!%͇%LEȽqIhg88hO]܉g ⪥0UG^ЅS1M_ Eao)Kֹb%5bE' ~?'o(ÍI&²]ȒVڔR6> 3X_ےe1(Vj` i#>k C9)PO079#OW&.V0F~+v<\5{-Oj[qP"y;) YyKvVIMv[V%F߂+k[+GFUܵ|(q _3Ý0iIi~~mU8ٔ&➂>F)XÓtG`QMe%c3FrK}iÉHH fsTR/oJLvoXaEpG̷>P|C8V±U: o^+5ga;KXÊC5F z7QȇKILb͆=,vڔMa9 !cֵV)v!tza,?a\lA VA9ӽ6?) yM9. ̡ٞ+&y#1#zĝu-Dŗn]x`*79u^"dr%/i+*n˾T')#CMxT1o1`n;.9Ƒ"x߿P\,3Ȭq_̦S}Cc{A}l:eb/Su$)'Mn 1ͱ5WM+|q[L:z.'Du Efhܾr8guGF/' LA'Զ3T:FhhK\/#79;La嘹GvMC*p*9|loK ;0pj"t'?*TkT]Ky *PO/c7l N)yt7⚞5٩%h'hT2+3V>ysX;3 Hmn;Bp);ML'k~I۸_Hj*)5%8Y62.lR`wKku[?)zTi# _#5mIUI3Ľ+5̩)iu;34 _H̿R!!>+7}Wk |We>̓RvӅjPyYInCe_T)RK^_wRFg6ӰKOjw[)Bk 1 ע#0fRcFSm3WNPҥc)wӗE%~L6Dyĥ-8;Y8) EaJbNI`Vݿd)rB*׋Tx}z/kI`|ZO̕O*.1NDZ $p 3]i9)DM01Eע*k?22TUwY p]&E`Y2wԕb~%E+p^"I9\m8GYoPO Z +oF톯GeW7x `0(;2[ȆdY3v`}g&Y6ӲL9 ^;g]p]oE97/?>p^e+H3@jO57y]$m1ME\R3;3|aNP%,,7ᮻ%GQv\5UwT2}JLMVyJ H6˽xѯXA51>FpGNlK;&]v̡`=z,8s 5wQvq\ 1>A*j 7o$w'-C;|"nb51v=D &ްKi]OGNq+*+dV9I0XѝOEB sIr̒}th]C!"$;"ù:'9 ^>(c$\7cslΘ0'r4gPrx,IXfݽdvs.]*Vӷ\jZj{̸=V9\be,kj[L.?ј#B=1T2!h9S&LyPs4!NZH5{5*-lV]։L QUWmTUyx7EJ 34pAD3yKHz%ExqMe.Y╓<ǚv3d1Wz$oMdKu-ƳZg$5p)7FI"Bn1Q\Qz& ^-n'` ,|GQx֙޲Rms6)7AWC`UѮ}=q~u[KΘ? :YHxp*{ǝV9^RϻTHL d[jZ̙FƵ'%㺚5bMF\+"ÙW8jd!_'Ύ㘟)H|hܺ~V!<6#ڪ@oi"Sͨ 5gaӅǂ4Y;ѫ@V׬M.K? ;{Fg4`/;T7bӒr\$S oM4Z*%lhHJD(DDK|;)459:th@f5hBÒykHV6];IRrv)_WO"w1#GN;Eގ܇5{J>8{G3؊4G̳/pӂȱGίRMQ\Nh1j} G[MEn7 E8pd8;ʧ*jς d|Q4 v˚h'cS7QnR-C5-܉,lKIyMHK4Z#F1 kg,{.%ښi!/Φʝ'9 AÅgNxn┌e~t[z]ND5%Vw9Fv 3 #g11 *D~!Sb $vknUmwJ3 u a+~)SZI "7'< oQ0M 3+*^7+\qP:Ԍʊ|!1pa@Va@?6[ItNXA=ʶ+guR915iiP>㆏-x$1<="&P`;{N yi{TҤwN|UgB\tdF_sTprl 1Z8d!7qTҒaRA^ꁭ^`,C7+qa^֥z?p*zNj`/NWc*|C(QqO|+{ξ+%ܿ_X4bhAlXb)8_6@er4|s CwaʅePVѐ@B^'B[ A>]l,NJ޾:޽P!7)V/CֽJ6";ɯLRԬX" 1#n)C3z'j_`#Fѹ Ѷ q= +9ں֘eNiï,@z1pi܋$ygIރ(ianHQmhWYLD 4g:uzBiܻkNX)s4pT%z"jvwlw(Y(Ez[qֵ= +vh|ǀK9M%)0(\S`skB|w“<ʜ1cB"hѬ`Cv (ޏwLyӇQFnvl7BG 5q Փ`ͿWg=!lf-Gʊ>)cQ2x +#>܃l 󜻂,\E[M7b5< 6 Ykf9 +FS\3)fF%ğLmL}G+1?5y`,!N=;npXzh~N4g <U =ԋo` {K^-p[e)4Q/j Is4̚zGũ@3rZC_'8)Wf- 7ͷ )w S].E vMsxZ]Q0HdAi-z7uu2,u6x8dgNR~bzc! xwQb6W= mStp{KGG4ףw R\^xZMR`lp[3}4WwUׯ<ƥ5A䫧m_$0\n>`oaűNIr1 9jg7?p 1qZ WQ΍S*Ԟd@3.Y5B϶ITxN|[nxUj S NkGJ6-Q2rk;'_̞j؀z˯W2mgY-,NMDhG̤j8-2JxCw w[V|!zEx ;l2tH?ݜبhY`ͮ*Tq|UI&^F!I+ 4XU-Vw B>-J>*(ݙy":W\рEQ7ö$AxEZKK "UՋRªF&cH[/KZW%-9\lQD&(>oĠH2nPT%93Υn0T9V HF@}+qF=OX⦼up-T._x8 X=QEnGyz &EMAcm;ҲcN9`ΦNܧ)p+=v7eId _T~u&GMKq99[A╰T,K=mxPZe75TD:CБ6k)g?p')\;ܔ#Uq\یsA8/FgĮC#nZLhHR]ʜyF8&ͭoORIMN<`WcDI |^MS.z\vO))QM%/p]m%wR@N:MAN$#k$C9-'Ib/wgx-C=%s*s7!@vϏhQ#^t)yAT[ZvqK)K8]ddC(1\`j8$"̇'材?4yYEɂ~fˎ&kܼKHQVm1w|[%hIi0[%ҢX"Ll ҧssDUh%6C7_R~Pho5q#WrLX.6׆Wry"lAxp'a08/Iav}Pniʢ$蟴0[c݂e@qn_b]l")h.#4*D1uwq_UGg0R<*/.8.8Թ[@ǰ7!ĭ $ #jm)sڽEʟ"j'Bi#B9F裈KOuzܤaӟ |+:֍:l$ZF)u/9_>N?쵏u]ŽٌB 9t \7AgXsCih܊?O5PCջґ(E'zrsUv4h|yYZ Ԗ| w2Sc]A$#qs_K1ݴhx#u3`K0){/~E )^y:,k&!qBi`ӊ5oBJiUQ|3T}w/)C-('ᚻTqXցq]jq\0KB=\vf])4hț<SK[IM5's }\WXܓNFl03Nռ-IyInb\ Cek0 zaow 0tGhn8*9eyB g_&wK[; O ^7 J!\ ׊5~Rܼgc8,b~2耉$;cLxG0I1> D%ƛ18.%}T"|ɖs6~J2uaYl׃j(j2_Pt_{xz٨*S`;Ѧ,sz)%oA Vrbq7r mkBqSސi 3{_t/EziPgBn;ѣc]ĠIJMQީ^l.,sSβR9)5}g ze8>ψ_?/ rha}),NK\}Bx!(c8POSV@9O:ּh+rv s1r{WqE" )\rML#wdFmƘ!L#C5xQx kAu+] 8V,dL&&hY썣ٱuiLI#2NHI8#lk_O0Ba–}7hE=ZoAg(CvrSl~E hyG '\=<:x-7&%tyQV+ AhWw෢c+cڲP͒V;qXlũCэN4t# 7J<{gա4ܙ녬iw]h!>sG'u0SYީdu)%ƍlqA+Y#󸯅w5l);[?E= owGi[K[S<nV(؈wb#╚Ħ Amg)tkfִmk6%yf9]򔫏JF3nK&^BiBJ cT!BVFa_͎̕6rRB>IG@ 6ּLvhm/V cw,Efq8<`Jw,EO~Te; E %'41XQ'g$M7vtD].k$?kR?&cT3QǪ űf1>. 4\;3`"XYKF-h}F 8Wb9x70Xi/M:NvN âg2qk,a4i?#hR-ml: X-A$hkzS_x;+}VG5p)+C䝍٘T^P᧣l׺qOq,bܱ#lfLK L8fs}SP}1HhG-uLssVM=_IQ[7%>&:Ls`ANg [x ^/LG5vR!v\qǫU 52ه !GuyQ.i-ĥo_FʔB;E`RAib=,OS[ Fw 9'cajPC3-cqLN.=ÚCsmn=lb O5Oh)kনȭfim^!T2<p^flxZAgD`*i-"̞erq&.Ir95kz4B99 eLZ5f[hpLȻ>s<e 'rW)N1poI)Q $l~jI:دoÊvYw+5Z}bRߊ6F׎)z-qr䝂) L;ΉzTw@Zaܚ4cqC G&X߈Am㊢`-v\ ˆ*n 2<{8b Ȋ!jq9%c뜹qg f+d)I^i+>&HPF+Xh|=\T$AAN@4 wR_aa裋BɗUK~>A!Z;Ar Σ)b T_>jU Sb L`fDdzu=7`=B^.68(Q9U]LUGAhFK_B&!=3lQGn7}Q7*j,kP. ju9*~x[iHҦ f(tfvAO{>?L_JR- zj4#LɃK*KHz&c)gk[-@J(j퐅?I_!(:(D?j-WlqRsw~DRg2mn5@ʣi+OGb@!Ga ?|Q3@7zT/ZWW^u!;jiW@Rp+^ {RJ!bܘ21^x3I&+"k4NA0II ;&4O:0pH8\% <.VJ9DljT8VsLTD# D3uÛv*5́Go>J{/Dy Yp8vsN?# esm˭>kv1ԖNmJ^Sl XGMvٖkS8?r/f_䩇5 ԓX55(mRQ>j -#-2ysq "e?&oeG?sx1)A&fGpbvXঠfWJc0P7JzG"ިck/'[3A,ıŋRfb`8XJWM LChy .΂&E'WĦ䰧 ia{rJ~!f{B`҆K w"kD>GJ#zKn sak" *J!Hn\k]<ŐB_-xKGq#qMG!ϵmAR JX #7B4_Oݫz,֥l|PoS/9.ib 3H)n~uN@9D\N♞Qݣ~R-b_CwRHSKv©%M#"K'e9/J/WSk81\_&L+ܗ3Q;xOo7pGk,^n@tEzfU|$ IA3ߥ2O80v)xKJ=k2y)h#Hb-F<VpA;z =cOV+~(S>9ysQ9F% tkvT죺8Kc|J,f^J%Nrb E6Mar!Qd1:#FнKg.o ;oeb+-y;cJf†SBVhIAmK胔mNkNi3jvLQg{.-Ixܱ;~wf<ofcގYCھCB’⇤O:1V5Q:f\w4"OBr_`_'"*[Y^|HhhޓJୠ tzƹCi2 ͓$j'Ӓ%nN׺*Dy;M>%S}FE*;9\ٞ+&,lF)IsHyNN :()y1[kaRp6OP`a )֋&' qK^l7 aM>t̀ρsYWS?ڳAwSozb 79q.T0RS?pman(l8" ZnY"S,)*ׄɶ$Z 0F;-\ö*sj ō[f 뙸%# pR0Ϧ?S^i+RϚ˒;SrԦSh:DbefHw^uP9:'.@|OvVO&]o(0D0oTT)(z%I5 Sc3 'J0fG-rT |'+[lcTёN(ǚf }-lz+{QFpEf?}Eu)aPFW4Q{&Qv-G$˾\Pz§J+핌sC60)e3l*.;W:W赶Ɋ $ld87q n7}Qk)ByX<&;£dqeG6JҡIZMb "g\6[ Qm a%p)i(G  ⨧/ H:7; vw9/`@s$0(򲍣}_ڛ$%^`T%(S2E`4ClKs(Bv~@Nv0hG?T2vŸ6wu7 8U1R!ꡁRhg^[.5! *ډr+Bd\U${Q"G{swʅT6*i>Ca HK; ʔsN)B[z,9ʗ`m&%3ƸWZhƜܿBɃע[_Z9V!oZ ygn-F=9Ǵq*߸78ppKiEg$x`-݄-~ L'_wM`JW+-[vK yIiL/;dܼKRkQMıs%rIH^`*o\fD]!Jbj(b̉0EWTš!/* ¡@"65 ǛÊz͸%o9SXw1H5l~)w!Ѝ>.-":L:cwUjIx3F+Sd!Pͱ"-G. SoqFIiy1[S9l;/l| ٘⦼ToXΰON-' ;#?]7E oKU !ijSpJAz쏹ux7rOp+|]K0.I^߿N+j ;}a0/)CsTj<}Ú{;Jrnz+U~?aWؽ4|34nRfrSφ+/zҗJ_#꼼T,topܾӰ z&Ww$N8'e;;.^^M$DlL=z}qKB_/*H2 w /*9k98O^*wP~D_QY2ovw B~ٞ!B(F^^HiO0Uio%"wԹ/BC5YBh;.]up^^E7@LG $o?7m#G-p(\3%;1E5IMJjv-^^K缿SjT]1-9dX|&g n嚾.ꇬ/*kŷ}WEz%Ox /+# JNzoF=6reyyNSZm>Jyd?yy#vCH#wuQ @ӻ%#5-~vٽ2N;>ּ^d{ l;RcvJ o+ʂwR>dޯĘ-nyy#q˘@Jޡ_/+/;F PLQ_Xz<}yy1ypLE3 ݨ;kr򦗽h. `vWOI>*^Zyyo1'=_avl/%8~~*W!=z![yJh//(zs O}]G^^Hk\߂e݆ӄ"KH^^]srHy}ɈgRIHKIyI8IȦ~BNv^^S/]f[[ONyyPQ:p^_Qaz<}(}geyyWʡ~n.w!5/*x\2[oBMbmYD!Iu rOTMayy";E5Z1}x}Ss:RPAwk//({,B+LAyymG\+sے$n=!yO %3/+ wy}MݵVGG%I̭>cfYJy Li_DB(yy-eNyOߨ^^V.H敁޿1^^Nu-yQ3m7hj^^F1& =;&rnRyf8?ZYme{ٛ&ocuN=J&.0^@=(*B |k~,sfP]iNFhѥ LwDZ欨>(\M=kL+I`]LKn@YA{bfnJQo:>O0/>#>߃h-bA4y{NV636q"u[YC/1f2&z%N2nknf{E9>Do@z9QL~ĂC(pm7#Ę螞GF۷_W{`")J;XƟ[Or/ڞ[w~Ws eepj#] z9QLG'b f)GL ONJœ6 Ͽ5u\lvGOI.{&IMp?N71(Zlh6Bܑ]'Kj60Z]1Me Lr%,)=q936K#Tj&e!%XFØ?bnywZ(n"on-ǹ|!>< LwMwX#EVwV\DKXfyq^݃ichqgUL!h,ZP{O&Α^9=yVCi0S;8 %ޟ6.~U`m, PEt]7\rC)B#'> P\-A`ZY䨿  b,h:sD kA{0};X1O;o1^݊4Ʒm%҅\&Ds5G10& y Nq?&F!eB]n7sEIӯr[õ}qYz]NN@G^|VB0spp> K,aݔyLZ=:B< `oK95zS;9Nw0FN\bH.~<%Ox(ojEL%4-?Ufp}jy쫙H5pxhR+}?_@<mcEu.F$6?go64q, w~&uGZ,{NBnm d-v H >yN$O$.ڸ ``n{Ofu^Jt<Ht.YWx[±Vv,`'3`îY&.>aOy&a^}+~W=sG&%-*LP1*X L;T nj]Zin{ dlrG]SK9c+ow0$h}BT Z]'/|"nq"6ȄWyg&o>{3ʹFc=ӳwk$  @$$0Гgp,c\%0;|-uaz׮="ro|j݊ _=WNŵDsLwՂer_vX ]gdX8緱LpY |{ !p[B$āϴ%좸$Ŝ;< } uЬ"hÌ鏞'<s?U5S\%ELXX" }^kZɖǢF Q5|d6ŽG8?fJm|ukJ=Ęļ׫{HȻ uV'N1yWXG9̰@T fV K^˼nr^d]Ð|;,3RX)^!U<)81[!3<ʊ[iO9,2% .K0i5*qFc/1=+<uDr , %&:s[r\v#v{{ q"?/uX{OhO&-SgUN˹k\y0;b c8[? BVsL8 Ye*(R~Oz6_}QY7׹N~ %0\/*K\f\2L= w9:X};%ڢyY|" QB uS:Ws0Eewż!I #XepnʓG*`.I3.Ix۹Ԯpت&i`3y*w7=ߕBe *Z-Y:9ҟy_?R2Ya{o$,ї?9+/#M\˖]Nz|O5+mR$]o]Gˏ ~| m"0WcX #F\\k- uXnŮ@ \NXF`蔹iuʁNdu&f  6 I| aOp._%G!YEamJ`_, and `cards layout `_. - The ``link-button`` directive creates a click-able button, linking to a URL or reference, and can also be used to make an entire panel click-able. - The ``dropdown`` directive creates toggle-able content. - The ``tabbed`` directive creates tabbed content. - ``opticon`` and ``fa`` roles allow for inline icons to be added. .. tabbed:: ReStructuredText .. code-block:: rst .. panels:: Content of the top-left panel --- Content of the top-right panel :badge:`example,badge-primary` --- .. dropdown:: :fa:`eye,mr-1` Bottom-left panel Hidden content --- .. link-button:: https://example.com :text: Clickable Panel :classes: stretched-link .. tabbed:: MyST Markdown .. code-block:: md ````{panels} Content of the top-left panel --- Content of the top-right panel {badge}`example,badge-primary` --- ```{dropdown} :fa:`eye,mr-1` Bottom-left panel Hidden content ``` --- ```{link-button} https://example.com :text: Clickable Panel :classes: stretched-link ``` ```` .. panels:: Content of the top-left panel --- Content of the top-right panel :badge:`example,badge-primary` --- .. dropdown:: :fa:`eye,mr-1` Bottom-left panel Hidden content --- .. link-button:: https://example.com :text: Clickable Panel :classes: stretched-link .. dropdown:: :fa:`eye,mr-1` See this documentation in other themes :title: text-info font-weight-bold Click the links to see the documentation built with: - `alabaster `_ - `sphinx-rtd-theme `_ - `sphinx-pydata-theme `_ - `sphinx-book-theme `_ .. panels:: :column: col-lg-12 p-0 :header: text-secondary font-weight-bold :fa:`arrows-alt,mr-1` Adaptive Sizing ^^^ Try shrinking the size of this window, to see how the panels above realign to compensate for small screens. .. contents:: :local: :depth: 2 Installation ============ You can install ``sphinx-panels`` with ``pip``: .. code-block:: bash pip install sphinx-panels Sphinx Configuration ===================== In your ``conf.py`` configuration file, simply add ``sphinx_panels`` to your extensions list, e.g.: .. code-block:: python extensions = [ ... 'sphinx_panels' ... ] This extension includes the bootstrap 4 CSS classes relevant to panels and loads it by default. However if you already load your own Bootstrap CSS (e.g., if your theme loads it already), you may choose *not* to add it with ``sphinx-panels``. To do so, use the following configuration in ``conf.py``: .. code-block:: python panels_add_bootstrap_css = False You can also change the delimiter regexes used by adding ``panel_delimiters`` to your ``conf.py``, e.g. the default value (panels, header, footer) is: .. code-block:: python panels_delimiters = (r"^\-{3,}$", r"^\^{3,}$", r"^\+{3,}$") .. _components-panels: Panels Usage ============ Grid Layout ----------- Panels are split by three or more ``-`` characters. The layout of panels is then set by using the bootstrap classes. Default classes for all panels may be set in the directive options, then panel specific classes can be added at the start of each panel. By default the new classes will override those set previously (as defaults or in the top level options), but starting the option value with ``+`` will make the classes additive. For example the following options will set the first panel's card to have both the ``shadow`` and ``bg-info`` classes: .. code-block:: rst .. panels:: :card: shadow --- :card: + bg-info .. seealso:: The bootstrap 4 `grid documentation `_, and this `grid tutorial `_ .. note:: The default classes are: .. code-block:: rst .. panels:: :container: container pb-4 :column: col-lg-6 col-md-6 col-sm-6 col-xs-12 p-2 :card: shadow .. code-block:: rst .. panels:: :container: container-lg pb-3 :column: col-lg-4 col-md-4 col-sm-6 col-xs-12 p-2 panel1 --- panel2 --- panel3 --- :column: col-lg-12 p-2 panel4 .. panels:: :container: container-lg pb-3 :column: col-lg-4 col-md-4 col-sm-6 col-xs-12 p-2 panel1 --- panel2 --- panel3 --- :column: col-lg-12 p-2 panel4 Card Layout ----------- Each panel contains a card, which can itself contain a header and/or footer, split by three or more ``^^^`` and ``+++`` respectively. .. seealso:: The bootstrap 4 `card documentation `_, and this `card tutorial `_ .. code-block:: rst .. panels:: panel 1 header ^^^^^^^^^^^^^^ panel 1 content more content ++++++++++++++ panel 1 footer --- panel 2 header ^^^^^^^^^^^^^^ panel 2 content ++++++++++++++ panel 2 footer .. panels:: panel 1 header ^^^^^^^^^^^^^^ panel 1 content more content ++++++++++++++ panel 1 footer --- panel 2 header ^^^^^^^^^^^^^^ panel 2 content ++++++++++++++ panel 2 footer Card Styling ------------ To style the look of cards, you may use the directive options to add default CSS classes for each element, or use the per-panel option syntax to add to or override these: - container: the top-level container - column: the panel container - card: the panel card - body: the panel card - header: the panel header - footer: the panel footer You can add your own CSS (see `the html_css_files option `_) but it is advised you use the built-in bootstrap classes: - `Card colouring `_ contextual classes: ``bg-primary``, ``bg-success``, ``bg-info``, ``bg-warning``, ``bg-danger``, ``bg-secondary`, ``bg-dark`` and ``bg-light``. - `Padding and margins `_: ``border-0``, ``p-2``, ``m-2``, --- - `Text alignment `_: ``text-justify``, ``text-left``, ``text-center``, ``text-right`` .. code-block:: rst .. panels:: :body: bg-primary text-justify :header: text-center :footer: text-right --- :column: + p-1 panel 1 header ^^^^^^^^^^^^^^ panel 1 content ++++++++++++++ panel 1 footer --- :column: + p-1 text-center border-0 :body: bg-info :header: bg-success :footer: bg-secondary panel 2 header ^^^^^^^^^^^^^^ panel 2 content ++++++++++++++ panel 2 footer .. panels:: :body: bg-primary text-justify :header: text-center :footer: text-right --- :column: + p-1 panel 1 header ^^^^^^^^^^^^^^ panel 1 content ++++++++++++++ panel 1 footer --- :column: + p-1 text-center border-0 :body: bg-info :header: bg-success :footer: bg-secondary panel 2 header ^^^^^^^^^^^^^^ panel 2 content ++++++++++++++ panel 2 footer Image Caps ---------- Images can be added to the top and/or bottom of the panel. By default they will expand to fit the width of the card, but classes can also be used to add padding: .. code-block:: rst .. panels:: :img-top-cls: pl-5 pr-5 --- :img-top: _static/ebp-logo.png :img-bottom: _static/footer-banner.jpg header 1 ^^^^^^^^ Panel 1 content More **content** ++++++ tail 1 --- :img-top: _static/sphinx-logo.png :img-top-cls: + bg-success :img-bottom: _static/footer-banner.jpg header 2 ^^^^^^^^ Panel 2 content ++++++ tail 1 .. panels:: :img-top-cls: pl-5 pr-5 :body: text-center --- :img-top: _static/ebp-logo.png :img-bottom: _static/footer-banner.jpg header 1 ^^^^^^^^ Panel 1 content More **content** ++++++ tail 1 --- :img-top: _static/sphinx-logo.png :img-top-cls: + bg-success :img-bottom: _static/footer-banner.jpg header 2 ^^^^^^^^ Panel 2 content ++++++ tail 1 .. _components-buttons: Link Buttons ============ The ``link-button`` directive can be used to create buttons, which link to a URL (default) or reference. They can be styled by `Bootstrap button classes `_: .. code-block:: rst .. link-button:: https://example.com :type: url :text: some text :tooltip: hallo .. link-button:: panels/usage :type: ref :text: some other text :classes: btn-outline-primary btn-block .. link-button:: https://example.com :type: url :text: some text :tooltip: hallo .. link-button:: panels/usage :type: ref :text: some other text :classes: btn-outline-primary btn-block When used inside a panel, you can use the `stretched-link class `_, to make the entire panel clickable: .. code-block:: rst .. panels:: .. link-button:: https://example.com :classes: btn-success --- This entire panel is clickable. +++ .. link-button:: panels/usage :type: ref :text: Go To Reference :classes: btn-outline-primary btn-block stretched-link .. panels:: .. link-button:: https://example.com :classes: btn-success --- This entire panel is clickable. +++ .. link-button:: panels/usage :type: ref :text: Go To Reference :classes: btn-outline-primary btn-block stretched-link .. _components-badges: Link Badges =========== Badges are inline text with special formatting. Use the ``badge`` role to assign `Bootstrap badge formatting `_. Text and classes are delimited by a comma: .. code-block:: rst :badge:`primary,badge-primary` :badge:`primary,badge-primary badge-pill` :badge:`primary,badge-primary` :badge:`secondary,badge-secondary` :badge:`info,badge-info` :badge:`success,badge-success` :badge:`danger,badge-danger` :badge:`warning,badge-warning` :badge:`light,badge-light` :badge:`dark,badge-dark` :badge:`primary,badge-primary badge-pill` :badge:`secondary,badge-secondary badge-pill` :badge:`info,badge-info badge-pill` :badge:`success,badge-success badge-pill` :badge:`danger,badge-danger badge-pill` :badge:`warning,badge-warning badge-pill` :badge:`light,badge-light badge-pill` :badge:`dark,badge-dark badge-pill` The ``link-badge`` also adds the ability to use a link to a URI or reference: .. code-block:: rst :link-badge:`https://example.com,cls=badge-primary text-white,tooltip=a tooltip` :link-badge:`https://example.com,"my, text",cls=badge-dark text-white` :link-badge:`panels/usage,my reference,ref,badge-success text-white,hallo` :link-badge:`https://example.com,cls=badge-primary text-white,tooltip=a tooltip` :link-badge:`https://example.com,"my, text",cls=badge-dark text-white` :link-badge:`panels/usage,my reference,ref,badge-success text-white` Note the inputs are parsed by the following functions. The role text therefore uses these function signatures, except you don't need to use quoted strings, unless the string contains a comma. .. code-block:: python def get_badge_inputs(text, cls: str = ""): return text, cls.split() def get_link_badge_inputs(link, text=None, type="link", cls: str = "", tooltip=None): return link, text or link, type, cls.split(), tooltip .. _components-dropdown: Dropdown Usage ============== The ``dropdown`` directive combines a `Bootstrap card `_ with the `HTML details tag `_ to create a collapsible drop-down panel. .. code-block:: rst .. dropdown:: Click on me to see my content! I'm the content which can be anything: .. link-button:: https://example.com :text: Like a Button :classes: btn-primary .. dropdown:: Click on me to see my content! I'm the content which can be anything: .. link-button:: https://example.com :text: Like a Button :classes: btn-primary You can start with the panel open by default using the ``open`` option: .. code-block:: rst .. dropdown:: My Content :open: Is already visible .. dropdown:: My Content :open: Is already visible If the drop-down has no title assigned, it will display an ellipsis, which is hidden when open: .. code-block:: rst .. dropdown:: My Content .. dropdown:: My Content The overarching container, title banner and body panel can all be styled by assigning classes. Adding ``+`` at the start appends the classes to any default ones. .. code-block:: rst .. dropdown:: My Content :container: + shadow :title: bg-primary text-white text-center font-weight-bold :body: bg-light text-right font-italic Is formatted .. dropdown:: My Content :container: + shadow :title: bg-primary text-white text-center font-weight-bold :body: bg-light text-right font-italic Is formatted Transition Animation -------------------- Adding the ``animate`` option will trigger an animation when the content of the drop-down is opened. .. code-block:: rst .. dropdown:: My content will fade in :animate: fade-in Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. .. dropdown:: My content will fade in :animate: fade-in Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. .. dropdown:: My content will fade in and slide down :animate: fade-in-slide-down Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. .. note:: Current available inputs: ``fade-in``, ``fade-in-slide-down`` .. _components-tabbed: Tabbed Content ============== The ``tabbed`` directive generates tabbed selection panels. Sequential directives will be grouped together, unless the ``:new-group`` option is added. You can set which tab will be shown by default, using the ``:selected:`` option. Tab directives can contain any content, and you can also set CSS classes with ``:class-label:`` and ``:class-content:``: .. code-block:: rst .. tabbed:: Tab 1 Tab 1 content .. tabbed:: Tab 2 :class-content: pl-1 bg-primary Tab 2 content .. tabbed:: Tab 3 :new-group: .. code-block:: python import pip .. tabbed:: Tab 4 :selected: .. dropdown:: Nested Dropdown Some content .. tabbed:: Tab 1 Tab 1 content .. tabbed:: Tab 2 :class-content: pl-1 bg-primary Tab 2 content .. tabbed:: Tab 3 :new-group: .. code-block:: python import pip .. tabbed:: Tab 4 :selected: .. dropdown:: Nested Dropdown Some content Here's an example of showing an example in multiple programming languages: .. tabbed:: c++ .. code-block:: c++ int main(const int argc, const char **argv) { return 0; } .. tabbed:: python .. code-block:: python def main(): return .. tabbed:: java .. code-block:: java class Main { public static void main(String[] args) { } } .. tabbed:: julia .. code-block:: julia function main() end .. tabbed:: fortran .. code-block:: fortran PROGRAM main END PROGRAM main You can also control the colors of the labels and lines, setting ``panels_css_variables`` in your ``conf.py``. Here are the defaults: .. code-block:: python panels_css_variables = { "tabs-color-label-active": "hsla(231, 99%, 66%, 1)", "tabs-color-label-inactive": "rgba(178, 206, 245, 0.62)", "tabs-color-overline": "rgb(207, 236, 238)", "tabs-color-underline": "rgb(207, 236, 238)", "tabs-size-label": "1rem", } .. seealso:: Note, the `sphinx-tabs `__ package also offers directives to create tabs. The key difference is that, whereas ``sphinx-tabs`` uses JavaScript to implement this functionality, ``sphinx-panels`` only uses CSS. A CSS only solution has the benefit of faster load-times, and working when JS is disabled, although JS allows ``sphinx-tabs`` to implement some extended functionality (like synchronized selections). .. _components-icons: Inline Icons ============ Inline icons can be added to your text from either the `GitHub octicon `_ or `FontAwesome `_ libraries. ====================================================== =============================================== rST Output ====================================================== =============================================== ``:opticon:`report``` :opticon:`report` ``:opticon:`x-circle,text-white bg-danger,size=24``` :opticon:`x-circle,text-white bg-danger,size=24` ``:fa:`save``` :fa:`save` ``:fa:`spinner,text-white bg-primary fa-2x,style=fa``` :fa:`spinner,text-white bg-primary fa-2x,style=fa` ====================================================== =============================================== Note that the theme you are using does not already include the FontAwesome CSS, it should be loaded in your ``conf.py``, with the `html_css_files `_ option, e.g.: .. code-block:: python html_css_files = ["https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"] By default, icons will only be output in HTML formats. But if you want fontawesome icons to be output on LaTeX, using the `fontawesome package `_, you can add to your ``conf.py``: .. code-block:: python panels_add_fontawesome_latex = True Additional classes can be added after a comma delimiter. Also the size (16px or 24px) can be set for opticons, and the style/prefix for fontawesome (version 5). .. seealso:: https://www.w3schools.com/icons/fontawesome_icons_intro.asp .. _components-div: Div Directive ============= The ``div`` directive is the same as the `container directive `_, but does not add a ``container`` class in HTML outputs, which is incompatible with Bootstrap CSS: .. code-block:: rst .. div:: text-primary hallo .. div:: text-primary hallo Combined Example ================ .. code-block:: rst .. dropdown:: Panels in a drop-down :title: bg-success text-warning :open: :animate: fade-in-slide-down .. panels:: :container: container-fluid pb-1 :column: col-lg-6 col-md-6 col-sm-12 col-xs-12 p-2 :card: shadow :header: border-0 :footer: border-0 --- :card: + bg-warning header ^^^^^^ Content of the top-left panel ++++++ footer --- :card: + bg-info :footer: + bg-danger header ^^^^^^ Content of the top-right panel ++++++ footer --- :column: col-lg-12 p-3 :card: + text-center .. link-button:: panels/usage :type: ref :text: Clickable Panel :classes: btn-link stretched-link font-weight-bold .. dropdown:: Panels in a drop-down :title: bg-success text-warning :open: :animate: fade-in-slide-down .. panels:: :container: container-fluid pb-1 :column: col-lg-6 col-md-6 col-sm-12 col-xs-12 p-2 :card: shadow :header: border-0 :footer: border-0 --- :card: + bg-warning header ^^^^^^ Content of the top-left panel ++++++ footer --- :card: + bg-info :footer: + bg-danger header ^^^^^^ Content of the top-right panel ++++++ footer --- :column: col-lg-12 p-3 :card: + text-center .. link-button:: panels/usage :type: ref :text: Clickable Panel :classes: btn-link stretched-link font-weight-bold Acknowledgements ================ - Panels originally adapted from the `pandas documentation `_. - Dropdown originally adapted from `tk0miya/sphinxcontrib-details-directive `_. sphinx-panels-0.6.0/git_rebase_theme_branches.sh000077500000000000000000000003321405624532300220020ustar00rootroot00000000000000#!/bin/sh set -e fmt=' git checkout %(refname) git rebase master git push origin HEAD:%(refname:strip=3) --force ' eval "$(git for-each-ref --shell --format="$fmt" refs/remotes/origin/*-theme)" git checkout master sphinx-panels-0.6.0/setup.py000066400000000000000000000031571405624532300160320ustar00rootroot00000000000000from pathlib import Path from setuptools import setup, find_packages version = [ line for line in Path("sphinx_panels/__init__.py").read_text().split("\n") if "__version__" in line ] version = version[0].split(" = ")[-1].strip('"') with open("./README.md", "r") as ff: readme_text = ff.read() setup( name="sphinx-panels", version=version, description="A sphinx extension for creating panels in a grid layout.", long_description=readme_text, long_description_content_type="text/markdown", author="Chris Sewell", author_email="chrisj_sewell@hotmail.com", url="https://github.com/executablebooks/sphinx-panels", project_urls={"Documentation": "https://sphinx-panels.readthedocs.io"}, license="MIT", packages=find_packages(), include_package_data=True, install_requires=[ "docutils", "sphinx>=2,<5", 'importlib-resources~=3.0.0; python_version < "3.7"', ], extras_require={ "themes": [ "sphinx-rtd-theme", "pydata-sphinx-theme~=0.4.0", "sphinx-book-theme~=0.0.36", "myst-parser~=0.12.9", ], "code_style": ["pre-commit~=2.7.0"], "testing": ["pytest~=6.0.1", "pytest-regressions~=2.0.1"], "live-dev": ["sphinx-autobuild", "web-compile~=0.2.0"], }, classifiers=[ "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Topic :: Software Development :: Libraries :: Python Modules", "Framework :: Sphinx :: Extension", ], keywords="sphinx html bootstrap grid card dropdown button badge", ) sphinx-panels-0.6.0/sphinx_panels/000077500000000000000000000000001405624532300171655ustar00rootroot00000000000000sphinx-panels-0.6.0/sphinx_panels/__init__.py000066400000000000000000000136111405624532300213000ustar00rootroot00000000000000""""A sphinx extension to add a ``panels`` directive.""" import hashlib from pathlib import Path try: import importlib.resources as resources except ImportError: # python < 3.7 import importlib_resources as resources from docutils import nodes from docutils.parsers.rst import directives, Directive from sphinx.application import Sphinx from sphinx.environment import BuildEnvironment from sphinx.util.logging import getLogger from .button import setup_link_button from .dropdown import setup_dropdown from .panels import setup_panels from .tabs import setup_tabs from .icons import setup_icons from . import _css as css_module __version__ = "0.6.0" LOGGER = getLogger(__name__) def get_default_css_variables(): return { "tabs-color-label-active": "hsla(231, 99%, 66%, 1)", "tabs-color-label-inactive": "rgba(178, 206, 245, 0.62)", "tabs-color-overline": "rgb(207, 236, 238)", "tabs-color-underline": "rgb(207, 236, 238)", "tabs-size-label": "1rem", } def update_css(app: Sphinx): """Compile SCSS to the build directory.""" # merge user CSS variables with defaults css_variables = get_default_css_variables() for key, value in app.config.panels_css_variables.items(): if key not in css_variables: LOGGER.warning(f"key in 'panels_css_variables' is not recognised: {key}") else: css_variables[key] = value # reset css changed attribute app.env.panels_css_changed = False # setup up new static path in output dir static_path = (Path(app.outdir) / "_panels_static").absolute() static_path.mkdir(exist_ok=True) app.config.html_static_path.append(str(static_path)) # record current resources old_resources = {path.name for path in static_path.glob("*") if path.is_file()} # Add core CSS css_files = [r for r in resources.contents(css_module) if r.endswith(".css")] if app.config.panels_add_boostrap_css is not None: LOGGER.warning( "`panels_add_boostrap_css` will be deprecated. Please use" "`panels_add_bootstrap_css`." ) app.config.panels_add_bootstrap_css = app.config.panels_add_boostrap_css if app.config.panels_add_bootstrap_css is False: css_files = [name for name in css_files if "bootstrap" not in name] for filename in css_files: app.add_css_file(filename) if not (static_path / filename).exists(): content = resources.read_text(css_module, filename) (static_path / filename).write_text(content) app.env.panels_css_changed = True if filename in old_resources: old_resources.remove(filename) # add variables CSS file css_lines = [":root {"] for name, value in css_variables.items(): css_lines.append(f"--{name}: {value};") css_lines.append("}") css_str = "\n".join(css_lines) css_variables_name = ( f"panels-variables.{hashlib.md5(css_str.encode('utf8')).hexdigest()}.css" ) app.add_css_file(css_variables_name) if not (static_path / css_variables_name).exists(): (static_path / css_variables_name).write_text(css_str) app.env.panels_css_changed = True if css_variables_name in old_resources: old_resources.remove(css_variables_name) # remove old resources for name in old_resources: for path in Path(app.outdir).glob(f"**/{name}"): path.unlink() def update_css_links(app: Sphinx, env: BuildEnvironment): """If CSS has changed, all files must be re-written, to include the correct stylesheets. """ if env.panels_css_changed and app.config.panels_dev_mode: LOGGER.debug("sphinx-panels CSS changed; re-writing all files") return list(env.all_docs.keys()) class Div(Directive): """Same as the ``container`` directive, but does not add the ``container`` class in HTML outputs, which can interfere with Bootstrap CSS. """ optional_arguments = 1 final_argument_whitespace = True option_spec = {"name": directives.unchanged} has_content = True def run(self): self.assert_has_content() text = "\n".join(self.content) try: if self.arguments: classes = directives.class_option(self.arguments[0]) else: classes = [] except ValueError: raise self.error( 'Invalid class attribute value for "%s" directive: "%s".' % (self.name, self.arguments[0]) ) node = nodes.container(text, is_div=True) node["classes"].extend(classes) self.add_name(node) self.state.nested_parse(self.content, self.content_offset, node) return [node] def visit_container(self, node: nodes.Node): classes = "docutils container" if node.get("is_div", False): # we don't want the CSS for container for these nodes classes = "docutils" self.body.append(self.starttag(node, "div", CLASS=classes)) def depart_container(self, node: nodes.Node): self.body.append("\n") def setup(app: Sphinx): app.add_directive("div", Div) app.add_config_value("panels_add_bootstrap_css", None, "env") app.add_config_value("panels_add_boostrap_css", None, "env") app.add_config_value("panels_css_variables", {}, "env") app.add_config_value("panels_dev_mode", False, "env") app.connect("builder-inited", update_css) app.connect("env-updated", update_css_links) # we override container html visitors, to stop the default behaviour # of adding the `container` class to all nodes.container app.add_node( nodes.container, override=True, html=(visit_container, depart_container) ) setup_panels(app) setup_link_button(app) setup_dropdown(app) setup_tabs(app) setup_icons(app) return { "version": __version__, "parallel_read_safe": True, "parallel_write_safe": True, } sphinx-panels-0.6.0/sphinx_panels/_css/000077500000000000000000000000001405624532300201145ustar00rootroot00000000000000sphinx-panels-0.6.0/sphinx_panels/_css/__init__.py000066400000000000000000000000001405624532300222130ustar00rootroot00000000000000sphinx-panels-0.6.0/sphinx_panels/_css/panels-bootstrap.5fd3999ee7762ccc51105388f4a9d115.css000066400000000000000000000716631405624532300304020ustar00rootroot00000000000000.badge{border-radius:.25rem;display:inline-block;font-size:75%;font-weight:700;line-height:1;padding:.25em .4em;text-align:center;vertical-align:baseline;white-space:nowrap}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{border-radius:10rem;padding-left:.6em;padding-right:.6em}.badge-primary{background-color:#007bff;color:#fff}.badge-primary[href]:focus,.badge-primary[href]:hover{background-color:#0062cc;color:#fff;text-decoration:none}.badge-secondary{background-color:#6c757d;color:#fff}.badge-secondary[href]:focus,.badge-secondary[href]:hover{background-color:#545b62;color:#fff;text-decoration:none}.badge-success{background-color:#28a745;color:#fff}.badge-success[href]:focus,.badge-success[href]:hover{background-color:#1e7e34;color:#fff;text-decoration:none}.badge-info{background-color:#17a2b8;color:#fff}.badge-info[href]:focus,.badge-info[href]:hover{background-color:#117a8b;color:#fff;text-decoration:none}.badge-warning{background-color:#ffc107;color:#212529}.badge-warning[href]:focus,.badge-warning[href]:hover{background-color:#d39e00;color:#212529;text-decoration:none}.badge-danger{background-color:#dc3545;color:#fff}.badge-danger[href]:focus,.badge-danger[href]:hover{background-color:#bd2130;color:#fff;text-decoration:none}.badge-light{background-color:#f8f9fa;color:#212529}.badge-light[href]:focus,.badge-light[href]:hover{background-color:#dae0e5;color:#212529;text-decoration:none}.badge-dark{background-color:#343a40;color:#fff}.badge-dark[href]:focus,.badge-dark[href]:hover{background-color:#1d2124;color:#fff;text-decoration:none}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:.25rem !important}.pt-1,.py-1{padding-top:.25rem !important}.pr-1,.px-1{padding-right:.25rem !important}.pb-1,.py-1{padding-bottom:.25rem !important}.pl-1,.px-1{padding-left:.25rem !important}.p-2{padding:.5rem !important}.pt-2,.py-2{padding-top:.5rem !important}.pr-2,.px-2{padding-right:.5rem !important}.pb-2,.py-2{padding-bottom:.5rem !important}.pl-2,.px-2{padding-left:.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:.25rem !important}.mt-1,.my-1{margin-top:.25rem !important}.mr-1,.mx-1{margin-right:.25rem !important}.mb-1,.my-1{margin-bottom:.25rem !important}.ml-1,.mx-1{margin-left:.25rem !important}.m-2{margin:.5rem !important}.mt-2,.my-2{margin-top:.5rem !important}.mr-2,.mx-2{margin-right:.5rem !important}.mb-2,.my-2{margin-bottom:.5rem !important}.ml-2,.mx-2{margin-left:.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;color:#212529;cursor:pointer;display:inline-block;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem .75rem;text-align:center;transition:color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none;vertical-align:middle}.btn:hover{color:#212529;text-decoration:none}.btn:visited{color:#212529}.btn.focus,.btn:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,0.25);outline:0}.btn.disabled,.btn:disabled{opacity:.65}@media (prefers-reduced-motion: reduce){.btn{transition:none}}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{background-color:#007bff;border-color:#007bff;color:#fff}.btn-primary:visited{color:#fff}.btn-primary:hover{background-color:#0069d9;border-color:#0062cc;color:#fff}.btn-primary.focus,.btn-primary:focus{background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(0,123,255,0.5);color:#fff}.btn-primary.disabled,.btn-primary:disabled{background-color:#007bff;border-color:#007bff;color:#fff}.btn-primary.active:not(:disabled):not(.disabled),.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{background-color:#0062cc;border-color:#005cbf;color:#fff}.btn-primary.active:not(:disabled):not(.disabled):focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-secondary{background-color:#6c757d;border-color:#6c757d;color:#fff}.btn-secondary:visited{color:#fff}.btn-secondary:hover{background-color:#5a6268;border-color:#545b62;color:#fff}.btn-secondary.focus,.btn-secondary:focus{background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(108,117,125,0.5);color:#fff}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#6c757d;border-color:#6c757d;color:#fff}.btn-secondary.active:not(:disabled):not(.disabled),.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{background-color:#545b62;border-color:#4e555b;color:#fff}.btn-secondary.active:not(:disabled):not(.disabled):focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.btn-success{background-color:#28a745;border-color:#28a745;color:#fff}.btn-success:visited{color:#fff}.btn-success:hover{background-color:#218838;border-color:#1e7e34;color:#fff}.btn-success.focus,.btn-success:focus{background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(40,167,69,0.5);color:#fff}.btn-success.disabled,.btn-success:disabled{background-color:#28a745;border-color:#28a745;color:#fff}.btn-success.active:not(:disabled):not(.disabled),.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{background-color:#1e7e34;border-color:#1c7430;color:#fff}.btn-success.active:not(:disabled):not(.disabled):focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-info{background-color:#17a2b8;border-color:#17a2b8;color:#fff}.btn-info:visited{color:#fff}.btn-info:hover{background-color:#138496;border-color:#117a8b;color:#fff}.btn-info.focus,.btn-info:focus{background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(23,162,184,0.5);color:#fff}.btn-info.disabled,.btn-info:disabled{background-color:#17a2b8;border-color:#17a2b8;color:#fff}.btn-info.active:not(:disabled):not(.disabled),.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{background-color:#117a8b;border-color:#10707f;color:#fff}.btn-info.active:not(:disabled):not(.disabled):focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-warning{background-color:#ffc107;border-color:#ffc107;color:#212529}.btn-warning:visited{color:#212529}.btn-warning:hover{background-color:#e0a800;border-color:#d39e00;color:#212529}.btn-warning.focus,.btn-warning:focus{background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(255,193,7,0.5);color:#212529}.btn-warning.disabled,.btn-warning:disabled{background-color:#ffc107;border-color:#ffc107;color:#212529}.btn-warning.active:not(:disabled):not(.disabled),.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{background-color:#d39e00;border-color:#c69500;color:#212529}.btn-warning.active:not(:disabled):not(.disabled):focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-danger{background-color:#dc3545;border-color:#dc3545;color:#fff}.btn-danger:visited{color:#fff}.btn-danger:hover{background-color:#c82333;border-color:#bd2130;color:#fff}.btn-danger.focus,.btn-danger:focus{background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(220,53,69,0.5);color:#fff}.btn-danger.disabled,.btn-danger:disabled{background-color:#dc3545;border-color:#dc3545;color:#fff}.btn-danger.active:not(:disabled):not(.disabled),.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{background-color:#bd2130;border-color:#b21f2d;color:#fff}.btn-danger.active:not(:disabled):not(.disabled):focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-light{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-light:visited{color:#212529}.btn-light:hover{background-color:#e2e6ea;border-color:#dae0e5;color:#212529}.btn-light.focus,.btn-light:focus{background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(248,249,250,0.5);color:#212529}.btn-light.disabled,.btn-light:disabled{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-light.active:not(:disabled):not(.disabled),.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{background-color:#dae0e5;border-color:#d3d9df;color:#212529}.btn-light.active:not(:disabled):not(.disabled):focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,0.5)}.btn-dark{background-color:#343a40;border-color:#343a40;color:#fff}.btn-dark:visited{color:#fff}.btn-dark:hover{background-color:#23272b;border-color:#1d2124;color:#fff}.btn-dark.focus,.btn-dark:focus{background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(52,58,64,0.5);color:#fff}.btn-dark.disabled,.btn-dark:disabled{background-color:#343a40;border-color:#343a40;color:#fff}.btn-dark.active:not(:disabled):not(.disabled),.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{background-color:#1d2124;border-color:#171a1d;color:#fff}.btn-dark.active:not(:disabled):not(.disabled):focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,0.5)}.btn-outline-primary{border-color:#007bff;color:#007bff}.btn-outline-primary:visited{color:#007bff}.btn-outline-primary:hover{background-color:#007bff;border-color:#007bff;color:#fff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{background-color:transparent;color:#007bff}.btn-outline-primary.active:not(:disabled):not(.disabled),.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{background-color:#007bff;border-color:#007bff;color:#fff}.btn-outline-primary.active:not(:disabled):not(.disabled):focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-outline-secondary{border-color:#6c757d;color:#6c757d}.btn-outline-secondary:visited{color:#6c757d}.btn-outline-secondary:hover{background-color:#6c757d;border-color:#6c757d;color:#fff}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{background-color:transparent;color:#6c757d}.btn-outline-secondary.active:not(:disabled):not(.disabled),.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{background-color:#6c757d;border-color:#6c757d;color:#fff}.btn-outline-secondary.active:not(:disabled):not(.disabled):focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.btn-outline-success{border-color:#28a745;color:#28a745}.btn-outline-success:visited{color:#28a745}.btn-outline-success:hover{background-color:#28a745;border-color:#28a745;color:#fff}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{background-color:transparent;color:#28a745}.btn-outline-success.active:not(:disabled):not(.disabled),.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{background-color:#28a745;border-color:#28a745;color:#fff}.btn-outline-success.active:not(:disabled):not(.disabled):focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-outline-info{border-color:#17a2b8;color:#17a2b8}.btn-outline-info:visited{color:#17a2b8}.btn-outline-info:hover{background-color:#17a2b8;border-color:#17a2b8;color:#fff}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{background-color:transparent;color:#17a2b8}.btn-outline-info.active:not(:disabled):not(.disabled),.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{background-color:#17a2b8;border-color:#17a2b8;color:#fff}.btn-outline-info.active:not(:disabled):not(.disabled):focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-outline-warning{border-color:#ffc107;color:#ffc107}.btn-outline-warning:visited{color:#ffc107}.btn-outline-warning:hover{background-color:#ffc107;border-color:#ffc107;color:#212529}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{background-color:transparent;color:#ffc107}.btn-outline-warning.active:not(:disabled):not(.disabled),.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{background-color:#ffc107;border-color:#ffc107;color:#212529}.btn-outline-warning.active:not(:disabled):not(.disabled):focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-outline-danger{border-color:#dc3545;color:#dc3545}.btn-outline-danger:visited{color:#dc3545}.btn-outline-danger:hover{background-color:#dc3545;border-color:#dc3545;color:#fff}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{background-color:transparent;color:#dc3545}.btn-outline-danger.active:not(:disabled):not(.disabled),.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{background-color:#dc3545;border-color:#dc3545;color:#fff}.btn-outline-danger.active:not(:disabled):not(.disabled):focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-outline-light{border-color:#f8f9fa;color:#f8f9fa}.btn-outline-light:visited{color:#f8f9fa}.btn-outline-light:hover{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,0.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{background-color:transparent;color:#f8f9fa}.btn-outline-light.active:not(:disabled):not(.disabled),.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-outline-light.active:not(:disabled):not(.disabled):focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,0.5)}.btn-outline-dark{border-color:#343a40;color:#343a40}.btn-outline-dark:visited{color:#343a40}.btn-outline-dark:hover{background-color:#343a40;border-color:#343a40;color:#fff}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,0.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{background-color:transparent;color:#343a40}.btn-outline-dark.active:not(:disabled):not(.disabled),.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{background-color:#343a40;border-color:#343a40;color:#fff}.btn-outline-dark.active:not(:disabled):not(.disabled):focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,0.5)}.btn-link{color:#007bff;font-weight:400;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{box-shadow:none;text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{border-radius:.3rem;font-size:1.25rem;line-height:1.5;padding:.5rem 1rem}.btn-group-sm>.btn,.btn-sm{border-radius:.2rem;font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input.btn-block[type=button],input.btn-block[type=reset],input.btn-block[type=submit]{width:100%}.stretched-link::after{background-color:rgba(0,0,0,0);bottom:0;content:'';left:0;pointer-events:auto;position:absolute;right:0;top:0;z-index:1}.text-wrap{white-space:normal !important}.card{background-clip:border-box;background-color:#fff;border:1px solid rgba(0,0,0,0.125);border-radius:.25rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.card>hr{margin-left:0;margin-right:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-bottom:0;margin-top:-.375rem}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{background-color:rgba(0,0,0,0.03);border-bottom:1px solid rgba(0,0,0,0.125);margin-bottom:0;padding:.75rem 1.25rem}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125);padding:.75rem 1.25rem}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{border-bottom:0;margin-bottom:-.75rem;margin-left:-.625rem;margin-right:-.625rem}.card-header-pills{margin-left:-.625rem;margin-right:-.625rem}.card-img-overlay{bottom:0;left:0;padding:1.25rem;position:absolute;right:0;top:0}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-left-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px)}.w-100{width:100% !important}.shadow{box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.bg-primary{background-color:#007bff !important}button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc !important}a.bg-primary:focus,a.bg-primary:hover{background-color:#0062cc !important}a.text-primary:focus,a.text-primary:hover{color:#121416 !important}.bg-secondary{background-color:#6c757d !important}button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62 !important}a.bg-secondary:focus,a.bg-secondary:hover{background-color:#545b62 !important}a.text-secondary:focus,a.text-secondary:hover{color:#121416 !important}.bg-success{background-color:#28a745 !important}button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34 !important}a.bg-success:focus,a.bg-success:hover{background-color:#1e7e34 !important}a.text-success:focus,a.text-success:hover{color:#121416 !important}.bg-info{background-color:#17a2b8 !important}button.bg-info:focus,button.bg-info:hover{background-color:#117a8b !important}a.bg-info:focus,a.bg-info:hover{background-color:#117a8b !important}a.text-info:focus,a.text-info:hover{color:#121416 !important}.bg-warning{background-color:#ffc107 !important}button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00 !important}a.bg-warning:focus,a.bg-warning:hover{background-color:#d39e00 !important}a.text-warning:focus,a.text-warning:hover{color:#121416 !important}.bg-danger{background-color:#dc3545 !important}button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130 !important}a.bg-danger:focus,a.bg-danger:hover{background-color:#bd2130 !important}a.text-danger:focus,a.text-danger:hover{color:#121416 !important}.bg-light{background-color:#f8f9fa !important}button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5 !important}a.bg-light:focus,a.bg-light:hover{background-color:#dae0e5 !important}a.text-light:focus,a.text-light:hover{color:#121416 !important}.bg-dark{background-color:#343a40 !important}button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124 !important}a.bg-dark:focus,a.bg-dark:hover{background-color:#1d2124 !important}a.text-dark:focus,a.text-dark:hover{color:#121416 !important}.bg-white{background-color:#fff !important}button.bg-white:focus,button.bg-white:hover{background-color:#e6e6e6 !important}a.bg-white:focus,a.bg-white:hover{background-color:#e6e6e6 !important}a.text-white:focus,a.text-white:hover{color:#121416 !important}.text-primary{color:#007bff !important}.text-secondary{color:#6c757d !important}.text-success{color:#28a745 !important}.text-info{color:#17a2b8 !important}.text-warning{color:#ffc107 !important}.text-danger{color:#dc3545 !important}.text-light{color:#f8f9fa !important}.text-dark{color:#343a40 !important}.text-white{color:#fff !important}.text-body{color:#212529 !important}.text-muted{color:#6c757d !important}.text-black-50{color:rgba(0,0,0,0.5) !important}.text-white-50{color:rgba(255,255,255,0.5) !important}.bg-transparent{background-color:transparent !important}.text-justify{text-align:justify !important}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.font-weight-light{font-weight:300 !important}.font-weight-lighter{font-weight:lighter !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-weight-bolder{font-weight:bolder !important}.font-italic{font-style:italic !important}.container{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;width:100%}@media (min-width: 576px){.container{max-width:540px}}@media (min-width: 768px){.container{max-width:720px}}@media (min-width: 992px){.container{max-width:960px}}@media (min-width: 1200px){.container{max-width:1140px}}.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;width:100%}@media (min-width: 576px){.container,.container-sm{max-width:540px}}@media (min-width: 768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width: 992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width: 1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-left:15px;padding-right:15px;position:relative;width:100%}@media (min-width: 576px){.col-sm{flex-basis:0;flex-grow:1;-ms-flex-positive:1;-ms-flex-preferred-size:0;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;max-width:100%;width:auto}.col-sm-1{-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media (min-width: 768px){.col-md{flex-basis:0;flex-grow:1;-ms-flex-positive:1;-ms-flex-preferred-size:0;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;max-width:100%;width:auto}.col-md-1{-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media (min-width: 992px){.col-lg{flex-basis:0;flex-grow:1;-ms-flex-positive:1;-ms-flex-preferred-size:0;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;max-width:100%;width:auto}.col-lg-1{-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media (min-width: 1200px){.col-xl{flex-basis:0;flex-grow:1;-ms-flex-positive:1;-ms-flex-preferred-size:0;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;max-width:100%;width:auto}.col-xl-1{-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.d-flex{display:-ms-flexbox !important;display:flex !important}.sphinx-bs,.sphinx-bs *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sphinx-bs p{margin-top:0} sphinx-panels-0.6.0/sphinx_panels/_css/panels-main.c949a650a448cc0ae9fd3441c0e17fb0.css000066400000000000000000000052461405624532300274700ustar00rootroot00000000000000details.dropdown .summary-title{padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.dropdown:hover{cursor:pointer}details.dropdown .summary-content{cursor:default}details.dropdown summary{list-style:none;padding:1em}details.dropdown summary .octicon.no-title{vertical-align:middle}details.dropdown[open] summary .octicon.no-title{visibility:hidden}details.dropdown summary::-webkit-details-marker{display:none}details.dropdown summary:focus{outline:none}details.dropdown summary:hover .summary-up svg,details.dropdown summary:hover .summary-down svg{opacity:1}details.dropdown .summary-up svg,details.dropdown .summary-down svg{display:block;opacity:.6}details.dropdown .summary-up,details.dropdown .summary-down{pointer-events:none;position:absolute;right:1em;top:.75em}details.dropdown[open] .summary-down{visibility:hidden}details.dropdown:not([open]) .summary-up{visibility:hidden}details.dropdown.fade-in[open] summary~*{-moz-animation:panels-fade-in .5s ease-in-out;-webkit-animation:panels-fade-in .5s ease-in-out;animation:panels-fade-in .5s ease-in-out}details.dropdown.fade-in-slide-down[open] summary~*{-moz-animation:panels-fade-in .5s ease-in-out, panels-slide-down .5s ease-in-out;-webkit-animation:panels-fade-in .5s ease-in-out, panels-slide-down .5s ease-in-out;animation:panels-fade-in .5s ease-in-out, panels-slide-down .5s ease-in-out}@keyframes panels-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes panels-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.octicon{display:inline-block;fill:currentColor;vertical-align:text-top}.tabbed-content{box-shadow:0 -.0625rem var(--tabs-color-overline),0 .0625rem var(--tabs-color-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.tabbed-content>:first-child{margin-top:0 !important}.tabbed-content>:last-child{margin-bottom:0 !important}.tabbed-content>.tabbed-set{margin:0}.tabbed-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.tabbed-set>input{opacity:0;position:absolute}.tabbed-set>input:checked+label{border-color:var(--tabs-color-label-active);color:var(--tabs-color-label-active)}.tabbed-set>input:checked+label+.tabbed-content{display:block}.tabbed-set>input:focus+label{outline-style:auto}.tabbed-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.tabbed-set>label{border-bottom:.125rem solid transparent;color:var(--tabs-color-label-inactive);cursor:pointer;font-size:var(--tabs-size-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .tabbed-set>label:hover{color:var(--tabs-color-label-active)} sphinx-panels-0.6.0/sphinx_panels/button.py000066400000000000000000000072661405624532300210650ustar00rootroot00000000000000from urllib.parse import unquote from docutils import nodes from docutils.utils import unescape from docutils.parsers.rst import directives from sphinx import addnodes from sphinx.util.docutils import SphinxDirective from .utils import string_to_func_inputs def setup_link_button(app): app.add_directive("link-button", LinkButton) # TODO hide badges in non-HTML? app.add_role("badge", badge_role) app.add_role("link-badge", link_badge_role) def create_ref_node(link_type, uri, text, tooltip): innernode = nodes.inline(text, text) if link_type == "ref": ref_node = addnodes.pending_xref( reftarget=unquote(uri), reftype="any", # refdoc=self.env.docname, refdomain="", refexplicit=True, refwarn=True, ) innernode["classes"] = ["xref", "any"] # if tooltip: # ref_node["reftitle"] = tooltip # ref_node["title"] = tooltip # TODO this doesn't work else: ref_node = nodes.reference() ref_node["refuri"] = uri if tooltip: ref_node["reftitle"] = tooltip ref_node += innernode return ref_node class LinkButton(SphinxDirective): """A directive to turn a link into a button.""" has_content = False required_arguments = 1 final_argument_whitespace = True option_spec = { "type": lambda arg: directives.choice(arg, ("url", "ref")), "text": directives.unchanged, "tooltip": directives.unchanged, "classes": directives.unchanged, } def run(self): uri = self.arguments[0] link_type = self.options.get("type", "url") text = self.options.get("text", uri) ref_node = create_ref_node( link_type, uri, text, self.options.get("tooltip", None) ) self.set_source_info(ref_node) ref_node["classes"] = ["sphinx-bs", "btn", "text-wrap"] + self.options.get( "classes", "" ).split() # sphinx requires that a reference be inside a block element container = nodes.paragraph() container += ref_node return [container] def get_badge_inputs(text, cls: str = ""): return text, cls.split() def badge_role(role, rawtext, text, lineno, inliner, options={}, content=[]): try: args, kwargs = string_to_func_inputs(text) text, classes = get_badge_inputs(*args, **kwargs) except Exception as err: msg = inliner.reporter.error(f"badge input is invalid: {err}", line=lineno) prb = inliner.problematic(rawtext, rawtext, msg) return [prb], [msg] node = nodes.inline( rawtext, unescape(text), classes=["sphinx-bs", "badge"] + classes ) # textnodes, messages = inliner.parse(text, lineno, node, memo) # TODO this would require the memo with reporter, document and language return [node], [] def get_link_badge_inputs(link, text=None, type="link", cls: str = "", tooltip=None): return link, text or link, type, cls.split(), tooltip def link_badge_role(role, rawtext, text, lineno, inliner, options={}, content=[]): try: args, kwargs = string_to_func_inputs(text) uri, text, link_type, classes, tooltip = get_link_badge_inputs(*args, **kwargs) except Exception as err: msg = inliner.reporter.error(f"badge input is invalid: {err}", line=lineno) prb = inliner.problematic(rawtext, rawtext, msg) return [prb], [msg] ref_node = create_ref_node(link_type, uri, text, tooltip) if lineno is not None: ref_node.source, ref_node.line = inliner.reporter.get_source_and_line(lineno) ref_node["classes"] = ["sphinx-bs", "badge"] + classes return [ref_node], [] sphinx-panels-0.6.0/sphinx_panels/data/000077500000000000000000000000001405624532300200765ustar00rootroot00000000000000sphinx-panels-0.6.0/sphinx_panels/data/LICENSE000066400000000000000000000020541405624532300211040ustar00rootroot00000000000000MIT License Copyright (c) 2020 GitHub Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. sphinx-panels-0.6.0/sphinx_panels/data/opticons.json000066400000000000000000006234051405624532300226410ustar00rootroot00000000000000{"alert":{"name":"alert","keywords":["warning","triangle","exclamation","point"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"archive":{"name":"archive","keywords":["box","catalog"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"arrow-both":{"name":"arrow-both","keywords":["point","direction","left","right"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"arrow-down":{"name":"arrow-down","keywords":["point","direction"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"arrow-down-left":{"name":"arrow-down-left","keywords":[],"heights":{"24":{"width":24,"path":""}}},"arrow-down-right":{"name":"arrow-down-right","keywords":[],"heights":{"24":{"width":24,"path":""}}},"arrow-left":{"name":"arrow-left","keywords":["point","direction"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"arrow-right":{"name":"arrow-right","keywords":["point","direction"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"arrow-up":{"name":"arrow-up","keywords":["point","direction"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"arrow-up-left":{"name":"arrow-up-left","keywords":[],"heights":{"24":{"width":24,"path":""}}},"arrow-up-right":{"name":"arrow-up-right","keywords":[],"heights":{"24":{"width":24,"path":""}}},"beaker":{"name":"beaker","keywords":["experiment","labs","experimental","feature","test","science","education","study","development","testing"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"bell":{"name":"bell","keywords":["notification"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"bell-fill":{"name":"bell-fill","keywords":[],"heights":{"24":{"width":24,"path":""}}},"bell-slash":{"name":"bell-slash","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"bold":{"name":"bold","keywords":["markdown","bold","text"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"book":{"name":"book","keywords":["book","journal","wiki","readme"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"bookmark":{"name":"bookmark","keywords":["tab","star"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"bookmark-fill":{"name":"bookmark-fill","keywords":[],"heights":{"24":{"width":24,"path":""}}},"bookmark-slash":{"name":"bookmark-slash","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"bookmark-slash-fill":{"name":"bookmark-slash-fill","keywords":[],"heights":{"24":{"width":24,"path":""}}},"broadcast":{"name":"broadcast","keywords":["rss","radio","signal"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"calendar":{"name":"calendar","keywords":["time","day","month","year","date","appointment"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"check":{"name":"check","keywords":["mark","yes","confirm","accept","ok","success"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"check-circle":{"name":"check-circle","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"check-circle-fill":{"name":"check-circle-fill","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"checklist":{"name":"checklist","keywords":["todo","tasks"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"chevron-down":{"name":"chevron-down","keywords":["triangle","arrow"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"chevron-left":{"name":"chevron-left","keywords":["triangle","arrow"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"chevron-right":{"name":"chevron-right","keywords":["triangle","arrow"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"chevron-up":{"name":"chevron-up","keywords":["triangle","arrow"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"circle":{"name":"circle","keywords":[],"heights":{"24":{"width":24,"path":""}}},"circle-slash":{"name":"circle-slash","keywords":["no","deny","fail","failure","error","bad"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"clippy":{"name":"clippy","keywords":["copy","paste","save","capture","clipboard"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"clock":{"name":"clock","keywords":["time","hour","minute","second","watch"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"code":{"name":"code","keywords":["brackets"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"code-review":{"name":"code-review","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"code-square":{"name":"code-square","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"comment":{"name":"comment","keywords":["speak","bubble"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"comment-discussion":{"name":"comment-discussion","keywords":["converse","talk"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"commit":{"name":"commit","keywords":[],"heights":{"24":{"width":24,"path":""}}},"copy":{"name":"copy","keywords":[],"heights":{"24":{"width":24,"path":""}}},"cpu":{"name":"cpu","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"credit-card":{"name":"credit-card","keywords":["money","billing","payments","transactions"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"cross-reference":{"name":"cross-reference","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"dash":{"name":"dash","keywords":["hyphen","range"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"database":{"name":"database","keywords":["disks","data"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"desktop-download":{"name":"desktop-download","keywords":["clone","download"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"device-camera-video":{"name":"device-camera-video","keywords":["watch","view","media","stream"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"device-desktop":{"name":"device-desktop","keywords":["computer","monitor"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"device-mobile":{"name":"device-mobile","keywords":["phone","iphone","cellphone"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"diff":{"name":"diff","keywords":["difference","changes","compare"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"diff-added":{"name":"diff-added","keywords":["new","addition","plus"],"heights":{"16":{"width":16,"path":""}}},"diff-ignored":{"name":"diff-ignored","keywords":["slash"],"heights":{"16":{"width":16,"path":""}}},"diff-modified":{"name":"diff-modified","keywords":["dot","changed","updated"],"heights":{"16":{"width":16,"path":""}}},"diff-removed":{"name":"diff-removed","keywords":["deleted","subtracted","dash"],"heights":{"16":{"width":16,"path":""}}},"diff-renamed":{"name":"diff-renamed","keywords":["moved","arrow"],"heights":{"16":{"width":16,"path":""}}},"dot":{"name":"dot","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"dot-fill":{"name":"dot-fill","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"download":{"name":"download","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"eye":{"name":"eye","keywords":["look","watch","see"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"eye-closed":{"name":"eye-closed","keywords":["hidden","invisible","concealed",""],"heights":{"16":{"width":16,"path":""}}},"eye-slash":{"name":"eye-slash","keywords":[],"heights":{"24":{"width":24,"path":""}}},"file":{"name":"file","keywords":["file","text","words"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"file-binary":{"name":"file-binary","keywords":["image","video","word","powerpoint","excel"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"file-code":{"name":"file-code","keywords":["text","javascript","html","css","php","ruby","coffeescript","sass","scss"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"file-diff":{"name":"file-diff","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"file-directory":{"name":"file-directory","keywords":["folder"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"file-directory-fill":{"name":"file-directory-fill","keywords":[],"heights":{"24":{"width":24,"path":""}}},"file-media":{"name":"file-media","keywords":["image","video","audio"],"heights":{"24":{"width":24,"path":""}}},"file-submodule":{"name":"file-submodule","keywords":["folder"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"file-symlink":{"name":"file-symlink","keywords":[],"heights":{"24":{"width":24,"path":""}}},"file-symlink-file":{"name":"file-symlink-file","keywords":["link","alias"],"heights":{"16":{"width":16,"path":""}}},"file-zip":{"name":"file-zip","keywords":["compress","archive"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"filter":{"name":"filter","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"fire":{"name":"fire","keywords":[],"heights":{"24":{"width":24,"path":""}}},"flame":{"name":"flame","keywords":["fire","hot","burn","trending"],"heights":{"16":{"width":16,"path":""}}},"fold":{"name":"fold","keywords":["unfold","hide","collapse"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"fold-down":{"name":"fold-down","keywords":["unfold","hide","collapse","down"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"fold-up":{"name":"fold-up","keywords":["unfold","hide","collapse","up"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"gear":{"name":"gear","keywords":["settings"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"gift":{"name":"gift","keywords":["package","present","skill","craft","freebie"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"git-branch":{"name":"git-branch","keywords":["fork","branch","git","duplicate"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"git-commit":{"name":"git-commit","keywords":["save"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"git-compare":{"name":"git-compare","keywords":["difference","changes"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"git-fork":{"name":"git-fork","keywords":[],"heights":{"24":{"width":24,"path":""}}},"git-merge":{"name":"git-merge","keywords":["join"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"git-pull-request":{"name":"git-pull-request","keywords":["review"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"globe":{"name":"globe","keywords":["world","earth","planet"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"grabber":{"name":"grabber","keywords":["mover","drap","drop","sort"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"graph":{"name":"graph","keywords":["trend","stats","statistics"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"heading":{"name":"heading","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"heart":{"name":"heart","keywords":["love","beat"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"heart-fill":{"name":"heart-fill","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"history":{"name":"history","keywords":["time","past","revert","back"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"home":{"name":"home","keywords":["welcome","index","house","building"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"home-fill":{"name":"home-fill","keywords":[],"heights":{"24":{"width":24,"path":""}}},"horizontal-rule":{"name":"horizontal-rule","keywords":["hr"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"hourglass":{"name":"hourglass","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"hubot":{"name":"hubot","keywords":["robot","bot"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"image":{"name":"image","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"inbox":{"name":"inbox","keywords":["mail","todo","new","messages"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"infinity":{"name":"infinity","keywords":["unlimited","infinite"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"info":{"name":"info","keywords":["help"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"insights":{"name":"insights","keywords":[],"heights":{"24":{"width":24,"path":""}}},"issue-closed":{"name":"issue-closed","keywords":["done","complete"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"issue-opened":{"name":"issue-opened","keywords":["new"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"issue-reopened":{"name":"issue-reopened","keywords":["regression"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"italic":{"name":"italic","keywords":["font","italic","style"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"kebab-horizontal":{"name":"kebab-horizontal","keywords":["kebab","dot","menu","more"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"key":{"name":"key","keywords":["key","lock","secure","safe"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"law":{"name":"law","keywords":["legal","bill"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"light-bulb":{"name":"light-bulb","keywords":["idea"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"link":{"name":"link","keywords":["connect","hyperlink"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"link-external":{"name":"link-external","keywords":["out","see","more","go","to"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"list-ordered":{"name":"list-ordered","keywords":["numbers","tasks","todo","items"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"list-unordered":{"name":"list-unordered","keywords":["bullet","point","tasks","todo","items"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"location":{"name":"location","keywords":["here","marker"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"lock":{"name":"lock","keywords":["secure","safe","protected"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"logo-gist":{"name":"logo-gist","keywords":["brand","github","logo"],"heights":{"16":{"width":25,"path":""}}},"logo-github":{"name":"logo-github","keywords":["brand","github","logo"],"heights":{"16":{"width":45,"path":""}}},"mail":{"name":"mail","keywords":["email","unread"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"mark-github":{"name":"mark-github","keywords":["octocat","brand","github","logo"],"heights":{"16":{"width":16,"path":""}}},"markdown":{"name":"markdown","keywords":["markup","style"],"heights":{"16":{"width":16,"path":""}}},"megaphone":{"name":"megaphone","keywords":["bullhorn","loud","shout","broadcast"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"mention":{"name":"mention","keywords":["at","ping"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"milestone":{"name":"milestone","keywords":["marker"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"mirror":{"name":"mirror","keywords":["reflect"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"mortar-board":{"name":"mortar-board","keywords":["education","learn","teach"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"mute":{"name":"mute","keywords":["quiet","sound","audio","turn","off"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"no-entry":{"name":"no-entry","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"north-star":{"name":"north-star","keywords":["star","snowflake","asterisk"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"note":{"name":"note","keywords":["card","paper","ticket"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"octoface":{"name":"octoface","keywords":["octocat","brand"],"heights":{"16":{"width":16,"path":""}}},"organization":{"name":"organization","keywords":["people","group","team"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"package":{"name":"package","keywords":["box","ship"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"package-dependencies":{"name":"package-dependencies","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"package-dependents":{"name":"package-dependents","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"paper-airplane":{"name":"paper-airplane","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"pencil":{"name":"pencil","keywords":["edit","change","update","write"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"people":{"name":"people","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"person":{"name":"person","keywords":["people","man","woman","human"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"pin":{"name":"pin","keywords":["save","star","bookmark"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"play":{"name":"play","keywords":["play","start","begin","action"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"plug":{"name":"plug","keywords":["hook","webhook"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"plus":{"name":"plus","keywords":["add","new","more"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"plus-circle":{"name":"plus-circle","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"project":{"name":"project","keywords":["board","kanban","columns","scrum"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"pulse":{"name":"pulse","keywords":["graph","trend","line","activity"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"question":{"name":"question","keywords":["help","explain"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"quote":{"name":"quote","keywords":["quotation"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"reply":{"name":"reply","keywords":["reply all","back"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"repo":{"name":"repo","keywords":["book","journal","repository"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"repo-forked":{"name":"repo-forked","keywords":["book","journal","copy"],"heights":{"16":{"width":16,"path":""}}},"repo-push":{"name":"repo-push","keywords":["book","journal","repository","put"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"repo-template":{"name":"repo-template","keywords":["book","new","add","template"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"report":{"name":"report","keywords":["report","abuse","flag"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"rocket":{"name":"rocket","keywords":["staff","stafftools","blast","off","space","launch","ship"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"rss":{"name":"rss","keywords":["broadcast","feed","atom"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"screen-full":{"name":"screen-full","keywords":["fullscreen","expand"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"screen-normal":{"name":"screen-normal","keywords":["fullscreen","expand","exit"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"search":{"name":"search","keywords":["magnifying","glass"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"server":{"name":"server","keywords":["computers","racks","ops"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"settings":{"name":"settings","keywords":["sliders","filters","controls","levels"],"heights":{"24":{"width":24,"path":""}}},"share":{"name":"share","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"share-android":{"name":"share-android","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"shield":{"name":"shield","keywords":["security","shield","protection"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"shield-check":{"name":"shield-check","keywords":["security","shield","protection","check","success"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"shield-lock":{"name":"shield-lock","keywords":["protect","shield","lock"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"shield-x":{"name":"shield-x","keywords":["security","shield","protection","fail"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"sign-in":{"name":"sign-in","keywords":["door","arrow","direction","enter","log in"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"sign-out":{"name":"sign-out","keywords":["door","arrow","direction","leave","log out"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"skip":{"name":"skip","keywords":["skip","slash"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"smiley":{"name":"smiley","keywords":["emoji","smile","mood","emotion"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"star":{"name":"star","keywords":["save","remember","like"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"star-fill":{"name":"star-fill","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"stop":{"name":"stop","keywords":["block","spam","report"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"stopwatch":{"name":"stopwatch","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"sync":{"name":"sync","keywords":["cycle","refresh","loop"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"tab":{"name":"tab","keywords":[],"heights":{"24":{"width":24,"path":""}}},"tag":{"name":"tag","keywords":["release"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"tasklist":{"name":"tasklist","keywords":["todo"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"telescope":{"name":"telescope","keywords":["science","space","look","view","explore"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"terminal":{"name":"terminal","keywords":["code","ops","shell"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"three-bars":{"name":"three-bars","keywords":["hamburger","menu","dropdown"],"heights":{"16":{"width":16,"path":""}}},"thumbsdown":{"name":"thumbsdown","keywords":["thumb","thumbsdown","rejected","dislike"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"thumbsup":{"name":"thumbsup","keywords":["thumb","thumbsup","prop","ship","like"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"tools":{"name":"tools","keywords":["screwdriver","wrench","settings"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"trash":{"name":"trash","keywords":[],"heights":{"24":{"width":24,"path":""}}},"trashcan":{"name":"trashcan","keywords":["garbage","rubbish","recycle","delete"],"heights":{"16":{"width":16,"path":""}}},"triangle-down":{"name":"triangle-down","keywords":["arrow","point","direction"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"triangle-left":{"name":"triangle-left","keywords":["arrow","point","direction"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"triangle-right":{"name":"triangle-right","keywords":["arrow","point","direction"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"triangle-up":{"name":"triangle-up","keywords":["arrow","point","direction"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"typography":{"name":"typography","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"unfold":{"name":"unfold","keywords":["expand","open","reveal"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"unlock":{"name":"unlock","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"unmute":{"name":"unmute","keywords":["loud","volume","audio","sound","play"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"unverifed":{"name":"unverifed","keywords":[],"heights":{"24":{"width":24,"path":""}}},"unverified":{"name":"unverified","keywords":["insecure","untrusted","signed"],"heights":{"16":{"width":16,"path":""}}},"upload":{"name":"upload","keywords":[],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"verified":{"name":"verified","keywords":["trusted","secure","trustworthy","signed"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"versions":{"name":"versions","keywords":["history","commits"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"workflow":{"name":"workflow","keywords":["workflow","actions"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"x":{"name":"x","keywords":["remove","close","delete"],"heights":{"16":{"width":16,"path":""},"24":{"width":24,"path":""}}},"x-circle":{"name":"x-circle","keywords":[],"heights":{"24":{"width":24,"path":""}}},"x-circle-fill":{"name":"x-circle-fill","keywords":[],"heights":{"24":{"width":24,"path":""}}}} sphinx-panels-0.6.0/sphinx_panels/dropdown.py000066400000000000000000000132641405624532300214010ustar00rootroot00000000000000"""Originally Adapted from sphinxcontrib.details.directive """ from docutils import nodes from docutils.parsers.rst import directives from sphinx.util.docutils import SphinxDirective from sphinx.transforms.post_transforms import SphinxPostTransform from sphinx.util.nodes import NodeMatcher from .icons import get_opticon def setup_dropdown(app): app.add_node(dropdown_main, html=(visit_dropdown_main, depart_dropdown_main)) app.add_node(dropdown_title, html=(visit_dropdown_title, depart_dropdown_title)) app.add_directive("dropdown", DropdownDirective) app.add_post_transform(DropdownHtmlTransform) class dropdown_main(nodes.Element, nodes.General): pass class dropdown_title(nodes.TextElement, nodes.General): pass def visit_dropdown_main(self, node): if node.get("opened"): self.body.append(self.starttag(node, "details", open="open")) else: self.body.append(self.starttag(node, "details")) def depart_dropdown_main(self, node): self.body.append("") def visit_dropdown_title(self, node): self.body.append(self.starttag(node, "summary")) def depart_dropdown_title(self, node): self.body.append("") class DropdownDirective(SphinxDirective): optional_arguments = 1 final_argument_whitespace = True has_content = True option_spec = { "container": directives.unchanged, "title": directives.unchanged, "body": directives.unchanged, "open": directives.flag, "name": directives.unchanged, "animate": lambda a: directives.choice(a, ("fade-in", "fade-in-slide-down")), } def run(self): # default classes classes = { "container_classes": ["mb-3"], "title_classes": [], "body_classes": [], } # add classes from options for element in ["container", "title", "body"]: if element not in self.options: continue value = self.options.get(element).strip() if value.startswith("+"): classes.setdefault(element + "_classes", []).extend(value[1:].split()) else: classes[element + "_classes"] = value.split() # add animation classes if ( "animate" in self.options and self.options["animate"] not in classes["container_classes"] ): classes["container_classes"].append(self.options["animate"]) container = nodes.container( "", opened="open" in self.options, type="dropdown", has_title=len(self.arguments) > 0, **classes ) if self.arguments: textnodes, messages = self.state.inline_text(self.arguments[0], self.lineno) container += nodes.paragraph(self.arguments[0], "", *textnodes) container += messages self.state.nested_parse(self.content, self.content_offset, container) self.add_name(container) return [container] KEBAB = """\ """ class DropdownHtmlTransform(SphinxPostTransform): default_priority = 200 formats = ("html",) def run(self): matcher = NodeMatcher(nodes.container, type="dropdown") for node in self.document.traverse(matcher): open_marker = nodes.container( "", nodes.raw( "", nodes.Text(get_opticon("chevron-up", size=24)), format="html" ), is_div=True, classes=["summary-up"], ) closed_marker = nodes.container( "", nodes.raw( "", nodes.Text(get_opticon("chevron-down", size=24)), format="html" ), is_div=True, classes=["summary-down"], ) newnode = dropdown_main( opened=node["opened"], classes=["sphinx-bs", "dropdown", "card"] + node["container_classes"], ) if node["has_title"]: title_children = node[0] body_children = node[1:] else: title_children = [ nodes.raw( "...", nodes.Text( KEBAB # Note the custom opticon here has thicker dots # get_opticon("kebab-horizontal", classes="no-title", # size=24) ), format="html", ) ] body_children = node newnode += dropdown_title( "", "", *title_children, closed_marker, open_marker, classes=["summary-title", "card-header"] + node["title_classes"] ) body_node = nodes.container( "", *body_children, is_div=True, classes=["summary-content", "card-body"] + node["body_classes"] ) for para in body_node.traverse(nodes.paragraph): para["classes"] = ([] if "classes" in para else para["classes"]) + [ "card-text" ] newnode += body_node # newnode += open_marker node.replace_self(newnode) sphinx-panels-0.6.0/sphinx_panels/icons.py000066400000000000000000000077021405624532300206600ustar00rootroot00000000000000from functools import lru_cache import json from pathlib import Path from docutils import nodes from .utils import string_to_func_inputs OPTICON_VERSION = "0.0.0-dd899ea" OPTICON_CSS = """\ .octicon { display: inline-block; vertical-align: text-top; fill: currentColor; }""" @lru_cache(1) def get_opticon_data(): path = Path(__file__).parent.joinpath("data", "opticons.json") return json.loads(path.read_text()) def list_opticons(): return list(get_opticon_data().keys()) def get_opticon( name: str, classes: str = None, width: int = None, height: int = None, aria_label: str = None, size: int = 16, ): assert size in [16, 24], "size must be 16 or 24" try: data = get_opticon_data()[name] except KeyError: raise KeyError(f"Unrecognised opticon: {name}") content = data["heights"][str(size)]["path"] options = { "version": "1.1", "width": data["heights"][str(size)]["width"], "height": int(size), "class": f"octicon octicon-{name}", } if width is not None or height is not None: if width is None: width = round((int(height) * options["width"]) / options["height"], 2) if height is None: height = round((int(width) * options["height"]) / options["width"], 2) options["width"] = width options["height"] = height options["viewBox"] = f'0 0 {options["width"]} {options["height"]}' if classes is not None: options["class"] += " " + classes.strip() if aria_label is not None: options["aria-label"] = aria_label options["role"] = "img" else: options["aria-hidden"] = "true" opt_string = " ".join(f'{k}="{v}"' for k, v in options.items()) return f"{content}" def opticon_role( role, rawtext: str, text: str, lineno, inliner, options={}, content=[] ): try: args, kwargs = string_to_func_inputs(text) svg = get_opticon(*args, **kwargs) except Exception as err: msg = inliner.reporter.error(f"Opticon input is invalid: {err}", line=lineno) prb = inliner.problematic(rawtext, rawtext, msg) return [prb], [msg] node = nodes.raw("", nodes.Text(svg), format="html") return [node], [] class fontawesome(nodes.Element, nodes.General): pass def create_fa_node(name, classes: str = None, style="fa"): assert style.startswith("fa"), "style must be a valid prefix, e.g. fa, fas, etc" return fontawesome( icon_name=name, classes=[style, f"fa-{name}"] + (classes.split() if classes else []), ) def fontawesome_role(role, rawtext, text, lineno, inliner, options={}, content=[]): try: args, kwargs = string_to_func_inputs(text) node = create_fa_node(*args, **kwargs) except Exception as err: msg = inliner.reporter.error( f"FontAwesome input is invalid: {err}", line=lineno ) prb = inliner.problematic(rawtext, rawtext, msg) return [prb], [msg] return [node], [] def visit_fontawesome_html(self, node): self.body.append(self.starttag(node, "span", "")) def depart_fontawesome_html(self, node): self.body.append("") def visit_fontawesome_latex(self, node): if self.config.panels_add_fontawesome_latex: self.body.append(f"\\faicon{{{node['icon_name']}}}") raise nodes.SkipNode def add_fontawesome_pkg(app, config): if app.config.panels_add_fontawesome_latex: app.add_latex_package("fontawesome") def setup_icons(app): app.add_role("opticon", opticon_role) app.add_role("fa", fontawesome_role) app.add_config_value("panels_add_fontawesome_latex", False, "env") app.connect("config-inited", add_fontawesome_pkg) app.add_node( fontawesome, html=(visit_fontawesome_html, depart_fontawesome_html), latex=(visit_fontawesome_latex, None), text=(None, None), man=(None, None), texinfo=(None, None), ) sphinx-panels-0.6.0/sphinx_panels/panels.py000066400000000000000000000215561405624532300210320ustar00rootroot00000000000000import re from docutils import nodes from docutils.parsers.rst import directives from sphinx.util.docutils import SphinxDirective DEFAULT_CONTAINER = "container pb-4" DEFAULT_COLUMN = "col-lg-6 col-md-6 col-sm-6 col-xs-12 p-2" DEFAULT_CARD = "shadow" RE_OPTIONS = re.compile( r"\:(column|card|body|header|footer|" r"img-top|img-bottom|img-top-cls|img-bottom-cls)\:\s*(\+?)\s*(.*)" ) def setup_panels(app): app.add_directive("panels", Panels) app.add_config_value( "panels_delimiters", (r"^\-{3,}$", r"^\^{3,}$", r"^\+{3,}$"), "env" ) app.connect("config-inited", validate_config) def parse_panels( content, content_offset, default_classes, panel_regex=None, head_regex=None, foot_regex=None, ): """split a block of content into panels. example:: --- header === body ... footer --- next panel """ panel_regex = panel_regex or re.compile(r"^\-{3,}$") head_regex = head_regex or re.compile(r"^\^{3,}$") foot_regex = foot_regex or re.compile(r"^\+{3,}$") if isinstance(content, str): content = content.splitlines() panel_blocks = [] start_line = 0 header_split = footer_split = None for i, line in enumerate(content): if panel_regex.match(line.strip()): if i != 0: panel_blocks.append( parse_single_panel( content[start_line:i], start_line, header_split, footer_split, content_offset, default_classes, ) ) start_line = i + 1 header_split = footer_split = None if head_regex.match(line.strip()) and footer_split is None: header_split = i - start_line if foot_regex.match(line.strip()): footer_split = i - start_line # TODO warn if multiple header_split or footer_split # TODO assert header_split is before footer_split try: panel_blocks.append( parse_single_panel( content[start_line:], start_line, header_split, footer_split, content_offset, default_classes, ) ) except IndexError: pass return panel_blocks def parse_single_panel( content, offset, header_split, footer_split, content_offset, default_classes ): """parse each panel data to dict.""" output = {} body_start = 0 body_end = len(content) # parse the classes required for this panel, and top/bottom images classes = default_classes.copy() for opt_offset, line in enumerate(content): opt_match = RE_OPTIONS.match(line) if not opt_match: break body_start += 1 if opt_match.group(1) in ["img-top", "img-bottom"]: output[opt_match.group(1)] = opt_match.group(3) continue if opt_match.group(2) == "+": classes[opt_match.group(1)] = ( classes.get(opt_match.group(1), []) + opt_match.group(3).split() ) else: classes[opt_match.group(1)] = opt_match.group(3).split() if classes: output["classes"] = classes if header_split is not None: header_content = content[opt_offset:header_split] header_offset = content_offset + offset + opt_offset body_start = header_split + 1 output["header"] = (header_content, header_offset) if footer_split is not None: footer_content = content[footer_split + 1 :] footer_offset = content_offset + offset + footer_split body_end = footer_split output["footer"] = (footer_content, footer_offset) body_content = content[body_start:body_end] body_offset = content_offset + offset + body_start output["body"] = (body_content, body_offset) return output def add_child_classes(node): """Add classes to specific child nodes.""" for para in node.traverse(nodes.paragraph): para["classes"] = ([] if "classes" in para else para["classes"]) + ["card-text"] for title in node.traverse(nodes.title): title["classes"] = ([] if "classes" in title else title["classes"]) + [ "card-title" ] class Panels(SphinxDirective): """Two Column Panels.""" has_content = True option_spec = { "container": directives.unchanged, "column": directives.unchanged, "card": directives.unchanged, "body": directives.unchanged, "header": directives.unchanged, "footer": directives.unchanged, "img-top-cls": directives.unchanged, "img-bottom-cls": directives.unchanged, } def run(self): default_classes = { "container": DEFAULT_CONTAINER.split(), "column": DEFAULT_COLUMN.split(), "card": DEFAULT_CARD.split(), "body": [], "header": [], "footer": [], "img-top-cls": [], "img-bottom-cls": [], } # set classes from the directive options for key, value in default_classes.items(): if key not in self.options: continue option_value = self.options[key].strip() if option_value.startswith("+"): default_classes[key] += option_value[1:].split() else: default_classes[key] = option_value.split() # split the block into panels panel_blocks = parse_panels( self.content, self.content_offset, default_classes, panel_regex=self.env.app.config.panels_delimiters[0], head_regex=self.env.app.config.panels_delimiters[1], foot_regex=self.env.app.config.panels_delimiters[2], ) # set the top-level containers parent = nodes.container( is_div=True, classes=["sphinx-bs"] + default_classes["container"] ) rows = nodes.container(is_div=True, classes=["row"]) parent += rows for data in panel_blocks: classes = data["classes"] column = nodes.container( is_div=True, classes=["d-flex"] + classes["column"] ) rows += column card = nodes.container( is_div=True, classes=["card", "w-100"] + classes["card"] ) column += card if "img-top" in data: image_top = nodes.image( "", uri=directives.uri(data["img-top"]), alt="img-top", classes=["card-img-top"] + classes["img-top-cls"], ) self.add_name(image_top) card += image_top if "header" in data: header = nodes.container( is_div=True, classes=["card-header"] + classes["header"] ) card += header header_content, header_offset = data["header"] self.state.nested_parse(header_content, header_offset, header) add_child_classes(header) body = nodes.container(is_div=True, classes=["card-body"] + classes["body"]) card += body body_content, body_offset = data["body"] self.state.nested_parse(body_content, body_offset, body) add_child_classes(body) if "footer" in data: footer = nodes.container( is_div=True, classes=["card-footer"] + classes["footer"] ) card += footer footer_content, footer_offset = data["footer"] self.state.nested_parse(footer_content, footer_offset, footer) add_child_classes(footer) if "img-bottom" in data: image_top = nodes.image( "", uri=directives.uri(data["img-bottom"]), alt="img-bottom", classes=["card-img-bottom"] + classes["img-bottom-cls"], ) self.add_name(image_top) card += image_top return [parent] def validate_config(app, config): if len(app.config.panels_delimiters) != 3: raise AssertionError( "panels_delimiters config must be of form: (header, body, footer)" ) if len(set(app.config.panels_delimiters)) != 3: raise AssertionError("panels_delimiters config must contain unique values") try: app.config.panels_delimiters = tuple( [re.compile(s) for s in app.config.panels_delimiters] ) except Exception as err: raise AssertionError( "panels_delimiters config must contain only compilable regexes: {}".format( err ) ) sphinx-panels-0.6.0/sphinx_panels/scss/000077500000000000000000000000001405624532300201405ustar00rootroot00000000000000sphinx-panels-0.6.0/sphinx_panels/scss/bootstrap/000077500000000000000000000000001405624532300221555ustar00rootroot00000000000000sphinx-panels-0.6.0/sphinx_panels/scss/bootstrap/_badge.scss000066400000000000000000000017111405624532300242530ustar00rootroot00000000000000// Bootstrap v4.4.1 (https://getbootstrap.com/) // Copyright 2011-2019 The Bootstrap Authors // Copyright 2011-2019 Twitter, Inc. // Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) .badge { border-radius: .25rem; display: inline-block; font-size: 75%; font-weight: 700; line-height: 1; padding: .25em .4em; text-align: center; vertical-align: baseline; white-space: nowrap; // Empty badges collapse automatically &:empty { display: none; } } // Quick fix for badges in buttons .btn .badge { position: relative; top: -1px; } .badge-pill { border-radius: 10rem; padding-left: .6em; padding-right: .6em; } @each $name, $color in $semantic-colors { .badge-#{$name} { background-color: $color; color: text-color($name); } .badge-#{$name}[href]:focus, .badge-#{$name}[href]:hover { background-color: darken($color, 10%); color: text-color($name); text-decoration: none; } } sphinx-panels-0.6.0/sphinx_panels/scss/bootstrap/_borders.scss000066400000000000000000000024171405624532300246550ustar00rootroot00000000000000// Bootstrap v4.4.1 (https://getbootstrap.com/) // Copyright 2011-2019 The Bootstrap Authors // Copyright 2011-2019 Twitter, Inc. // Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) .border-0 { border: 0 !important; } .border-top-0 { border-top: 0 !important; } .border-right-0 { border-right: 0 !important; } .border-bottom-0 { border-bottom: 0 !important; } .border-left-0 { border-left: 0 !important; } $pad-width: ( "0": 0, "1": .25rem, "2": .5rem, "3": 1rem, "4": 1.5rem, "5": 3rem, ) !default; @each $id, $value in $pad-width { .p-#{$id} { padding: $value !important; } .pt-#{$id}, .py-#{$id} { padding-top: $value !important; } .pr-#{$id}, .px-#{$id} { padding-right: $value !important; } .pb-#{$id}, .py-#{$id} { padding-bottom: $value !important; } .pl-#{$id}, .px-#{$id} { padding-left: $value !important; } } @each $id, $value in $pad-width { .m-#{$id} { margin: $value !important; } .mt-#{$id}, .my-#{$id} { margin-top: $value !important; } .mr-#{$id}, .mx-#{$id} { margin-right: $value !important; } .mb-#{$id}, .my-#{$id} { margin-bottom: $value !important; } .ml-#{$id}, .mx-#{$id} { margin-left: $value !important; } } sphinx-panels-0.6.0/sphinx_panels/scss/bootstrap/_buttons.scss000066400000000000000000000102501405624532300247050ustar00rootroot00000000000000// Bootstrap v4.4.1 (https://getbootstrap.com/) // Copyright 2011-2019 The Bootstrap Authors // Copyright 2011-2019 Twitter, Inc. // Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) .btn { background-color: transparent; border: 1px solid transparent; border-radius: .25rem; color: $gray-900; cursor: pointer; display: inline-block; font-size: 1rem; font-weight: 400; line-height: 1.5; padding: .375rem .75rem; text-align: center; transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; -moz-user-select: none; -ms-user-select: none; -webkit-user-select: none; user-select: none; vertical-align: middle; &:hover { color: $gray-900; text-decoration: none; } &:visited { color: $gray-900; } &.focus, &:focus { box-shadow: 0 0 0 $btn-focus-width rgba(mix($blue, $blue, 15%), .25); outline: 0; } &.disabled, &:disabled { opacity: .65; } } @media (prefers-reduced-motion:reduce) { .btn { transition: none; } } a.btn.disabled, fieldset:disabled a.btn { pointer-events: none; } @each $name, $color in $semantic-colors { .btn-#{$name} { background-color: $color; border-color: $color; color: text-color($name); &:visited { color: text-color($name); } &:hover { background-color: darken($color, 7.5%); border-color: darken($color, 10%); color: text-color($name); } &.focus, &:focus { background-color: darken($color, 7.5%); border-color: darken($color, 10%); box-shadow: 0 0 0 $btn-focus-width rgba(mix($color, $color, 15%), .5); color: text-color($name); } &.disabled, &:disabled { background-color: $color; border-color: $color; color: text-color($name); } &:not(:disabled):not(.disabled).active, &:not(:disabled):not(.disabled):active, .show>&.dropdown-toggle { background-color: darken($color, 10%); border-color: darken($color, 12.5%); color: text-color($name); } &:not(:disabled):not(.disabled).active:focus, &:not(:disabled):not(.disabled):active:focus, .show>&.dropdown-toggle:focus { box-shadow: 0 0 0 $btn-focus-width rgba(mix($color, $color, 15%), .5); } } } @each $name, $color in $semantic-colors { .btn-outline-#{$name} { border-color: $color; color: $color; &:visited { color: $color; } &:hover { background-color: $color; border-color: $color; color: text-color($name); } &.focus, &:focus { box-shadow: 0 0 0 $btn-focus-width rgba(mix($color, $color, 15%), .5); } &.disabled, &:disabled { background-color: transparent; color: $color; } &:not(:disabled):not(.disabled).active, &:not(:disabled):not(.disabled):active, .show>&.dropdown-toggle { background-color: $color; border-color: $color; color: text-color($name); } &:not(:disabled):not(.disabled).active:focus, &:not(:disabled):not(.disabled):active:focus, .show>&.dropdown-toggle:focus { box-shadow: 0 0 0 $btn-focus-width rgba(mix($color, $color, 15%), .5); } } } .btn-link { color: $blue; font-weight: 400; text-decoration: none; &:hover { color: darken($blue, 15%); text-decoration: underline; } &.focus, &:focus { box-shadow: none; text-decoration: underline; } &.disabled, &:disabled { color: $gray-600; pointer-events: none; } } .btn-group-lg>.btn, .btn-lg { border-radius: .3rem; font-size: 1.25rem; line-height: 1.5; padding: .5rem 1rem; } .btn-group-sm>.btn, .btn-sm { border-radius: .2rem; font-size: .875rem; line-height: 1.5; padding: .25rem .5rem; } .btn-block { display: block; width: 100%; } .btn-block+.btn-block { margin-top: .5rem; } input[type=button].btn-block, input[type=reset].btn-block, input[type=submit].btn-block { width: 100%; } .stretched-link::after { background-color: $black-0; bottom: 0; content: ''; left: 0; pointer-events: auto; position: absolute; right: 0; top: 0; z-index: 1; } .text-wrap { white-space: normal !important; } sphinx-panels-0.6.0/sphinx_panels/scss/bootstrap/_cards.scss000066400000000000000000000075051405624532300243140ustar00rootroot00000000000000// Bootstrap v4.4.1 (https://getbootstrap.com/) // Copyright 2011-2019 The Bootstrap Authors // Copyright 2011-2019 Twitter, Inc. // Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) .card { background-clip: border-box; background-color: $white; border: 1px solid $black-12-5; border-radius: .25rem; display: -ms-flexbox; display: flex; -ms-flex-direction: column; flex-direction: column; min-width: 0; position: relative; word-wrap: break-word; >hr { margin-left: 0; margin-right: 0; } >.list-group:first-child .list-group-item:first-child { border-top-left-radius: .25rem; border-top-right-radius: .25rem; } >.list-group:last-child .list-group-item:last-child { border-bottom-left-radius: .25rem; border-bottom-right-radius: .25rem; } } .card-body { -ms-flex: 1 1 auto; flex: 1 1 auto; min-height: 1px; padding: 1.25rem; } .card-title { margin-bottom: .75rem; } .card-subtitle { margin-bottom: 0; margin-top: -.375rem; } .card-text:last-child { margin-bottom: 0; } .card-link:hover { text-decoration: none; } .card-link+.card-link { margin-left: 1.25rem; } .card-header { background-color: $black-3; border-bottom: 1px solid $black-12-5; margin-bottom: 0; padding: .75rem 1.25rem; } .card-header:first-child { border-radius: calc(.25rem - 1px) calc(.25rem - 1px) 0 0; } .card-header+.list-group .list-group-item:first-child { border-top: 0; } .card-footer { background-color: $black-3; border-top: 1px solid $black-12-5; padding: .75rem 1.25rem; } .card-footer:last-child { border-radius: 0 0 calc(.25rem - 1px) calc(.25rem - 1px); } .card-header-tabs { border-bottom: 0; margin-bottom: -.75rem; margin-left: -.625rem; margin-right: -.625rem; } .card-header-pills { margin-left: -.625rem; margin-right: -.625rem; } .card-img-overlay { bottom: 0; left: 0; padding: 1.25rem; position: absolute; right: 0; top: 0; } .card-img, .card-img-bottom, .card-img-top { -ms-flex-negative: 0; flex-shrink: 0; width: 100%; } .card-img, .card-img-top { border-top-left-radius: calc(.25rem - 1px); border-top-right-radius: calc(.25rem - 1px); } .card-img, .card-img-bottom { border-bottom-left-radius: calc(.25rem - 1px); border-bottom-right-radius: calc(.25rem - 1px); } .w-100 { width: 100% !important; } .shadow { box-shadow: 0 .5rem 1rem $black-15 !important; } // scss-docs-start theme-colors-map $semantic-colors-text: map-merge( $semantic-colors, ( "white": $white, "body": $gray-900, "muted": $gray-600, "black-50": $black-50, "white-50": $white-50, ) ) !default; // scss-docs-end theme-colors-map @each $color, $value in map-merge($semantic-colors, ("white": $white)) { .bg-#{$color} { background-color: $value !important; } button { &.bg-#{$color}:focus, &.bg-#{$color}:hover { background-color: darken($value, 10%) !important; } } a { &.bg-#{$color}:focus, &.bg-#{$color}:hover { background-color: darken($value, 10%) !important; } &.text-#{$color}:focus, &.text-#{$color}:hover { color: darken($dark, 15%) !important; } } } @each $color, $value in $semantic-colors-text { .text-#{$color} { color: $value !important; } } .bg-transparent { background-color: transparent !important; } .text-justify { text-align: justify !important; } .text-left { text-align: left !important; } .text-right { text-align: right !important; } .text-center { text-align: center !important; } .font-weight-light { font-weight: 300 !important; } .font-weight-lighter { font-weight: lighter !important; } .font-weight-normal { font-weight: 400 !important; } .font-weight-bold { font-weight: 700 !important; } .font-weight-bolder { font-weight: bolder !important; } .font-italic { font-style: italic !important; } sphinx-panels-0.6.0/sphinx_panels/scss/bootstrap/_colors.scss000066400000000000000000000031031405624532300245070ustar00rootroot00000000000000$white: #fff !default; $white-50: rgba(255, 255, 255, .5) !default; $gray-100: #f8f9fa !default; $gray-200: #e9ecef !default; $gray-300: #dee2e6 !default; $gray-400: #ced4da !default; $gray-500: #adb5bd !default; $gray-600: #6c757d !default; $gray-700: #495057 !default; $gray-800: #343a40 !default; $gray-900: #212529 !default; $black: #000 !default; $black-0: rgba(0, 0, 0, 0) !default; $black-3: rgba(0, 0, 0, .03) !default; $black-12-5: rgba(0, 0, 0, .125) !default; $black-15: rgba(0, 0, 0, .15) !default; $black-50: rgba(0, 0, 0, .5) !default; // $blue: #0d6efd !default; $blue: #007bff !default; $indigo: #6610f2 !default; $purple: #6f42c1 !default; $pink: #d63384 !default; $red: #dc3545 !default; $orange: #fd7e14 !default; $yellow: #ffc107 !default; // $green: #198754 !default; $green: #28a745 !default; $teal: #20c997 !default; // $cyan: #0dcaf0 !default; $cyan: #17a2b8 !default; $primary: $blue !default; $secondary: $gray-600 !default; $success: $green !default; $info: $cyan !default; $warning: $yellow !default; $danger: $red !default; $light: $gray-100 !default; $dark: $gray-800 !default; // scss-docs-start theme-colors-map $semantic-colors: ( "primary": $primary, "secondary": $secondary, "success": $success, "info": $info, "warning": $warning, "danger": $danger, "light": $light, "dark": $dark, ) !default; // scss-docs-end theme-colors-map @function text-color($name) { // color: if(lightness($value) > 70, $gray-900, $white); @return if($name == 'light' or $name == 'warning', $gray-900, $white); } $btn-focus-width: .2rem !default; sphinx-panels-0.6.0/sphinx_panels/scss/bootstrap/_grids.scss000066400000000000000000000064621405624532300243310ustar00rootroot00000000000000// Bootstrap v4.4.1 (https://getbootstrap.com/) // Copyright 2011-2019 The Bootstrap Authors // Copyright 2011-2019 Twitter, Inc. // Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) .container { margin-left: auto; margin-right: auto; padding-left: 15px; padding-right: 15px; width: 100%; } $media-min-sm: 576px; $media-min-md: 768px; $media-min-lg: 992px; $media-min-xl: 1200px; $media-max-sm: 540px; $media-max-md: 720px; $media-max-lg: 960px; $media-max-xl: 1140px; $media-widths: ( 'sm': $media-min-sm, 'md': $media-min-md, 'lg': $media-min-lg, 'xl': $media-min-xl, ) !default; @media (min-width:$media-min-sm) { .container { max-width: $media-max-sm; } } @media (min-width:$media-min-md) { .container { max-width: $media-max-md; } } @media (min-width:$media-min-lg) { .container { max-width: $media-max-lg; } } @media (min-width:$media-min-xl) { .container { max-width: $media-max-xl; } } .container-fluid, .container-lg, .container-md, .container-sm, .container-xl { margin-left: auto; margin-right: auto; padding-left: 15px; padding-right: 15px; width: 100%; } @media (min-width:$media-min-sm) { .container, .container-sm { max-width: $media-max-sm; } } @media (min-width:$media-min-md) { .container, .container-md, .container-sm { max-width: $media-max-md; } } @media (min-width:$media-min-lg) { .container, .container-lg, .container-md, .container-sm { max-width: $media-max-lg; } } @media (min-width:$media-min-xl) { .container, .container-lg, .container-md, .container-sm, .container-xl { max-width: $media-max-xl; } } .row { display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; margin-left: -15px; margin-right: -15px; } .col-lg, .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-auto, .col-md, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-auto, .col-sm, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-auto, .col-xl, .col-xl-1, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-auto { padding-left: 15px; padding-right: 15px; position: relative; width: 100%; } $col-widths: ( "1": 8.333333%, "2": 16.666667%, "3": 25%, "4": 33.333333%, "5": 41.666667%, "6": 50%, "7": 58.333333%, "8": 66.666667%, "9": 75%, "10": 83.333333%, "11": 91.666667%, "12": 100%, ) !default; @each $cat, $width in $media-widths { @media (min-width:$width) { .col-#{$cat} { flex-basis: 0; flex-grow: 1; -ms-flex-positive: 1; -ms-flex-preferred-size: 0; max-width: 100%; } .col-#{$cat}-auto { -ms-flex: 0 0 auto; flex: 0 0 auto; max-width: 100%; width: auto; } @each $twelth, $percent in $col-widths { .col-#{$cat}-#{$twelth} { -ms-flex: 0 0 $percent; flex: 0 0 $percent; max-width: $percent; } } } } .d-flex { display: -ms-flexbox !important; display: flex !important; } sphinx-panels-0.6.0/sphinx_panels/scss/bootstrap/_overrides.scss000066400000000000000000000003261405624532300252140ustar00rootroot00000000000000// Overrides for non-bootstrap themes (such as alabaster) .sphinx-bs, .sphinx-bs * { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } .sphinx-bs p { margin-top: 0; } sphinx-panels-0.6.0/sphinx_panels/scss/bootstrap/index.scss000066400000000000000000000003051405624532300241570ustar00rootroot00000000000000// Minimal bootstrap required for non-bootstrap themes @import './colors'; @import './badge'; @import './borders'; @import './buttons'; @import './cards'; @import './grids'; @import './overrides'; sphinx-panels-0.6.0/sphinx_panels/scss/panels/000077500000000000000000000000001405624532300214225ustar00rootroot00000000000000sphinx-panels-0.6.0/sphinx_panels/scss/panels/_dropdown.scss000066400000000000000000000034761405624532300243240ustar00rootroot00000000000000details.dropdown { .summary-title { // don't overlap the chevron padding-right: 3em !important; -moz-user-select: none; -ms-user-select: none; -webkit-user-select: none; user-select: none; } &:hover { cursor: pointer; } .summary-content { cursor: default; } summary { // hide the default triangle marker list-style: none; padding: 1em; // Ellipsis added when no title .octicon.no-title { vertical-align: middle; } } &[open] summary .octicon.no-title { visibility: hidden; } // chrome doesn't yet support list-style summary::-webkit-details-marker { display: none; } summary:focus { outline: none; } summary:hover .summary-up svg, summary:hover .summary-down svg { opacity: 1; } .summary-up svg, .summary-down svg { display: block; opacity: .6; } .summary-up, .summary-down { pointer-events: none; position: absolute; right: 1em; top: .75em; } &[open] .summary-down { visibility: hidden; } &:not([open]) .summary-up { visibility: hidden; } // Transition animation &.fade-in[open] summary~* { -moz-animation: panels-fade-in .5s ease-in-out; -webkit-animation: panels-fade-in .5s ease-in-out; animation: panels-fade-in .5s ease-in-out; } &.fade-in-slide-down[open] summary~* { -moz-animation: panels-fade-in .5s ease-in-out, panels-slide-down .5s ease-in-out; -webkit-animation: panels-fade-in .5s ease-in-out, panels-slide-down .5s ease-in-out; animation: panels-fade-in .5s ease-in-out, panels-slide-down .5s ease-in-out; } } @keyframes panels-fade-in { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes panels-slide-down { 0% { transform: translate(0, -10px); } 100% { transform: translate(0, 0); } } sphinx-panels-0.6.0/sphinx_panels/scss/panels/_icons.scss000066400000000000000000000001301405624532300235630ustar00rootroot00000000000000.octicon { display: inline-block; fill: currentColor; vertical-align: text-top; } sphinx-panels-0.6.0/sphinx_panels/scss/panels/_tabs.scss000066400000000000000000000047331405624532300234160ustar00rootroot00000000000000// --------------------------------------------------------------------------------- // Adapted from https://squidfunk.github.io/mkdocs-material/reference/content-tabs/ /// Copyright (c) 2016-2020 Martin Donath // --------------------------------------------------------------------------------- /// /// Convert font size in px to rem /// @function px2rem($size, $base: 16px) { @if unit($size) == px { @if unit($base) == px { @return ($size / $base) * 1rem; } @else { @error "Invalid base: #{$base} - unit must be 'px'"; } } @else { @error "Invalid size: #{$size} - unit must be 'px'"; } } /// /// Convert font size in px to em /// @function px2em($size, $base: 16px) { @if unit($size) == px { @if unit($base) == px { @return ($size / $base) * 1em; } @else { @error "Invalid base: #{$base} - unit must be 'px'"; } } @else { @error "Invalid size: #{$size} - unit must be 'px'"; } } // Tabbed block content .tabbed-content { box-shadow: 0 px2rem(-1px) var(--tabs-color-overline), 0 px2rem(1px) var(--tabs-color-underline); display: none; order: 99; padding-bottom: px2rem(12px); padding-top: px2rem(12px); width: 100%; >:first-child { margin-top: 0 !important; } >:last-child { margin-bottom: 0 !important; } // Nested tabs >.tabbed-set { margin: 0; } } // Tabbed block container .tabbed-set { border-radius: px2rem(2px); display: flex; flex-wrap: wrap; margin: 1em 0; position: relative; // Hide radio buttons >input { opacity: 0; position: absolute; // Active tab label &:checked+label { border-color: var(--tabs-color-label-active); color: var(--tabs-color-label-active); // Show tabbed block content +.tabbed-content { display: block; } } // Focused tab label &:focus+label { outline-style: auto; } // Disable focus indicator for pointer devices &:not(.focus-visible)+label { outline: none; -webkit-tap-highlight-color: transparent; } } // Tab label >label { border-bottom: px2rem(2px) solid transparent; color: var(--tabs-color-label-inactive); cursor: pointer; font-size: var(--tabs-size-label); font-weight: 700; padding: px2em(20px, 20px) 1.25em px2em(10px, 20px); transition: color 250ms; width: auto; z-index: 1; // Hovered label html &:hover { color: var(--tabs-color-label-active); } } } sphinx-panels-0.6.0/sphinx_panels/scss/panels/index.scss000066400000000000000000000001251405624532300234240ustar00rootroot00000000000000// SCSS For sphinx panels @import './dropdown'; @import './icons'; @import './tabs'; sphinx-panels-0.6.0/sphinx_panels/tabs.py000066400000000000000000000134551405624532300205000ustar00rootroot00000000000000from uuid import uuid4 from typing import Optional from docutils import nodes from docutils.parsers.rst import directives from sphinx.transforms.post_transforms import SphinxPostTransform from sphinx.util.docutils import SphinxDirective from sphinx.util.logging import getLogger from sphinx.util.nodes import NodeMatcher LOGGER = getLogger(__name__) def setup_tabs(app): app.add_directive("tabbed", TabbedDirective) app.add_post_transform(TabbedHtmlTransform) app.add_node(tabbed_input, html=(visit_tabbed_input, depart_tabbed_input)) app.add_node(tabbed_label, html=(visit_tabbed_label, depart_tabbed_label)) class tabbed_input(nodes.Element, nodes.General): pass class tabbed_label(nodes.TextElement, nodes.General): pass def visit_tabbed_input(self, node): attributes = {"ids": [node["id"]], "type": node["type"], "name": node["set_id"]} if node["checked"]: attributes["checked"] = "checked" self.body.append(self.starttag(node, "input", **attributes)) def depart_tabbed_input(self, node): self.body.append("") def visit_tabbed_label(self, node): attributes = {"for": node["input_id"]} self.body.append(self.starttag(node, "label", **attributes)) def depart_tabbed_label(self, node): self.body.append("") class TabbedDirective(SphinxDirective): """CSS-based tabs.""" required_arguments = 1 final_argument_whitespace = True has_content = True option_spec = { "new-group": directives.flag, "selected": directives.flag, "name": directives.unchanged, "class-label": directives.class_option, "class-content": directives.class_option, } def run(self): self.assert_has_content() container = nodes.container( "", type="tabbed", new_group="new-group" in self.options, selected="selected" in self.options, classes=["tabbed-container"], ) self.set_source_info(container) # add label as a rubric (to degrade nicely for non-html outputs) textnodes, messages = self.state.inline_text(self.arguments[0], self.lineno) label = nodes.rubric(self.arguments[0], *textnodes, classes=["tabbed-label"]) label["classes"] += self.options.get("class-label", []) self.add_name(label) container += label # add content content = nodes.container("", is_div=True, classes=["tabbed-content"]) content["classes"] += self.options.get("class-content", []) self.state.nested_parse(self.content, self.content_offset, content) container += content return [container] class TabSet: def __init__(self, node): self._nodes = [node] def is_next(self, node): if self.parent != node.parent: return False if node.parent.index(node) != (self.indices[-1] + 1): return False return True def append(self, node): assert self.is_next(node) self._nodes.append(node) @property def parent(self) -> int: return self._nodes[0].parent @property def nodes(self) -> int: return self._nodes[:] @property def indices(self) -> int: return [n.parent.index(n) for n in self._nodes] class TabbedHtmlTransform(SphinxPostTransform): default_priority = 200 formats = ("html",) def get_unique_key(self): return str(uuid4()) def run(self): matcher = NodeMatcher(nodes.container, type="tabbed") tab_set = None for node in self.document.traverse(matcher): # type: nodes.container if tab_set is None: tab_set = TabSet(node) elif node["new_group"]: self.render_tab_set(tab_set) tab_set = TabSet(node) elif tab_set.is_next(node): tab_set.append(node) else: self.render_tab_set(tab_set) tab_set = TabSet(node) self.render_tab_set(tab_set) def render_tab_set(self, tab_set: Optional[TabSet]): if tab_set is None: return container = nodes.container("", is_div=True, classes=["tabbed-set"]) container.parent = tab_set.parent set_identity = self.get_unique_key() # get the first selected node selected_idx = None for idx, tab in enumerate(tab_set.nodes): if tab["selected"]: if selected_idx is None: selected_idx = idx else: LOGGER.warning("multiple selected tabbed directives", location=tab) selected_idx = 0 if selected_idx is None else selected_idx for idx, tab in enumerate(tab_set.nodes): # TODO warn and continue if incorrect children title, content = tab.children # input identity = self.get_unique_key() input_node = tabbed_input( "", id=identity, set_id=set_identity, type="radio", checked=(idx == selected_idx), ) input_node.source, input_node.line = tab.source, tab.line container += input_node # label # TODO this actually has to be text only label = tabbed_label("", *title.children, input_id=identity) label["classes"] = title["classes"] container += label input_node.source, input_node.line = tab.source, tab.line # content container += content # replace all nodes tab_set.parent.children = ( tab_set.parent.children[: tab_set.indices[0]] + [container] + tab_set.parent.children[tab_set.indices[-1] + 1 :] ) sphinx-panels-0.6.0/sphinx_panels/utils.py000066400000000000000000000010501405624532300206730ustar00rootroot00000000000000from ast import literal_eval import re REGEX = re.compile( r'\s*(?:(?P[a-zA-Z0-9_]+)\s*\=)?\s*(?P".*"|[^,]+)\s*(?:,|$)' ) def eval_literal(string): try: value = literal_eval(string) except Exception: value = string return value def string_to_func_inputs(text): args = [] kwargs = {} for key, value in REGEX.findall(text): if key: kwargs[key.strip()] = eval_literal(value.strip()) else: args.append(eval_literal(value.strip())) return args, kwargs sphinx-panels-0.6.0/tests/000077500000000000000000000000001405624532300154545ustar00rootroot00000000000000sphinx-panels-0.6.0/tests/conftest.py000066400000000000000000000000531405624532300176510ustar00rootroot00000000000000pytest_plugins = "sphinx.testing.fixtures" sphinx-panels-0.6.0/tests/sources/000077500000000000000000000000001405624532300171375ustar00rootroot00000000000000sphinx-panels-0.6.0/tests/sources/dropdown_basic/000077500000000000000000000000001405624532300221345ustar00rootroot00000000000000sphinx-panels-0.6.0/tests/sources/dropdown_basic/conf.py000066400000000000000000000000371405624532300234330ustar00rootroot00000000000000extensions = ["sphinx_panels"] sphinx-panels-0.6.0/tests/sources/dropdown_basic/index.rst000066400000000000000000000004001405624532300237670ustar00rootroot00000000000000Title ===== .. dropdown:: My Content :container: + shadow :title: bg-primary text-white text-center font-weight-bold :body: bg-light text-right font-italic Is formatted .. dropdown:: Fade In :animate: fade-in-slide-down Content sphinx-panels-0.6.0/tests/sources/tabbed_basic/000077500000000000000000000000001405624532300215215ustar00rootroot00000000000000sphinx-panels-0.6.0/tests/sources/tabbed_basic/conf.py000066400000000000000000000000371405624532300230200ustar00rootroot00000000000000extensions = ["sphinx_panels"] sphinx-panels-0.6.0/tests/sources/tabbed_basic/index.rst000066400000000000000000000004271405624532300233650ustar00rootroot00000000000000Title ===== .. tabbed:: Tab 1 Tab 1 content .. tabbed:: Tab 2 :class-content: pl-1 bg-primary Tab 2 content .. tabbed:: Tab 3 :new-group: Tab 3 content .. code-block:: python import pip .. tabbed:: Tab 4 :selected: Tab 4 content sphinx-panels-0.6.0/tests/test_icons.py000066400000000000000000000024471405624532300202070ustar00rootroot00000000000000from sphinx_panels import icons def test_opticon_simple(): string = icons.get_opticon("report") assert string == ( '' ) def test_opticon_with_options(): string = icons.get_opticon( "kebab-horizontal", width=36.0, size=24, classes="custom", aria_label="other" ) assert string == ( '' '' ) sphinx-panels-0.6.0/tests/test_panels.py000066400000000000000000000013711405624532300203510ustar00rootroot00000000000000import pytest from sphinx_panels.panels import parse_panels @pytest.mark.parametrize( "content,expected", ( ("a", [{"body": (["a"], 0)}]), ("---\na", [{"body": (["a"], 1)}]), ("a\n^^^", [{"body": ([], 2), "header": (["a"], 0)}]), ("a\n+++", [{"body": (["a"], 0), "footer": ([], 1)}]), ( "a\n^^^\nb\n+++\nc", [{"body": (["b"], 2), "footer": (["c"], 3), "header": (["a"], 0)}], ), ("---\n:card: a", [{"body": ([], 2), "classes": {"card": ["a"]}}]), ("a\n---\nb", [{"body": (["a"], 0)}, {"body": (["b"], 2)}]), ), ) def test_parse_panels(content, expected): output = parse_panels(content, content_offset=0, default_classes={}) assert output == expected sphinx-panels-0.6.0/tests/test_sphinx.py000066400000000000000000000020151405624532300203740ustar00rootroot00000000000000from pathlib import Path import shutil import pytest from sphinx.testing.path import path from sphinx_panels.tabs import TabbedHtmlTransform @pytest.fixture() def sphinx_app_factory(make_app, tmp_path: Path, monkeypatch): monkeypatch.setattr(TabbedHtmlTransform, "get_unique_key", lambda self: "mock-uuid") def _func(src_folder, **kwargs): shutil.copytree( (Path(__file__).parent / "sources" / src_folder), tmp_path / src_folder ) app = make_app(srcdir=path(str((tmp_path / src_folder).absolute())), **kwargs) return app yield _func @pytest.mark.parametrize("folder", ["tabbed_basic", "dropdown_basic"]) def test_sources(sphinx_app_factory, file_regression, folder): app = sphinx_app_factory(folder) app.build() assert app._warning.getvalue() == "" doctree = app.env.get_and_resolve_doctree("index", app.builder) doctree["source"] = "source" file_regression.check( doctree.pformat(), encoding="utf8", extension=".xml", ) sphinx-panels-0.6.0/tests/test_sphinx/000077500000000000000000000000001405624532300200245ustar00rootroot00000000000000sphinx-panels-0.6.0/tests/test_sphinx/test_sources_dropdown_basic_.xml000066400000000000000000000050601405624532300265050ustar00rootroot00000000000000
Title <dropdown_main classes="sphinx-bs dropdown card mb-3 shadow" opened="False"> <dropdown_title classes="summary-title card-header bg-primary text-white text-center font-weight-bold"> My Content <container classes="summary-down" is_div="True"> <raw format="html" xml:space="preserve"> <svg version="1.1" width="24" height="24" class="octicon octicon-chevron-down" viewBox="0 0 24 24" aria-hidden="true"><path fill-rule="evenodd" d="M5.22 8.72a.75.75 0 000 1.06l6.25 6.25a.75.75 0 001.06 0l6.25-6.25a.75.75 0 00-1.06-1.06L12 14.44 6.28 8.72a.75.75 0 00-1.06 0z"></path></svg> <container classes="summary-up" is_div="True"> <raw format="html" xml:space="preserve"> <svg version="1.1" width="24" height="24" class="octicon octicon-chevron-up" viewBox="0 0 24 24" aria-hidden="true"><path fill-rule="evenodd" d="M18.78 15.28a.75.75 0 000-1.06l-6.25-6.25a.75.75 0 00-1.06 0l-6.25 6.25a.75.75 0 101.06 1.06L12 9.56l5.72 5.72a.75.75 0 001.06 0z"></path></svg> <container classes="summary-content card-body bg-light text-right font-italic" is_div="True"> <paragraph classes="card-text"> Is formatted <dropdown_main classes="sphinx-bs dropdown card mb-3 fade-in-slide-down" opened="False"> <dropdown_title classes="summary-title card-header"> Fade In <container classes="summary-down" is_div="True"> <raw format="html" xml:space="preserve"> <svg version="1.1" width="24" height="24" class="octicon octicon-chevron-down" viewBox="0 0 24 24" aria-hidden="true"><path fill-rule="evenodd" d="M5.22 8.72a.75.75 0 000 1.06l6.25 6.25a.75.75 0 001.06 0l6.25-6.25a.75.75 0 00-1.06-1.06L12 14.44 6.28 8.72a.75.75 0 00-1.06 0z"></path></svg> <container classes="summary-up" is_div="True"> <raw format="html" xml:space="preserve"> <svg version="1.1" width="24" height="24" class="octicon octicon-chevron-up" viewBox="0 0 24 24" aria-hidden="true"><path fill-rule="evenodd" d="M18.78 15.28a.75.75 0 000-1.06l-6.25-6.25a.75.75 0 00-1.06 0l-6.25 6.25a.75.75 0 101.06 1.06L12 9.56l5.72 5.72a.75.75 0 001.06 0z"></path></svg> <container classes="summary-content card-body" is_div="True"> <paragraph classes="card-text"> Content ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sphinx-panels-0.6.0/tests/test_sphinx/test_sources_tabbed_basic_.xml��������������������������������0000664�0000000�0000000�00000003111�14056245323�0026065�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="source"> <section ids="title" names="title"> <title> Title <container classes="tabbed-set" is_div="True"> <tabbed_input checked="True" id="mock-uuid" set_id="mock-uuid" type="radio"> <tabbed_label classes="tabbed-label" input_id="mock-uuid"> Tab 1 <container classes="tabbed-content" is_div="True"> <paragraph> Tab 1 content <tabbed_input checked="False" id="mock-uuid" set_id="mock-uuid" type="radio"> <tabbed_label classes="tabbed-label" input_id="mock-uuid"> Tab 2 <container classes="tabbed-content pl-1 bg-primary" is_div="True"> <paragraph> Tab 2 content <container classes="tabbed-set" is_div="True"> <tabbed_input checked="False" id="mock-uuid" set_id="mock-uuid" type="radio"> <tabbed_label classes="tabbed-label" input_id="mock-uuid"> Tab 3 <container classes="tabbed-content" is_div="True"> <paragraph> Tab 3 content <literal_block force="False" highlight_args="{}" language="python" linenos="False" xml:space="preserve"> import pip <tabbed_input checked="True" id="mock-uuid" set_id="mock-uuid" type="radio"> <tabbed_label classes="tabbed-label" input_id="mock-uuid"> Tab 4 <container classes="tabbed-content" is_div="True"> <paragraph> Tab 4 content �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sphinx-panels-0.6.0/tests/test_utils.py�������������������������������������������������������������0000664�0000000�0000000�00000001203�14056245323�0020221�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������import pytest from sphinx_panels import utils @pytest.mark.parametrize( "string,expected", [ ("", ([], {})), ("a", (["a"], {})), ("a,b", (["a", "b"], {})), ("a,1", (["a", 1], {})), ("1,a", ([1, "a"], {})), ("a,b=1", (["a"], {"b": 1})), ('a,b="1"', (["a"], {"b": "1"})), ('a , b = "1,2" ', (["a"], {"b": "1,2"})), ('a , b = "1,2", sdf=4 ', (["a"], {"b": "1,2", "sdf": 4})), ('a,b="""', (["a"], {"b": '"""'})), # This is kind of wrong ], ) def test_string_to_func_inputs(string, expected): assert utils.string_to_func_inputs(string) == expected ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sphinx-panels-0.6.0/tox.ini�������������������������������������������������������������������������0000664�0000000�0000000�00000002515�14056245323�0015630�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# To use tox, see https://tox.readthedocs.io # Simply pip or conda install tox # If you use conda, you may also want to install tox-conda # then run `tox` or `tox -- {pytest args}` # To run in parallel using `tox -p` (this does not appear to work for this repo) # To rebuild the tox environment, for example when dependencies change, use # `tox -r` # Note: if the following error is encountered: `ImportError while loading conftest` # then then deleting compiled files has been found to fix it: `find . -name \*.pyc -delete` [tox] envlist = py38-sphinx4 [testenv] usedevelop = true [testenv:py{36,37,38,39}-sphinx{2,3,4}] extras = testing deps = sphinx2: sphinx>=2,<3 sphinx3: sphinx>=3,<4 sphinx4: sphinx>=4,<5 commands = pytest {posargs} [testenv:docs-{update,clean}] extras = themes passenv = HTML_THEME whitelist_externals = rm commands = clean: rm -rf docs/_build sphinx-build -nW --keep-going -b {posargs:html} docs/ docs/_build/{posargs:html} [testenv:docs-live] extras = themes live-dev passenv = HTML_THEME usedevelop = true commands = sphinx-autobuild \ --watch sphinx_panels \ --pre-build "web-compile --no-git-add" \ --re-ignore sphinx_panels/_css/.* \ --re-ignore _build/.* \ --port 0 --open-browser \ -n -b {posargs:html} docs/ docs/_build/{posargs:html} �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sphinx-panels-0.6.0/web-compile-config.yml����������������������������������������������������������0000664�0000000�0000000�00000000421�14056245323�0020500�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������web-compile: sass: files: sphinx_panels/scss/bootstrap/index.scss: sphinx_panels/_css/panels-bootstrap.[hash].css sphinx_panels/scss/panels/index.scss: sphinx_panels/_css/panels-main.[hash].css precision: 5 sourcemap: false format: compressed �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������