diff --git a/.copier-answers.yml b/.copier-answers.yml
new file mode 100644
index 000000000..7b50606ab
--- /dev/null
+++ b/.copier-answers.yml
@@ -0,0 +1,12 @@
+# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY
+_commit: 2024.08.19
+_src_path: gh:scientific-python/cookie
+backend: hatch
+email: econ-ark@jhuecon.org
+full_name: Econ-ARK Team
+license: MIT
+org: econ-ark
+project_name: HARK
+project_short_description: Heterogeneous Agents Resources and toolKit
+url: https://github.com/econ-ark/HARK
+vcs: true
diff --git a/.git_archival.txt b/.git_archival.txt
new file mode 100644
index 000000000..7c5100942
--- /dev/null
+++ b/.git_archival.txt
@@ -0,0 +1,3 @@
+node: $Format:%H$
+node-date: $Format:%cI$
+describe-name: $Format:%(describe:tags=true,match=*[0-9]*)$
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 000000000..00a7b00c9
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+.git_archival.txt export-subst
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
new file mode 100644
index 000000000..368750a6b
--- /dev/null
+++ b/.github/CONTRIBUTING.md
@@ -0,0 +1,89 @@
+See the [Scientific Python Developer Guide][spc-dev-intro] for a detailed
+description of best practices for developing scientific packages.
+
+[spc-dev-intro]: https://learn.scientific-python.org/development/
+
+# Quick development
+
+The fastest way to start with development is to use nox. If you don't have nox,
+you can use `pipx run nox` to run it without installing, or `pipx install nox`.
+If you don't have pipx (pip for applications), then you can install with
+`pip install pipx` (the only case were installing an application with regular
+pip is reasonable). If you use macOS, then pipx and nox are both in brew, use
+`brew install pipx nox`.
+
+To use, run `nox`. This will lint and test using every installed version of
+Python on your system, skipping ones that are not installed. You can also run
+specific jobs:
+
+```console
+$ nox -s lint # Lint only
+$ nox -s tests # Python tests
+$ nox -s docs -- --serve # Build and serve the docs
+$ nox -s build # Make an SDist and wheel
+```
+
+Nox handles everything for you, including setting up an temporary virtual
+environment for each run.
+
+# Setting up a development environment manually
+
+You can set up a development environment by running:
+
+```bash
+python3 -m venv .venv
+source ./.venv/bin/activate
+pip install -v -e .[dev]
+```
+
+If you have the
+[Python Launcher for Unix](https://github.com/brettcannon/python-launcher), you
+can instead do:
+
+```bash
+py -m venv .venv
+py -m install -v -e .[dev]
+```
+
+# Pre-commit
+
+You should prepare pre-commit, which will help you by checking that commits pass
+required checks:
+
+```bash
+pip install pre-commit # or brew install pre-commit on macOS
+pre-commit install # Will install a pre-commit hook into the git repo
+```
+
+You can also/alternatively run `pre-commit run` (changes only) or
+`pre-commit run --all-files` to check even without installing the hook.
+
+# Testing
+
+Use pytest to run the unit checks:
+
+```bash
+pytest
+```
+
+# Coverage
+
+Use pytest-cov to generate coverage reports:
+
+```bash
+pytest --cov=HARK
+```
+
+# Building docs
+
+You can build the docs using:
+
+```bash
+nox -s docs
+```
+
+You can see a preview with:
+
+```bash
+nox -s docs -- --serve
+```
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 000000000..6c4b36953
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,11 @@
+version: 2
+updates:
+ # Maintain dependencies for GitHub Actions
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ groups:
+ actions:
+ patterns:
+ - "*"
diff --git a/.github/release.yml b/.github/release.yml
new file mode 100644
index 000000000..9d1e0987b
--- /dev/null
+++ b/.github/release.yml
@@ -0,0 +1,5 @@
+changelog:
+ exclude:
+ authors:
+ - dependabot
+ - pre-commit-ci
diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml
new file mode 100644
index 000000000..efc7d0612
--- /dev/null
+++ b/.github/workflows/cd.yml
@@ -0,0 +1,60 @@
+name: CD
+
+on:
+ workflow_dispatch:
+ pull_request:
+ push:
+ branches:
+ - main
+ release:
+ types:
+ - published
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+env:
+ # Many color libraries just need this to be set to any value, but at least
+ # one distinguishes color depth, where "3" -> "256-bit color".
+ FORCE_COLOR: 3
+
+jobs:
+ dist:
+ name: Distribution build
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - uses: hynek/build-and-inspect-python-package@v2
+
+ publish:
+ needs: [dist]
+ name: Publish to PyPI
+ environment: pypi
+ permissions:
+ id-token: write
+ attestations: write
+ contents: read
+ runs-on: ubuntu-latest
+ if: github.event_name == 'release' && github.event.action == 'published'
+
+ steps:
+ - uses: actions/download-artifact@v4
+ with:
+ name: Packages
+ path: dist
+
+ - name: Generate artifact attestation for sdist and wheel
+ uses: actions/attest-build-provenance@v1.4.1
+ with:
+ subject-path: "dist/*"
+
+ - uses: pypa/gh-action-pypi-publish@release/v1
+ with:
+ # Remember to tell (test-)pypi about this repo before publishing
+ # Remove this line to publish to PyPI
+ repository-url: https://test.pypi.org/legacy/
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 000000000..fe68bf967
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,67 @@
+name: CI
+
+on:
+ workflow_dispatch:
+ pull_request:
+ push:
+ branches:
+ - main
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+env:
+ # Many color libraries just need this to be set to any value, but at least
+ # one distinguishes color depth, where "3" -> "256-bit color".
+ FORCE_COLOR: 3
+
+jobs:
+ pre-commit:
+ name: Format
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - uses: actions/setup-python@v5
+ with:
+ python-version: "3.x"
+ - uses: pre-commit/action@v3.0.1
+ with:
+ extra_args: --hook-stage manual --all-files
+ - name: Run PyLint
+ run: pipx run nox -s pylint -- --output-format=github
+
+ checks:
+ name: Check Python ${{ matrix.python-version }} on ${{ matrix.runs-on }}
+ runs-on: ${{ matrix.runs-on }}
+ needs: [pre-commit]
+ strategy:
+ fail-fast: false
+ matrix:
+ python-version: ["3.10", "3.11", "3.12"]
+ runs-on: [ubuntu-latest, windows-latest, macos-14]
+
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - uses: actions/setup-python@v5
+ with:
+ python-version: ${{ matrix.python-version }}
+ allow-prereleases: true
+
+ - name: Install package
+ run: python -m pip install .[test]
+
+ - name: Test package
+ run: >-
+ python -m pytest -ra --cov --cov-report=xml --cov-report=term
+ --durations=20
+
+ - name: Upload coverage report
+ uses: codecov/codecov-action@v4.5.0
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml
index 3b2437b62..3372df68b 100644
--- a/.github/workflows/documentation.yml
+++ b/.github/workflows/documentation.yml
@@ -35,7 +35,7 @@ jobs:
cache: "pip"
cache-dependency-path: |
requirements/base.txt
- requirements/doc.txt
+ requirements/docs.txt
- name: Install Pandoc
run: sudo apt-get install --yes pandoc
@@ -44,16 +44,11 @@ jobs:
run: python -m pip install --upgrade pip
- name: Install HARK
- run: python -m pip install .[doc]
+ run: python -m pip install .[docs]
- name: Run Sphinx
run: >
- sphinx-build
- -M html . HARK-docs
- -T
- -c Documentation
- -W
- -j 1
+ sphinx-build -M html docs HARK-docs -T -c docs -j 1
- name: Set up git for deployment
run: |
@@ -69,12 +64,13 @@ jobs:
- name: Deploy to GitHub Pages
# Only deploy to Pages on pushes to HEAD
- if: (github.repository_owner == 'Econ-ARK') && (github.event_name == 'push') && (github.ref_name == 'master')
+ if:
+ (github.repository_owner == 'Econ-ARK') && (github.event_name ==
+ 'push') && (github.ref_name == 'master')
run: >
- git push
- --force
- https://x-access-token:${{ github.token }}@github.com/${{ github.repository }}
- `git subtree split --prefix HARK-docs/html gh-pages`:refs/heads/gh-pages
+ git push --force https://x-access-token:${{ github.token
+ }}@github.com/${{ github.repository }} `git subtree split --prefix
+ HARK-docs/html gh-pages`:refs/heads/gh-pages
lint:
runs-on: ubuntu-latest
@@ -91,9 +87,5 @@ jobs:
python -m pip install --upgrade sphinx-lint
- name: Lint documentation with sphinx-lint
run: >
- sphinx-lint
- --ignore Documentation/example_notebooks/GenIncProcessModel.py
- --enable all
- --max-line-length 85
- README.md
- Documentation/
+ sphinx-lint --ignore docs/example_notebooks/GenIncProcessModel.py
+ --enable all --max-line-length 85 README.md docs/
diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index 81d3a6d44..6cec8b04d 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -6,13 +6,13 @@ on:
- master
paths-ignore:
- ".github/workflows/documentation.yml"
- - "Documentation/**"
+ - "docs/**"
pull_request:
branches:
- master
paths-ignore:
- ".github/workflows/documentation.yml"
- - "Documentation/**"
+ - "docs/**"
schedule:
- cron: 0 0 * * *
@@ -35,4 +35,4 @@ jobs:
pip install ".[dev]"
- name: Run examples
run: |
- pytest --nbval-lax --nbval-current-env --dist loadscope -n auto examples/
+ pytest --nbval-lax --nbval-current-env --dist loadscope -n auto docs/examples/
diff --git a/.github/workflows/execute-notebooks.yml b/.github/workflows/execute-notebooks.yml
index d9ddf59ab..d201eb971 100644
--- a/.github/workflows/execute-notebooks.yml
+++ b/.github/workflows/execute-notebooks.yml
@@ -49,11 +49,11 @@ jobs:
python -m pip install ipykernel nbclient nbformat
- name: Strip output
- run: nbstripout examples/**/*.ipynb
+ run: nbstripout docs/examples/**/*.ipynb
# This step takes c. 20 minutes
- name: Execute notebooks
- run: python tools/nb_exec.py examples/**/*.ipynb
+ run: python tools/nb_exec.py docs/examples/**/*.ipynb
env:
PYTHONUNBUFFERED: "1"
@@ -67,7 +67,8 @@ jobs:
title: "[bot] Execute example notebooks"
# language=Markdown
body: >
- This PR was [automatically generated] to re-execute
- the example notebooks for use in the documentation.
+ This PR was [automatically generated] to re-execute the example
+ notebooks for use in the documentation.
- [automatically generated]: https://github.com/Econ-ARK/HARK/actions/workflows/execute-notebooks.yml
+ [automatically generated]:
+ https://github.com/Econ-ARK/HARK/actions/workflows/execute-notebooks.yml
diff --git a/.github/workflows/hark.yml b/.github/workflows/hark.yml
deleted file mode 100644
index e52ed1ece..000000000
--- a/.github/workflows/hark.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-name: HARK build on MacOS, Ubuntu and Windows
-
-on:
- push:
- branches:
- - master
- paths-ignore:
- - ".github/workflows/documentation.yml"
- - "Documentation/**"
- pull_request:
- branches:
- - master
- paths-ignore:
- - ".github/workflows/documentation.yml"
- - "Documentation/**"
-
-jobs:
- build:
- runs-on: ${{ matrix.os }}
- strategy:
- max-parallel: 5
- matrix:
- os: [ubuntu-latest, macos-latest, windows-latest]
- python-version: ["3.10", "3.11", "3.12"]
-
- steps:
- - uses: actions/checkout@v3
- - name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@v4
- with:
- python-version: ${{ matrix.python-version }}
- - name: Install dependencies
- run: |
- python -m pip install --upgrade pip
- pip install ".[dev]"
- - name: Test with pytest
- run: |
- pytest -n auto
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
deleted file mode 100644
index 86723ac74..000000000
--- a/.github/workflows/lint.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-name: pre-commit
-
-on: [push, pull_request]
-
-jobs:
- format:
- runs-on: ubuntu-latest
- strategy:
- matrix:
- python-version: ["3.12"]
-
- steps:
- - uses: actions/checkout@v4
-
- - name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@v4
- with:
- python-version: ${{ matrix.python-version }}
-
- - name: Install packages
- run: |
- python -m pip install --upgrade pip
- python -m pip install ".[dev]"
- pip list
-
- - name: Lint
- run: pre-commit run --all-files --show-diff-on-failure --color always
diff --git a/.gitignore b/.gitignore
index 87f333f6e..25cf9a498 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,16 +3,11 @@ __pycache__/
*.py[cod]
*$py.class
-# Virtual Environments
-venv/
-econ-ark/
-
# C extensions
*.so
# Distribution / packaging
.Python
-env/
build/
develop-eggs/
dist/
@@ -24,9 +19,12 @@ lib64/
parts/
sdist/
var/
+wheels/
+share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
+MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
@@ -41,13 +39,17 @@ pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
+.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
-*,cover
+*.cover
+*.py,cover
.hypothesis/
+.pytest_cache/
+cover/
# Translations
*.mo
@@ -55,240 +57,102 @@ coverage.xml
# Django stuff:
*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
# Sphinx documentation
-Documentation/generated
-Documentation/_build
-Documentation/TractableBufferStockModel.rst
-Documentation/MultithreadDemo.rst
-Documentation/modules.rst
-Documentation/ConsumerParameters.rst
-Documentation/ConsPrefShockModel.rst
-Documentation/ConsMarkovModel.rst
-Documentation/ConsIndShockModel.rst
-Documentation/ConsAggShockModel.rst
-Documentation/StructEstimation.rst
-Documentation/SetupSCFdata.rst
-Documentation/EstimationParameters.rst
-Documentation/SetupParamsCSTW.rst
-Documentation/cstwMPC.rst
-Documentation/FashionVictimParams.rst
-Documentation/FashionVictimModel.rst
-Documentation/HARKutilities.rst
-Documentation/HARKsimulation.rst
-Documentation/HARKparallel.rst
-Documentation/HARKinterpolation.rst
-Documentation/HARKestimation.rst
-Documentation/HARKcore.rst
-doc/_build/
-doc/generated/
+docs/_build/
# PyBuilder
+.pybuilder/
target/
-#Ipython Notebook
+# Jupyter Notebook
.ipynb_checkpoints
-#Windows files
-Thumbs.db
-
-## Core latex/pdflated auxiliary files:
-*.aux
-*.lof
-*.log
-*.lot
-*.fls
-*.out
-*.toc
-*.fmt
-
-## Intermediate documents:
-*.dvi
-*-converted-to.*
-
-## Bibliography auxiliary files (bibtex/biblatex/biber):
-*.bbl
-*.bcf
-*.blg
-*-blx.aux
-*-blx.bib
-*.brf
-*.run.xml
-
-## Files created by htlatex
-*.4tc
-*.tmp
-*.xref
-
-## Build tool auxiliary files:
-*.fdb_latexmk
-*.synctex
-*.synctex.gz
-*.synctex.gz(busy)
-*.pdfsync
-
-## Auxiliary and intermediate files from other packages:
-# algorithms
-*.alg
-*.loa
-
-# achemso
-acs-*.bib
-
-# amsthm
-*.thm
-
-# beamer
-*.nav
-*.snm
-*.vrb
-
-# cprotect
-*.cpt
-
-#(e)ledmac/(e)ledpar
-*.end
-*.[1-9]
-*.[1-9][0-9]
-*.[1-9][0-9][0-9]
-*.[1-9]R
-*.[1-9][0-9]R
-*.[1-9][0-9][0-9]R
-*.eledsec[1-9]
-*.eledsec[1-9]R
-*.eledsec[1-9][0-9]
-*.eledsec[1-9][0-9]R
-*.eledsec[1-9][0-9][0-9]
-*.eledsec[1-9][0-9][0-9]R
-
-# glossaries
-*.acn
-*.acr
-*.glg
-*.glo
-*.gls
-
-# gnuplottex
-*-gnuplottex-*
-
-# hyperref
-*.brf
-
-# knitr
-*-concordance.tex
-*.tikz
-*-tikzDictionary
-
-# listings
-*.lol
+# IPython
+profile_default/
+ipython_config.py
-# makeidx
-*.idx
-*.ilg
-*.ind
-*.ist
+# pyenv
+# For a library or package, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# .python-version
-# minitoc
-*.maf
-*.mtc
-*.mtc[0-9]
-*.mtc[1-9][0-9]
+# 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
-# minted
-_minted*
-*.pyg
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
-# morewrites
-*.mw
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
-# mylatexformat
-*.fmt
+# SageMath parsed files
+*.sage.py
-# nomencl
-*.nlo
-
-# sagetex
-*.sagetex.sage
-*.sagetex.py
-*.sagetex.scmd
-
-# sympy
-*.sout
-*.sympy
-sympy-plots-for-*.tex/
-
-#pdfcomment
-*.upa
-*.upb
-
-# pythontex
-*.pytxcode
-pythontex-filse-*/
-
-# Texpad
-*.texpadtmp
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
-# TikZ & PGF
-*.dpth
-*.md5
-*.auxlock
+# Spyder project settings
+.spyderproject
+.spyproject
-# todonotes
-*.tdo
+# Rope project settings
+.ropeproject
-# xindy
-*.xdy
+# mkdocs documentation
+/site
-# xypic precompiled matrices
-*.xyc
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
-# WinEdt
-*.bak
-*.sav
+# Pyre type checker
+.pyre/
-# endfloat
-*.ttt
-*.fff
+# pytype static type analyzer
+.pytype/
-# Latexian
-TSWLatexianTemp
+# Cython debug symbols
+cython_debug/
-# Files for initializing subfolders
-# Filename.md
+# setuptools_scm
+src/*/_version.py
-# Version that generates html
-Web
+# ruff
+.ruff_cache/
-# Mac system files
+# OS specific stuff
.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
-# Emacs automatic backup and hash files
+# Common editor files
*~
-\#*#
-
-# Vim swap files
*.swp
-
-# Autogenerated equations
-eq
-
-# Emacs
-*.el
-
-# Particular user scratchwork directories
-nate-notes/
-
-*_region_*.*
-
-# VSCode
-settings.json
-.idea
-
-# Spyder project settings
-.spyderproject
-spyproject
-.spyproject
-
-# 20240608: CDC added *private* to avoid accidentally uploading private material
-*private*
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index d2360c4e3..469485112 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,20 +1,91 @@
-exclude: Documentation/example_notebooks/
+ci:
+ autoupdate_commit_msg: "chore: update pre-commit hooks"
+ autofix_commit_msg: "style: pre-commit fixes"
+
+exclude: ^.cruft.json|.copier-answers.yml$|docs/example_notebooks/
repos:
- - repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.3.2
+ - repo: https://github.com/adamchainz/blacken-docs
+ rev: "1.18.0"
hooks:
- - id: ruff
- types_or: [ python, pyi, jupyter ]
- args:
- - --fix
- - id: ruff-format
- types_or: [ python, pyi, jupyter ]
+ - id: blacken-docs
+ additional_dependencies: [black==24.*]
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.5.0
+ rev: "v4.6.0"
hooks:
+ - id: check-added-large-files
+ - id: check-case-conflict
+ - id: check-merge-conflict
+ - id: check-symlinks
+ # - id: check-yaml
+ - id: debug-statements
- id: end-of-file-fixer
- - id: trailing-whitespace
+ - id: mixed-line-ending
+ - id: name-tests-test
+ args: ["--pytest-test-first"]
- id: requirements-txt-fixer
- exclude: ^examples/
+ - id: trailing-whitespace
+
+ - repo: https://github.com/pre-commit/pygrep-hooks
+ rev: "v1.10.0"
+ hooks:
+ - id: rst-backticks
+ - id: rst-directive-colons
+ - id: rst-inline-touching-normal
+
+ - repo: https://github.com/rbubley/mirrors-prettier
+ rev: "v3.3.3"
+ hooks:
+ - id: prettier
+ types_or: [yaml, html, css, scss, javascript, json]
+ args: [--prose-wrap=always]
+
+ - repo: https://github.com/astral-sh/ruff-pre-commit
+ rev: "v0.6.1"
+ hooks:
+ - id: ruff
+ types_or: [python, pyi, jupyter]
+ args: ["--fix"]
+ - id: ruff-format
+ types_or: [python, pyi, jupyter]
+
+ # - repo: https://github.com/pre-commit/mirrors-mypy
+ # rev: "v1.11.1"
+ # hooks:
+ # - id: mypy
+ # files: src|tests
+ # args: []
+ # additional_dependencies:
+ # - pytest
+
+ # - repo: https://github.com/codespell-project/codespell
+ # rev: "v2.3.0"
+ # hooks:
+ # - id: codespell
+
+ # - repo: https://github.com/shellcheck-py/shellcheck-py
+ # rev: "v0.10.0.1"
+ # hooks:
+ # - id: shellcheck
+
+ # - repo: local
+ # hooks:
+ # - id: disallow-caps
+ # name: Disallow improper capitalization
+ # language: pygrep
+ # entry: PyBind|Numpy|Cmake|CCache|Github|PyTest
+ # exclude: .pre-commit-config.yaml
+
+ - repo: https://github.com/abravalheri/validate-pyproject
+ rev: "v0.19"
+ hooks:
+ - id: validate-pyproject
+ additional_dependencies: ["validate-pyproject-schema-store[all]"]
+
+ - repo: https://github.com/python-jsonschema/check-jsonschema
+ rev: "0.29.1"
+ hooks:
+ - id: check-dependabot
+ - id: check-github-workflows
+ - id: check-readthedocs
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
new file mode 100644
index 000000000..67c194c82
--- /dev/null
+++ b/.readthedocs.yaml
@@ -0,0 +1,17 @@
+# Read the Docs configuration file
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+
+version: 2
+
+build:
+ os: ubuntu-22.04
+ tools:
+ python: "3.12"
+ commands:
+ - asdf plugin add uv
+ - asdf install uv latest
+ - asdf global uv latest
+ - uv venv
+ - uv pip install .[docs]
+ - .venv/bin/python -m sphinx -T -b html -d docs/_build/doctrees -D
+ language=en docs $READTHEDOCS_OUTPUT/html
diff --git a/Documentation/example_notebooks/Include_list.txt b/Documentation/example_notebooks/Include_list.txt
deleted file mode 100644
index 79beabd2c..000000000
--- a/Documentation/example_notebooks/Include_list.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-examples/Gentle-Intro/Gentle-Intro-To-HARK.ipynb
-examples/LifecycleModel/Cycles_tutorial.ipynb
-examples/ConsIndShockModel/PerfForesightConsumerType.ipynb
-examples/ConsIndShockModel/IndShockConsumerType.ipynb
-examples/ConsIndShockModel/KinkedRconsumerType.ipynb
-examples/ConsPortfolioModel/example_ConsPortfolioModel.ipynb
-examples/GenIncProcessModel/GenIncProcessModel.ipynb
-examples/LifecycleModel/LifecycleModel.ipynb
-examples/HowWeSolveIndShockConsumerType/HowWeSolveIndShockConsumerType.ipynb
-examples/Journeys/Journey-PhD.ipynb
-examples/ConsNewKeynesianModel/Transition_Matrix_Example.ipynb
-examples/ConsNewKeynesianModel/Jacobian_Example.ipynb
-examples/ConsNewKeynesianModel/KS-HARK-presentation.ipynb
-examples/ConsNewKeynesianModel/SSJ_example.ipynb
\ No newline at end of file
diff --git a/Documentation/overview/index.rst b/Documentation/overview/index.rst
deleted file mode 100644
index ebbfe66ef..000000000
--- a/Documentation/overview/index.rst
+++ /dev/null
@@ -1,38 +0,0 @@
-Overview
-========
-
-.. toctree::
- :caption: Introduction to HARK
- :maxdepth: 1
-
- introduction
- ARKitecture
-
-.. nbgallery is a wrapper around the toctree directive, see
- https://nbsphinx.readthedocs.io/en/latest/a-normal-rst-file.html#thumbnail-galleries
-
-.. nbgallery::
- :caption: Examples
- :maxdepth: 1
-
- ../../examples/Gentle-Intro/Gentle-Intro-To-HARK.ipynb
- ../../examples/LifecycleModel/Cycles_tutorial.ipynb
- ../../examples/ConsIndShockModel/PerfForesightConsumerType.ipynb
- ../../examples/ConsIndShockModel/IndShockConsumerType.ipynb
- ../../examples/ConsIndShockModel/KinkedRconsumerType.ipynb
- ../../examples/ConsPortfolioModel/example_ConsPortfolioModel.ipynb
- ../../examples/GenIncProcessModel/GenIncProcessModel.ipynb
- ../../examples/LifecycleModel/LifecycleModel.ipynb
- ../../examples/HowWeSolveIndShockConsumerType/HowWeSolveIndShockConsumerType.ipynb
- ../../examples/Journeys/Journey-PhD.ipynb
- ../../examples/ConsNewKeynesianModel/Transition_Matrix_Example.ipynb
- ../../examples/ConsNewKeynesianModel/Jacobian_Example.ipynb
- ../../examples/ConsNewKeynesianModel/KS-HARK-presentation.ipynb
- ../../examples/ConsNewKeynesianModel/SSJ_example.ipynb
-
-.. toctree::
- :hidden:
- :caption: Extras
-
- ../CHANGELOG
- ../license
diff --git a/HARK/models/consumer.yaml b/HARK/models/consumer.yaml
deleted file mode 100644
index a7a315e45..000000000
--- a/HARK/models/consumer.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-#
-# A YAML configuration file for the consumption portfolio problem blocks.
-#
-
-calibration:
- DiscFac: 0.96
- CRRA: 2.0
- R: 1.03 # can be overriden by portfolio dynamics
- Rfree: 1.03
- EqP: 0.02
- LivPrb: 0.98
- PermGroFac: 1.01
- BoroCnstArt: None
- TranShkStd: 0.1
- RiskyStd: 0.1
-
-blocks:
- - &cons_normalized
- name: consumption normalized
- shocks:
- live: !Bernoulli
- p: LivPrb
- theta: !MeanOneLogNormal
- sigma: TranShkStd
- dynamics:
- b: k * R / PermGroFac
- m: b + theta
- c: !Control
- info: m
- a: m - c
-
- reward:
- u: c ** (1 - CRRA) / (1 - CRRA)
- - &portfolio_choice
- name: portfolio choice
- shocks:
- risky_return: !Lognormal
- mean: Rfree + EqP
- std: RiskyStd
- dynamics:
- stigma: !Control
- info: a
- R: Rfree + (risky_return - Rfree) * stigma
diff --git a/HARK/tests/OpenCLtest.py b/HARK/tests/OpenCLtest.py
deleted file mode 100644
index 78fccd458..000000000
--- a/HARK/tests/OpenCLtest.py
+++ /dev/null
@@ -1,124 +0,0 @@
-"""
-Simple test for opencl4py, edited from the example distributed in that package.
-"""
-
-import os
-
-import numpy as np
-import opencl4py as cl
-
-os.environ["PYOPENCL_CTX"] = (
- "0:0" # This is where you set which devices are in the context
-)
-# EVERY machine will have a device 0:0
-from time import time
-
-if __name__ == "__main__":
- N = 20000000 # Size of vectors to work with
- use_DP = True # Whether to use double precision floating point
-
- # Print all of the platforms and devices to screen
- platforms = cl.Platforms()
- print("List of all platforms and devices:")
- print(platforms.dump_devices())
- print("")
-
- # Create a context and a queue
- ctx = platforms.create_some_context()
- queue = ctx.create_queue(ctx.devices[0]) # This is where you choose a device
-
- # Tell the user about the test that will be run
- device_can_use_DP = ("cl_khr_fp64" in queue.device.extensions) or (
- "cl_amd_fp64" in queue.device.extensions
- )
- print("Will test OpenCL on " + queue.device.name + ".")
- if use_DP and device_can_use_DP:
- print("The test will use double precision, which this device can handle.")
- elif (not use_DP) and device_can_use_DP:
- print(
- "The test will use single precision, but the device is capable of double precision."
- )
- elif use_DP and (not device_can_use_DP):
- print(
- "The test would use double precision, but the device is not capable; expect an error."
- )
- elif (not use_DP) and (not device_can_use_DP):
- print(
- "The test will use single precision. This device is not capable of double precision."
- )
- print("Test vectors have " + str(N) + " elements each.\n")
-
- # Define a simple kernel using double precision floating point
- double_code = """
- #pragma OPENCL EXTENSION cl_khr_fp64 : enable
- #pragma OPENCL EXTENSION cl_amd_fp64 : enable
-
- __kernel void test(__global const double *a, __global const double *b,
- __global double *c, const double k) {
- size_t i = get_global_id(0);
- c[i] = (a[i] + b[i]) * k;
- }
- """
-
- # Define a simple kernel using single precision floating point
- single_code = """
- __kernel void test(__global const float *a, __global const float *b,
- __global float *c, const float k) {
- size_t i = get_global_id(0);
- c[i] = (a[i] + b[i]) * k;
- }
- """
-
- # Define the kernel using single or double precision as selected above
- if use_DP:
- my_type = np.float64
- prg = ctx.create_program(double_code)
- else:
- my_type = np.float32
- prg = ctx.create_program(single_code)
- krn = prg.get_kernel("test")
-
- # Define numpy arrays with arbitrary numbers
- a = np.arange(N, dtype=my_type) # Input array a
- b = np.arange(N, dtype=my_type) # Input array b
- c = np.empty(
- N, dtype=my_type
- ) # Input array c (which will hold result of calculation)
- k = np.array([0.8], dtype=my_type) # Constant scalar
-
- # Define OpenCL memory buffers, passing appropriate flags and inputs
- a_buf = ctx.create_buffer(
- cl.CL_MEM_READ_ONLY | cl.CL_MEM_COPY_HOST_PTR, a
- ) # Read only, copy values from host, use array a
- b_buf = ctx.create_buffer(
- cl.CL_MEM_READ_ONLY | cl.CL_MEM_COPY_HOST_PTR, b
- ) # Read only, copy values from host, use array b
- c_buf = ctx.create_buffer(
- cl.CL_MEM_WRITE_ONLY | cl.CL_MEM_ALLOC_HOST_PTR, size=c.nbytes
- ) # Write only, allocate memory, use byte size of array c
-
- # Run the kernel and time it
- t_start = time()
- krn.set_args(
- a_buf, b_buf, c_buf, k[0:1]
- ) # Set kernel arguments as the three buffers and a float
- queue.execute_kernel(
- krn, [N], None
- ) # Execute the simple kernel, specifying the global workspace dimensionality and local workspace dimensionality (None uses some default)
- queue.read_buffer(
- c_buf, c
- ) # Read the memory buffer for c into the numpy array for c
- t_end = time()
- print("OpenCL took " + str(t_end - t_start) + " seconds.")
-
- # Now do the equivalent work as the kernel, but in Python (and time it)
- t_start = time()
- truth = (a + b) * k[0]
- t_end = time()
- print("Python took " + str(t_end - t_start) + " seconds.")
-
- # Make sure that OpenCL and Python actually agree on their results
- max_diff = np.max(np.fabs(c - truth))
- print(
- "Maximum difference between OpenCL and Python calculations is " + str(max_diff)
- )
diff --git a/LICENSE b/LICENSE
index d64569567..bc78a2f35 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,202 +1,19 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
+Copyright 2024 Econ-ARK Team
+
+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.
diff --git a/README.md b/README.md
index c50f2aff0..e30547d30 100644
--- a/README.md
+++ b/README.md
@@ -7,25 +7,25 @@
[![Anaconda Cloud](https://anaconda.org/conda-forge/econ-ark/badges/version.svg?style=flat)](https://anaconda.org/conda-forge/econ-ark)
[![PyPi](https://img.shields.io/pypi/v/econ-ark.png?style=flat)](https://pypi.org/project/econ-ark/)
-[![Documentation Status](https://readthedocs.org/projects/hark/badge/?style=flat&version=latest)](https://docs.econ-ark.org/?badge=latest)
-[![Code Coverage](https://codecov.io/gh/econ-ark/hark/branch/master/graph/badge.svg)](https://app.codecov.io/gh/econ-ark/hark/branch/master)
+[![Documentation Status](https://readthedocs.org/projects/HARK/badge/?style=flat&version=latest)](https://docs.econ-ark.org/?badge=latest)
+[![Code Coverage](https://codecov.io/gh/econ-ark/HARK/branch/master/graph/badge.svg)](https://app.codecov.io/gh/econ-ark/HARK/branch/master)
[![GitHub Good First Issues](https://img.shields.io/github/issues/econ-ark/HARK/good%20first%20issue.svg)](https://github.com/econ-ark/HARK/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)
[![DOI](https://zenodo.org/badge/50448254.svg)](https://zenodo.org/badge/latestdoi/50448254)
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
[![Powered by NumFOCUS](https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A)](https://numfocus.org/)
[![Donate](https://img.shields.io/badge/donate-$2-brightgreen.svg)](https://numfocus.org/donate-to-econ-ark)
-[![Actions Status](https://github.com/econ-ark/hark/workflows/HARK%20build%20on%20MacOS%2C%20Ubuntu%20and%20Windows/badge.svg)](https://github.com/econ-ark/hark/actions)
+[![Actions Status](https://github.com/econ-ark/HARK/workflows/HARK%20build%20on%20MacOS%2C%20Ubuntu%20and%20Windows/badge.svg)](https://github.com/econ-ark/HARK/actions)
[![badge](https://img.shields.io/badge/HARK-DemARK-579ACA.svg?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFkAAABZCAMAAABi1XidAAAB8lBMVEX///9XmsrmZYH1olJXmsr1olJXmsrmZYH1olJXmsr1olJXmsrmZYH1olL1olJXmsr1olJXmsrmZYH1olL1olJXmsrmZYH1olJXmsr1olL1olJXmsrmZYH1olL1olJXmsrmZYH1olL1olL0nFf1olJXmsrmZYH1olJXmsq8dZb1olJXmsrmZYH1olJXmspXmspXmsr1olL1olJXmsrmZYH1olJXmsr1olL1olJXmsrmZYH1olL1olLeaIVXmsrmZYH1olL1olL1olJXmsrmZYH1olLna31Xmsr1olJXmsr1olJXmsrmZYH1olLqoVr1olJXmsr1olJXmsrmZYH1olL1olKkfaPobXvviGabgadXmsqThKuofKHmZ4Dobnr1olJXmsr1olJXmspXmsr1olJXmsrfZ4TuhWn1olL1olJXmsqBi7X1olJXmspZmslbmMhbmsdemsVfl8ZgmsNim8Jpk8F0m7R4m7F5nLB6jbh7jbiDirOEibOGnKaMhq+PnaCVg6qWg6qegKaff6WhnpKofKGtnomxeZy3noG6dZi+n3vCcpPDcpPGn3bLb4/Mb47UbIrVa4rYoGjdaIbeaIXhoWHmZYHobXvpcHjqdHXreHLroVrsfG/uhGnuh2bwj2Hxk17yl1vzmljzm1j0nlX1olL3AJXWAAAAbXRSTlMAEBAQHx8gICAuLjAwMDw9PUBAQEpQUFBXV1hgYGBkcHBwcXl8gICAgoiIkJCQlJicnJ2goKCmqK+wsLC4usDAwMjP0NDQ1NbW3Nzg4ODi5+3v8PDw8/T09PX29vb39/f5+fr7+/z8/Pz9/v7+zczCxgAABC5JREFUeAHN1ul3k0UUBvCb1CTVpmpaitAGSLSpSuKCLWpbTKNJFGlcSMAFF63iUmRccNG6gLbuxkXU66JAUef/9LSpmXnyLr3T5AO/rzl5zj137p136BISy44fKJXuGN/d19PUfYeO67Znqtf2KH33Id1psXoFdW30sPZ1sMvs2D060AHqws4FHeJojLZqnw53cmfvg+XR8mC0OEjuxrXEkX5ydeVJLVIlV0e10PXk5k7dYeHu7Cj1j+49uKg7uLU61tGLw1lq27ugQYlclHC4bgv7VQ+TAyj5Zc/UjsPvs1sd5cWryWObtvWT2EPa4rtnWW3JkpjggEpbOsPr7F7EyNewtpBIslA7p43HCsnwooXTEc3UmPmCNn5lrqTJxy6nRmcavGZVt/3Da2pD5NHvsOHJCrdc1G2r3DITpU7yic7w/7Rxnjc0kt5GC4djiv2Sz3Fb2iEZg41/ddsFDoyuYrIkmFehz0HR2thPgQqMyQYb2OtB0WxsZ3BeG3+wpRb1vzl2UYBog8FfGhttFKjtAclnZYrRo9ryG9uG/FZQU4AEg8ZE9LjGMzTmqKXPLnlWVnIlQQTvxJf8ip7VgjZjyVPrjw1te5otM7RmP7xm+sK2Gv9I8Gi++BRbEkR9EBw8zRUcKxwp73xkaLiqQb+kGduJTNHG72zcW9LoJgqQxpP3/Tj//c3yB0tqzaml05/+orHLksVO+95kX7/7qgJvnjlrfr2Ggsyx0eoy9uPzN5SPd86aXggOsEKW2Prz7du3VID3/tzs/sSRs2w7ovVHKtjrX2pd7ZMlTxAYfBAL9jiDwfLkq55Tm7ifhMlTGPyCAs7RFRhn47JnlcB9RM5T97ASuZXIcVNuUDIndpDbdsfrqsOppeXl5Y+XVKdjFCTh+zGaVuj0d9zy05PPK3QzBamxdwtTCrzyg/2Rvf2EstUjordGwa/kx9mSJLr8mLLtCW8HHGJc2R5hS219IiF6PnTusOqcMl57gm0Z8kanKMAQg0qSyuZfn7zItsbGyO9QlnxY0eCuD1XL2ys/MsrQhltE7Ug0uFOzufJFE2PxBo/YAx8XPPdDwWN0MrDRYIZF0mSMKCNHgaIVFoBbNoLJ7tEQDKxGF0kcLQimojCZopv0OkNOyWCCg9XMVAi7ARJzQdM2QUh0gmBozjc3Skg6dSBRqDGYSUOu66Zg+I2fNZs/M3/f/Grl/XnyF1Gw3VKCez0PN5IUfFLqvgUN4C0qNqYs5YhPL+aVZYDE4IpUk57oSFnJm4FyCqqOE0jhY2SMyLFoo56zyo6becOS5UVDdj7Vih0zp+tcMhwRpBeLyqtIjlJKAIZSbI8SGSF3k0pA3mR5tHuwPFoa7N7reoq2bqCsAk1HqCu5uvI1n6JuRXI+S1Mco54YmYTwcn6Aeic+kssXi8XpXC4V3t7/ADuTNKaQJdScAAAAAElFTkSuQmCC)](https://mybinder.org/v2/gh/econ-ark/DemARK/master?filepath=notebooks)
[![badge](https://img.shields.io/badge/HARK-examples-579ACA.svg?logo=data:image/png;base64,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)](https://mybinder.org/v2/gh/econ-ark/HARK/master?filepath=examples)
@@ -33,9 +33,15 @@
# Heterogeneous Agents Resources and toolKit (HARK)
-HARK is a toolkit for the structural modeling of economic choices of optimizing and non-optimizing heterogeneous agents. For more information on using HARK, see the [Econ-ARK Website](https://econ-ark.org).
+HARK is a toolkit for the structural modeling of economic choices of optimizing
+and non-optimizing heterogeneous agents. For more information on using HARK, see
+the [Econ-ARK Website](https://econ-ark.org).
-The Econ-ARK project is fiscally sponsored by [NumFOCUS](https://numfocus.org/). Consider making a [tax-deductible donation](https://numfocus.org/donate-to-econ-ark) to help the project pay for developer time, professional services, travel, workshops, and a variety of other needs.
+The Econ-ARK project is fiscally sponsored by [NumFOCUS](https://numfocus.org/).
+Consider making a
+[tax-deductible donation](https://numfocus.org/donate-to-econ-ark) to help the
+project pay for developer time, professional services, travel, workshops, and a
+variety of other needs.
"""
-myst_enable_extensions = [
- "colon_fence",
-]
+
+myst_enable_extensions = ["colon_fence"]
+
# Point to Econ-ARK repo for edit buttons
html_context = {
"github_url": "https://github.com",
"github_user": "econ-ark",
- "github_repo": "hark",
+ "github_repo": "HARK",
"github_version": "master",
- "doc_path": "Documentation/",
+ "doc_path": "docs/",
}
# Use Econ-ARK URL to host the website
@@ -159,9 +153,16 @@
# sphinx.ext.intersphinx configuration
intersphinx_mapping = {
- "python": ("https://docs.python.org/3/", None),
+ "python": ("https://docs.python.org/3", None),
}
+nitpick_ignore = [
+ ("py:class", "_io.StringIO"),
+ ("py:class", "_io.BytesIO"),
+]
+
+always_document_param_types = True
+
# sphinx.ext.autodoc configuration
autodoc_default_flags = ["members"] # must add outside ']' bracket
diff --git a/examples/Blocks/Model Setup Demo.ipynb b/docs/examples/Blocks/Model Setup Demo.ipynb
similarity index 100%
rename from examples/Blocks/Model Setup Demo.ipynb
rename to docs/examples/Blocks/Model Setup Demo.ipynb
diff --git a/examples/Calibration/Income_calibrations.ipynb b/docs/examples/Calibration/Income_calibrations.ipynb
similarity index 100%
rename from examples/Calibration/Income_calibrations.ipynb
rename to docs/examples/Calibration/Income_calibrations.ipynb
diff --git a/examples/Calibration/Life_Cycle_example.ipynb b/docs/examples/Calibration/Life_Cycle_example.ipynb
similarity index 100%
rename from examples/Calibration/Life_Cycle_example.ipynb
rename to docs/examples/Calibration/Life_Cycle_example.ipynb
diff --git a/examples/Calibration/SCF_distributions.ipynb b/docs/examples/Calibration/SCF_distributions.ipynb
similarity index 100%
rename from examples/Calibration/SCF_distributions.ipynb
rename to docs/examples/Calibration/SCF_distributions.ipynb
diff --git a/examples/Calibration/Sabelhaus_Song_var_profiles.ipynb b/docs/examples/Calibration/Sabelhaus_Song_var_profiles.ipynb
similarity index 100%
rename from examples/Calibration/Sabelhaus_Song_var_profiles.ipynb
rename to docs/examples/Calibration/Sabelhaus_Song_var_profiles.ipynb
diff --git a/examples/Calibration/US_SSA_life_tables.ipynb b/docs/examples/Calibration/US_SSA_life_tables.ipynb
similarity index 100%
rename from examples/Calibration/US_SSA_life_tables.ipynb
rename to docs/examples/Calibration/US_SSA_life_tables.ipynb
diff --git a/examples/ConsBequestModel/example_AccidentalBequestComp.ipynb b/docs/examples/ConsBequestModel/example_AccidentalBequestComp.ipynb
similarity index 100%
rename from examples/ConsBequestModel/example_AccidentalBequestComp.ipynb
rename to docs/examples/ConsBequestModel/example_AccidentalBequestComp.ipynb
diff --git a/examples/ConsBequestModel/example_AccidentalBequestPortComp.ipynb b/docs/examples/ConsBequestModel/example_AccidentalBequestPortComp.ipynb
similarity index 100%
rename from examples/ConsBequestModel/example_AccidentalBequestPortComp.ipynb
rename to docs/examples/ConsBequestModel/example_AccidentalBequestPortComp.ipynb
diff --git a/examples/ConsBequestModel/example_TerminalBequest.ipynb b/docs/examples/ConsBequestModel/example_TerminalBequest.ipynb
similarity index 100%
rename from examples/ConsBequestModel/example_TerminalBequest.ipynb
rename to docs/examples/ConsBequestModel/example_TerminalBequest.ipynb
diff --git a/examples/ConsBequestModel/example_TerminalBequestPort.ipynb b/docs/examples/ConsBequestModel/example_TerminalBequestPort.ipynb
similarity index 100%
rename from examples/ConsBequestModel/example_TerminalBequestPort.ipynb
rename to docs/examples/ConsBequestModel/example_TerminalBequestPort.ipynb
diff --git a/examples/ConsBequestModel/example_WarmGlowBequest.ipynb b/docs/examples/ConsBequestModel/example_WarmGlowBequest.ipynb
similarity index 100%
rename from examples/ConsBequestModel/example_WarmGlowBequest.ipynb
rename to docs/examples/ConsBequestModel/example_WarmGlowBequest.ipynb
diff --git a/examples/ConsBequestModel/example_WarmGlowBequestPort.ipynb b/docs/examples/ConsBequestModel/example_WarmGlowBequestPort.ipynb
similarity index 100%
rename from examples/ConsBequestModel/example_WarmGlowBequestPort.ipynb
rename to docs/examples/ConsBequestModel/example_WarmGlowBequestPort.ipynb
diff --git a/examples/ConsBequestModel/example_WealthPortfolio.ipynb b/docs/examples/ConsBequestModel/example_WealthPortfolio.ipynb
similarity index 100%
rename from examples/ConsBequestModel/example_WealthPortfolio.ipynb
rename to docs/examples/ConsBequestModel/example_WealthPortfolio.ipynb
diff --git a/examples/ConsIndShockModel/Finite Cyclical Test.ipynb b/docs/examples/ConsIndShockModel/Finite Cyclical Test.ipynb
similarity index 100%
rename from examples/ConsIndShockModel/Finite Cyclical Test.ipynb
rename to docs/examples/ConsIndShockModel/Finite Cyclical Test.ipynb
diff --git a/examples/ConsIndShockModel/IndShockConsumerType.ipynb b/docs/examples/ConsIndShockModel/IndShockConsumerType.ipynb
similarity index 100%
rename from examples/ConsIndShockModel/IndShockConsumerType.ipynb
rename to docs/examples/ConsIndShockModel/IndShockConsumerType.ipynb
diff --git a/examples/ConsIndShockModel/KinkedRconsumerType.ipynb b/docs/examples/ConsIndShockModel/KinkedRconsumerType.ipynb
similarity index 100%
rename from examples/ConsIndShockModel/KinkedRconsumerType.ipynb
rename to docs/examples/ConsIndShockModel/KinkedRconsumerType.ipynb
diff --git a/examples/ConsIndShockModel/PerfForesightConsumerType.ipynb b/docs/examples/ConsIndShockModel/PerfForesightConsumerType.ipynb
similarity index 100%
rename from examples/ConsIndShockModel/PerfForesightConsumerType.ipynb
rename to docs/examples/ConsIndShockModel/PerfForesightConsumerType.ipynb
diff --git a/examples/ConsIndShockModel/latexdefs.tex b/docs/examples/ConsIndShockModel/latexdefs.tex
similarity index 100%
rename from examples/ConsIndShockModel/latexdefs.tex
rename to docs/examples/ConsIndShockModel/latexdefs.tex
diff --git a/examples/ConsNewKeynesianModel/Jacobian_Example.ipynb b/docs/examples/ConsNewKeynesianModel/Jacobian_Example.ipynb
similarity index 100%
rename from examples/ConsNewKeynesianModel/Jacobian_Example.ipynb
rename to docs/examples/ConsNewKeynesianModel/Jacobian_Example.ipynb
diff --git a/examples/ConsNewKeynesianModel/KS-HARK-presentation.ipynb b/docs/examples/ConsNewKeynesianModel/KS-HARK-presentation.ipynb
similarity index 100%
rename from examples/ConsNewKeynesianModel/KS-HARK-presentation.ipynb
rename to docs/examples/ConsNewKeynesianModel/KS-HARK-presentation.ipynb
diff --git a/examples/ConsNewKeynesianModel/KS_DAG.jpeg b/docs/examples/ConsNewKeynesianModel/KS_DAG.jpeg
similarity index 100%
rename from examples/ConsNewKeynesianModel/KS_DAG.jpeg
rename to docs/examples/ConsNewKeynesianModel/KS_DAG.jpeg
diff --git a/examples/ConsNewKeynesianModel/SSJ_example.ipynb b/docs/examples/ConsNewKeynesianModel/SSJ_example.ipynb
similarity index 100%
rename from examples/ConsNewKeynesianModel/SSJ_example.ipynb
rename to docs/examples/ConsNewKeynesianModel/SSJ_example.ipynb
diff --git a/examples/ConsNewKeynesianModel/SSJ_explanation.ipynb b/docs/examples/ConsNewKeynesianModel/SSJ_explanation.ipynb
similarity index 100%
rename from examples/ConsNewKeynesianModel/SSJ_explanation.ipynb
rename to docs/examples/ConsNewKeynesianModel/SSJ_explanation.ipynb
diff --git a/examples/ConsNewKeynesianModel/Transition_Matrix_Example.ipynb b/docs/examples/ConsNewKeynesianModel/Transition_Matrix_Example.ipynb
similarity index 100%
rename from examples/ConsNewKeynesianModel/Transition_Matrix_Example.ipynb
rename to docs/examples/ConsNewKeynesianModel/Transition_Matrix_Example.ipynb
diff --git a/HARK/Calibration/Income/__init__.py b/docs/examples/ConsNewKeynesianModel/estimation/__init__.py
similarity index 100%
rename from HARK/Calibration/Income/__init__.py
rename to docs/examples/ConsNewKeynesianModel/estimation/__init__.py
diff --git a/examples/ConsNewKeynesianModel/estimation/create_data.py b/docs/examples/ConsNewKeynesianModel/estimation/create_data.py
similarity index 100%
rename from examples/ConsNewKeynesianModel/estimation/create_data.py
rename to docs/examples/ConsNewKeynesianModel/estimation/create_data.py
diff --git a/examples/ConsNewKeynesianModel/estimation/model.py b/docs/examples/ConsNewKeynesianModel/estimation/model.py
similarity index 100%
rename from examples/ConsNewKeynesianModel/estimation/model.py
rename to docs/examples/ConsNewKeynesianModel/estimation/model.py
diff --git a/examples/ConsNewKeynesianModel/estimation/plots.py b/docs/examples/ConsNewKeynesianModel/estimation/plots.py
similarity index 100%
rename from examples/ConsNewKeynesianModel/estimation/plots.py
rename to docs/examples/ConsNewKeynesianModel/estimation/plots.py
diff --git a/examples/ConsNewKeynesianModel/estimation/routines.py b/docs/examples/ConsNewKeynesianModel/estimation/routines.py
similarity index 100%
rename from examples/ConsNewKeynesianModel/estimation/routines.py
rename to docs/examples/ConsNewKeynesianModel/estimation/routines.py
diff --git a/examples/ConsNewKeynesianModel/estimation/us_data.csv b/docs/examples/ConsNewKeynesianModel/estimation/us_data.csv
similarity index 100%
rename from examples/ConsNewKeynesianModel/estimation/us_data.csv
rename to docs/examples/ConsNewKeynesianModel/estimation/us_data.csv
diff --git a/examples/ConsPortfolioModel/example_ConsPortfolioModel.ipynb b/docs/examples/ConsPortfolioModel/example_ConsPortfolioModel.ipynb
similarity index 100%
rename from examples/ConsPortfolioModel/example_ConsPortfolioModel.ipynb
rename to docs/examples/ConsPortfolioModel/example_ConsPortfolioModel.ipynb
diff --git a/examples/ConsPortfolioModel/example_ConsRiskyAssetModel.ipynb b/docs/examples/ConsPortfolioModel/example_ConsRiskyAssetModel.ipynb
similarity index 100%
rename from examples/ConsPortfolioModel/example_ConsRiskyAssetModel.ipynb
rename to docs/examples/ConsPortfolioModel/example_ConsRiskyAssetModel.ipynb
diff --git a/examples/ConsPortfolioModel/example_ConsSequentialPortfolioModel.ipynb b/docs/examples/ConsPortfolioModel/example_ConsSequentialPortfolioModel.ipynb
similarity index 100%
rename from examples/ConsPortfolioModel/example_ConsSequentialPortfolioModel.ipynb
rename to docs/examples/ConsPortfolioModel/example_ConsSequentialPortfolioModel.ipynb
diff --git a/examples/ConsumptionSaving/example_ConsAggShockModel.ipynb b/docs/examples/ConsumptionSaving/example_ConsAggShockModel.ipynb
similarity index 100%
rename from examples/ConsumptionSaving/example_ConsAggShockModel.ipynb
rename to docs/examples/ConsumptionSaving/example_ConsAggShockModel.ipynb
diff --git a/examples/ConsumptionSaving/example_ConsGenIncProcessModel.ipynb b/docs/examples/ConsumptionSaving/example_ConsGenIncProcessModel.ipynb
similarity index 100%
rename from examples/ConsumptionSaving/example_ConsGenIncProcessModel.ipynb
rename to docs/examples/ConsumptionSaving/example_ConsGenIncProcessModel.ipynb
diff --git a/examples/ConsumptionSaving/example_ConsIndShock.ipynb b/docs/examples/ConsumptionSaving/example_ConsIndShock.ipynb
similarity index 100%
rename from examples/ConsumptionSaving/example_ConsIndShock.ipynb
rename to docs/examples/ConsumptionSaving/example_ConsIndShock.ipynb
diff --git a/examples/ConsumptionSaving/example_ConsLaborModel.ipynb b/docs/examples/ConsumptionSaving/example_ConsLaborModel.ipynb
similarity index 100%
rename from examples/ConsumptionSaving/example_ConsLaborModel.ipynb
rename to docs/examples/ConsumptionSaving/example_ConsLaborModel.ipynb
diff --git a/examples/ConsumptionSaving/example_ConsMarkovModel.ipynb b/docs/examples/ConsumptionSaving/example_ConsMarkovModel.ipynb
similarity index 100%
rename from examples/ConsumptionSaving/example_ConsMarkovModel.ipynb
rename to docs/examples/ConsumptionSaving/example_ConsMarkovModel.ipynb
diff --git a/examples/ConsumptionSaving/example_ConsMedModel.ipynb b/docs/examples/ConsumptionSaving/example_ConsMedModel.ipynb
similarity index 100%
rename from examples/ConsumptionSaving/example_ConsMedModel.ipynb
rename to docs/examples/ConsumptionSaving/example_ConsMedModel.ipynb
diff --git a/examples/ConsumptionSaving/example_ConsPrefShockModel.ipynb b/docs/examples/ConsumptionSaving/example_ConsPrefShockModel.ipynb
similarity index 100%
rename from examples/ConsumptionSaving/example_ConsPrefShockModel.ipynb
rename to docs/examples/ConsumptionSaving/example_ConsPrefShockModel.ipynb
diff --git a/examples/ConsumptionSaving/example_ConsRepAgentModel.ipynb b/docs/examples/ConsumptionSaving/example_ConsRepAgentModel.ipynb
similarity index 100%
rename from examples/ConsumptionSaving/example_ConsRepAgentModel.ipynb
rename to docs/examples/ConsumptionSaving/example_ConsRepAgentModel.ipynb
diff --git a/examples/ConsumptionSaving/example_ConsRiskyContribModel.ipynb b/docs/examples/ConsumptionSaving/example_ConsRiskyContribModel.ipynb
similarity index 100%
rename from examples/ConsumptionSaving/example_ConsRiskyContribModel.ipynb
rename to docs/examples/ConsumptionSaving/example_ConsRiskyContribModel.ipynb
diff --git a/examples/ConsumptionSaving/example_TractableBufferStockModel.ipynb b/docs/examples/ConsumptionSaving/example_TractableBufferStockModel.ipynb
similarity index 100%
rename from examples/ConsumptionSaving/example_TractableBufferStockModel.ipynb
rename to docs/examples/ConsumptionSaving/example_TractableBufferStockModel.ipynb
diff --git a/examples/Distributions/DiscreteDistributionLabeled.ipynb b/docs/examples/Distributions/DiscreteDistributionLabeled.ipynb
similarity index 100%
rename from examples/Distributions/DiscreteDistributionLabeled.ipynb
rename to docs/examples/Distributions/DiscreteDistributionLabeled.ipynb
diff --git a/examples/Distributions/EquiprobableLognormal.ipynb b/docs/examples/Distributions/EquiprobableLognormal.ipynb
similarity index 100%
rename from examples/Distributions/EquiprobableLognormal.ipynb
rename to docs/examples/Distributions/EquiprobableLognormal.ipynb
diff --git a/examples/Distributions/ExpectedValue.ipynb b/docs/examples/Distributions/ExpectedValue.ipynb
similarity index 100%
rename from examples/Distributions/ExpectedValue.ipynb
rename to docs/examples/Distributions/ExpectedValue.ipynb
diff --git a/examples/Estimation/Method of Simulated Moments.ipynb b/docs/examples/Estimation/Method of Simulated Moments.ipynb
similarity index 100%
rename from examples/Estimation/Method of Simulated Moments.ipynb
rename to docs/examples/Estimation/Method of Simulated Moments.ipynb
diff --git a/examples/GenIncProcessModel/GenIncProcessModel.ipynb b/docs/examples/GenIncProcessModel/GenIncProcessModel.ipynb
similarity index 100%
rename from examples/GenIncProcessModel/GenIncProcessModel.ipynb
rename to docs/examples/GenIncProcessModel/GenIncProcessModel.ipynb
diff --git a/examples/Gentle-Intro/Gentle-Intro-To-HARK.ipynb b/docs/examples/Gentle-Intro/Gentle-Intro-To-HARK.ipynb
similarity index 100%
rename from examples/Gentle-Intro/Gentle-Intro-To-HARK.ipynb
rename to docs/examples/Gentle-Intro/Gentle-Intro-To-HARK.ipynb
diff --git a/examples/HowWeSolveIndShockConsumerType/HowWeSolveIndShockConsumerType.ipynb b/docs/examples/HowWeSolveIndShockConsumerType/HowWeSolveIndShockConsumerType.ipynb
similarity index 100%
rename from examples/HowWeSolveIndShockConsumerType/HowWeSolveIndShockConsumerType.ipynb
rename to docs/examples/HowWeSolveIndShockConsumerType/HowWeSolveIndShockConsumerType.ipynb
diff --git a/examples/Interpolation/CubicInterp.ipynb b/docs/examples/Interpolation/CubicInterp.ipynb
similarity index 100%
rename from examples/Interpolation/CubicInterp.ipynb
rename to docs/examples/Interpolation/CubicInterp.ipynb
diff --git a/examples/Interpolation/DecayInterp.ipynb b/docs/examples/Interpolation/DecayInterp.ipynb
similarity index 100%
rename from examples/Interpolation/DecayInterp.ipynb
rename to docs/examples/Interpolation/DecayInterp.ipynb
diff --git a/examples/Journeys/AzureMachineLearning.ipynb b/docs/examples/Journeys/AzureMachineLearning.ipynb
similarity index 100%
rename from examples/Journeys/AzureMachineLearning.ipynb
rename to docs/examples/Journeys/AzureMachineLearning.ipynb
diff --git a/examples/Journeys/HAFiscalFig1.png b/docs/examples/Journeys/HAFiscalFig1.png
similarity index 100%
rename from examples/Journeys/HAFiscalFig1.png
rename to docs/examples/Journeys/HAFiscalFig1.png
diff --git a/examples/Journeys/HARK-ind-sh.png b/docs/examples/Journeys/HARK-ind-sh.png
similarity index 100%
rename from examples/Journeys/HARK-ind-sh.png
rename to docs/examples/Journeys/HARK-ind-sh.png
diff --git a/examples/Journeys/HARK-struct-2.png b/docs/examples/Journeys/HARK-struct-2.png
similarity index 100%
rename from examples/Journeys/HARK-struct-2.png
rename to docs/examples/Journeys/HARK-struct-2.png
diff --git a/examples/Journeys/HARK-struct-3.png b/docs/examples/Journeys/HARK-struct-3.png
similarity index 100%
rename from examples/Journeys/HARK-struct-3.png
rename to docs/examples/Journeys/HARK-struct-3.png
diff --git a/examples/Journeys/HARK-struct-4.png b/docs/examples/Journeys/HARK-struct-4.png
similarity index 100%
rename from examples/Journeys/HARK-struct-4.png
rename to docs/examples/Journeys/HARK-struct-4.png
diff --git a/examples/Journeys/Journey-Engineering-Background.ipynb b/docs/examples/Journeys/Journey-Engineering-Background.ipynb
similarity index 100%
rename from examples/Journeys/Journey-Engineering-Background.ipynb
rename to docs/examples/Journeys/Journey-Engineering-Background.ipynb
diff --git a/docs/examples/Journeys/Journey-PhD.ipynb b/docs/examples/Journeys/Journey-PhD.ipynb
new file mode 100644
index 000000000..9dacc7b52
--- /dev/null
+++ b/docs/examples/Journeys/Journey-PhD.ipynb
@@ -0,0 +1,541 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Journey: Economics PhD Student\n",
+ "====\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 1 Introduction\n",
+ "\n",
+ "This notebook is designed as an introduction to someone with the training of a 1st year Economics student, but perhaps without much background in computer programming or scientific computation. As it is a \"journey,\" it is not one big tutorial, but a set of links to notebooks and other resources which will help you understand the different HARK objects and functionalities.\n",
+ "\n",
+ "This journey does not require any special skill in programming. However, we recommend you take a few introductory tutorials in Python and object-oriented programming (OOP) to make you familiar with the basic concepts. Moreover, we assume some knowledge in economic theory.\n",
+ "\n",
+ "As you have found this journey, you probably have a concept of what a heterogeneous agent model is, but here is a short recap. Think about a basic, infinitely lived consumer problem as you know from first-year graduate courses (letting alone the companies and general equilibrium for now). Using the Bellman equation, we can write it as:\n",
+ "\n",
+ "\\begin{eqnarray*}\n",
+ "V(M_t) &=& \\max_{C_t} U(C_t) + \\beta V(M_{t+1}), \\\\\n",
+ "& s.t. & \\\\\n",
+ "A_t &=& M_t - C_t, \\\\\n",
+ "M_{t+1} &=& R (M_{t}-C_{t}) + Y_t, \\\\\n",
+ "\\end{eqnarray*}\n",
+ "\n",
+ "\n",
+ "Where $\\beta <1$ is a discount factor, $C_t$ is consumption, $A_t$ - assets, $Y_t$ - income and $U(C)$ is a standard CRRA utility function:\n",
+ "\n",
+ "$$\n",
+ "U(C)=\\frac{C^{1-\\rho}}{1-\\rho}.\n",
+ "$$\n",
+ "\n",
+ "Now assume that every consumer faces some uncertainty on her income which is subject to idiosyncratic shocks - the realizations of each shock is (potentially) different for each agent. In this setting, it follows an AR (1) process, so that the current value of $Y$ is a state variable that predicts future values of $Y$.\n",
+ "\n",
+ "Then, the Bellman equation looks like:\n",
+ "\n",
+ "\\begin{eqnarray*}\n",
+ "V(M_t, Y_t) &=& \\max_{C_t} U(C_t) + E[\\beta V(M_{t+1}, Y_{t+1})], \\\\\n",
+ "& s.t. & \\\\\n",
+ "A_t &=& M_t - C_t, \\\\\n",
+ "M_{t+1} &=& R (M_{t}-C_{t}) + Y_t, \\\\\n",
+ "\\end{eqnarray*}\n",
+ "\n",
+ "Finding a distribution of agent assets (consumption, savings) must involve much more advanced numerical tools than in the representative agent setting. This is more demanding task to accomplish and master. Moreover, the knowledge about involved numerical methods is less systematic, and often hard to find. To quote the HARK [Documentation](https://docs.econ-ark.org/docs/overview/introduction.html):\n",
+ "\n",
+ "*\"After months of effort, you may have had the character-improving experience of\n",
+ "proudly explaining to your adviser that not only had you grafted two ideas\n",
+ "together, you also found a trick that speeded the solution by an order of\n",
+ "magnitude, only to be told that your breathtaking insight had been understood\n",
+ "for many years, as reflected in an appendix to a 2008 paper; or, worse, your\n",
+ "discovery was something that “everybody knows” but did not exist at all in\n",
+ "published form!\"*\n",
+ "\n",
+ "HARK was designed to help you avoid similar experiences. We see two main uses of this package and its tools:\n",
+ "\n",
+ "- To simulate the standard heterogeneous agent models without learning all the numerical methods\n",
+ "- To solve your own models building-on the already implemented algorithms\n",
+ "\n",
+ "This journey will help you mostly with using HARK in the first way. We do not elaborate here the numerical methods; however, in the last sections you can find some guidance on which methods were used and how the source code is structured.\n",
+ "\n",
+ "Although using the prepared package is easier than writing your own solution (what you will need to do sooner or later if you create an original heterogeneous agent model), there is much effort in comprehending the main classes and functionalities of HARK. We hope that this journey will make it easier! We believe that it also will be your first step into the world of the heterogeneous agents modeling.\n",
+ "\n",
+ "---\n",
+ "NOTE\n",
+ "***\n",
+ "We will be very happy to see your feedback. If you have any questions regarding this tutorial or HARK as a whole please see our [Github page](https://github.com/econ-ark/HARK).\n",
+ "\n",
+ "---"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 2 Before you start\n",
+ "\n",
+ "As we have mentioned before, this journey does not require any special skill in programming. However, some knowledge about Python and object-oriented programing (OOP) is needed. We propose two possible ways to gather the basic concepts; however, plenty of others resources are available:\n",
+ "\n",
+ "- Quick introduction to Python and OOP: chapters five to seven from [Quantecon](https://python-programming.quantecon.org/intro.html) should familiarize you with everything what you need for the first tutorials.\n",
+ "- A little longer introduction (if you want to learn something about used numerical methods):\n",
+ " - Start with the basic Python [tutorial](https://docs.python.org/3/tutorial)\n",
+ " - Get some knowledge about [Numpy](https://numpy.org/doc/stable/user/quickstart.html)\n",
+ "- You can also learn Python by learning Machine learning, as there are many tutorials constructed in that way (one example is [scikit-learn tutorials](https://scikit-learn.org/stable/tutorial/index.html))."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 3 Few words about HARK structure\n",
+ "\n",
+ "HARK was written using OOP (we hope that you skimmed the tutorials and have some understanding of this). This means that different parts of the model, like different types of consumers, firms, and general equilibrium conditions (if you have these components in the model), are implemented as different *objects*. Such structure enables you to build your own models with different consumer-type distributions / company structure (if you want some). Importantly, learning the package with such structure implies learning the different types of objects (classes).\n",
+ "\n",
+ "In HARK there are two main classes: `AgentType` (think consumers, microeconomic models) and `Market` (think general equilibrium, macroeconomic models). As AgentType objects are the attributes of the Market, we first present this type (additionally, if you are interested only in microeconomic research, you may not want to study the Market class).\n",
+ "\n",
+ "In practice, it will take more than two classes to accommodate the variety of models constructed using the toolkit. Thus, each class will have subclasses and those their own subclasses. In general, a more sophisticated class will be defined as a subclass. This journey will reflect this structure, first by presenting the most primitive models, and then the more fancy ones.\n",
+ "\n",
+ "---\n",
+ "NOTE\n",
+ "***\n",
+ "In OOP, objects are organized in **classes** (the general structure of the objects) and more specific **subclasses**. The subclass inherits the methods and attributes from the its parent class. Thus, everything which you can do with the object from a general class can be done with the object from its subclass. In case of the economic models, the basic one are always the parent classes of the more sophisticated ones.\n",
+ "\n",
+ "---\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 4 Agent-type class\n",
+ "Agent-type class enables you to build microeconomic models (such as the one presented in the introduction). It is also the essential part of the macroeconomic model in HARK. So remember: *to use HARK, you always need to use agent-type classes!*\n",
+ "\n",
+ "### 4.1 Introductory example\n",
+ "As an example, let's solve the stochastic model from the introduction. Assume the income process of the agent $i$ in the period t, $Y_{i,t}$, is given by:\n",
+ "\n",
+ "\\begin{eqnarray*}\n",
+ "Y_{i,t} &=& \\varepsilon_t(\\theta_{i,t} p_{i,t}) \\\\\n",
+ "p_{i,t+1} &=& p_{i,t}\\psi_{i,t+1}\\\\\n",
+ "\\psi_{i,t} & \\sim & N(1,\\sigma_{\\varrho})\\\\\n",
+ "\\theta_{i,t} & \\sim & N(1,\\sigma_{\\theta})\\\\\n",
+ "\\end{eqnarray*}\n",
+ "\n",
+ "To get a universal solution of this problem, we need to find a policy function (in this case consumption function). This can be done easily using the HARK `solve` function.\n",
+ "\n",
+ "Before doing this, we need to declare our model (we assume standard parametrization: R= 1.03, $\\rho = 2$, $\\beta = 0.96$, $P(\\varepsilon=0)= 0.005$, $P(\\varepsilon=1)= 0.995$, $\\sigma_{\\psi}= \\sigma_{\\theta}=0.1)$:\n",
+ "\n",
+ "[comment]: <> (Is this the correct description of the income process? The confusion comes from not knowing the names of a few parameters \"epsilon\", \"P v.s. p\"? Does this match the income process defined in the cstw paper?)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2024-07-11T15:32:51.730143Z",
+ "iopub.status.busy": "2024-07-11T15:32:51.729888Z",
+ "iopub.status.idle": "2024-07-11T15:32:52.476452Z",
+ "shell.execute_reply": "2024-07-11T15:32:52.475866Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import sys # set path of the notebook\n",
+ "\n",
+ "sys.path.insert(0, os.path.abspath(\"../../.\"))\n",
+ "# we previously defined the paramters to not bother you about it now\n",
+ "import JourneyPhDparam as Params # imported paramters\n",
+ "\n",
+ "from HARK.ConsumptionSaving.ConsIndShockModel import * # import the module for the idiosyncratic shocks\n",
+ "from HARK.utilities import plot_funcs # useful function\n",
+ "\n",
+ "Example = IndShockConsumerType()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next we can solve the model and plot the consumption function:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2024-07-11T15:32:52.478475Z",
+ "iopub.status.busy": "2024-07-11T15:32:52.478187Z",
+ "iopub.status.idle": "2024-07-11T15:32:52.773208Z",
+ "shell.execute_reply": "2024-07-11T15:32:52.772677Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Consumption function\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAGdCAYAAAA1/PiZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA+00lEQVR4nO3deXwU9f3H8ffmDiEJBEhCIIFwhEAOVBQE6p1yyhnPn209Wm0V64GVQwVEoAG02tZaPFpRaz05FQUEBFRAbswBBALhJgkEks1Brt35/RFJRW7YzexuXs/HI48Hu/vdmc/km515M7v7GYthGIYAAADcgJfZBQAAAFwoggsAAHAbBBcAAOA2CC4AAMBtEFwAAIDbILgAAAC3QXABAABug+ACAADcho/ZBfyc3W7XoUOHFBwcLIvFYnY5AADgAhiGoZKSEkVFRcnLy3nnRVwuuBw6dEjR0dFmlwEAAC7B/v371bp1a6ct3+WCS3BwsKTaDQ8JCTG5GgAAcCGsVquio6PrjuPO4nLB5eTbQyEhIQQXAADcjLM/5sGHcwEAgNsguAAAALdBcAEAAG6D4AIAANwGwQUAALgNggsAAHAbBBcAAOA2CC4AAMBtEFwAAIDbILgAAAC3QXABAABug+ACAADcBsEFAABcts37jtXLelzu6tAAAMB9lFbW6MVF2/XOym31sj6CCwAAuCQrsgv07NxMHSw6IcOon3XyVhEAALgox8uqNPLjLbpv5nodLDqh6LBAvfWbq+tl3ZxxAQAAF8QwDH2eflgTP8tSYVmVvCzS/b1j9VSfONVUlNdLDQQXAABwXoeLT+i5uZlatr1AkhQX0VjTUpN1ZUxTSZK1on7qILgAAICzstsNfbBun6Yu3K7Syhr5elv06E0d9fCN7eXnU/+fOCG4AACAM9p9pFRj5mRoXW7tV52vjGmiaanJiosINq0mggsAADhFjc2ut77N1StLd6iqxq5AX2893beT7u3VVt5eFlNrI7gAAIA6mQeLNXp2urIOWSVJ13Vsrj8PS1J0WCOTK6tFcAEAAKqotulvy3bqzW92y2Y3FBroq3G3dlHqVa1ksZh7luWnCC4AADRwa3cXauycDO0+WiZJGpjUUs8PTlCLYH+TKzsdwQUAgAaqpKJaUxdu13/X7pMkhQf7a9LQRPVNiDS5srMjuAAA0AAt25av5+Zl6nBxbQOWu7tHa0z/zgoN9DW5snMjuAAA0IAUllZq4udb9dkPhyRJbZo1UtrwJPVq39zkyi4MwQUAgAbAMAzN33JIEz/P0vHyanlZpN9d105PpsQp0M/b7PIuGMEFAAAPd7DohJ6dm6EV2UckSfGRwZp+W7KSWzcxt7BLQHABAMBD2e2G3l+7V9MWbldZlU1+3l567JYO+v0N7eXrXf/t+h2B4AIAgAfKKSjVmNnp2rD3uCSpW5ummpaapA7h5rXrdwSCCwAAHqTaZtcbK3fp78tyVGWzK8jPW6P6xevX17aRl8nt+h3hos8TffPNNxo0aJCioqJksVg0b968Ux43DEPjx49Xy5YtFRgYqJSUFO3cudNR9QIAgLNIP1CkQa9+p5e+2qEqm103dmqhr0beoHt7tfWI0CJdQnApKytT165d9dprr53x8enTp+vvf/+7Xn/9da1du1ZBQUHq27evKioqLrtYAABwuhNVNqV9uU1DX1ul7XklatrIV6/c2VUz77tGrZoEml2eQ130W0X9+/dX//79z/iYYRj661//queee05DhgyRJL333nuKiIjQvHnzdNddd11etQAA4BSrdx3V2DkZ2ltYLkka1DVKEwZ1UfPGrteu3xEc+hmX3Nxc5eXlKSUlpe6+0NBQ9ejRQ2vWrDljcKmsrFRlZWXdbavV6siSAADwSMUnqjV14TZ9uG6/JCkyJECThyYqpUuEyZU5l0ODS15eniQpIuLUX1pERETdYz+XlpamiRMnOrIMAAA82ldZeRo3P1P51tr/+N/TI0aj+8crJMC12/U7gunfKho7dqxGjhxZd9tqtSo6OtrEigAAcE1HSir1/OdZ+iL9sCQptnmQ0oYn6dp2zUyurP44NLhERtZeTTI/P18tW7asuz8/P19XXHHFGZ/j7+8vf3/PfB8OAABHMAxDczYd1AsLtqr4RLW8vSx68Lp2eiKlowJ83addvyM4NLjExsYqMjJSy5YtqwsqVqtVa9eu1cMPP+zIVQEA0CDsP1auZ+Zm6NudRyVJXVqGaPptyUpsFWpyZea46OBSWlqqnJycutu5ubnasmWLwsLCFBMToyeeeEKTJ09Wx44dFRsbq3HjxikqKkpDhw51ZN0AAHg0m93Qe2v26MXF2SqvssnPx0tPpHTUg9e1c9t2/Y5w0cFlw4YNuummm+pun/x8yr333qt33nlHo0aNUllZmR566CEVFRXpF7/4hRYtWqSAgADHVQ0AgAfbmV+iUbPTtXlfkSSpe9swpaUmqX2LxuYW5gIshmEYZhfxU1arVaGhoSouLlZISIjZ5QAAUG+qauyasWKXXlte266/sb+PxvSP1/91j3H5zrf1dfw2/VtFAABA2rK/SKNnpSs7v0SSdHN8uCYPTVSUh3W+vVwEFwAATFReVaOXv9qht1flym5IYUF+mjCoiwZ3rb0mIE5FcAEAwCSrco5qzJx07T92QpI09IoojR+UoLAgP5Mrc10EFwAA6llxebWmfLlVn2w4IEmKCg3QlGFJuik+3OTKXB/BBQCAerQo87DGzc/SkZLadv2/6dlGo/rFq7E/h+QLwW8JAIB6UFBSoQnzs7Qws/bafe1aBGlaarKuaRtmcmXuheACAIATGYahTzce0OQFW2WtqJG3l0V/uKGd/nhzw2vX7wgEFwAAnGRfYW27/u9yatv1J7YK0bTUZCVENcx2/Y5AcAEAwMFsdkMzV+XqL1/t0Ilqm/x9vDTyl3H67S9i5dOA2/U7AsEFAAAHys4r0ejZ6dqyv0iS1CM2TFNTkxXbPMjcwjwEwQUAAAeorLHpn8t36Z8rclRtMxTs76OxAzrrrmuiXb5dvzshuAAAcJk27Tuu0bPStbOgVJKU0jlCk4cmKjKUCww7GsEFAIBLVFZZo5e+ytY7q/fIMKRmQX6aOCRBA5Na0q7fSQguAABcgm93HtHYORk6cLy2Xf/wq1pp3MAuakq7fqciuAAAcBGKyqs0+YttmrWxtl1/qyaBmjIsUTd2ol1/fSC4AABwAQzD0MLMPI2fn6WjpZWyWKR7e7bVn/p2ol1/PeI3DQDAeeRbKzRuXqa+2povSWrfIkjTb0tWtza0669vBBcAAM7CMAx9vH6/pny5TSUVNfLxsuiRG9trxM0d5O9Du34zEFwAADiDvYVlGjsnQ6t3FUqSkluHalpqsjq3DDG5soaN4AIAwE/U2OyauWqP/rIkWxXVdgX4eumpX3bS/b3b0q7fBRBcAAD40bbDVo2ena70A8WSpJ7tmmlqapLaNKNdv6sguAAAGrzKGpv+8XWOZqzYpRq7oeAAHz03sLPuuDqaRnIuhuACAGjQNu49ptGzM5TzY7v+Pl0iNGlooiJCaNfvigguAIAGqayyRi8uzta7a2rb9Tdv7K8XhiSof2IkZ1lcGMEFANDgrMgu0LNzM3WwqLZd/23dWuu5gZ3VpBHt+l0dwQUA0GAcL6vSpAVbNWfzQUlS66aB+vOwJF0f18LkynChCC4AAI9nGIYWpB/W859lqbCsShaLdH+vWD3VJ05BtOt3K8wWAMCj5RVX6Ll5mVq6rbZdf8fwxpp2W7KuimlqcmW4FAQXAIBHstsNfbR+v9K+3KaSyhr5elv0yI0d9MhN7WnX78YILgAAj5N7tExjZqdrbe4xSVLX6CaanpqsTpHBJleGy0VwAQB4jBqbXf/6LlevLNmhyhq7An299ae+nXRfr7by9uIrzp6A4AIA8AhZh4o1ena6Mg9aJUm/6NBcacOTFB3WyOTK4EgEFwCAW6uotunVr3fq9ZW7ZbMbCgnw0bhbu+i2bq1pJOeBCC4AALe1fs8xjZ6drt1HyiRJA5Ii9fzgBIUH067fUxFcAABup6SiWtMXZes/3++VJLUI9tekIYnqlxhpcmVwNoILAMCtLN9eoGfnZuhQcYUk6c6ro/XMgM4KbeRrcmWoDwQXAIBbOFZWpRc+z9K8LYckSTFhjZQ2PEm9OzQ3uTLUJ4ILAMClGYahz344pImfb9Wxsip5WaTf/iJWI3/ZSYF+NJJraAguAACXdajohJ6bl6mvtxdIkuIjgzUtNVldo5uYWxhMQ3ABALgcu93Qf9ft07SF21VaWSM/by89enMH/eGG9vLz8TK7PJiI4AIAcCm7j5RqzOwMrdtT267/qpgmmpaarI4RtOsHwQUA4CKqbXa99e1u/XXpTlXV2NXIz1uj+nbSr3vSrh//Q3ABAJgu82CxRs1K19bDte36r49roT8PS1TrprTrx6kILgAA01RU2/TXpTv11re17fqbNPLV+Fu7aNiVrWjXjzMiuAAATPH97kKNnZOh3KO17fpvTW6pCYMS1CLY3+TK4MoILgCAemWtqNbUhdv1wdp9kqSIEH9NHpqkX3aJMLkyuAOCCwCg3izdmq/n5mUqz1rbrv/u7jEaOyBeIQG068eFIbgAAJzuaGmlnv8sSwvSD0uS2jZrpLThyerZvpnJlcHdEFwAAE5jGIbmbj6oFxZsVVF5tbws0oPXt9OTKXEK8KVdPy4ewQUA4BQHjpfr2bmZWrnjiCSpc8sQTU9NVlLrUJMrgzsjuAAAHMpuN/Sf7/dq2qLtKq+yyc/HS4/f0lEPXd9Ovt6068flIbgAABwmp6BEo2dnaOPe45Kkq9s01dTUZHUIb2xyZfAUDo++NptN48aNU2xsrAIDA9W+fXtNmjRJhmE4elUAABdRbbPr1WU7NeBv32nj3uMK8vPWpCEJ+uT3PQktcCiHn3GZNm2aZsyYoXfffVcJCQnasGGD7r//foWGhuqxxx5z9OoAACZLP1CkUbPStT2vRJJ0Y6cWmjIsSa2aBJpcGTyRw4PL6tWrNWTIEA0cOFCS1LZtW3344Ydat26do1cFADDRiSqbXlm6Q//6drfshtS0ka8mDErQkCuiaNcPp3F4cOnVq5fefPNN7dixQ3Fxcfrhhx/03Xff6eWXXz7j+MrKSlVWVtbdtlqtji4JAOBgq3cd1dg5GdpbWC5JGtw1ShMGdVGzxrTrh3M5PLiMGTNGVqtV8fHx8vb2ls1m05QpU3TPPfeccXxaWpomTpzo6DIAAE5QfKJaaV9u00fr90uSIkMCNGVYom7pTLt+1A+HB5dPPvlE//3vf/XBBx8oISFBW7Zs0RNPPKGoqCjde++9p40fO3asRo4cWXfbarUqOjra0WUBAC7T4qw8jZuXqYKS2rPkv7o2RqP7xSuYdv2oRxbDwV/3iY6O1pgxYzRixIi6+yZPnqz3339f27dvP+/zrVarQkNDVVxcrJCQEEeWBgC4BEdKatv1f5FR264/tnmQpg5PUo92tOvH/9TX8dvhZ1zKy8vl5XXqt6y9vb1lt9sdvSoAgBMZhqHZmw5q0oKtKj5RLW8vix66vp0ev6Uj7fphGocHl0GDBmnKlCmKiYlRQkKCNm/erJdfflkPPPCAo1cFAHCS/cfK9czcDH2786gkKSEqRNNSk5XYinb9MJfD3yoqKSnRuHHjNHfuXBUUFCgqKkp33323xo8fLz8/v/M+n7eKAMA8Nruhd1fv0UtfZde1638yJU6/uy6Wdv04p/o6fjs8uFwuggsAmGNnfolGzU7X5n1FkqTusWGaOjxJ7VrQ+Rbn57afcQEAuJeqGrtmrNilfyzfqWqbocb+PhrTP17/1z1GXl40koNrIbgAQAO2ZX+RRs9KV3Z+bbv+W+LDNXlYolqG0q4frongAgANUHlVjf7y1Q7NXJUruyGFBfnp+cEJGpTcknb9cGkEFwBoYFblHNWYOenaf+yEJGnYla007tYuCgs6/xcoALMRXACggSgur9aUL7fqkw0HJElRoQGaMjxJN3UKN7ky4MIRXACgAViUeVjj5mfpyI/t+n/Ts41G9YtXY38OA3Av/MUCgAcrsFZo/PwsLcrKkyS1axGkaanJuqZtmMmVAZeG4AIAHsgwDH264YAmf7FV1ooa+XhZ9Icb2uvRmzvQrh9ujeACAB5mX2Ftu/7vcmrb9Se1CtW01GR1iaKpJ9wfwQUAPITNbmjmqlz95asdOlFtk7+Pl0b+Mk6//UWsfGjXDw9BcAEAD5CdV9uu/4f9RZKka9uFaerwZLVtHmRuYYCDEVwAwI1V1tj02vJdmrEiR9U2Q8H+PnpmYGfddU00jeTgkQguAOCmNu07rtGz0rWzoFSS9MsuEZo0JFGRoQEmVwY4D8EFANxMWWWNXvoqW++s3iPDkJo39tPEwYkakBTJWRZ4PIILALiRb3Yc0dg5GTpYVNuuP/Wq1npuYGc1pV0/GgiCCwC4gaLyKk1asE2zN9W262/VJFB/Hp6kG+JamFwZUL8ILgDgwgzD0JcZeZrwWaaOllbJYpHu7dlWT/ftpCDa9aMB4q8eAFxUvrVC4+Zl6qut+ZKkDuGNNS01Wd3aNDW5MsA8BBcAcDGGYejj9fs15cttKvmxXf8jN3XQiJvay9+Hdv1o2AguAOBC9hwt09g5GVqzu1CS1LV1qKbdlqz4SNr1AxLBBQBcQo3NrrdX5erlJTtUUW1XgK+X/tSnk+7vHStvL77iDJxEcAEAk207bNXo2elKP1AsSerVvpmmDk9WTLNGJlcGuB6CCwCYpLLGpn98naMZK3apxm4oOMBH4wZ20e1Xt6aRHHAWBBcAMMGGPcc0ena6dh0pkyT1S4jUC0MSFB5Cu37gXAguAFCPSitr9OKi7Xrv+70/tuv316QhCeqf1NLs0gC3QHABgHqyIrtAz87NrGvXf8fVrfXsgC4KbeRrcmWA+yC4AICTHS+r0qQFWzVn80FJUnRYoNKGJesXHZubXBngfgguAOAkhmFoQfphPf9ZlgrLquRlke7vHaun+sSpkR+7X+BS8MoBACc4XHxC4+Zlaum2AklSXERtu/4rY2jXD1wOggsAOJDdbujD9fs09cvtKqmska+3RY/e1FEP39hefj5eZpcHuD2CCwA4SO7RMo2Zna61ucckSVfGNNG01GTFRQSbXBngOQguAHCZamx2/eu7XL2yZIcqa+wK9PXW03076d5ebWnXDzgYwQUALkPWoWKNnp2uzINWSdJ1HZvrz8OSFB1Gu37AGQguAHAJKqpt+vuynXrjm92y2Q2FBvpq3K1dlHpVK9r1A05EcAGAi7Qu95jGzE7X7qO17foHJrXUhMFdFB5Mu37A2QguAHCBSiqqNX1Rtv7z/V5JUniwvyYNTVTfhEiTKwMaDoILAFyAr7fn69m5mTpcXCFJuuuaaI0d0FmhgbTrB+oTwQUAzqGwtFIvLNiq+VsOSZJiwhpp6vAk9epAu37ADAQXADgDwzA0f8shvbBgq4792K7/d9e105MpcQr08za7PKDBIrgAwM8cKjqhZ+dmaHn2EUlSfGSwpqUmq2t0E3MLA0BwAYCT7HZD/127V1MXbldZlU1+3l76480d9PsbaNcPuAqCCwBI2nWkVGNmp2v9nuOSpG5tmmpaapI6hNOuH3AlBBcADVq1za43v9mtvy3bqaoauxr5eWt0v3j9+to28qJdP+ByCC4AGqyMA8UaNTtd2w7Xtuu/Ia6FpgxLVOumtOsHXBXBBUCDU1Ft0ytLd+hf3+bKZjfUpJGvxt/aRcOupF0/4OoILgAalDW7CjV2Trr2FJZLkm5NbqnnByeoeWN/kysDcCEILgAaBGtFtdK+3K4P1+2TJEWE+Gvy0CT9skuEyZUBuBgEFwAeb8nWfD03L0P51kpJ0v/1iNGY/vEKCaBdP+BuCC4APNbR0ko9/1mWFqQfliS1bdZIU1OTdW27ZiZXBuBSEVwAeBzDMDR380G9sGCrisqr5e1l0e+ui9WTKXEK8KVdP+DOCC4APMqB4+V6Zm6mvtlR266/S8sQTb8tWYmtQk2uDIAjOKWH9cGDB/WrX/1KzZo1U2BgoJKSkrRhwwZnrAoAJNW2639nVa76vPKNvtlxRH4+Xnq6byfNf7Q3oQXwIA4/43L8+HH17t1bN910kxYuXKgWLVpo586datq0qaNXBQCSpJyCEo2enaGNe2vb9V/TtqmmpiarfYvGJlcGwNEcHlymTZum6OhozZw5s+6+2NhYR68GAFRVY9cbK3fp1a9zVGWzK8jPW2MGdNY93WNo1w94KIe/VfTZZ5/p6quv1u23367w8HBdeeWVeuutt846vrKyUlar9ZQfADifH/YXafA/vtNfluxQlc2um+PDtWTkDVxjCPBwDg8uu3fv1owZM9SxY0ctXrxYDz/8sB577DG9++67Zxyflpam0NDQup/o6GhHlwTAg5yosmnKF1s17J+rtD2vRGFBfvrbXVfo3/deragmgWaXB8DJLIZhGI5coJ+fn66++mqtXr267r7HHntM69ev15o1a04bX1lZqcrKyrrbVqtV0dHRKi4uVkhIiCNLA+DmVucc1Zg5Gdp3rLZd/5ArojT+1i5qRrt+wHRWq1WhoaFOP347/DMuLVu2VJcuXU65r3Pnzpo9e/YZx/v7+8vfn50OgLMrPlGttC+36aP1+yVJLUMDNGVYom6Op10/0NA4PLj07t1b2dnZp9y3Y8cOtWnTxtGrAtAALM7K07h5mSooqT0z++tr22hUv04Kpl0/0CA5PLg8+eST6tWrl/785z/rjjvu0Lp16/Tmm2/qzTffdPSqAHiwgpIKPf9Zlr7MyJMktWsepKmpyeoeG2ZyZQDM5PDPuEjSggULNHbsWO3cuVOxsbEaOXKkHnzwwQt6bn29RwbANRmGoVkbD2jyF9tUfKK2Xf/vr2+nx27pSLt+wIXV1/HbKcHlchBcgIZr/7FyPTM3Q9/uPCpJSmwVommpyUqIovMt4Orc9sO5AHCxbHZD767eoxcXZ+tEtU3+Pl568pdx+t0vYuXj7ZQrkwBwUwQXAKbakV+iUbPStWV/kSSpR2yYpqYmK7Z5kLmFAXBJBBcApqiqseufK3L02vIcVdsMBfv7aMyAeN19De36AZwdwQVAvdu877jGzM5Qdn6JJCmlc7gmDU1Uy1A63wI4N4ILgHpTXlWjv3y1Q2+vypVhSM2C/PT84ATdmtxSFgtnWQCcH8EFQL34budRjZ2brv3HTkiShl/ZSuNu7aKmQX4mVwbAnRBcADhVcXm1Jn+xVZ9uPCBJatUkUFOGJerGTuEmVwbAHRFcADjNwozDGv9Zlo6UVMpikX5zbRs93S9ejf3Z9QC4NOw9ADhcgbVC4+dnaVFWbbv+9i2CNP22ZHVrQ7t+AJeH4ALAYQzD0KcbDmjyF1tlraiRj5dFD9/YXiNu6kC7fgAOQXAB4BD7Css1dm66VuUUSpKSW4dqWmqyOrfk0h0AHIfgAuCy2OyGZq7K1UtfZaui2q4AXy899ctOur93W9r1A3A4gguAS7Y9z6rRszP0w4/t+nu2a6apqUlq04x2/QCcg+AC4KJV1tj02vJd+ufyHNXYDQUH+OjZAZ115zXRNJID4FQEFwAXZePe4xo9O105BaWSpD5dIjRpaKIiQgJMrgxAQ0BwAXBByipr9NJX2Xpn9R4ZhtS8sZ8mDk7UgKRIzrIAqDcEFwDn9e3OIxo7J0MHjte260+9qrXG3dpZTRrRrh9A/SK4ADirovIqTf5im2b9pF3/n4cn6Ya4FiZXBqChIrgAOKOFGYc1bn6WjpbWtuu/t2dbPd23k4Jo1w/AROyBAJyCdv0AXBnBBYCkM7frf+TG9hpxcwf5+9CuH4BrILgA0L7Ccj0zN0Pf5RyVJCW1CtX022jXD8D1EFyABsxmN/TO6j16aXG2TlTb5O/jpaf6xOmB3rG06wfgkgguQAO1I79Eo2ala8uP7fqvbRemqcOT1bY57foBuC6CC9DAVNXY9c8VOXpteY6qbYaC/X30zMDOuvPqaHl50UgOgGsjuAANyJb9RRo9K13Z+SWSpJTO4Zo8NEmRobTrB+AeCC5AA1BeVaOXv9qht1flym5IzYL89PzgBN2a3JJ2/QDcCsEF8HCrco5qzJx07T9W265/2JWtNO7WLgoLol0/APdDcAE8VPGJav35i236eMN+SVJUaICmDE/STZ3CTa4MAC4dwQXwQIuz8jRuXqYKSiolSb/p2Uaj+sWrMe36Abg59mKABzlSUqnnP8vSFxmHJUntmgdpamqyusfSrh+AZyC4AB7AMAzN3nRQkxZsVfGJanl7WfT769vpsVs6KsCXdv0APAfBBXBz+4/Vtuv/dmdtu/6EqBBNvy1ZCVGhJlcGAI5HcAHclM1u6D9r9mj64myVV9nk5+OlJ1Pi9OB1tOsH4LkILoAbyimobde/aV+RJKl72zBNTU1SuxaNzS0MAJyM4AK4kaoau95YuUuvfp2jKptdjf19NKZ/vP6vewzt+gE0CAQXwE2kHyjSqFnp2p5X267/5vhwTR6aqKgmgSZXBgD1h+ACuLgTVTa9snSH/vXtbtkNqWkjXz0/OEGDu0bRrh9Ag0NwAVzYml2FGjMnXXsLyyVJQ66I0vhbu6hZY3+TKwMAcxBcABdkrahW2pfb9eG6fZKkyJAATRmWqFs6R5hcGQCYi+ACuJglW/P13LwM5Vtr2/Xf0yNGY/rHKzjA1+TKAMB8BBfARRwtrW3XvyC9tl1/bPMgpQ1P0rXtmplcGQC4DoILYDLDMDRvy0FN/Hyrispr2/U/eF07PZFCu34A+DmCC2Cig0Un9OzcDK3IPiJJ6twyRNNTk5XUmnb9AHAmBBfABHa7offX7tW0hdtV9mO7/sdv6aiHrm8nX9r1A8BZEVyAerbrSKnGzE7X+j3HJUlXt2mqqanJ6hBOu34AOB+CC1BPqm12vfnNbv1t2U5V1dgV5Oet0f3j9asebWjXDwAXiOAC1IPMg8V6ela6th22SpJuiGuhKcMS1bppI5MrAwD3QnABnKii2qa/Lt2pt77dLZvdUJNGvpowqIuGXtGKdv0AcAkILoCTrN1dqDFzMpR7tEySdGtySz0/OEHNadcPAJeM4AI4WElFtaYu3K7/rq1t1x8R4q9JQxLVJyHS5MoAwP0RXAAH+np7vp6dm6nDxRWSpLu7R2tM/84KDaRdPwA4gtMbRkydOlUWi0VPPPGEs1cFmKawtFKPf7RZD7yzQYeLK9SmWSN98GAPpQ1PJrQAgAM59YzL+vXr9cYbbyg5OdmZqwFMYxiGPvvhkCZ+vlXHyqrkZZF+d107PZkSp0A/2vUDgKM57YxLaWmp7rnnHr311ltq2rSps1YDmOZQ0Qn99t0NevyjLTpWVqX4yGDNfaS3nhnQmdACAE7itOAyYsQIDRw4UCkpKeccV1lZKavVesoP4MrsdkPvf79XfV75Rl9vL5Cft5dG/jJOnz36C3WNbmJ2eQDg0ZzyVtFHH32kTZs2af369ecdm5aWpokTJzqjDMDhdh8p1Zg5GVqXe0ySdFVME01LTVbHiGCTKwOAhsHhwWX//v16/PHHtWTJEgUEBJx3/NixYzVy5Mi621arVdHR0Y4uC7gsNTa7/vVdrl5ZskOVNXYF+nprVL9O+k3PtvKmXT8A1BuLYRiGIxc4b948DRs2TN7e/3uP32azyWKxyMvLS5WVlac89nNWq1WhoaEqLi5WSEiII0sDLknWoWKNnp2uzIO1b2Ne17G5/jwsSdFhtOsHgJPq6/jt8DMut9xyizIyMk657/7771d8fLxGjx59ztACuJKKapte/XqnXl9Z264/NNBX427totSraNcPAGZxeHAJDg5WYmLiKfcFBQWpWbNmp90PuKr1e45p9Ox07T5S265/QFKknh+coPDg87/9CQBwHjrnAj9RWlmj6Yu26701eyVJLYJr2/X3S6RdPwC4gnoJLitWrKiP1QCXZXl2gZ6dk6FDP7brv/PqaD0zoLNCG9H5FgBcBWdc0OAdK6vSpAVbNXfzQUlSdFig0oYl6xcdm5tcGQDg5wguaLAMw9CC9MN6/rMsFf7Yrv/+3rF6qk+cGvnx0gAAV8TeGQ1SXnGFnpuXqaXb8iVJcRGNNS01WVfGcHkKAHBlBBc0KHa7oY/W71fal9tUUlkjX2+LRtzUQY/c2EF+Pk6/WDoA4DIRXNBg7DlapjFz0vX97tp2/V2jm2h6arI6RdKuHwDcBcEFHq/GZtfbq3L1l6/+167/qT5xur93LO36AcDNEFzg0bYdtmr07HSlHyiWJPXu0Expw5IV04x2/QDgjggu8EiVNTb94+sczVixSzV2Q8EBPho3sItuv7o17foBwI0RXOBxNu49ptGzM5RTUCpJ6tMlQpOGJioihHb9AODuCC7wGGWVNXpxcbbeXbNHhiE1b+yvF4YkqH9iJGdZAMBDEFzgEb7ZcURj52ToYNEJSdJt3VrruYGd1aSRn8mVAQAcieACt1ZUXqVJC7Zp9qYDkqRWTQKVNjxJ18e1MLkyAIAzEFzglgzD0MLMPI2fn6mjpVWyWKR7e7bV0307KcifP2sA8FTs4eF2CqwVGjc/U4uzatv1dwivbdffrQ3t+gHA0xFc4DYMw9AnG/Zr8hfbVFJRIx8vix65sb1G3NxB/j7eZpcHAKgHBBe4hX2F5RozJ12rdxVKkpJbh2paarI6twwxuTIAQH0iuMCl2eyGZq7K1UtfZaui2i5/Hy891SdOD/SOlY83F0UEgIaG4AKXlZ1XolGz0/XD/iJJ0rXtwjR1eLLaNg8ytzAAgGkILnA5VTV2/XNFjl5bnqNqm6Fgfx89M7Cz7rommkZyANDAEVzgUn7YX6RRs9KVnV8iSUrpHK7JQ5MUGUq7fgAAwQUu4kSVTa8s3aF/fbtbdkMKC/LT84MTNCi5JWdZAAB1CC4w3fe7CzVmdrr2FJZLkoZcEaXxt3ZRs8b+JlcGAHA1BBeYpqSiWlMXbtd/1+6TJEWGBGjy0ESldIkwuTIAgKsiuMAUy7cX6Jm5GTpcXCFJurt7jMYOiFdIgK/JlQEAXBnBBfXqWFmVXvg8S/O2HJIktWnWSGnDk9SrfXOTKwMAuAOCC+qFYRj6IuOwJszPUmFZlbws0gO9Y/VUn04K9KNdPwDgwhBc4HT51go9Ny9TS7bWXhQxLqL2oohXxnBRRADAxSG4wGnOdFHEETd10CM3teeiiACAS0JwgVPsP1ausXMy9F3OUUm1F0Wcfluy4iO5KCIA4NIRXOBQNruhd1fv0YuLs3Wi2sZFEQEADkVwgcPkFJRo1Kx0bdpXJEnqHhumaanJiuWiiAAAByG44LJV2+x6Y+Uu/X1ZjqpsdjX299GY/vH6v+4x8vKiXT8AwHEILrgsmQeL9fSsdG07bJUk3dSphaYMS1JUk0CTKwMAeCKCCy5JRbVNf126U299u1s2u6EmjXw1YVAXDb2iFRdFBAA4DcEFF239nmMaPStdu4+WSZIGJrfUxMEJas5FEQEATkZwwQUrrazR9EXb9d6avZKk8GB/TRqaqL4JkSZXBgBoKAguuCArdxzRM3MydLDohCTpzquj9cyAzgptxEURAQD1h+CCcyoqr9KkBds0e9MBSVLrpoGaOjxZv+jIRREBAPWP4IKzWphxWOPmZ+loaaUsFum+Xm31pz6dFOTPnw0AwBwcgXCagpIKTZifpYWZeZKk9i2CNP22ZHVrE2ZyZQCAho7ggjqGYWj2poOatGCrik9Uy9vLoodvaK9Hb+6gAF8uiggAMB/BBZKkA8fL9czcTH2z44gkKSEqRNNvS1ZCVKjJlQEA8D8ElwbObjf0n+/3atqi7SqvssnPx0tPpHTUQ9e146KIAACXQ3BpwHYdKdWY2elav+e4JOmatk01NTVZ7Vs0NrkyAADOjODSANXY7Hrz293669Kdqqqxq5Gft8b0j9everThoogAAJdGcGlgsg4Va/TsdGUerL0o4nUdmytteJJaN21kcmUAAJwfwaWBqKyx6R9f52jGil2qsRsKDfTVuFu7KPUqLooIAHAfBJcGYMv+Io2a9YN25JdKkvolROqFoQkKDw4wuTIAAC4OwcWDVVTb9MqSHXrr292yG1KzID9NGpqoAUktzS4NAIBLQnDxUOv3HNOoWenKPVomSRp6RZTGD0pQWJCfyZUBAHDpCC4epqyyRi8uzta7a/bIMKSIEH9NGZqklC4RZpcGAMBlI7h4kFU5RzV6droOHD8hSbrj6tZ6dmAXhQb6mlwZAACO4fDWqGlpabrmmmsUHBys8PBwDR06VNnZ2Y5eDX7CWlGtsXMydM+/1urA8RNq1SRQ7z3QXdNv60poAQB4FIcHl5UrV2rEiBH6/vvvtWTJElVXV6tPnz4qKytz9KogaXl2gfq+8o0+XLdPkvTra9to8ZPX6/q4FiZXBgCA41kMwzCcuYIjR44oPDxcK1eu1PXXX3/e8VarVaGhoSouLlZISIgzS3NrReVVemHBVs3ZdFCSFBPWSNNSk9WzfTOTKwMANET1dfx2+mdciouLJUlhYWFnfLyyslKVlZV1t61Wq7NLcnuLs/L03LxMHSmplMUiPdA7Vk/1iVMjPz6yBADwbE490tntdj3xxBPq3bu3EhMTzzgmLS1NEydOdGYZHqOwtFITPsvSgvTDkqT2LYI0/bau6tamqcmVAQBQP5z6VtHDDz+shQsX6rvvvlPr1q3POOZMZ1yio6N5q+gnDMPQ5+mH9fxnWTpWViVvL4seur6dHr+lowJ8vc0uDwAA93+r6NFHH9WCBQv0zTffnDW0SJK/v7/8/f2dVYbbK7BW6Nl5mVqyNV+SFB8ZrOm3JSu5dRNzCwMAwAQODy6GYeiPf/yj5s6dqxUrVig2NtbRq2gQDMPQ7E0H9cLnWbJW1MjHy6JHb+6gR27sID8fh38ZDAAAt+Dw4DJixAh98MEHmj9/voKDg5WXlydJCg0NVWBgoKNX55EOFp3QM3MytHLHEUlSUqtQTb8tWZ1b8tYZAKBhc/hnXCwWyxnvnzlzpu67777zPr8hfx3aMAx9sG6f0r7crtLKGvn5eOmJlI566Lp28vHmLAsAwHW57WdcnNwWxmPtKyzXmDnpWr2rUJJ0VUwTTb8tWR3Cg02uDAAA10HjD5PZ7YbeXbNH0xdl60S1TQG+Xnq6b7zu69VW3l5nPnsFAEBDRXAxUe7RMj396Q/asPe4JKlHbJimpSarbfMgkysDAMA1EVxMYLMbmrkqVy8uzlZljV1Bft4aM6Cz7ukeIy/OsgAAcFYEl3q252iZnp71g9bvqT3L0rtDM00dnqzosEYmVwYAgOsjuNQTu93QO6v3aPri7aqorj3LMnZAZ93TI+as38QCAACnIrjUg72FZXp6VrrW5R6TJPVq30zTUjnLAgDAxSK4OJHdbui9NXs07cdvDDU6eZaFz7IAAHBJCC5Osq+wXE/P+kFrfzzL0rNdM02/jbMsAABcDoKLg9nthv7z/V5NXbj9f2dZ+sfrnh5tOMsCAMBlIrg40L7Cco2a/YO+3117luXadmGantpVMc04ywIAgCMQXBzAbjf037V7lbZwu8qrbAr09dbYAfH6FWdZAABwKILLZTpUdEJPz/pBq3JqrzHUIzZML97GWRYAAJyB4HKJDMPQ3M0HNeGzLJVU1CjA10tj+sXrNz3bcpYFAAAnIbhcgsLSSj07N1OLsvIkSVfGNNFfbu+qdi0am1wZAACejeBykZZszdfYOek6WlolX2+LnkiJ0++vbycfby+zSwMAwOMRXC5QSUW1Ji3Yqk82HJAkdYoI1st3dlVCVKjJlQEA0HAQXC7A97sL9dQnP+hg0QlZLNJD17XTk7+MU4Cvt9mlAQDQoBBczqGi2qaXFmfr36tyZRhSdFig/nL7FeoeG2Z2aQAANEgEl7PIPFisJz/eop0FpZKku7vH6NmBndXYn18ZAABm4Sj8M3a7obdX5Wr6omxV2exqEeyv6anJuik+3OzSAABo8AguP1FQUqGnPvlB3+48Kknq0yVCU1OTFRbkZ3JlAABAIrjU+Xp7vp7+NF2FZVUK8PXS+FsTdHf3aFksNJMDAMBVNPjgUlFt09SF2/XO6j2SpM4tQ/Tq3VeoQ3iwuYUBAIDTNOjgkp1Xosc/2qzteSWSpAd6x2pUv058zRkAABfVIIOLYRj6eP1+TfgsS5U1djVv7KcXb++qmzrxAVwAAFxZgwsu5VU1em5upuZsPihJuiGuhV66vataBPubXBkAADifBhVccgpK9Mh/N2lHfqm8LNKf+nbSH65vz9WcAQBwEw0muMzfclBj52SovMqm8GB//f3uK3Vtu2ZmlwUAAC5CgwguUxdu1+srd0mSerVvpr/ddSVvDQEA4IY8Prh8smF/XWh57OYOejwlTt68NQQAgFvy6OCSfqBIz83LlCQ9mRKnx1M6mlwRAAC4HF5mF+AsR0sr9Yf/bFRVjV0pnSP0x5s7mF0SAAC4TB4ZXGpsdj36wSYdKq5Qu+ZBevnOrnxzCAAAD+CRwWXqwu36fvcxBfl5683fdFNIgK/ZJQEAAAfwuOAyf8tB/eu7XEnSX+7oyjWHAADwIB4VXLYdtmr07HRJ0iM3tle/xJYmVwQAABzJY4JLUXmVfv+fjaqotuv6uBZ6qk8ns0sCAAAO5hHBxWY39PhHW7TvWLmiwwL197uuoFcLAAAeyCOCyytLdmjljiMK8PXSG7+6Wk0a+ZldEgAAcAK3Dy6LMvP0j+U5kqRpqcnqEhVickUAAMBZ3Dq45BSU6KlPtkiSHugdqyFXtDK3IAAA4FRuG1xKKqr10H82qqzKph6xYRo7IN7skgAAgJO5ZXCx2w2N/OQH7T5SppahAXrtnqvk6+2WmwIAAC6CWx7tX1ueoyVb8+Xn7aUZv+qm5o39zS4JAADUA7cLLsuzC/Ty0h2SpMlDE3VFdBNzCwIAAPXGrYLLnqNlevzDzTIM6Z4eMbrjmmizSwIAAPXIbYJLeVWN/vD+RlkranRVTBNNGJRgdkkAAKCeuUVwMQxDo2ala3teiVoE+2vGr7rJz8ctSgcAAA7kFkf/f32bqwXph+XjZdE/77lKESEBZpcEAABM4PLBZVXOUaUt3CZJGj+oi65pG2ZyRQAAwCwuHVwOHC/Xox9skt2QUq9qrV9f28bskgAAgImcFlxee+01tW3bVgEBAerRo4fWrVt3Uc+vqLbpD+9v1PHyaiW2CtGUYYmyWLjiMwAADZlTgsvHH3+skSNHasKECdq0aZO6du2qvn37qqCg4IKX8cLnW5V50KqwID+9/qtuCvD1dkapAADAjTgluLz88st68MEHdf/996tLly56/fXX1ahRI7399tsXvIzPfjgkL4v0j7uvVOumjZxRJgAAcDMODy5VVVXauHGjUlJS/rcSLy+lpKRozZo1p42vrKyU1Wo95eekMf3j1atDc0eXCAAA3JTDg8vRo0dls9kUERFxyv0RERHKy8s7bXxaWppCQ0PrfqKja7vh9kuI0IPXtXN0eQAAwI2Z/q2isWPHqri4uO5n//79kqQXhvJhXAAAcCofRy+wefPm8vb2Vn5+/in35+fnKzIy8rTx/v7+8vc//erOjfwcXhoAAHBzDj/j4ufnp27dumnZsmV199ntdi1btkw9e/Z09OoAAEAD4pTTGiNHjtS9996rq6++Wt27d9df//pXlZWV6f7773fG6gAAQAPhlOBy55136siRIxo/frzy8vJ0xRVXaNGiRad9YBcAAOBiWAzDMMwu4qesVqtCQ0NVXFyskJAQs8sBAAAXoL6O36Z/qwgAAOBCEVwAAIDbILgAAAC3QXABAABug+ACAADcBsEFAAC4DYILAABwGwQXAADgNgguAADAbbjcJZhPNvK1Wq0mVwIAAC7UyeO2sxvyu1xwKSwslCRFR0ebXAkAALhYhYWFCg0NddryXS64hIWFSZL27dvn1A13NVarVdHR0dq/f3+DukYT2812NwRsN9vdEBQXFysmJqbuOO4sLhdcvLxqP3YTGhraoCb8pJCQELa7AWG7Gxa2u2FpqNt98jjutOU7dekAAAAORHABAABuw+WCi7+/vyZMmCB/f3+zS6lXbDfb3RCw3Wx3Q8B2O3e7LYazv7cEAADgIC53xgUAAOBsCC4AAMBtEFwAAIDbILgAAAC3YUpwee2119S2bVsFBASoR48eWrdu3TnHf/rpp4qPj1dAQICSkpL05Zdf1lOljpGWlqZrrrlGwcHBCg8P19ChQ5WdnX3O57zzzjuyWCyn/AQEBNRTxY7x/PPPn7YN8fHx53yOu8/1SW3btj1t2y0Wi0aMGHHG8e463998840GDRqkqKgoWSwWzZs375THDcPQ+PHj1bJlSwUGBiolJUU7d+4873Ivdh9R38613dXV1Ro9erSSkpIUFBSkqKgo/eY3v9GhQ4fOucxLeb3Ut/PN93333XfaNvTr1++8y3Xn+ZZ0xte6xWLRiy++eNZluvp8X8hxq6KiQiNGjFCzZs3UuHFjpaamKj8//5zLvdR9wk/Ve3D5+OOPNXLkSE2YMEGbNm1S165d1bdvXxUUFJxx/OrVq3X33Xfrt7/9rTZv3qyhQ4dq6NChyszMrOfKL93KlSs1YsQIff/991qyZImqq6vVp08flZWVnfN5ISEhOnz4cN3P3r1766lix0lISDhlG7777ruzjvWEuT5p/fr1p2z3kiVLJEm33377WZ/jjvNdVlamrl276rXXXjvj49OnT9ff//53vf7661q7dq2CgoLUt29fVVRUnHWZF7uPMMO5tru8vFybNm3SuHHjtGnTJs2ZM0fZ2dkaPHjweZd7Ma8XM5xvviWpX79+p2zDhx9+eM5luvt8Szplew8fPqy3335bFotFqamp51yuK8/3hRy3nnzySX3++ef69NNPtXLlSh06dEjDhw8/53IvZZ9wGqOede/e3RgxYkTdbZvNZkRFRRlpaWlnHH/HHXcYAwcOPOW+Hj16GL///e+dWqczFRQUGJKMlStXnnXMzJkzjdDQ0PorygkmTJhgdO3a9YLHe+Jcn/T4448b7du3N+x2+xkf94T5lmTMnTu37rbdbjciIyONF198se6+oqIiw9/f3/jwww/PupyL3UeY7efbfSbr1q0zJBl79+4965iLfb2Y7Uzbfe+99xpDhgy5qOV44nwPGTLEuPnmm885xt3m++fHraKiIsPX19f49NNP68Zs27bNkGSsWbPmjMu41H3Cz9XrGZeqqipt3LhRKSkpdfd5eXkpJSVFa9asOeNz1qxZc8p4Serbt+9Zx7uD4uJiSTrvhahKS0vVpk0bRUdHa8iQIcrKyqqP8hxq586dioqKUrt27XTPPfdo3759Zx3riXMt1f7dv//++3rggQdksVjOOs4T5vuncnNzlZeXd8qchoaGqkePHmed00vZR7iD4uJiWSwWNWnS5JzjLub14qpWrFih8PBwderUSQ8//LAKCwvPOtYT5zs/P19ffPGFfvvb3553rDvN98+PWxs3blR1dfUpcxcfH6+YmJizzt2l7BPOpF6Dy9GjR2Wz2RQREXHK/REREcrLyzvjc/Ly8i5qvKuz2+164okn1Lt3byUmJp51XKdOnfT2229r/vz5ev/992W329WrVy8dOHCgHqu9PD169NA777yjRYsWacaMGcrNzdV1112nkpKSM473tLk+ad68eSoqKtJ999131jGeMN8/d3LeLmZOL2Uf4eoqKio0evRo3X333ee84N7Fvl5cUb9+/fTee+9p2bJlmjZtmlauXKn+/fvLZrOdcbwnzve7776r4ODg875l4k7zfabjVl5envz8/E4L4+c7np8cc6HPOROXuzq0pxsxYoQyMzPP+15mz5491bNnz7rbvXr1UufOnfXGG29o0qRJzi7TIfr371/37+TkZPXo0UNt2rTRJ598ckH/G/EU//73v9W/f39FRUWddYwnzDdOV11drTvuuEOGYWjGjBnnHOsJr5e77rqr7t9JSUlKTk5W+/bttWLFCt1yyy0mVlZ/3n77bd1zzz3n/XC9O833hR636ku9nnFp3ry5vL29T/vUcX5+viIjI8/4nMjIyIsa78oeffRRLViwQMuXL1fr1q0v6rm+vr668sorlZOT46TqnK9JkyaKi4s76zZ40lyftHfvXi1dulS/+93vLup5njDfJ+ftYub0UvYRrupkaNm7d6+WLFlyzrMtZ3K+14s7aNeunZo3b37WbfCk+Zakb7/9VtnZ2Rf9epdcd77PdtyKjIxUVVWVioqKThl/vuP5yTEX+pwzqdfg4ufnp27dumnZsmV199ntdi1btuyU/23+VM+ePU8ZL0lLliw563hXZBiGHn30Uc2dO1dff/21YmNjL3oZNptNGRkZatmypRMqrB+lpaXatWvXWbfBE+b652bOnKnw8HANHDjwop7nCfMdGxuryMjIU+bUarVq7dq1Z53TS9lHuKKToWXnzp1aunSpmjVrdtHLON/rxR0cOHBAhYWFZ90GT5nvk/7973+rW7du6tq160U/19Xm+3zHrW7dusnX1/eUucvOzta+ffvOOneXsk84W3H16qOPPjL8/f2Nd955x9i6davx0EMPGU2aNDHy8vIMwzCMX//618aYMWPqxq9atcrw8fExXnrpJWPbtm3GhAkTDF9fXyMjI6O+S79kDz/8sBEaGmqsWLHCOHz4cN1PeXl53Zifb/fEiRONxYsXG7t27TI2btxo3HXXXUZAQICRlZVlxiZckqeeespYsWKFkZuba6xatcpISUkxmjdvbhQUFBiG4Zlz/VM2m82IiYkxRo8efdpjnjLfJSUlxubNm43NmzcbkoyXX37Z2Lx5c923Z6ZOnWo0adLEmD9/vpGenm4MGTLEiI2NNU6cOFG3jJtvvtl49dVX626fbx/hCs613VVVVcbgwYON1q1bG1u2bDnlNV9ZWVm3jJ9v9/leL67gXNtdUlJi/OlPfzLWrFlj5ObmGkuXLjWuuuoqo2PHjkZFRUXdMjxtvk8qLi42GjVqZMyYMeOMy3C3+b6Q49Yf/vAHIyYmxvj666+NDRs2GD179jR69ux5ynI6depkzJkzp+72hewTzqfeg4thGMarr75qxMTEGH5+fkb37t2N77//vu6xG264wbj33ntPGf/JJ58YcXFxhp+fn5GQkGB88cUX9Vzx5ZF0xp+ZM2fWjfn5dj/xxBN1v6OIiAhjwIABxqZNm+q/+Mtw5513Gi1btjT8/PyMVq1aGXfeeaeRk5NT97gnzvVPLV682JBkZGdnn/aYp8z38uXLz/i3fXLb7Ha7MW7cOCMiIsLw9/c3brnlltN+H23atDEmTJhwyn3n2ke4gnNtd25u7llf88uXL69bxs+3+3yvF1dwru0uLy83+vTpY7Ro0cLw9fU12rRpYzz44IOnBRBPm++T3njjDSMwMNAoKio64zLcbb4v5Lh14sQJ45FHHjGaNm1qNGrUyBg2bJhx+PDh05bz0+dcyD7hfCw/LhgAAMDlca0iAADgNgguAADAbRBcAACA2yC4AAAAt0FwAQAAboPgAgAA3AbBBQAAuA2CCwAAcBsEFwAA4DYILgAAwG0QXAAAgNsguAAAALfx/+A9v74SDt/+AAAAAElFTkSuQmCC",
+ "text/plain": [
+ "