Repository: parmoo/parmoo (language: python)

Issue:
Feature/readthedocs
Merging Feature/readthedocs into develop


Discussion / hints:

Fix patch:
diff --git a/.readthedocs.yml b/.readthedocs.yml
new file mode 100644
index 0000000..ea8ed39
--- /dev/null
+++ b/.readthedocs.yml
@@ -0,0 +1,23 @@
+version: 2
+
+# conda:
+#     environment: install/environment.yml
+
+sphinx:
+    configuration: docs/conf.py
+
+build:
+    image: latest
+
+formats:
+  - pdf
+
+python:
+    version: 3.7
+    install:
+      - requirements: docs/REQUIREMENTS.txt
+      - method: pip
+        path: .
+        extra_requirements:
+         - docs
+    system_packages: false
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
new file mode 100644
index 0000000..483d464
--- /dev/null
+++ b/CHANGELOG.rst
@@ -0,0 +1,41 @@
+Release Notes
+=============
+
+Below are the release notes for ParMOO.
+
+May reference issues on:
+https://github.com/parmoo/parmoo/issues
+
+Release 0.1.0
+-------------
+
+:Date: May 9, 2022
+
+Initial release.
+
+Known issues and desired features will be raised on GitHub post-release.
+
+Known issues:
+
+ - update unit tests to use sim/obj/const libraries
+ - restructure test suite, unit tests are currently not usable as
+   additional documentation
+ - ``solve()`` method(s) should support additional stopping criteria
+ - allow for maximizing objectives and constraint lower bounds without
+   "hacky" solution (negating values)
+ - missing functions from DTLZ libraries
+ - ``README.md`` needs a code coverage badge
+
+Desired features:
+
+ - update, test, and merge-in MDML interface
+ - allow user to choose whether or not to use named variables via ``useNames``
+   method, or similar
+ - add a funcx simulation interface, using libEnsemble release 0.9
+ - add predicter interface and standalone module
+ - a GUI interface for creating MOOPs
+ - static visualization tools for plotting results
+   (from ``MOOP.getPF()`` method)
+ - a visualization dashboard for viewing progress interactively
+ - design variable types should be a class, with embed/extract methods
+   that can be called by ``MOOP.__embed__()`` and ``MOOP.__extract__()``
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index dcec1ea..ae27587 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -2,11 +2,9 @@ Contributing to ParMOO
 ======================
 
 Contributions of source code, documentations, and fixes are happily
-accepted via github merge requests. Please see
+accepted via GitHub pull request to
 
-  https://parmoo.readthedocs.io/
-  
-for a discussion of the process.
+    https://github.com/parmoo/parmoo/tree/develop
 
 If you are planning a contribution, reporting bugs, or suggesting features, 
 we encourage you to discuss the concept by opening a github issue at
@@ -16,14 +14,45 @@ we encourage you to discuss the concept by opening a github issue at
 or by emailing  ``parmoo@mcs.anl.gov``
 and interacting with us to ensure that your effort is well-directed.
 
+Contribution Process
+--------------------
+
+ParMOO uses the Gitflow model. Contributors should typically branch from, and
+make pull requests to, the ``develop`` branch. The ``main`` branch is used only
+for releases. Pull requests may be made from a fork, for those without
+repository write access.
+
+Issues can be raised at
+
+    https://github.com/parmoo/parmoo/issues
+
+Issues may include reporting bugs or suggested features.
+
+By convention, user branch names should have a ``<type>/<name>`` format, where
+example types are ``feature``, ``bugfix``, ``testing``, ``docs``, and
+``experimental``.
+Administrators may take a ``hotfix`` branch from the main, which will be
+merged into ``main`` (as a patch) and ``develop``.
+Administrators may also take a ``release`` branch off ``develop`` and then
+merge this branch into ``main`` and ``develop`` for a release.
 
-Contributions
--------------
+When a branch closes a related issue, the pull request message should include
+the phrase "Closes #N," where N is the issue number.
+
+New features should be accompanied by at least one test case.
+
+All pull requests to ``develop`` or ``main`` must be reviewed by at least one
+administrator.
+
+Developer's Certificate
+-----------------------
 
 ParMOO is distributed under a 3-clause BSD license (see LICENSE_).  
 The act of submitting a pull request or patch will be understood as an 
 affirmation of the following:
+
 ::
+
   Developer's Certificate of Origin 1.1
 
   By making a contribution to this project, I certify that:
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..2fdcb1b
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,23 @@
+include setup.py
+include *.cfg
+include *.rst
+include LICENSE
+include CONTRIBUTING
+
+exclude .coverage
+
+recursive-include parmoo *
+recursive-include examples *
+recursive-include docs *
+
+recursive-exclude * __pycache__
+recursive-exclude docs/build *
+recursive-exclude * .pytest_cache
+recursive-exclude * *.py[co]
+recursive-exclude * cov_*
+recursive-exclude * *.o
+recursive-exclude * *.npy
+recursive-exclude . *.gitignore
+recursive-exclude * parmoo.moop
+recursive-exclude * parmoo.simdb.json
+recursive-exclude * parmoo.surrogate.*
diff --git a/README.rst b/README.rst
index 90700e9..d1ddad7 100644
--- a/README.rst
+++ b/README.rst
@@ -5,6 +5,10 @@
 
 |
 
+.. image:: https://img.shields.io/badge/License-BSD_3--Clause-blue.svg
+    :target: https://opensource.org/licenses/BSD-3-Clause
+    :alt: License
+
 .. image:: https://img.shields.io/pypi/v/parmoo.svg?color=blue
     :target: https://pypi.org/project/parmoo
 
@@ -12,13 +16,16 @@
     :target: https://github.com/parmoo/parmoo/actions
 
 .. image:: https://readthedocs.org/projects/parmoo/badge/?maxAge=2592000
-    :target: https://parmoo.readthedocs.org/en/latest/
+    :target: https://parmoo.readthedocs.org/en/latest
     :alt: Documentation Status
 
+.. image:: https://img.shields.io/github/downloads/parmoo/parmoo/total.svg
+    :alt: GitHub Downloads
+
 |
 
-ParMOO: Parallel MultiObjective Optimization in Python
-======================================================
+ParMOO: Python library for parallel multiobjective simulation optimization
+==========================================================================
 
 ParMOO is a parallel multiobjective optimization solver that seeks to
 exploit simulation-based structure in objective and constraint functions.
@@ -36,16 +43,16 @@ To exploit structure, ParMOO models *simulations* separately from
  * a **constraint** is an algebraic function of the design variables
    and/or simulation outputs, which cannot exceed a specified bound.
 
-To solve a multiobjective optimization problem (MOOP), we use surrogate
-models of the simulation outputs, together with the algebraic definition of
-the objectives and constraints.
-
 .. figure:: docs/img/des-sim-obj-space.png
     :alt: Designs, simulations, and objectives
     :align: center
 
 |
 
+To solve a multiobjective optimization problem (MOOP), we use surrogate
+models of the simulation outputs, together with the algebraic definition of
+the objectives and constraints.
+
 ParMOO is implemented in Python. In order to achieve scalable parallelism,
 we use libEnsemble_ to distribute batches of simulation evaluations across
 parallel resources.
@@ -88,8 +95,7 @@ then you can test your installation.
 
 .. code-block:: bash
 
-   cd [parmoo base]
-   parmoo/tests/run-tests.sh -cu[rl]
+   python3 setup.py test
 
 These tests are run regularly using GitHub Actions_.
 
@@ -218,6 +224,21 @@ Our full documentation is hosted on:
 
 Please read our LICENSE_ and CONTRIBUTING_ files.
 
+Citing ParMOO:
+
+ * Please use the following to cite ParMOO:
+
+.. code-block:: bibtex
+
+    @techreport{parmoo-docs,
+        title       = {{ParMOO}: {P}ython library for parallel multiobjective simulation optimization},
+        author      = {Chang, Tyler H. and Wild, Stefan M.},
+        institution = {Argonne National Laboratory},
+        number      = {Version 0.1.0},
+        year        = {2022},
+        url         = {https://parmoo.readthedocs.io/en/latest}
+    }
+
 
 .. _Actions: https://github.com/parmoo/parmoo/actions
 .. _CONTRIBUTING: https://github.com/parmoo/parmoo/blob/main/CONTRIBUTING.rst
diff --git a/REQUIREMENTS b/REQUIREMENTS
index 8725163..fee4d09 100644
--- a/REQUIREMENTS
+++ b/REQUIREMENTS
@@ -1,4 +1,4 @@
 numpy>=1.8.2
 scipy>=1.0.0
 pyDOE>=0.3.8
-libensemble>=0.8.0
+libensemble>=0.9.0
diff --git a/docs/REQUIREMENTS.txt b/docs/REQUIREMENTS.txt
new file mode 100644
index 0000000..662dda5
--- /dev/null
+++ b/docs/REQUIREMENTS.txt
@@ -0,0 +1,3 @@
+sphinx==2.4.1
+sphinxcontrib-bibtex
+ipykernel
diff --git a/docs/about.rst b/docs/about.rst
index 70247e3..0810dee 100644
--- a/docs/about.rst
+++ b/docs/about.rst
@@ -26,39 +26,34 @@ hard rules that every solution must adhere to.
 |
 
 In a multiobjective *simulation-based* optimization problem, the objectives
-are derived from the outputs of one or more expensive 
-simulations.
+are derived from the outputs of one or more expensive simulations.
 
 Here, we use the term *simulation* in its broadest sense.
 In our terminology, a simulation could refer to any data-generating
-process of sufficient complexity,
-including
- * numerical simulations run on a computer or
- * real-world experiments performed in a laboratory environment.
+process of sufficient complexity, including
+
+ * numerical simulations run on a computer,
+ * physical experiments performed in a laboratory environment, and
+ * other nontrivial data-generating campaigns.
 
 A simulation's expense can be judged by any of several factors, including
+
  * the amount of time that is required to complete the simulation;
  * the simulation's occupation of valuable scientific resources,
-   such as computing nodes or laboratory equipment; and
+   such as computing nodes or laboratory equipment; 
+ * the need for expert/human involvement to validate simulation outputs;  and
  * consumption of raw resources such as energy or laboratory materials.
 
 ParMOO is designed to solve multiobjective simulation-based
 optimization problems by exploiting the simulation-based structure in
 such problems.
 
-.. figure:: img/des-sim-obj-space.png
-    :alt: Designs, simulations, and objectives
-    :align: center
-
-|
-
-One of the key concepts in ParMOO is the distinction between simulations
-and objectives.
+**One of the key concepts in ParMOO is the distinction between simulations
+and objectives.**
 
-In ParMOO, a *simulation* is a computationally expensive function:
+In ParMOO, a simulation is an expensive or time-consuming process:
 it may require significant computational resources and may have
 a nonnegligible execution time.
-A single MOOP may involve multiple simulations, with varying costs, which map from the design variables to an intermediate space
 
 .. math::
     {\bf S} : {\cal X} \rightarrow {\cal S},
@@ -66,6 +61,14 @@ A single MOOP may involve multiple simulations, with varying costs, which map fr
     {\cal X} \subset \mathbb{R}^n,
     {\cal S} \subset \mathbb{R}^m.
 
+A single MOOP may involve multiple simulations, with varying costs, which map
+from the design variables to an intermediate space
+
+.. figure:: img/des-sim-obj-space.png
+    :alt: Designs, simulations, and objectives
+    :align: center
+
+|
 
 ParMOO provides a framework for solving these problems, while
 parallelizing simulation evaluations.
@@ -88,7 +91,7 @@ Constraints are expressed as
 .. math::
     {\bf G} :{\cal X} \times {\cal S} \rightarrow \mathbb{R}^p.
 
-ParMOO allows one to separately specify simulations, objective functions,
+ParMOO allows its users to separately specify simulations, objective functions,
 and constraint functions. ParMOO will then utilize simulations sparingly,
 but it may use many objective and constraint evaluations to solve problems of
 the form 
@@ -124,6 +127,7 @@ This allows ParMOO to exploit additional information about your problem,
 in situations where it is available.
 
 Common use cases include the following.
+
  * One or more objectives does not depend on any simulation outputs
    and therefore can be evaluated directly without concern for computational
    expense.
@@ -135,6 +139,7 @@ Common use cases include the following.
 
 This process has several key components, which ParMOO allows
 users to interchange.
+
  * Before fitting any surrogates or performing any scalarizations, ParMOO
    must search the design space using one of the ``GlobalSearch``
    implementations from the ``parmoo.searches`` module.
@@ -166,108 +171,140 @@ Glossary
  * **Design variable:**
    A *design variable* is an input to your simulations, which can be controlled
    within some reasonable bounds.
+
     * **Ex.-** when designing an air foil using a fluid dynamics simulation,
       one design variable might be the angle of attack.
     * ParMOO currently supports continuous and categorical design variables.
+
  * **Design space:**
    The *design space* is the underlying vector space where you could
    represent all possible design variable combinations.
+
     * **Ex.-** if you have :math:`n` continuous design variables, then
       your design space would be all of :math:`\mathbb{R}^n`.
+
  * **Constraint:**
    A *constraint* is a requirement that every solution point must satisfy.
+
     * **Ex.-** if your simulation code fails whenever :math:`x_1 > x_2`,
       then you might impose the constraint: :math:`x_2 - x_1 \leq 0`.
+
  * **Hard constraint:**
    A *hard constraint* cannot be violated by the MOOP solver.
    ParMOO will never attempt to evaluate a point that violates a hard
    constraint.
+
     * **Ex.-** your simulation code does not need to be defined for points
       that are outside the upper/lower bounds on the design variables.
+
  * **Soft constraint:**
    A *soft constraint* must be satisfied for a point to be considered a
    solution, but ParMOO may violate it during the course of the optimization
    process.
+
     * **Ex.-** all nonlinear constraints are soft constraints for ParMOO,
       and ParMOO will evaluate design points that violate these constraints,
       especially early in the optimization process.
+
  * **Bound constraint:**
    A *bound constraint* is a simple upper/lower bound on the range of
    design values.
    In ParMOO, these are treated as hard constraints, while all other
    constraints are considered to be soft.
+
  * **Feasible design space:**
    The *feasible design space* is the subset of the design
    space where all constraints (both hard and soft) are satisfied.
    In other words, this is the set of all "legal" designs.
+
     * **Ex.-** if you have `n` continuous design variables, constrained
       to the unit cube, then your entire design space is still :math:`R^n`,
       but your *feasible* design space is the cube :math:`[0, 1]^n`.
+
  * **Simulation:**
    A *simulation* can refer to any complex process for generating
    scientific or engineering data.
    This includes both numerical simulations and laboratory experiments.
    The data that is gathered from your simulation might used to compute
    your objectives, constraints, or both.
+
     * **Ex.-** if you are designing a material, your simulation may be 
       a molecular dynamics code **or** a process for synthesizing new
       materials in the laboratory.
     * Each simulation may have a single output or many outputs, which will
       be passed on as inputs to your objectives and/or constraints.
+
  * **Objective:**
    An *objective* is one of possibly many criteria that you will use to rank
    the "goodness" of a particular design configuration.
    By convention, we assume that your goal is to minimize all objectives.
+
     * **Ex.-** if you are designing materials, you may want to minimize
       the production of unwanted byproducts.
     * If your goal is actually to maximize an objective
       :math:`f_{max}`, you may supply the negated value of that
       objective :math:`-f_{max}` to ParMOO.
+
  * **Feasible objective space:**
-   The *feasible objective space* is the image of the design space
+   The *feasible objective space* is the image of the feasible design space
    -- i.e., the set of all objective values
    that can be obtained, by evaluating every objective at configurations
    from the feasible design space.
+
     * In practice, you will not know your feasible objective space *a priori*.
+
  * **Nondominated:**
    A point :math:`{\bf y}^*` in a set
    :math:`{\cal V} \subset \mathbb{R}^p`
    is *nondominated* if for all :math:`{\bf y} \in {\cal V}`, either
    :math:`{\bf y} = {\bf y}^*` or :math:`{\bf y}^*` is less than
    :math:`{\bf y}` in at least one of its :math:`p` components.
+
     * Objective values that are feasible and nondominated in the set of
       all observations make up the solution set returned by ParMOO.
+
  * **Pareto optimal:**
    A point in the feasible objective space is *Pareto optimal* for a given
    MOOP if it is nondominated in the feasible objective space.
+
     * This is a member of the true solution set for a MOOP.
     * In practice, we cannot typically guarantee that any point in a
       multiobjective simulation optimization problem is Pareto optimal,
       so we return solutions that are nondominated among all other objective
       values that we have observed.
+
  * **Pareto front:**
    The *Pareto front* is the set of all Pareto optimal objective points.
+
     * This is the true solution to a multiobjective optimization problem.
+
  * **Efficient set:**
    The *efficient set* is the set of all corresponding design
    configurations that produce points on the Pareto front.
-    * These are the solutions in the feasible design space that the 
-      objectives map onto the Pareto front.
+
+    * These are the solutions in the feasible design space, which are the 
+      pre-image of the Pareto front.
+
  * **Surrogate:**
    A *surrogate* is a computational model that approximates another
    underlying function.
+
     * **Ex.-** a trained artificial neural network, Gaussian process,
       RBF model, or spline interpolant.
+
  * **Scalarization:**
    A *scalarization* technique reduces a MOOP into a single-objective
    optimization problem.
    Typically, solving the scalarized problem should produce a solution that
    is efficient/Pareto optimal.
+
     * **Ex.-** minimize the weighted sum of all objectives in a MOOP
       to obtain a single efficient point/Pareto optimal value.
+
  * **Design of experiments/experimental design:**
    An *experimental design* is a set of design points that are in some sense
    space filling and could
    be evaluated to gain some initial data for a particular simulation.
+
     * **Ex.-** generate 100 uniform random samples within the feasible design
       space.
diff --git a/docs/api.rst b/docs/api.rst
new file mode 100644
index 0000000..6b23b11
--- /dev/null
+++ b/docs/api.rst
@@ -0,0 +1,15 @@
+ParMOO API
+==========
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Modules:
+
+   modules/class_api
+   modules/acquisitions
+   modules/optimizers
+   modules/searches
+   modules/surrogates
+   modules/libraries
+   modules/dtlz
+   modules/dev_tools
diff --git a/docs/conf.py b/docs/conf.py
index 2b7aad3..a38fe16 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -12,6 +12,9 @@
 #
 import os
 import sys
+from datetime import datetime
+
+# Add ParMOO's modules to path
 sys.path.insert(0, os.path.abspath('.'))
 sys.path.insert(0, os.path.abspath('..'))
 sys.path.insert(0, os.path.abspath('../parmoo'))
@@ -20,11 +23,13 @@
 # -- Project information -----------------------------------------------------
 
 project = 'ParMOO'
-copyright = '2020, Tyler Chang, Stefan Wild'
-author = 'Tyler Chang, Stefan Wild'
+copyright = str(datetime.now().year) + ' Tyler Chang, Stefan Wild'
+author = 'Tyler Chang and Stefan Wild'
 
 # The full version, including alpha/beta/rc tags
-release = '0'
+exec(open("../parmoo/version.py").read())
+version = __version__
+release = version
 
 
 # -- General configuration ---------------------------------------------------
@@ -53,12 +58,48 @@
 # see https://github.com/rtfd/readthedocs.org/issues/2569
 master_doc = 'index'
 
+# The latex toctree document
+latex_doc = 'latex_index'
+
 # -- Options for HTML output -------------------------------------------------
 
 # The theme to use for HTML and HTML Help pages.  See the documentation for
 # a list of builtin themes.
 #
-html_theme = 'alabaster'
+html_theme = 'sphinx_rtd_theme'
+html_theme_options = {'navigation_depth': 3,
+                      'logo_only': True}
+html_logo = './img/logo-ParMOO_white.png'
+
+# -- Options for LaTeX output ------------------------------------------------
+
+latex_elements = {
+    'fncychap': "\\usepackage[Lenny]{fncychap}",
+    'extraclassoptions': "openany",
+    'preamble': r"""
+    \protected\def\sphinxcrossref#1{\texttt{#1}}
+
+    \newsavebox\mytempbox
+    \definecolor{sphinxnoteBgColor}{RGB}{221,233,239}
+    \renewenvironment{sphinxnote}[1]{%
+    \begin{lrbox}{\mytempbox}%
+    \begin{minipage}{\columnwidth}%
+    \begin{sphinxlightbox}%
+    \sphinxstrong{#1}}%
+    {\end{sphinxlightbox}%
+    \end{minipage}%
+    \end{lrbox}%
+    \colorbox{sphinxnoteBgColor}{\usebox{\mytempbox}}}
+    """,
+    }
+
+latex_documents = [
+    (latex_doc, "parmoo.tex", "ParMOO User's Manual",
+     "Tyler Chang and Stefan Wild", "manual"),
+     ]
+
+latex_logo = "img/logo-ParMOO_white.png"
+
 
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
diff --git a/docs/dev-guide/contributing.rst b/docs/dev-guide/contributing.rst
index 94cfca1..ac7b6bc 100644
--- a/docs/dev-guide/contributing.rst
+++ b/docs/dev-guide/contributing.rst
@@ -1,4 +1,1 @@
-Contributing
-============
-
-This page is under construction.
+.. include:: ../../CONTRIBUTING.rst
diff --git a/docs/dev-guide/modules.rst b/docs/dev-guide/modules.rst
new file mode 100644
index 0000000..4817f7b
--- /dev/null
+++ b/docs/dev-guide/modules.rst
@@ -0,0 +1,8 @@
+Module List
+===========
+
+See the module index:
+ * :ref:`modindex`
+
+Or search the full general index for a specific class, method, or function:
+ * :ref:`genindex`
diff --git a/docs/dev-guide/release-notes.rst b/docs/dev-guide/release-notes.rst
index 39c210c..09929fe 100644
--- a/docs/dev-guide/release-notes.rst
+++ b/docs/dev-guide/release-notes.rst
@@ -1,4 +1,1 @@
-Release Notes
-=============
-
-This page is under construction.
+.. include:: ../../CHANGELOG.rst
diff --git a/docs/dev-guide/release-proc.rst b/docs/dev-guide/release-proc.rst
index fb1d765..dce5b28 100644
--- a/docs/dev-guide/release-proc.rst
+++ b/docs/dev-guide/release-proc.rst
@@ -1,4 +1,62 @@
 Release Process
 ===============
 
-This page is under construction.
+A release can be undertaken only by a project administrator.
+A project administrator should have an administrator role on the ParMOO
+GitHub, PyPI, and readthedocs pages.
+
+Before release
+--------------
+
+- A release branch should be taken off ``develop`` (or ``develop`` pulls
+  controlled).
+
+- Release notes for this version are added to the ``CHANGELOG.rst`` file.
+
+- Version number is updated wherever it appears and ``+dev`` suffix is removed
+  (in ``parmoo/version.py`` and ``README.rst``).
+
+- Check ``README.rst`` *Citing ParMOO* and ``docs/refs.rst`` for correctness.
+
+- ``setup.py`` and ``parmoo/__init__.py`` are checked to ensure all
+  information is up to date.
+
+- ``MANIFEST.in`` is checked. Locally, try out ``python setup.py sdist`` and
+  check created tarball contains correct files and directories for PyPI
+  package.
+
+- Tests are run with source to be released (this may iterate):
+
+  - On-line CI (GitHub Actions) tests must pass.
+
+  - Documentation must build and display correctly wherever hosted (currently
+    readthedocs.org).
+
+- Pull request from either the develop or release branch to main requesting
+  one or more reviewers (including at least one other administrator).
+
+- Reviewer will check that all tests have passed and will then approve merge.
+
+During release
+--------------
+
+An administrator will take the following steps.
+
+- Merge the pull request into main.
+
+- Once CI tests have passed on main:
+
+  - A GitHub release will be taken from the main
+
+  - A tarball (source distribution) will be uploaded to PyPI
+
+- If the merge was made from a release branch (instead of develop), merge this
+  branch into develop.
+
+- Create a new commit on develop that appends ``+dev`` to the version number
+  (wherever it appears).
+
+After release
+-------------
+
+- Ensure all relevant GitHub issues are closed.
diff --git a/docs/extras.rst b/docs/extras.rst
index f0dd136..da0a181 100644
--- a/docs/extras.rst
+++ b/docs/extras.rst
@@ -1,8 +1,8 @@
 Extras and Plugins
 ==================
 
-Solving on Parallel Systems Using libEnsemble
----------------------------------------------
+Running in Parallel using libEnsemble
+-------------------------------------
 
 `libEnsemble <https://github.com/Libensemble/libensemble>`_ is
 a Python library to "coordinate concurrent evaluation of dynamic
@@ -12,9 +12,8 @@ Read more about libEnsemble by visiting the
 
 The :mod:`libE_MOOP <extras.libe.libE_MOOP>` class is used to solve
 MOOPs using libEnsemble.
-Although it does not directly extend the :mod:`MOOP <moop.MOOP>` class
-for technical reasons, the :mod:`libE_MOOP <extras.libe.libE_MOOP>` class functions
-similarly to  a :mod:`MOOP <moop.MOOP>` extension.
+The :mod:`libE_MOOP <extras.libe.libE_MOOP>` class inherits from
+:mod:`MOOP <moop.MOOP>` and supports all of the public methods in its API.
 
 To create an instance of the :mod:`libE_MOOP <extras.libe.libE_MOOP>` class,
 import it from the :mod:`extras.libe` module and then create a MOOP, just as
@@ -27,8 +26,11 @@ evaluations, which it will distribute over available resources.
 
 Below we reproduce the example from the :doc:`Quickstart <quickstart>`
 guide, using a :mod:`libE_MOOP <extras.libe.libE_MOOP>` object.
-Note that for technical reasons, the libEnsemble interface does not
-support the usage of Python ``lambda`` functions, so each of the objectives
+
+Note that it is always recommended that you turn on
+:meth:`checkpointing <moop.MOOP.setCheckpoint>` when using libEnsemble.
+Since :meth:`setCheckpoint <moop.MOOP.setCheckpoint>` method does not
+support the usage of Python ``lambda`` functions, each of the objectives
 and constraints is explicitly defined.
 
 .. literalinclude:: ../examples/libe_basic_ex.py
@@ -47,13 +49,13 @@ Common methods of running a libEnsemble script are with MPI
 
 .. code-block:: bash
 
-    mpirun -np N python myscript.py
+    mpirun -np N python3 libe_basic_ex.py
 
 and with Python's built-in multiprocessing module.
 
 .. code-block:: bash
 
-    python myscript.py --comms local --nworkers N
+    python3 libe_basic_ex.py --comms local --nworkers N
 
 The result from running the example is shown below.
 
diff --git a/docs/how-to-write.rst b/docs/how-to-write.rst
index 0a98019..dc91c62 100644
--- a/docs/how-to-write.rst
+++ b/docs/how-to-write.rst
@@ -9,12 +9,21 @@ ParMOO.
 Below is a UML diagram showing the key public methods and
 dependencies.
 
-.. image:: ./img/moop-uml.svg
-    :alt: Designs variables, objectives, and the Pareto front (tradeoff curve)
-    :align: center
-    :scale: 5
+.. only:: html
 
-|
+    .. figure:: img/moop-uml.svg
+        :alt: ParMOO UML Diagram
+        :align: center
+
+    |
+
+.. only:: latex
+
+    .. figure:: img/moop-uml.png
+        :alt: ParMOO UML Diagram
+        :align: center
+
+    |
 
 To create an instance of the :mod:`MOOP <moop.MOOP>` class,
 use the :meth:`constructor <moop.MOOP.__init__>`.
@@ -25,13 +34,15 @@ use the :meth:`constructor <moop.MOOP.__init__>`.
     moop = MOOP(optimizer, hyperparams=hp)
 
 In the above code snippet, ``optimizer`` should be an implementation
-of the :mod:`SurrogateOptimizer <structs.SurrogateOptimizer>` ABC,
+of the :mod:`SurrogateOptimizer <structs.SurrogateOptimizer>`
+Abstract-Base-Class (ABC),
 and the optional input ``hp`` is a dictionary of hyperparameters for the
 ``optimizer`` object.
-The ``optimizer`` is the surrogate optimization method that will be used
-when solving your MOOP.
+The ``optimizer`` is the surrogate optimization problem solver that will be used
+to generate candidate solutions for the MOOP.
 The choice of surrogate optimizer determines what information
 will be required when defining each objective and constraint.
+
  * If you use a derivative-free technique, such as
    :meth:`LocalGPS <optimizers.gps_search.LocalGPS>`,
    then you do not need to provide derivative information for your
@@ -71,6 +82,7 @@ default to ``{sim|f|c}i``,
 where ``sim`` is for a simulation, ``f`` is for an objective,
 ``c`` is for a constraint, and ``i=1,2,...``
 is determined by the order in which each was added.
+
 For example, if you add 3 simulations, then they will automatically
 be named ``sim1``, ``sim2``, and ``sim3`` unless a different name,
 was specified for one or more by including the ``name`` key.
@@ -87,6 +99,14 @@ then ParMOO formats its output in a numpy structured array, using the
 given/default names to specify each field.
 This operation mode is recommended, especially for first-time users.
 
+After adding all design variables, simulations, objectives, and constraints
+to the MOOP, you can check the numpy dtype for each of these by using
+
+ * :meth:`MOOP.getDesignType() <moop.MOOP.getDesignType>`,
+ * :meth:`MOOP.getSimulationType() <moop.MOOP.getSimulationType>`,
+ * :meth:`MOOP.getObjectiveType() <moop.MOOP.getObjectiveType>`, and
+ * :meth:`MOOP.getConstraintType() <moop.MOOP.getConstraintType>`.
+
 .. literalinclude:: ../examples/named_var_ex.py
     :language: python
 
@@ -98,8 +118,9 @@ Working with Unnamed Outputs
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 If even a single design variable is left with a blank ``name`` key,
-then all outputs are placed in a Python
+then all input/output pairs are returned in a Python
 dictionary, with the following keys:
+
  * ``x_vals: (np.ndarray)`` of length :math:`d \times n` --
    number of data points by number of design variables;
  * ``s_vals: (np.ndarray)`` of length :math:`d \times m` --
@@ -115,9 +136,22 @@ Each column in each of ``x_vals``, ``s_vals``, ``f_vals``, and ``c_vals``
 will correspond to a specific design variable, simulation output,
 objective function, or constraint, determined by the order in
 which they were added to the MOOP.
-For first-time users, this execution mode may be confusing;
+
+*For first-time users, this execution mode may be confusing;
 however, for advanced users, the convenience of using numpy.ndarrays
-over structured arrays may be preferable.
+over structured arrays may be preferable.*
+
+You can still use the type-getter methods from the previous section to
+check the dtype of each output, knowing that
+
+ * :meth:`MOOP.getDesignType() <moop.MOOP.getDesignType>`
+   is the dtype of the ``x_vals`` key (when present).
+ * :meth:`MOOP.getSimulationType() <moop.MOOP.getSimulationType>`
+   is the dtype of the ``s_vals`` key (when present),
+ * :meth:`MOOP.getObjectiveType() <moop.MOOP.getObjectiveType>`
+   is the dtype of the ``f_vals`` key (when present), and
+ * :meth:`MOOP.getConstraintType() <moop.MOOP.getConstraintType>`
+   is the dtype of the ``c_vals`` key (when present).
 
 .. literalinclude:: ../examples/unnamed_var_ex.py
     :language: python
@@ -135,6 +169,7 @@ Design variables are added to your :mod:`MOOP <moop.MOOP>` object
 using the :meth:`addDesign(*args) <moop.MOOP.addDesign>` method.
 ParMOO currently supports
 two types of design variables:
+
  * ``continuous`` and
  * ``categorical``.
 
@@ -185,9 +220,11 @@ Adding Simulations
 
 Before you can add a simulation to your :mod:`MOOP <moop.MOOP>`, you must
 define the simulation function.
+
+*The simulation function can be either a Python function or a callable object.*
+
 The expected signature of your simulation function depends on whether you
 are working with :ref:`named or unnamed outputs <naming>`.
-%GW: Shouldn't the "or" not be in italics?
 
 When working with named variables, the simulation should take a single
 numpy structured array as input, whose keys match the design variable
@@ -229,7 +266,6 @@ use the :meth:`addSimulation(*args) <moop.MOOP.addSimulation>` method.
                         'surrogate': GaussRBF, # surrogate model
                         'hyperparams': {'search_budget': 20}})
 
-%GW: Why is this in bold in  the  pdf?
 In the above example,
  * ``name`` is used as described in :ref:`named or unnamed outputs <naming>`;
  * ``m`` specifies the number of outputs for this simulation;
@@ -250,17 +286,7 @@ If you wish, you may create a MOOP without any simulations.
 Using a Precomputed Simulation Database
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-%GW: Why bold  first  sentence?
-The simulation dictionary may actually contain one additional key:
- * The ``sim_db`` key specifies a database of precomputed simulation
-   outputs, which will be used when fitting the surrogate models.
-
-%GW: Again, why  is  "or" in  italics  (presumably  for   ref?)
-Currently, this particular input does not support both of ParMOO's
-execution modes (:ref:`named or unnamed outputs <naming>`), so
-we do not encourage its usage and may remove it in the future.
-Instead, if you would like to specify a precomputed database, you could
-use the
+If you would like to specify a precomputed database, use the
 :meth:`MOOP.update_sim_db(x, sx, s_name) <moop.MOOP.update_sim_db>`
 method to add all simulation data into ParMOO's database after creating
 your MOOP but before solving.
@@ -279,11 +305,15 @@ Adding Objectives
 
 Objectives are algebraic functions of your design variables and
 simulation outputs.
-ParMOO always minimizes objectives.
-To define an objective, make sure you match the expected signature,
-which depends on whether you are using
+*ParMOO always minimizes objectives.*
+If you would like to maximize instead, re-define the problem by minimizing
+the negative-value of your objective.
+
+Just like with simulation functions, ParMOO accepts either a Python
+function or a callable object for each objective.
+Make sure you match the expected signature, which depends on whether you are
+using
 :ref:`named or unnamed outputs <naming>`.
-%GW: or italics?
 
 For named outputs, your objective function should accept two
 numpy structured arrays and return a single scalar output.
@@ -292,7 +322,7 @@ named ``MySim.``
 
 .. code-block:: python
 
-def min_sim(x, sim):
+    def min_sim(x, sim):
         return sim["MySim"]
 
 Similarly, the following objective minimizes the squared value of the
@@ -308,6 +338,7 @@ If you are using a gradient-based
 then you are required to supply an additional input named ``der``, 
 which defaults to 0.
 The ``der`` input is used as follows:
+
  * ``der=0`` (default) implies that no derivatives are taken, and
    you will return the objective function value;
  * ``der=1`` implies that you will return an array of derivatives with
@@ -422,7 +453,7 @@ following constraint functions.
         return x["MyDes"] - 0.9
 
 As with objectives, if you want to use a gradient-based
-:mod:`SurrogateOptimizer <structs.SurrogateOptimizer,>` you must
+:mod:`SurrogateOptimizer <structs.SurrogateOptimizer>`, you must
 modify the above constraint functions as follows.
 
 .. code-block:: python
@@ -498,7 +529,6 @@ method.
     moop.addAcquisition({'acquisition': FixedWeights,
                          'hyperparams': {'weights': np.array([0.5, 0.5])}})
 
-%GW: why bold?
 The acquisition dictionary may contain two keys:
  * ``acquisition`` (required) specifies one
    :mod:`AcquisitionFunction <structs.AcquisitionFunction>`
@@ -510,9 +540,117 @@ The acquisition dictionary may contain two keys:
 The number of acquisitions added determines the batch size for each of
 ParMOO's batches of simulation evaluations (which could be done in parallel).
 **In general, if there are q acquisition functions and s simulations,
-the ParMOO will generate batches of q*s simulations**.
-In other words, each simulation is evaluated once per acquisition function in each
-iteration of ParMOO's algorithm.
+then ParMOO will generate batches of q*s simulations**.
+In other words, each simulation is evaluated once per acquisition function in
+each iteration of ParMOO's algorithm.
+
+Logging and Checkpointing
+-------------------------
+
+When solving large or expensive problems, it is often a good idea to
+activate ParMOO's logging and/or checkpointing features.
+
+Logging
+~~~~~~~
+
+For diagnostics, ParMOO logs its progress at the ``logging.INFO`` level.
+To display these log messages, turn on Python's ``INFO``-level logging.
+
+.. code-block:: python
+
+    import logging
+    logging.basicConfig(level=logging.INFO)
+
+If you would like to also print a formatted timestamp, use the Python
+logger's built-in formatting options.
+
+.. code-block:: python
+
+    import logging
+    logging.basicConfig(level=logging.INFO,
+                        [format='%(asctime)s %(levelname)-8s %(message)s',
+                         datefmt='%Y-%m-%d %H:%M:%S'])
+
+Be aware that when using ParMOO together with
+`libEnsemble <https://github.com/Libensemble/libensemble>`_,
+``libE`` already comes with its own logging tools, which are recommended,
+and ParMOO's logging tools will not work.
+
+Checkpointing
+~~~~~~~~~~~~~
+
+A ParMOO can be run with checkpointing turned on, so that your MOOP can be
+paused and resumed later, and your simulation data can be recovered after
+a crash.
+Checkpointing is off by default.
+To turn it on, use the method:
+
+ * :meth:`setCheckpoint(checkpoint, [checkpoint_data, filename]) <moop.MOOP.setCheckpoint>`
+
+.. code-block:: python
+
+    moop.setCheckpoint(True, checkpoint_data=True, filename="parmoo")
+
+The first argument tells ParMOO to save its internal class attributes and
+databases, so that they can be reloaded in the future.
+In the above example, this save data will be written to a file in the calling
+directory, with the name ``parmoo.moop``.
+
+In order to save the problem definition, ParMOO needs to store information
+for reloading all of your functions.
+For this to work:
+
+ * All functions (such as simulation functions, objective functions, and
+   constraint functions) are defined in the global scope;
+ * All modules are reloaded before attempting to recover a previously-saved
+   MOOP object (by calling the :meth:`load(filename) <moop.MOOP.load>` method);
+ * ParMOO cannot reload ``lambda`` functions. Use only regular functions
+   and callable objects when checkpointing.
+
+If the option argument ``checkpoint_data`` is set to ``True`` (default),
+the ParMOO will also save a second copy of all simulation evaluations in a
+human-readable JSON file in the same directory, with the name
+``parmoo.simdb.json``.
+This file is not used by ParMOO, it is only provided for user-convenience.
+
+Reloading After Crash or Early Stop
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+After a crash or early termination, reload the saved ``.moop`` file to resume.
+**Make sure that you first import any external modules and redefine any
+functions that are needed by ParMOO (with the exact same signatures).**
+
+.. code-block:: python
+
+    from parmoo import MOOP
+    from optimizers import [optimizer]
+
+    # Create a new MOOP object
+    moop = MOOP([optimizer])
+    # Reload the old problem
+    moop.load(filename="parmoo") # Use your savefile name, omitting ".moop"
+
+Then resume your solve with an increased budget.
+
+.. code-block:: python
+
+    # Resume solve with increased budget
+    moop.solve(6)
+
+Example
+~~~~~~~
+
+The example below shows how the `Quickstart demo <quickstart_ex>`_ can be
+modified to use logging and checkpointing, including an example of how
+to load a MOOP from a saved checkpoint file and resume running.
+
+.. literalinclude:: ../examples/checkpointing.py
+    :language: python
+
+The result is the following.
+
+.. literalinclude:: ../examples/checkpointing.out
+
 
 Methods for Solving
 -------------------
@@ -535,14 +673,14 @@ without ever attempting to solve a single scalarized surrogate problems.
 
 Note that the above command will perform all simulation evaluations serially.
 To generate a batch of simulations that you could evaluate in parallel,
-use :meth:`MOOP.iterate(k) <moop.MOOP.iterate,>` where ``k`` is the iteration
+use :meth:`MOOP.iterate(k) <moop.MOOP.iterate>`, where ``k`` is the iteration
 index.
 You can let ParMOO handle the simulation evaluations with
-:meth:`MOOP.evaluateSimulation(x, s_name) <moop.MOOP.evaluateSimulation>,`
+:meth:`MOOP.evaluateSimulation(x, s_name) <moop.MOOP.evaluateSimulation>`,
 or you can evaluate the simulations yourself and add them to the simulation
 database using
-:meth:`MOOP.update_sim_db(x, sx, s_name) <moop.MOOP.update_sim_db>.`
-Afterward, call `MOOP.updateAll(k, batch) <moop.MOOP.updateAll>` to
+:meth:`MOOP.update_sim_db(x, sx, s_name) <moop.MOOP.update_sim_db>`.
+Afterward, call :meth:`MOOP.updateAll(k, batch) <moop.MOOP.updateAll>` to
 update the surrogate models and objective database.
 
 .. code-block:: python
@@ -606,13 +744,14 @@ Built-in and Custom Components
 
 By now you can see that the performance of ParMOO is determined
 by your choices of
+
  * :mod:`AcquisitionFunction <structs.AcquisitionFunction>`,
  * :mod:`GlobalSearch <structs.GlobalSearch>`,
  * :mod:`SurrogateFunction <structs.SurrogateFunction>`, and
  * :mod:`SurrogateOptimizer <structs.SurrogateOptimizer>`.
 
-%GW: Why bold?
 You can find the current options for each of these in the following modules.
+
  * :doc:`parmoo.acquisitions <modules/acquisitions>`
  * :doc:`parmoo.searches <modules/searches>`
  * :doc:`parmoo.surrogates <modules/surrogates>`
diff --git a/docs/img/logo-ParMOO_white.png b/docs/img/logo-ParMOO_white.png
new file mode 100644
index 0000000..07394d7
Binary files /dev/null and b/docs/img/logo-ParMOO_white.png differ
diff --git a/docs/img/moop-uml.png b/docs/img/moop-uml.png
new file mode 100644
index 0000000..504a71c
Binary files /dev/null and b/docs/img/moop-uml.png differ
diff --git a/docs/img/moop-uml.svg b/docs/img/moop-uml.svg
index 27e0281..98d459a 100644
--- a/docs/img/moop-uml.svg
+++ b/docs/img/moop-uml.svg
@@ -1,6 +1,6 @@
 <?xml version='1.0'?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"><!-- Generated by graphviz version 2.36.0 (20140111.2315)
- --><!-- Title: structs Pages: 1 --><svg height='696pt' xmlns:svg='http://www.w3.org/2000/svg' viewBox='0.00 0.00 936.00 696.00' weidth='936pt' width='936pt' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns='http://www.w3.org/2000/svg'><defs><style type='text/css'>
+ --><!-- Title: structs Pages: 1 --><svg height='802pt' xmlns:svg='http://www.w3.org/2000/svg' viewBox='0.00 0.00 936.00 802.00' weidth='936pt' width='936pt' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns='http://www.w3.org/2000/svg'><defs><style type='text/css'>
 				/* devanagari */
 				@font-face {
 				font-family: 'Dekko';
@@ -27,33 +27,40 @@
 				}
 
 			</style><filter filterRes='100' id='shadow' x='0' y='0'><feGaussianBlur stdDeviation='2 2'/><feOffset dx='2' dy='2'/></filter><linearGradient id='aliceblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f0f8ff;stop-opacity:1'/></linearGradient><linearGradient id='antiquewhite' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#faebd7;stop-opacity:1'/></linearGradient><linearGradient id='antiquewhite1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffefdb;stop-opacity:1'/></linearGradient><linearGradient id='antiquewhite2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eedfcc;stop-opacity:1'/></linearGradient><linearGradient id='antiquewhite3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdc0b0;stop-opacity:1'/></linearGradient><linearGradient id='antiquewhite4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b8378;stop-opacity:1'/></linearGradient><linearGradient id='aquamarine' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7fffd4;stop-opacity:1'/></linearGradient><linearGradient id='aquamarine1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7fffd4;stop-opacity:1'/></linearGradient><linearGradient id='aquamarine2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#76eec6;stop-opacity:1'/></linearGradient><linearGradient id='aquamarine3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#66cdaa;stop-opacity:1'/></linearGradient><linearGradient id='aquamarine4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#458b74;stop-opacity:1'/></linearGradient><linearGradient id='azure' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f0ffff;stop-opacity:1'/></linearGradient><linearGradient id='azure1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f0ffff;stop-opacity:1'/></linearGradient><linearGradient id='azure2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#e0eeee;stop-opacity:1'/></linearGradient><linearGradient id='azure3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#c1cdcd;stop-opacity:1'/></linearGradient><linearGradient id='azure4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#838b8b;stop-opacity:1'/></linearGradient><linearGradient id='beige' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f5f5dc;stop-opacity:1'/></linearGradient><linearGradient id='bisque' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffe4c4;stop-opacity:1'/></linearGradient><linearGradient id='bisque1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffe4c4;stop-opacity:1'/></linearGradient><linearGradient id='bisque2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eed5b7;stop-opacity:1'/></linearGradient><linearGradient id='bisque3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdb79e;stop-opacity:1'/></linearGradient><linearGradient id='bisque4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b7d6b;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#000000;stop-opacity:1'/></linearGradient><linearGradient id='blue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#0000ff;stop-opacity:1'/></linearGradient><linearGradient id='blue1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#0000ff;stop-opacity:1'/></linearGradient><linearGradient id='blue2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#0000ee;stop-opacity:1'/></linearGradient><linearGradient id='blue3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#0000cd;stop-opacity:1'/></linearGradient><linearGradient id='blue4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00008b;stop-opacity:1'/></linearGradient><linearGradient id='blueviolet' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8a2be2;stop-opacity:1'/></linearGradient><linearGradient id='brown' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#a52a2a;stop-opacity:1'/></linearGradient><linearGradient id='brown1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff4040;stop-opacity:1'/></linearGradient><linearGradient id='brown2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee3b3b;stop-opacity:1'/></linearGradient><linearGradient id='brown3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd3333;stop-opacity:1'/></linearGradient><linearGradient id='brown4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b2323;stop-opacity:1'/></linearGradient><linearGradient id='burlywood' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#deb887;stop-opacity:1'/></linearGradient><linearGradient id='burlywood1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffd39b;stop-opacity:1'/></linearGradient><linearGradient id='burlywood2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eec591;stop-opacity:1'/></linearGradient><linearGradient id='burlywood3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdaa7d;stop-opacity:1'/></linearGradient><linearGradient id='burlywood4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b7355;stop-opacity:1'/></linearGradient><linearGradient id='cadetblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#5f9ea0;stop-opacity:1'/></linearGradient><linearGradient id='cadetblue1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#98f5ff;stop-opacity:1'/></linearGradient><linearGradient id='cadetblue2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8ee5ee;stop-opacity:1'/></linearGradient><linearGradient id='cadetblue3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7ac5cd;stop-opacity:1'/></linearGradient><linearGradient id='cadetblue4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#53868b;stop-opacity:1'/></linearGradient><linearGradient id='chartreuse' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7fff00;stop-opacity:1'/></linearGradient><linearGradient id='chartreuse1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7fff00;stop-opacity:1'/></linearGradient><linearGradient id='chartreuse2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#76ee00;stop-opacity:1'/></linearGradient><linearGradient id='chartreuse3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#66cd00;stop-opacity:1'/></linearGradient><linearGradient id='chartreuse4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#458b00;stop-opacity:1'/></linearGradient><linearGradient id='chocolate' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#d2691e;stop-opacity:1'/></linearGradient><linearGradient id='chocolate1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff7f24;stop-opacity:1'/></linearGradient><linearGradient id='chocolate2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee7621;stop-opacity:1'/></linearGradient><linearGradient id='chocolate3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd661d;stop-opacity:1'/></linearGradient><linearGradient id='chocolate4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b4513;stop-opacity:1'/></linearGradient><linearGradient id='coral' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff7f50;stop-opacity:1'/></linearGradient><linearGradient id='coral1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff7256;stop-opacity:1'/></linearGradient><linearGradient id='coral2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee6a50;stop-opacity:1'/></linearGradient><linearGradient id='coral3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd5b45;stop-opacity:1'/></linearGradient><linearGradient id='coral4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b3e2f;stop-opacity:1'/></linearGradient><linearGradient id='cornflowerblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#6495ed;stop-opacity:1'/></linearGradient><linearGradient id='cornsilk' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fff8dc;stop-opacity:1'/></linearGradient><linearGradient id='cornsilk1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fff8dc;stop-opacity:1'/></linearGradient><linearGradient id='cornsilk2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eee8cd;stop-opacity:1'/></linearGradient><linearGradient id='cornsilk3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdc8b1;stop-opacity:1'/></linearGradient><linearGradient id='cornsilk4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b8878;stop-opacity:1'/></linearGradient><linearGradient id='crimson' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#dc143c;stop-opacity:1'/></linearGradient><linearGradient id='cyan' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00ffff;stop-opacity:1'/></linearGradient><linearGradient id='cyan1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00ffff;stop-opacity:1'/></linearGradient><linearGradient id='cyan2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00eeee;stop-opacity:1'/></linearGradient><linearGradient id='cyan3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00cdcd;stop-opacity:1'/></linearGradient><linearGradient id='cyan4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#008b8b;stop-opacity:1'/></linearGradient><linearGradient id='darkgoldenrod' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b8860b;stop-opacity:1'/></linearGradient><linearGradient id='darkgoldenrod1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffb90f;stop-opacity:1'/></linearGradient><linearGradient id='darkgoldenrod2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eead0e;stop-opacity:1'/></linearGradient><linearGradient id='darkgoldenrod3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd950c;stop-opacity:1'/></linearGradient><linearGradient id='darkgoldenrod4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b6508;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#006400;stop-opacity:1'/></linearGradient><linearGradient id='       ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#556b2f;stop-opacity:1'/></linearGradient><linearGradient id='darkolivegreen2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#bcee68;stop-opacity:1'/></linearGradient><linearGradient id='darkolivegreen3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#a2cd5a;stop-opacity:1'/></linearGradient><linearGradient id='darkolivegreen4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#6e8b3d;stop-opacity:1'/></linearGradient><linearGradient id='darkorange' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff8c00;stop-opacity:1'/></linearGradient><linearGradient id='darkorange1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff7f00;stop-opacity:1'/></linearGradient><linearGradient id='darkorange2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee7600;stop-opacity:1'/></linearGradient><linearGradient id='darkorange3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd6600;stop-opacity:1'/></linearGradient><linearGradient id='darkorange4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b4500;stop-opacity:1'/></linearGradient><linearGradient id='darkorchid' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#9932cc;stop-opacity:1'/></linearGradient><linearGradient id='darkorchid1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#bf3eff;stop-opacity:1'/></linearGradient><linearGradient id='darkorchid2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b23aee;stop-opacity:1'/></linearGradient><linearGradient id='darkorchid3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#9a32cd;stop-opacity:1'/></linearGradient><linearGradient id='darkorchid4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#68228b;stop-opacity:1'/></linearGradient><linearGradient id='darksalmon' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#e9967a;stop-opacity:1'/></linearGradient><linearGradient id='darkseagreen' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8fbc8f;stop-opacity:1'/></linearGradient><linearGradient id='darkseagreen1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#c1ffc1;stop-opacity:1'/></linearGradient><linearGradient id='darkseagreen2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b4eeb4;stop-opacity:1'/></linearGradient><linearGradient id='darkseagreen3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#9bcd9b;stop-opacity:1'/></linearGradient><linearGradient id='darkseagreen4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#698b69;stop-opacity:1'/></linearGradient><linearGradient id='darkslateblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#483d8b;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#2f4f4f;stop-opacity:1'/></linearGradient><linearGradient id='darkslategray2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8deeee;stop-opacity:1'/></linearGradient><linearGradient id='darkslategray3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#79cdcd;stop-opacity:1'/></linearGradient><linearGradient id='darkslategray4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#528b8b;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#2f4f4f;stop-opacity:1'/></linearGradient><linearGradient id='darkviolet' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#9400d3;stop-opacity:1'/></linearGradient><linearGradient id='deeppink' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff1493;stop-opacity:1'/></linearGradient><linearGradient id='deeppink1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff1493;stop-opacity:1'/></linearGradient><linearGradient id='deeppink2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee1289;stop-opacity:1'/></linearGradient><linearGradient id='deeppink3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd1076;stop-opacity:1'/></linearGradient><linearGradient id='deeppink4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b0a50;stop-opacity:1'/></linearGradient><linearGradient id='deepskyblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00bfff;stop-opacity:1'/></linearGradient><linearGradient id='deepskyblue1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00bfff;stop-opacity:1'/></linearGradient><linearGradient id='deepskyblue2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00b2ee;stop-opacity:1'/></linearGradient><linearGradient id='deepskyblue3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#009acd;stop-opacity:1'/></linearGradient><linearGradient id='deepskyblue4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00688b;stop-opacity:1'/></linearGradient><linearGradient id='       ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#696969;stop-opacity:1'/></linearGradient><linearGradient id='dodgerblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#1e90ff;stop-opacity:1'/></linearGradient><linearGradient id='dodgerblue1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#1e90ff;stop-opacity:1'/></linearGradient><linearGradient id='dodgerblue2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#1c86ee;stop-opacity:1'/></linearGradient><linearGradient id='dodgerblue3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#1874cd;stop-opacity:1'/></linearGradient><linearGradient id='dodgerblue4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#104e8b;stop-opacity:1'/></linearGradient><linearGradient id='firebrick' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b22222;stop-opacity:1'/></linearGradient><linearGradient id='firebrick1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff3030;stop-opacity:1'/></linearGradient><linearGradient id='firebrick2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee2c2c;stop-opacity:1'/></linearGradient><linearGradient id='firebrick3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd2626;stop-opacity:1'/></linearGradient><linearGradient id='firebrick4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b1a1a;stop-opacity:1'/></linearGradient><linearGradient id='floralwhite' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fffaf0;stop-opacity:1'/></linearGradient><linearGradient id='forestgreen' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#228b22;stop-opacity:1'/></linearGradient><linearGradient id='gainsboro' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#dcdcdc;stop-opacity:1'/></linearGradient><linearGradient id='ghostwhite' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f8f8ff;stop-opacity:1'/></linearGradient><linearGradient id='gold' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffd700;stop-opacity:1'/></linearGradient><linearGradient id='gold1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffd700;stop-opacity:1'/></linearGradient><linearGradient id='gold2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eec900;stop-opacity:1'/></linearGradient><linearGradient id='gold3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdad00;stop-opacity:1'/></linearGradient><linearGradient id='gold4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b7500;stop-opacity:1'/></linearGradient><linearGradient id='goldenrod' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#daa520;stop-opacity:1'/></linearGradient><linearGradient id='goldenrod1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffc125;stop-opacity:1'/></linearGradient><linearGradient id='goldenrod2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eeb422;stop-opacity:1'/></linearGradient><linearGradient id='goldenrod3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd9b1d;stop-opacity:1'/></linearGradient><linearGradient id='goldenrod4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b6914;stop-opacity:1'/></linearGradient><linearGradient id='gray' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#c0c0c0;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#000000;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#050505;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#0a0a0a;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#0f0f0f;stop-opacity:1'/></linearGradient><linearGradient id='       ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#141414;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#1a1a1a;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#1f1f1f;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#242424;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#292929;stop-opacity:1'/></linearGradient><linearGradient id='       ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#2e2e2e;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#333333;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#383838;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#3d3d3d;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#424242;stop-opacity:1'/></linearGradient><linearGradient id='       ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#474747;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#4d4d4d;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#525252;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#575757;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#5c5c5c;stop-opacity:1'/></linearGradient><linearGradient id='       ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#616161;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#666666;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#6b6b6b;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#707070;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#757575;stop-opacity:1'/></linearGradient><linearGradient id='       ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7a7a7a;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7f7f7f;stop-opacity:1'/></linearGradient><linearGradient id='gray52' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#858585;stop-opacity:1'/></linearGradient><linearGradient id='gray53' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#878787;stop-opacity:1'/></linearGradient><linearGradient id='gray54' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8a8a8a;stop-opacity:1'/></linearGradient><linearGradient id='gray55' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8c8c8c;stop-opacity:1'/></linearGradient><linearGradient id='gray56' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8f8f8f;stop-opacity:1'/></linearGradient><linearGradient id='gray57' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#919191;stop-opacity:1'/></linearGradient><linearGradient id='gray58' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#949494;stop-opacity:1'/></linearGradient><linearGradient id='gray59' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#969696;stop-opacity:1'/></linearGradient><linearGradient id='gray60' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#999999;stop-opacity:1'/></linearGradient><linearGradient id='gray61' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#9c9c9c;stop-opacity:1'/></linearGradient><linearGradient id='gray62' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#9e9e9e;stop-opacity:1'/></linearGradient><linearGradient id='gray63' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#a1a1a1;stop-opacity:1'/></linearGradient><linearGradient id='gray64' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#a3a3a3;stop-opacity:1'/></linearGradient><linearGradient id='gray65' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#a6a6a6;stop-opacity:1'/></linearGradient><linearGradient id='gray66' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#a8a8a8;stop-opacity:1'/></linearGradient><linearGradient id='gray67' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ababab;stop-opacity:1'/></linearGradient><linearGradient id='gray68' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#adadad;stop-opacity:1'/></linearGradient><linearGradient id='gray69' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b0b0b0;stop-opacity:1'/></linearGradient><linearGradient id='gray70' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b3b3b3;stop-opacity:1'/></linearGradient><linearGradient id='gray71' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b5b5b5;stop-opacity:1'/></linearGradient><linearGradient id='gray72' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b8b8b8;stop-opacity:1'/></linearGradient><linearGradient id='gray73' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#bababa;stop-opacity:1'/></linearGradient><linearGradient id='gray74' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#bdbdbd;stop-opacity:1'/></linearGradient><linearGradient id='gray75' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#bfbfbf;stop-opacity:1'/></linearGradient><linearGradient id='gray76' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#c2c2c2;stop-opacity:1'/></linearGradient><linearGradient id='gray77' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#c4c4c4;stop-opacity:1'/></linearGradient><linearGradient id='gray78' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#c7c7c7;stop-opacity:1'/></linearGradient><linearGradient id='gray79' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#c9c9c9;stop-opacity:1'/></linearGradient><linearGradient id='gray80' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cccccc;stop-opacity:1'/></linearGradient><linearGradient id='gray81' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cfcfcf;stop-opacity:1'/></linearGradient><linearGradient id='gray82' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#d1d1d1;stop-opacity:1'/></linearGradient><linearGradient id='gray83' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#d4d4d4;stop-opacity:1'/></linearGradient><linearGradient id='gray84' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#d6d6d6;stop-opacity:1'/></linearGradient><linearGradient id='gray85' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#d9d9d9;stop-opacity:1'/></linearGradient><linearGradient id='gray86' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#dbdbdb;stop-opacity:1'/></linearGradient><linearGradient id='gray87' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#dedede;stop-opacity:1'/></linearGradient><linearGradient id='gray88' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#e0e0e0;stop-opacity:1'/></linearGradient><linearGradient id='gray89' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#e3e3e3;stop-opacity:1'/></linearGradient><linearGradient id='gray90' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#e5e5e5;stop-opacity:1'/></linearGradient><linearGradient id='gray91' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#e8e8e8;stop-opacity:1'/></linearGradient><linearGradient id='gray92' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ebebeb;stop-opacity:1'/></linearGradient><linearGradient id='gray93' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ededed;stop-opacity:1'/></linearGradient><linearGradient id='gray94' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f0f0f0;stop-opacity:1'/></linearGradient><linearGradient id='gray95' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f2f2f2;stop-opacity:1'/></linearGradient><linearGradient id='gray96' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f5f5f5;stop-opacity:1'/></linearGradient><linearGradient id='gray97' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f7f7f7;stop-opacity:1'/></linearGradient><linearGradient id='gray98' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fafafa;stop-opacity:1'/></linearGradient><linearGradient id='gray99' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fcfcfc;stop-opacity:1'/></linearGradient><linearGradient id='gray100' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffffff;stop-opacity:1'/></linearGradient><linearGradient id='green' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00ff00;stop-opacity:1'/></linearGradient><linearGradient id='green1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00ff00;stop-opacity:1'/></linearGradient><linearGradient id='green2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00ee00;stop-opacity:1'/></linearGradient><linearGradient id='green3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00cd00;stop-opacity:1'/></linearGradient><linearGradient id='green4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#008b00;stop-opacity:1'/></linearGradient><linearGradient id='greenyellow' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#adff2f;stop-opacity:1'/></linearGradient><linearGradient id='grey' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#c0c0c0;stop-opacity:1'/></linearGradient><linearGradient id='       ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#000000;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#050505;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#0a0a0a;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#0f0f0f;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#141414;stop-opacity:1'/></linearGradient><linearGradient id='       ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#1a1a1a;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#1f1f1f;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#242424;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#292929;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#2e2e2e;stop-opacity:1'/></linearGradient><linearGradient id='       ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#333333;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#383838;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#3d3d3d;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#424242;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#474747;stop-opacity:1'/></linearGradient><linearGradient id='       ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#4d4d4d;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#525252;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#575757;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#5c5c5c;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#616161;stop-opacity:1'/></linearGradient><linearGradient id='       ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#666666;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#6b6b6b;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#707070;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#757575;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7a7a7a;stop-opacity:1'/></linearGradient><linearGradient id='       ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7f7f7f;stop-opacity:1'/></linearGradient><linearGradient id='grey52' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#858585;stop-opacity:1'/></linearGradient><linearGradient id='grey53' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#878787;stop-opacity:1'/></linearGradient><linearGradient id='grey54' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8a8a8a;stop-opacity:1'/></linearGradient><linearGradient id='grey55' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8c8c8c;stop-opacity:1'/></linearGradient><linearGradient id='grey56' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8f8f8f;stop-opacity:1'/></linearGradient><linearGradient id='grey57' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#919191;stop-opacity:1'/></linearGradient><linearGradient id='grey58' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#949494;stop-opacity:1'/></linearGradient><linearGradient id='grey59' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#969696;stop-opacity:1'/></linearGradient><linearGradient id='grey60' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#999999;stop-opacity:1'/></linearGradient><linearGradient id='grey61' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#9c9c9c;stop-opacity:1'/></linearGradient><linearGradient id='grey62' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#9e9e9e;stop-opacity:1'/></linearGradient><linearGradient id='grey63' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#a1a1a1;stop-opacity:1'/></linearGradient><linearGradient id='grey64' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#a3a3a3;stop-opacity:1'/></linearGradient><linearGradient id='grey65' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#a6a6a6;stop-opacity:1'/></linearGradient><linearGradient id='grey66' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#a8a8a8;stop-opacity:1'/></linearGradient><linearGradient id='grey67' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ababab;stop-opacity:1'/></linearGradient><linearGradient id='grey68' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#adadad;stop-opacity:1'/></linearGradient><linearGradient id='grey69' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b0b0b0;stop-opacity:1'/></linearGradient><linearGradient id='grey70' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b3b3b3;stop-opacity:1'/></linearGradient><linearGradient id='grey71' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b5b5b5;stop-opacity:1'/></linearGradient><linearGradient id='grey72' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b8b8b8;stop-opacity:1'/></linearGradient><linearGradient id='grey73' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#bababa;stop-opacity:1'/></linearGradient><linearGradient id='grey74' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#bdbdbd;stop-opacity:1'/></linearGradient><linearGradient id='grey75' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#bfbfbf;stop-opacity:1'/></linearGradient><linearGradient id='grey76' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#c2c2c2;stop-opacity:1'/></linearGradient><linearGradient id='grey77' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#c4c4c4;stop-opacity:1'/></linearGradient><linearGradient id='grey78' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#c7c7c7;stop-opacity:1'/></linearGradient><linearGradient id='grey79' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#c9c9c9;stop-opacity:1'/></linearGradient><linearGradient id='grey80' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cccccc;stop-opacity:1'/></linearGradient><linearGradient id='grey81' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cfcfcf;stop-opacity:1'/></linearGradient><linearGradient id='grey82' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#d1d1d1;stop-opacity:1'/></linearGradient><linearGradient id='grey83' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#d4d4d4;stop-opacity:1'/></linearGradient><linearGradient id='grey84' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#d6d6d6;stop-opacity:1'/></linearGradient><linearGradient id='grey85' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#d9d9d9;stop-opacity:1'/></linearGradient><linearGradient id='grey86' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#dbdbdb;stop-opacity:1'/></linearGradient><linearGradient id='grey87' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#dedede;stop-opacity:1'/></linearGradient><linearGradient id='grey88' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#e0e0e0;stop-opacity:1'/></linearGradient><linearGradient id='grey89' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#e3e3e3;stop-opacity:1'/></linearGradient><linearGradient id='grey90' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#e5e5e5;stop-opacity:1'/></linearGradient><linearGradient id='grey91' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#e8e8e8;stop-opacity:1'/></linearGradient><linearGradient id='grey92' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ebebeb;stop-opacity:1'/></linearGradient><linearGradient id='grey93' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ededed;stop-opacity:1'/></linearGradient><linearGradient id='grey94' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f0f0f0;stop-opacity:1'/></linearGradient><linearGradient id='grey95' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f2f2f2;stop-opacity:1'/></linearGradient><linearGradient id='grey96' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f5f5f5;stop-opacity:1'/></linearGradient><linearGradient id='grey97' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f7f7f7;stop-opacity:1'/></linearGradient><linearGradient id='grey98' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fafafa;stop-opacity:1'/></linearGradient><linearGradient id='grey99' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fcfcfc;stop-opacity:1'/></linearGradient><linearGradient id='grey100' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffffff;stop-opacity:1'/></linearGradient><linearGradient id='honeydew' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f0fff0;stop-opacity:1'/></linearGradient><linearGradient id='honeydew1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f0fff0;stop-opacity:1'/></linearGradient><linearGradient id='honeydew2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#e0eee0;stop-opacity:1'/></linearGradient><linearGradient id='honeydew3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#c1cdc1;stop-opacity:1'/></linearGradient><linearGradient id='honeydew4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#838b83;stop-opacity:1'/></linearGradient><linearGradient id='hotpink' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff69b4;stop-opacity:1'/></linearGradient><linearGradient id='hotpink1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff6eb4;stop-opacity:1'/></linearGradient><linearGradient id='hotpink2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee6aa7;stop-opacity:1'/></linearGradient><linearGradient id='hotpink3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd6090;stop-opacity:1'/></linearGradient><linearGradient id='hotpink4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b3a62;stop-opacity:1'/></linearGradient><linearGradient id='indianred' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd5c5c;stop-opacity:1'/></linearGradient><linearGradient id='indianred1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff6a6a;stop-opacity:1'/></linearGradient><linearGradient id='indianred2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee6363;stop-opacity:1'/></linearGradient><linearGradient id='indianred3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd5555;stop-opacity:1'/></linearGradient><linearGradient id='indianred4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b3a3a;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#4b0082;stop-opacity:1'/></linearGradient><linearGradient id='ivory1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fffff0;stop-opacity:1'/></linearGradient><linearGradient id='ivory2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eeeee0;stop-opacity:1'/></linearGradient><linearGradient id='ivory3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdcdc1;stop-opacity:1'/></linearGradient><linearGradient id='ivory4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b8b83;stop-opacity:1'/></linearGradient><linearGradient id='khaki' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f0e68c;stop-opacity:1'/></linearGradient><linearGradient id='khaki1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fff68f;stop-opacity:1'/></linearGradient><linearGradient id='khaki2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eee685;stop-opacity:1'/></linearGradient><linearGradient id='khaki3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdc673;stop-opacity:1'/></linearGradient><linearGradient id='khaki4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b864e;stop-opacity:1'/></linearGradient><linearGradient id='lavender' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#e6e6fa;stop-opacity:1'/></linearGradient><linearGradient id='lavenderblush' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fff0f5;stop-opacity:1'/></linearGradient><linearGradient id='lavenderblush1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fff0f5;stop-opacity:1'/></linearGradient><linearGradient id='lavenderblush2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eee0e5;stop-opacity:1'/></linearGradient><linearGradient id='lavenderblush3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdc1c5;stop-opacity:1'/></linearGradient><linearGradient id='lavenderblush4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b8386;stop-opacity:1'/></linearGradient><linearGradient id='lawngreen' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7cfc00;stop-opacity:1'/></linearGradient><linearGradient id='lemonchiffon' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fffacd;stop-opacity:1'/></linearGradient><linearGradient id='lemonchiffon1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fffacd;stop-opacity:1'/></linearGradient><linearGradient id='lemonchiffon2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eee9bf;stop-opacity:1'/></linearGradient><linearGradient id='lemonchiffon3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdc9a5;stop-opacity:1'/></linearGradient><linearGradient id='lemonchiffon4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b8970;stop-opacity:1'/></linearGradient><linearGradient id='lightblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#add8e6;stop-opacity:1'/></linearGradient><linearGradient id='lightblue1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#bfefff;stop-opacity:1'/></linearGradient><linearGradient id='lightblue2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b2dfee;stop-opacity:1'/></linearGradient><linearGradient id='lightblue3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#9ac0cd;stop-opacity:1'/></linearGradient><linearGradient id='lightblue4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#68838b;stop-opacity:1'/></linearGradient><linearGradient id='lightcoral' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f08080;stop-opacity:1'/></linearGradient><linearGradient id='lightcyan' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#e0ffff;stop-opacity:1'/></linearGradient><linearGradient id='lightcyan1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#e0ffff;stop-opacity:1'/></linearGradient><linearGradient id='lightcyan2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#d1eeee;stop-opacity:1'/></linearGradient><linearGradient id='lightcyan3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b4cdcd;stop-opacity:1'/></linearGradient><linearGradient id='lightcyan4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7a8b8b;stop-opacity:1'/></linearGradient><linearGradient id='lightgoldenrod' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eedd82;stop-opacity:1'/></linearGradient><linearGradient id='lightgoldenrod1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffec8b;stop-opacity:1'/></linearGradient><linearGradient id='lightgoldenrod2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eedc82;stop-opacity:1'/></linearGradient><linearGradient id='lightgoldenrod3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdbe70;stop-opacity:1'/></linearGradient><linearGradient id='lightgoldenrod4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b814c;stop-opacity:1'/></linearGradient><linearGradient id='lightgoldenrodyellow' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fafad2;stop-opacity:1'/></linearGradient><linearGradient id='lightgray' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#d3d3d3;stop-opacity:1'/></linearGradient><linearGradient id='lightpink' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffb6c1;stop-opacity:1'/></linearGradient><linearGradient id='lightpink1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffaeb9;stop-opacity:1'/></linearGradient><linearGradient id='lightpink2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eea2ad;stop-opacity:1'/></linearGradient><linearGradient id='lightpink3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd8c95;stop-opacity:1'/></linearGradient><linearGradient id='lightpink4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b5f65;stop-opacity:1'/></linearGradient><linearGradient id='lightsalmon' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffa07a;stop-opacity:1'/></linearGradient><linearGradient id='lightsalmon1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffa07a;stop-opacity:1'/></linearGradient><linearGradient id='lightsalmon2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee9572;stop-opacity:1'/></linearGradient><linearGradient id='lightsalmon3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd8162;stop-opacity:1'/></linearGradient><linearGradient id='lightsalmon4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b5742;stop-opacity:1'/></linearGradient><linearGradient id='lightseagreen' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#20b2aa;stop-opacity:1'/></linearGradient><linearGradient id='lightskyblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#87cefa;stop-opacity:1'/></linearGradient><linearGradient id='lightskyblue1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b0e2ff;stop-opacity:1'/></linearGradient><linearGradient id='lightskyblue2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#a4d3ee;stop-opacity:1'/></linearGradient><linearGradient id='lightskyblue3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8db6cd;stop-opacity:1'/></linearGradient><linearGradient id='lightskyblue4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#607b8b;stop-opacity:1'/></linearGradient><linearGradient id='lightslateblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8470ff;stop-opacity:1'/></linearGradient><linearGradient id='lightslategray' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#778899;stop-opacity:1'/></linearGradient><linearGradient id='lightslategrey' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#778899;stop-opacity:1'/></linearGradient><linearGradient id='lightsteelblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b0c4de;stop-opacity:1'/></linearGradient><linearGradient id='lightsteelblue1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cae1ff;stop-opacity:1'/></linearGradient><linearGradient id='lightsteelblue2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#bcd2ee;stop-opacity:1'/></linearGradient><linearGradient id='lightsteelblue3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#a2b5cd;stop-opacity:1'/></linearGradient><linearGradient id='lightsteelblue4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#6e7b8b;stop-opacity:1'/></linearGradient><linearGradient id='lightyellow' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffffe0;stop-opacity:1'/></linearGradient><linearGradient id='lightyellow1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffffe0;stop-opacity:1'/></linearGradient><linearGradient id='lightyellow2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eeeed1;stop-opacity:1'/></linearGradient><linearGradient id='lightyellow3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdcdb4;stop-opacity:1'/></linearGradient><linearGradient id='lightyellow4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b8b7a;stop-opacity:1'/></linearGradient><linearGradient id='limegreen' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#32cd32;stop-opacity:1'/></linearGradient><linearGradient id='linen' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#faf0e6;stop-opacity:1'/></linearGradient><linearGradient id='magenta' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff00ff;stop-opacity:1'/></linearGradient><linearGradient id='magenta1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff00ff;stop-opacity:1'/></linearGradient><linearGradient id='magenta2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee00ee;stop-opacity:1'/></linearGradient><linearGradient id='magenta3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd00cd;stop-opacity:1'/></linearGradient><linearGradient id='magenta4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b008b;stop-opacity:1'/></linearGradient><linearGradient id='maroon' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b03060;stop-opacity:1'/></linearGradient><linearGradient id='maroon1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff34b3;stop-opacity:1'/></linearGradient><linearGradient id='maroon2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee30a7;stop-opacity:1'/></linearGradient><linearGradient id='maroon3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd2990;stop-opacity:1'/></linearGradient><linearGradient id='maroon4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b1c62;stop-opacity:1'/></linearGradient><linearGradient id='mediumaquamarine' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#66cdaa;stop-opacity:1'/></linearGradient><linearGradient id='mediumblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#0000cd;stop-opacity:1'/></linearGradient><linearGradient id='mediumorchid' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ba55d3;stop-opacity:1'/></linearGradient><linearGradient id='mediumorchid1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#e066ff;stop-opacity:1'/></linearGradient><linearGradient id='mediumorchid2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#d15fee;stop-opacity:1'/></linearGradient><linearGradient id='mediumorchid3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b452cd;stop-opacity:1'/></linearGradient><linearGradient id='mediumorchid4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7a378b;stop-opacity:1'/></linearGradient><linearGradient id='mediumpurple' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#9370db;stop-opacity:1'/></linearGradient><linearGradient id='mediumpurple1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ab82ff;stop-opacity:1'/></linearGradient><linearGradient id='mediumpurple2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#9f79ee;stop-opacity:1'/></linearGradient><linearGradient id='mediumpurple3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8968cd;stop-opacity:1'/></linearGradient><linearGradient id='mediumpurple4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#5d478b;stop-opacity:1'/></linearGradient><linearGradient id='mediumseagreen' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#3cb371;stop-opacity:1'/></linearGradient><linearGradient id='mediumslateblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7b68ee;stop-opacity:1'/></linearGradient><linearGradient id='mediumspringgreen' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00fa9a;stop-opacity:1'/></linearGradient><linearGradient id='mediumturquoise' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#48d1cc;stop-opacity:1'/></linearGradient><linearGradient id='mediumvioletred' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#c71585;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#191970;stop-opacity:1'/></linearGradient><linearGradient id='mistyrose' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffe4e1;stop-opacity:1'/></linearGradient><linearGradient id='mistyrose1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffe4e1;stop-opacity:1'/></linearGradient><linearGradient id='mistyrose2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eed5d2;stop-opacity:1'/></linearGradient><linearGradient id='mistyrose3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdb7b5;stop-opacity:1'/></linearGradient><linearGradient id='mistyrose4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b7d7b;stop-opacity:1'/></linearGradient><linearGradient id='moccasin' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffe4b5;stop-opacity:1'/></linearGradient><linearGradient id='navajowhite' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffdead;stop-opacity:1'/></linearGradient><linearGradient id='navajowhite1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffdead;stop-opacity:1'/></linearGradient><linearGradient id='navajowhite2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eecfa1;stop-opacity:1'/></linearGradient><linearGradient id='navajowhite3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdb38b;stop-opacity:1'/></linearGradient><linearGradient id='navajowhite4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b795e;stop-opacity:1'/></linearGradient><linearGradient id='     ' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#000080;stop-opacity:1'/></linearGradient><linearGradient id='oldlace' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fdf5e6;stop-opacity:1'/></linearGradient><linearGradient id='olivedrab' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#6b8e23;stop-opacity:1'/></linearGradient><linearGradient id='olivedrab1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#c0ff3e;stop-opacity:1'/></linearGradient><linearGradient id='olivedrab2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b3ee3a;stop-opacity:1'/></linearGradient><linearGradient id='olivedrab3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#9acd32;stop-opacity:1'/></linearGradient><linearGradient id='olivedrab4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#698b22;stop-opacity:1'/></linearGradient><linearGradient id='orange' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffa500;stop-opacity:1'/></linearGradient><linearGradient id='orange1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffa500;stop-opacity:1'/></linearGradient><linearGradient id='orange2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee9a00;stop-opacity:1'/></linearGradient><linearGradient id='orange3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd8500;stop-opacity:1'/></linearGradient><linearGradient id='orange4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b5a00;stop-opacity:1'/></linearGradient><linearGradient id='orangered' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff4500;stop-opacity:1'/></linearGradient><linearGradient id='orangered1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff4500;stop-opacity:1'/></linearGradient><linearGradient id='orangered2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee4000;stop-opacity:1'/></linearGradient><linearGradient id='orangered3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd3700;stop-opacity:1'/></linearGradient><linearGradient id='orangered4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b2500;stop-opacity:1'/></linearGradient><linearGradient id='orchid' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#da70d6;stop-opacity:1'/></linearGradient><linearGradient id='orchid1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff83fa;stop-opacity:1'/></linearGradient><linearGradient id='orchid2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee7ae9;stop-opacity:1'/></linearGradient><linearGradient id='orchid3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd69c9;stop-opacity:1'/></linearGradient><linearGradient id='orchid4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b4789;stop-opacity:1'/></linearGradient><linearGradient id='palegoldenrod' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eee8aa;stop-opacity:1'/></linearGradient><linearGradient id='palegreen' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#98fb98;stop-opacity:1'/></linearGradient><linearGradient id='palegreen1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#9aff9a;stop-opacity:1'/></linearGradient><linearGradient id='palegreen2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#90ee90;stop-opacity:1'/></linearGradient><linearGradient id='palegreen3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7ccd7c;stop-opacity:1'/></linearGradient><linearGradient id='palegreen4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#548b54;stop-opacity:1'/></linearGradient><linearGradient id='paleturquoise' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#afeeee;stop-opacity:1'/></linearGradient><linearGradient id='paleturquoise1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#bbffff;stop-opacity:1'/></linearGradient><linearGradient id='paleturquoise2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#aeeeee;stop-opacity:1'/></linearGradient><linearGradient id='paleturquoise3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#96cdcd;stop-opacity:1'/></linearGradient><linearGradient id='paleturquoise4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#668b8b;stop-opacity:1'/></linearGradient><linearGradient id='palevioletred' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#db7093;stop-opacity:1'/></linearGradient><linearGradient id='palevioletred1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff82ab;stop-opacity:1'/></linearGradient><linearGradient id='palevioletred2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee799f;stop-opacity:1'/></linearGradient><linearGradient id='palevioletred3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd6889;stop-opacity:1'/></linearGradient><linearGradient id='palevioletred4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b475d;stop-opacity:1'/></linearGradient><linearGradient id='papayawhip' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffefd5;stop-opacity:1'/></linearGradient><linearGradient id='peachpuff' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffdab9;stop-opacity:1'/></linearGradient><linearGradient id='peachpuff1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffdab9;stop-opacity:1'/></linearGradient><linearGradient id='peachpuff2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eecbad;stop-opacity:1'/></linearGradient><linearGradient id='peachpuff3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdaf95;stop-opacity:1'/></linearGradient><linearGradient id='peachpuff4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b7765;stop-opacity:1'/></linearGradient><linearGradient id='peru' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd853f;stop-opacity:1'/></linearGradient><linearGradient id='pink' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffc0cb;stop-opacity:1'/></linearGradient><linearGradient id='pink1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffb5c5;stop-opacity:1'/></linearGradient><linearGradient id='pink2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eea9b8;stop-opacity:1'/></linearGradient><linearGradient id='pink3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd919e;stop-opacity:1'/></linearGradient><linearGradient id='pink4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b636c;stop-opacity:1'/></linearGradient><linearGradient id='plum' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#dda0dd;stop-opacity:1'/></linearGradient><linearGradient id='plum1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffbbff;stop-opacity:1'/></linearGradient><linearGradient id='plum2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eeaeee;stop-opacity:1'/></linearGradient><linearGradient id='plum3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd96cd;stop-opacity:1'/></linearGradient><linearGradient id='plum4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b668b;stop-opacity:1'/></linearGradient><linearGradient id='powderblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b0e0e6;stop-opacity:1'/></linearGradient><linearGradient id='purple' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#a020f0;stop-opacity:1'/></linearGradient><linearGradient id='purple1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#9b30ff;stop-opacity:1'/></linearGradient><linearGradient id='purple2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#912cee;stop-opacity:1'/></linearGradient><linearGradient id='purple3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7d26cd;stop-opacity:1'/></linearGradient><linearGradient id='purple4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#551a8b;stop-opacity:1'/></linearGradient><linearGradient id='red' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff0000;stop-opacity:1'/></linearGradient><linearGradient id='red1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff0000;stop-opacity:1'/></linearGradient><linearGradient id='red2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee0000;stop-opacity:1'/></linearGradient><linearGradient id='red3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd0000;stop-opacity:1'/></linearGradient><linearGradient id='red4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b0000;stop-opacity:1'/></linearGradient><linearGradient id='rosybrown' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#bc8f8f;stop-opacity:1'/></linearGradient><linearGradient id='rosybrown1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffc1c1;stop-opacity:1'/></linearGradient><linearGradient id='rosybrown2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eeb4b4;stop-opacity:1'/></linearGradient><linearGradient id='rosybrown3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd9b9b;stop-opacity:1'/></linearGradient><linearGradient id='rosybrown4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b6969;stop-opacity:1'/></linearGradient><linearGradient id='royalblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#4169e1;stop-opacity:1'/></linearGradient><linearGradient id='royalblue1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#4876ff;stop-opacity:1'/></linearGradient><linearGradient id='royalblue2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#436eee;stop-opacity:1'/></linearGradient><linearGradient id='royalblue3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#3a5fcd;stop-opacity:1'/></linearGradient><linearGradient id='royalblue4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#27408b;stop-opacity:1'/></linearGradient><linearGradient id='saddlebrown' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b4513;stop-opacity:1'/></linearGradient><linearGradient id='salmon' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fa8072;stop-opacity:1'/></linearGradient><linearGradient id='salmon1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff8c69;stop-opacity:1'/></linearGradient><linearGradient id='salmon2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee8262;stop-opacity:1'/></linearGradient><linearGradient id='salmon3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd7054;stop-opacity:1'/></linearGradient><linearGradient id='salmon4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b4c39;stop-opacity:1'/></linearGradient><linearGradient id='sandybrown' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f4a460;stop-opacity:1'/></linearGradient><linearGradient id='seagreen' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#2e8b57;stop-opacity:1'/></linearGradient><linearGradient id='seagreen1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#54ff9f;stop-opacity:1'/></linearGradient><linearGradient id='seagreen2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#4eee94;stop-opacity:1'/></linearGradient><linearGradient id='seagreen3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#43cd80;stop-opacity:1'/></linearGradient><linearGradient id='seagreen4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#2e8b57;stop-opacity:1'/></linearGradient><linearGradient id='seashell' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fff5ee;stop-opacity:1'/></linearGradient><linearGradient id='seashell1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fff5ee;stop-opacity:1'/></linearGradient><linearGradient id='seashell2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eee5de;stop-opacity:1'/></linearGradient><linearGradient id='seashell3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdc5bf;stop-opacity:1'/></linearGradient><linearGradient id='seashell4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b8682;stop-opacity:1'/></linearGradient><linearGradient id='sienna' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#a0522d;stop-opacity:1'/></linearGradient><linearGradient id='sienna1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff8247;stop-opacity:1'/></linearGradient><linearGradient id='sienna2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee7942;stop-opacity:1'/></linearGradient><linearGradient id='sienna3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd6839;stop-opacity:1'/></linearGradient><linearGradient id='sienna4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b4726;stop-opacity:1'/></linearGradient><linearGradient id='skyblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#87ceeb;stop-opacity:1'/></linearGradient><linearGradient id='skyblue1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#87ceff;stop-opacity:1'/></linearGradient><linearGradient id='skyblue2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7ec0ee;stop-opacity:1'/></linearGradient><linearGradient id='skyblue3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#6ca6cd;stop-opacity:1'/></linearGradient><linearGradient id='skyblue4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#4a708b;stop-opacity:1'/></linearGradient><linearGradient id='slateblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#6a5acd;stop-opacity:1'/></linearGradient><linearGradient id='slateblue1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#836fff;stop-opacity:1'/></linearGradient><linearGradient id='slateblue2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#7a67ee;stop-opacity:1'/></linearGradient><linearGradient id='slateblue3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#6959cd;stop-opacity:1'/></linearGradient><linearGradient id='slateblue4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#473c8b;stop-opacity:1'/></linearGradient><linearGradient id='slategray' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#708090;stop-opacity:1'/></linearGradient><linearGradient id='slategray1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#c6e2ff;stop-opacity:1'/></linearGradient><linearGradient id='slategray2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#b9d3ee;stop-opacity:1'/></linearGradient><linearGradient id='slategray3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#9fb6cd;stop-opacity:1'/></linearGradient><linearGradient id='slategray4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#6c7b8b;stop-opacity:1'/></linearGradient><linearGradient id='slategrey' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#708090;stop-opacity:1'/></linearGradient><linearGradient id='snow' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fffafa;stop-opacity:1'/></linearGradient><linearGradient id='snow1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fffafa;stop-opacity:1'/></linearGradient><linearGradient id='snow2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eee9e9;stop-opacity:1'/></linearGradient><linearGradient id='snow3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdc9c9;stop-opacity:1'/></linearGradient><linearGradient id='snow4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b8989;stop-opacity:1'/></linearGradient><linearGradient id='springgreen' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00ff7f;stop-opacity:1'/></linearGradient><linearGradient id='springgreen1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00ff7f;stop-opacity:1'/></linearGradient><linearGradient id='springgreen2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00ee76;stop-opacity:1'/></linearGradient><linearGradient id='springgreen3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00cd66;stop-opacity:1'/></linearGradient><linearGradient id='springgreen4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#008b45;stop-opacity:1'/></linearGradient><linearGradient id='steelblue' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#4682b4;stop-opacity:1'/></linearGradient><linearGradient id='steelblue1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#63b8ff;stop-opacity:1'/></linearGradient><linearGradient id='steelblue2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#5cacee;stop-opacity:1'/></linearGradient><linearGradient id='steelblue3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#4f94cd;stop-opacity:1'/></linearGradient><linearGradient id='steelblue4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#36648b;stop-opacity:1'/></linearGradient><linearGradient id='tan' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#d2b48c;stop-opacity:1'/></linearGradient><linearGradient id='tan1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffa54f;stop-opacity:1'/></linearGradient><linearGradient id='tan2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee9a49;stop-opacity:1'/></linearGradient><linearGradient id='tan3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd853f;stop-opacity:1'/></linearGradient><linearGradient id='tan4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b5a2b;stop-opacity:1'/></linearGradient><linearGradient id='thistle' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#d8bfd8;stop-opacity:1'/></linearGradient><linearGradient id='thistle1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffe1ff;stop-opacity:1'/></linearGradient><linearGradient id='thistle2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eed2ee;stop-opacity:1'/></linearGradient><linearGradient id='thistle3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdb5cd;stop-opacity:1'/></linearGradient><linearGradient id='thistle4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b7b8b;stop-opacity:1'/></linearGradient><linearGradient id='tomato' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff6347;stop-opacity:1'/></linearGradient><linearGradient id='tomato1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff6347;stop-opacity:1'/></linearGradient><linearGradient id='tomato2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee5c42;stop-opacity:1'/></linearGradient><linearGradient id='tomato3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd4f39;stop-opacity:1'/></linearGradient><linearGradient id='tomato4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b3626;stop-opacity:1'/></linearGradient><linearGradient id='transparent' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#fffffe;stop-opacity:1'/></linearGradient><linearGradient id='turquoise' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#40e0d0;stop-opacity:1'/></linearGradient><linearGradient id='turquoise1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00f5ff;stop-opacity:1'/></linearGradient><linearGradient id='turquoise2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00e5ee;stop-opacity:1'/></linearGradient><linearGradient id='turquoise3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00c5cd;stop-opacity:1'/></linearGradient><linearGradient id='turquoise4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#00868b;stop-opacity:1'/></linearGradient><linearGradient id='violet' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee82ee;stop-opacity:1'/></linearGradient><linearGradient id='violetred' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#d02090;stop-opacity:1'/></linearGradient><linearGradient id='violetred1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ff3e96;stop-opacity:1'/></linearGradient><linearGradient id='violetred2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ee3a8c;stop-opacity:1'/></linearGradient><linearGradient id='violetred3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cd3278;stop-opacity:1'/></linearGradient><linearGradient id='violetred4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b2252;stop-opacity:1'/></linearGradient><linearGradient id='wheat' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f5deb3;stop-opacity:1'/></linearGradient><linearGradient id='wheat1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffe7ba;stop-opacity:1'/></linearGradient><linearGradient id='wheat2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eed8ae;stop-opacity:1'/></linearGradient><linearGradient id='wheat3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdba96;stop-opacity:1'/></linearGradient><linearGradient id='wheat4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b7e66;stop-opacity:1'/></linearGradient><linearGradient id='white' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffffff;stop-opacity:1'/></linearGradient><linearGradient id='whitesmoke' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#f5f5f5;stop-opacity:1'/></linearGradient><linearGradient id='yellow' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffff00;stop-opacity:1'/></linearGradient><linearGradient id='yellow1' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#ffff00;stop-opacity:1'/></linearGradient><linearGradient id='yellow2' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#eeee00;stop-opacity:1'/></linearGradient><linearGradient id='yellow3' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#cdcd00;stop-opacity:1'/></linearGradient><linearGradient id='yellow4' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#8b8b00;stop-opacity:1'/></linearGradient><linearGradient id='yellowgreen' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:#9acd32;stop-opacity:1'/></linearGradient><linearGradient id='lightgrey' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:rgb(220,220,220);stop-opacity:1'/></linearGradient><linearGradient id='none' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(255,255,255);stop-opacity:1'/><stop offset='100%' style='stop-color:rgb(255,255,255);stop-opacity:1'/></linearGradient><linearGradient id='black' x1='0%' x2='100%' y1='0%' y2='100%'><stop offset='0%' style='stop-color:rgb(150,150,150);stop-opacity:2'/><stop offset='100%' style='stop-color:rgb(0,0,0);stop-opacity:2'/></linearGradient></defs>
-<g class='graph' id='graph0' transform='scale(1 1) rotate(0) translate(4 662)'><title>structs</title><g class='node' id='node1'><title>MOOP</title>
-<polygon fill='white' points='339.5,-270.5 339.5,-657.5 648.5,-657.5 648.5,-270.5 339.5,-270.5' stroke='black' style='fill:white;stroke:black;'/>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-639.3'>&lt;&lt;class&gt;&gt;</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-624.3'>MOOP</text>
-<polyline fill='none' points='339.5,-613.5 648.5,-613.5 ' stroke='black'/>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-595.3'>Scalar Surrogate Problem Solver: SurrogateOptimizer</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-580.3'> Global Hyperparameters: dict</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-565.3'> List of Design Variables: list</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-550.3'> List of Simulations: list</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-535.3'> List of Objectives: list</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-520.3'> List of Constraints: list</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-505.3'> List of Acquisitions: list</text>
-<polyline fill='none' points='339.5,-494.5 648.5,-494.5 ' stroke='black'/>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-476.3'>addDesign(*args)</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-461.3'> addSimulation(*args)</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-446.3'> addObjective(*args)</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-431.3'> addConstraint(*args)</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-416.3'> addAcquisition(*args)</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-401.3'> iterate(k)</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-386.3'> updateAll(k, batch)</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-371.3'> check_sim_db(x, s_name)</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-356.3'> update_sim_db(x, sx, s_name)</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-341.3'> evaluateSimulation(x, s_name)</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-326.3'> solve(budget)</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-311.3'> getPF()</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-296.3'> getSimulationData()</text>
-<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-281.3'> getObjectiveData()</text>
+<g class='graph' id='graph0' transform='scale(1 1) rotate(0) translate(4 768)'><title>structs</title><g class='node' id='node1'><title>MOOP</title>
+<polygon fill='white' points='288.5,-271 288.5,-763 699.5,-763 699.5,-271 288.5,-271' stroke='black' style='fill:white;stroke:black;'/>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-744.8'>&lt;&lt;class&gt;&gt;</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-729.8'>MOOP</text>
+<polyline fill='none' points='288.5,-719 699.5,-719 ' stroke='black'/>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-700.8'>Scalar Surrogate Problem Solver: SurrogateOptimizer</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-685.8'> Global Hyperparameters: dict</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-670.8'> List of Design Variables: list</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-655.8'> List of Simulations: list</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-640.8'> List of Objectives: list</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-625.8'> List of Constraints: list</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-610.8'> List of Acquisitions: list</text>
+<polyline fill='none' points='288.5,-600 699.5,-600 ' stroke='black'/>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-581.8'>addDesign(*args)</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-566.8'> addSimulation(*args)</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-551.8'> addObjective(*args)</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-536.8'> addConstraint(*args)</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-521.8'> addAcquisition(*args)</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-506.8'> getDesignType()</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-491.8'> getSimulationType()</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-476.8'> getObjectiveType()</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-461.8'> getConstraintType()</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-446.8'> save(filename="parmoo")</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-431.8'> load(filename="parmoo")</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-416.8'> setCheckpoint(checkpoint, checkpoint_data=True, filename="parmoo")</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-401.8'> iterate(k)</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-386.8'> updateAll(k, batch)</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-371.8'> check_sim_db(x, s_name)</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-356.8'> update_sim_db(x, sx, s_name)</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-341.8'> evaluateSimulation(x, s_name)</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-326.8'> solve(budget)</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-311.8'> getPF()</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-296.8'> getSimulationData()</text>
+<text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-281.8'> getObjectiveData()</text>
 </g><g class='node' id='node2'><title>Design Variable</title>
 <polygon fill='white' points='0,-16 0,-164 216,-164 216,-16 0,-16' stroke='black' style='fill:white;stroke:black;'/>
 <text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='108' y='-145.8'>&lt;&lt;dict&gt;&gt;</text>
@@ -66,10 +73,10 @@
 <text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='108' y='-41.8'>tol: float (only when 'continuous')</text>
 <text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='108' y='-26.8'>levels: int (only when 'categorical')</text>
 </g><g class='edge' id='edge1'><title>MOOP-&gt;Design Variable</title>
-<path d='M330.415,-305.348C282.367,-259.043 231.829,-210.338 191.091,-171.077' fill='none' stroke='black'/>
-<polygon fill='none' points='330.583,-305.51 337.679,-306.793 339.223,-313.837 332.127,-312.553 330.583,-305.51' stroke='black'/>
-<polygon fill='black' points='183.862,-164.11 194.185,-167.809 187.462,-167.58 191.062,-171.05 191.062,-171.05 191.062,-171.05 187.462,-167.58 187.94,-174.29 183.862,-164.11 183.862,-164.11' stroke='black'/>
-<text style='font-size:8px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='192.647' y='-178.377'>n</text>
+<path d='M280.094,-280.481C244.615,-241.419 210.091,-203.405 181.391,-171.806' fill='none' stroke='black'/>
+<polygon fill='none' points='280.218,-280.618 287.213,-282.371 288.286,-289.501 281.291,-287.749 280.218,-280.618' stroke='black'/>
+<polygon fill='black' points='174.603,-164.333 184.658,-168.71 177.965,-168.034 181.327,-171.735 181.327,-171.735 181.327,-171.735 177.965,-168.034 177.995,-174.761 174.603,-164.333 174.603,-164.333' stroke='black'/>
+<text style='font-size:8px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='182.175' y='-179.144'>n</text>
 </g><g class='node' id='node3'><title>Simulation</title>
 <polygon fill='white' points='234.5,-1 234.5,-179 407.5,-179 407.5,-1 234.5,-1' stroke='black' style='fill:white;stroke:black;'/>
 <text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='321' y='-160.8'>&lt;&lt;dict&gt;&gt;</text>
@@ -84,10 +91,10 @@
 <text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='321' y='-26.8'>hyperparams: dict</text>
 <text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='321' y='-11.8'>sim_db: dict, optional</text>
 </g><g class='edge' id='edge2'><title>MOOP-&gt;Simulation</title>
-<path d='M399.25,-259.26C387.826,-234.696 376.596,-210.549 366.367,-188.552' fill='none' stroke='black'/>
-<polygon fill='none' points='399.399,-259.581 405.556,-263.335 404.46,-270.462 398.302,-266.708 399.399,-259.581' stroke='black'/>
-<polygon fill='black' points='362.047,-179.262 370.344,-186.432 364.155,-183.796 366.263,-188.329 366.263,-188.329 366.263,-188.329 364.155,-183.796 362.183,-190.227 362.047,-179.262 362.047,-179.262' stroke='black'/>
-<text style='font-size:8px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='363.769' y='-195.488'>s</text>
+<path d='M389.594,-259.511C379.474,-234.65 369.696,-210.629 360.847,-188.891' fill='none' stroke='black'/>
+<polygon fill='none' points='389.718,-259.816 395.685,-263.865 394.242,-270.93 388.275,-266.881 389.718,-259.816' stroke='black'/>
+<polygon fill='black' points='356.982,-179.395 364.92,-186.961 358.867,-184.026 360.752,-188.658 360.752,-188.658 360.752,-188.658 358.867,-184.026 356.584,-190.354 356.982,-179.395 356.982,-179.395' stroke='black'/>
+<text style='font-size:8px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='357.732' y='-195.681'>s</text>
 </g><g class='node' id='node4'><title>Objective</title>
 <polygon fill='white' points='425.5,-46 425.5,-134 562.5,-134 562.5,-46 425.5,-46' stroke='black' style='fill:white;stroke:black;'/>
 <text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-115.8'>&lt;&lt;dict&gt;&gt;</text>
@@ -96,10 +103,10 @@
 <text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-71.8'>name: String, optional</text>
 <text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='494' y='-56.8'>obj_func: function</text>
 </g><g class='edge' id='edge3'><title>MOOP-&gt;Objective</title>
-<path d='M494,-258.174C494,-215.999 494,-175.127 494,-144.355' fill='none' stroke='black'/>
-<polygon fill='none' points='494,-258.462 498,-264.462 494,-270.462 490,-264.462 494,-258.462' stroke='black'/>
-<polygon fill='black' points='494,-134.318 498.5,-144.318 494,-139.318 494,-144.318 494,-144.318 494,-144.318 494,-139.318 489.5,-144.318 494,-134.318 494,-134.318' stroke='black'/>
-<text style='font-size:8px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='487.16' y='-149.412'>o</text>
+<path d='M494,-258.898C494,-215.603 494,-174.895 494,-144.407' fill='none' stroke='black'/>
+<polygon fill='none' points='494,-258.93 498,-264.93 494,-270.93 490,-264.93 494,-258.93' stroke='black'/>
+<polygon fill='black' points='494,-134.062 498.5,-144.062 494,-139.062 494,-144.062 494,-144.062 494,-144.062 494,-139.062 489.5,-144.062 494,-134.062 494,-134.062' stroke='black'/>
+<text style='font-size:8px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='487.16' y='-149.156'>o</text>
 </g><g class='node' id='node5'><title>Constraint</title>
 <polygon fill='white' points='580.5,-46 580.5,-134 717.5,-134 717.5,-46 580.5,-46' stroke='black' style='fill:white;stroke:black;'/>
 <text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='649' y='-115.8'>&lt;&lt;dict&gt;&gt;</text>
@@ -108,10 +115,10 @@
 <text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='649' y='-71.8'>name: String, optional</text>
 <text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='649' y='-56.8'>constraint: function</text>
 </g><g class='edge' id='edge4'><title>MOOP-&gt;Constraint</title>
-<path d='M578.846,-259.371C596.732,-216.443 614.092,-174.779 627.069,-143.636' fill='none' stroke='black'/>
-<polygon fill='none' points='578.84,-259.385 580.224,-266.462 574.224,-270.462 572.84,-263.385 578.84,-259.385' stroke='black'/>
-<polygon fill='black' points='630.951,-134.318 631.258,-145.28 629.028,-138.934 627.104,-143.549 627.104,-143.549 627.104,-143.549 629.028,-138.934 622.951,-141.818 630.951,-134.318 630.951,-134.318' stroke='black'/>
-<text style='font-size:8px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='617.408' y='-145.336'>p</text>
+<path d='M587.543,-259.512C603.547,-215.63 618.596,-174.365 629.797,-143.653' fill='none' stroke='black'/>
+<polygon fill='none' points='587.49,-259.657 589.192,-266.664 583.378,-270.93 581.676,-263.923 587.49,-259.657' stroke='black'/>
+<polygon fill='black' points='633.295,-134.062 634.096,-144.999 631.582,-138.759 629.869,-143.457 629.869,-143.457 629.869,-143.457 631.582,-138.759 625.641,-141.915 633.295,-134.062 633.295,-134.062' stroke='black'/>
+<text style='font-size:8px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='620.429' y='-145.675'>p</text>
 </g><g class='node' id='node6'><title>Acquisition</title>
 <polygon fill='white' points='736,-46 736,-134 928,-134 928,-46 736,-46' stroke='black' style='fill:white;stroke:black;'/>
 <text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='832' y='-115.8'>&lt;&lt;dict&gt;&gt;</text>
@@ -120,9 +127,9 @@
 <text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='832' y='-71.8'>acquisition: AcquisitionFunction</text>
 <text style='font-size:10px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='832' y='-56.8'>hyperparams: dict</text>
 </g><g class='edge' id='edge5'><title>MOOP-&gt;Acquisition</title>
-<path d='M656.772,-283.854C704.033,-231.84 751.943,-179.11 785.694,-141.964' fill='none' stroke='black'/>
-<polygon fill='none' points='656.727,-283.904 655.652,-291.035 648.657,-292.786 649.731,-285.655 656.727,-283.904' stroke='black'/>
-<polygon fill='black' points='792.676,-134.28 789.282,-144.707 789.313,-137.981 785.951,-141.681 785.951,-141.681 785.951,-141.681 789.313,-137.981 782.62,-138.655 792.676,-134.28 792.676,-134.28' stroke='black'/>
-<text style='font-size:8px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='774.975' y='-139.89'>q</text>
+<path d='M696.516,-261.357C732.527,-216.077 766.423,-173.456 791.304,-142.171' fill='none' stroke='black'/>
+<polygon fill='none' points='696.372,-261.538 695.768,-268.724 688.903,-270.93 689.507,-263.744 696.372,-261.538' stroke='black'/>
+<polygon fill='black' points='797.753,-134.062 795.051,-144.69 794.641,-137.975 791.529,-141.889 791.529,-141.889 791.529,-141.889 794.641,-137.975 788.007,-139.088 797.753,-134.062 797.753,-134.062' stroke='black'/>
+<text style='font-size:8px; font-family:Verdana;' text-anchor='middle' transform='translate(0,0)' x='780.701' y='-140.813'>q</text>
 </g></g>
-<text style='fill: lightslategray; font-size: 6pt; font-family: Verdana' x='839' y='686'>CREATED WITH YUML</text></svg>
+<text style='fill: lightslategray; font-size: 6pt; font-family: Verdana' x='839' y='792'>CREATED WITH YUML</text></svg>
diff --git a/docs/img/moop.uml b/docs/img/moop.uml
index 740344e..b8ce32d 100644
--- a/docs/img/moop.uml
+++ b/docs/img/moop.uml
@@ -7,7 +7,7 @@
 [MOOP]<>-q>[Acquisition]
 
 // Give class/dict details
-[<<class>>;MOOP|Scalar Surrogate Problem Solver: SurrogateOptimizer; Global Hyperparameters: dict; List of Design Variables: list; List of Simulations: list; List of Objectives: list; List of Constraints: list; List of Acquisitions: list|addDesign(*args); addSimulation(*args); addObjective(*args); addConstraint(*args); addAcquisition(*args); iterate(k); updateAll(k, batch); check_sim_db(x, s_name); update_sim_db(x, sx, s_name); evaluateSimulation(x, s_name); solve(budget); getPF(); getSimulationData(); getObjectiveData()]
+[<<class>>;MOOP|Scalar Surrogate Problem Solver: SurrogateOptimizer; Global Hyperparameters: dict; List of Design Variables: list; List of Simulations: list; List of Objectives: list; List of Constraints: list; List of Acquisitions: list|addDesign(*args); addSimulation(*args); addObjective(*args); addConstraint(*args); addAcquisition(*args); getDesignType(); getSimulationType(); getObjectiveType(); getConstraintType(); save(filename="parmoo"); load(filename="parmoo"); setCheckpoint(checkpoint, checkpoint_data=True, filename="parmoo"); iterate(k); updateAll(k, batch); check_sim_db(x, s_name); update_sim_db(x, sx, s_name); evaluateSimulation(x, s_name); solve(budget); getPF(); getSimulationData(); getObjectiveData()]
 
 [<<dict>>;Design Variable|name: String, optional;des_type: 'continuous' or 'categorical';lb: float (only when 'continuous');ub: float (only when 'continuous');tol: float (only when 'continuous');levels: int (only when 'categorical')]
 
diff --git a/docs/index.rst b/docs/index.rst
index 3f92b26..f4222b1 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -1,19 +1,27 @@
-.. ParMOO documentation master file, created by
-   sphinx-quickstart on Thu Jul  9 19:23:48 2020.
-   You can adapt this file completely to your liking, but it should at least
-   contain the root `toctree` directive.
+.. ParMOO documentation master file
+
+.. image:: img/logo-ParMOO.svg
+    :align: center
+    :alt: ParMOO
+
+|
 
 ParMOO: Python library for parallel multiobjective simulation optimization
 ==========================================================================
 
-ParMOO is a Python library for solving multiobjective simulation--based optimization
-problems, while exploiting problem structure.
+ParMOO is a Python library for solving multiobjective simulation-based
+optimization problems, while exploiting problem structure.
 
 ParMOO stands for "parallel multiobjective optimization".
 ParMOO can be used to solve multiobjective optimization problems (MOOPs)
 or to generate batches of simulation inputs for parallel evaluation.
 
-To get started, check out the :ref:`Quickstart`.
+If you're new to ParMOO:
+
+ * Check out the :ref:`Quickstart`
+ * Try some of our :doc:`Basic Tutorials <tutorials/basic-tutorials>`
+ * Try :doc:`Running in Parallel using libEnsemble <extras>`
+ * Check us out on `GitHub <https://github.com/parmoo/parmoo>`_
 
 Table of Contents
 =================
@@ -29,6 +37,12 @@ Table of Contents
    extras
    refs
 
+.. toctree::
+   :maxdepth: 2
+   :caption: API:
+
+   api
+
 .. toctree::
    :maxdepth: 2
    :caption: Tutorials:
@@ -43,12 +57,10 @@ Table of Contents
    dev-guide/contributing
    dev-guide/release-proc
    dev-guide/release-notes
-   modules/module-home
-
+   dev-guide/modules
 
-Indices
-=======
+Indices:
+========
 
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
+ * :ref:`genindex`
+ * :ref:`modindex`
diff --git a/docs/install.rst b/docs/install.rst
index c77ddbe..d265bcb 100644
--- a/docs/install.rst
+++ b/docs/install.rst
@@ -1,40 +1,88 @@
 Advanced Installation
 =====================
 
-Before you install ParMOO, make sure that you have all of the dependencies.
- * `Python 3.6+ <https://www.python.org/downloads/>`_
- * `numpy <https://numpy.org/>`_ -- for data structures and performant
-   numerical linear algebra
- * `scipy <https://scipy.org>`_ -- for important scientific calculations
-   (such as optimization solvers) needed by certain modules
- * `pyDOE <https://pythonhosted.org/pyDOE/>`_ -- for generating experimental
-   designs
+ParMOO can be installed with ``pip`` or directly from its GitHub_ source.
 
-Next, you will need to clone ParMOO and place the base directory into
-your system's Python3 load path.
+ParMOO's base has the following dependencies, which may be automatically
+installed depending on your choice of method:
 
-On Debian-based systems with a bash shell, this looks like
-the following.
+ * Python_ 3.6+
+ * numpy_ -- for data structures and performant numerical linear algebra
+ * scipy_ -- for scientific calculations needed for specific modules
+ * pyDOE_ -- for generating experimental designs
+
+Additional dependencies are needed to use the additional features in
+``parmoo.extras``:
+
+ * libEnsemble_ -- for managing parallel simulation evaluations
+
+If you want to run the tests (in ``parmoo.tests``), then you will also need:
+
+ * pytest_,
+ * pytest-cov_, and
+ * flake8_.
+
+pip
+---
+
+The easiest way to install is via the PyPI package manager (``pip`` utility).
+To install the latest release:
 
 .. code-block:: bash
 
-   git clone [parmoo url]
-   cd [parmoo base]
+    pip install [--user] parmoo
+
+Note that the default install will not install the extra dependencies,
+such as libEnsemble_.
+
+To install *all* dependencies, use:
+
+.. code-block:: bash
+
+    pip install [--user] parmoo[extras]
+
+To check the installation by running the full test suite, use:
+
+.. code-block:: bash
+
+    python3 setup.py test
+
+which will also install the test dependencies (pytest_, pytest-cov_, and
+flake8_).
+
+Install from GitHub source
+--------------------------
+
+You may want to install ParMOO from its GitHub_ source code, so that
+you can easily pull the latest updates.
+
+The easiest way to do this is to clone it from our GitHub_ and then
+``pip`` install it in-place by using the ``-e .`` option.
+In a bash shell, that looks like this.
+
+.. code-block:: bash
+
+   git clone https://github.com/parmoo/parmoo
+   cd parmoo
+   pip install -e .
+
+This command will use the ``setup.py`` file to generate an ``egg`` inside
+the ``parmoo`` base directory.
+
+Alternatively, you could just add the ``parmoo`` base directory to your
+``PYTHONPATH`` environment variable. In the bash shell, this looks like:
+
+.. code-block:: bash
+
+   git clone https://github.com/parmoo/parmoo
+   cd parmoo
    export PYTHONPATH=$PYTHONPATH:`pwd`
 
-To make the installation permanent, you could
- * ensure that you have added the ParMOO base directory to your
-   Python3 path (e.g., by appending the last command above with
-   `pwd` replaced by the base directory to your shell startup file;
-   ``~/.bashrc`` for the bash shell) or
- * place a copy of the ``[parmoo base]/parmoo`` directory in your system's
-   default library load path
-   (e.g., ``~/.local/lib/pythonX.X/site-packages`` on many Unix/Linux systems).
+However, this technique will not install any of ParMOO's dependencies.
 
-Additionally, if you would like to use libEnsemble to handle parallel
+Additionally, if you would like to use libEnsemble_ to handle parallel
 function evaluations (from :mod:`extras.libe`),
-you will need to also install
-`libEnsemble <https://github.com/Libensemble/libensemble>`_.
+you will need to also install libEnsemble_.
 
 To install libEnsemble with PyPI, use
 
@@ -42,5 +90,30 @@ To install libEnsemble with PyPI, use
 
    pip3 install libensemble
 
-or visit the libEnsemble documentation for detailed
-`installation instructions <https://libensemble.readthedocs.io/en/main/advanced_installation.html>`_.
+or visit the libEnsemble_documentation_ for detailed installation instructions.
+
+After installation, you can run the tests using either:
+
+.. code-block:: bash
+
+    python3 setup.py test
+
+(if you used the ``pip install -e .`` method), or:
+
+.. code-block:: bash
+
+    parmoo/tests/run-tests.sh -cu[rl]
+
+
+.. _Actions: https://github.com/parmoo/parmoo/actions
+.. _flake8: https://flake8.pycqa.org/en/latest
+.. _GitHub: https://github.com/parmoo/parmoo
+.. _libEnsemble: https://github.com/Libensemble/libensemble
+.. _libEnsemble_documentation: https://libensemble.readthedocs.io/en/main/advanced_installation.html
+.. _numpy: https://numpy.org
+.. _pyDOE: https://pythonhosted.org/pyDOE
+.. _pytest: https://docs.pytest.org/en/7.0.x
+.. _pytest-cov: https://pytest-cov.readthedocs.io/en/latest
+.. _Python: https://www.python.org/downloads
+.. _ReadTheDocs: https://parmoo.readthedocs.org
+.. _scipy: https://scipy.org
diff --git a/docs/latex_index.rst b/docs/latex_index.rst
new file mode 100644
index 0000000..31748e5
--- /dev/null
+++ b/docs/latex_index.rst
@@ -0,0 +1,60 @@
+.. ParMOO documentation master file for the latex build
+
+.. image:: img/logo-ParMOO.svg
+    :align: center
+    :alt: ParMOO
+
+|
+
+==========================================================================
+ParMOO: Python library for parallel multiobjective simulation optimization
+==========================================================================
+
+User's Guide
+============
+
+.. toctree::
+   :maxdepth: 3
+
+   quickstart
+   install
+   about
+   how-to-write
+   extras
+   refs
+
+API
+===
+
+.. toctree::
+   :maxdepth: 3
+
+   api
+
+Tutorials
+=========
+
+.. toctree::
+   :maxdepth: 3
+
+   tutorials/basic-tutorials
+   tutorials/libe-tutorial
+
+Developer's Guide
+=================
+
+.. toctree::
+   :maxdepth: 3
+
+   dev-guide/contributing
+   dev-guide/release-proc
+   dev-guide/release-notes
+
+Appendices
+==========
+
+.. toctree::
+    :maxdepth: 3
+
+    genindex
+    modindex
diff --git a/docs/modules/acquisitions.rst b/docs/modules/acquisitions.rst
index b258585..dec47e8 100644
--- a/docs/modules/acquisitions.rst
+++ b/docs/modules/acquisitions.rst
@@ -1,8 +1,25 @@
-acquisitions
-------------
+Acquisition Functions
+---------------------
 
-weighted_sum
-~~~~~~~~~~~~
+Add one of these to your ``MOOP`` object to generate additional scalarizations
+per iteration.
+In general, ParMOO typically generates one candidate solution per simulation
+per acquisition function, so the number of acquisition functions determines
+the number of candidate simulations evaluated (in parallel) per
+iteration/batch.
+
+.. code-block:: python
+
+    from parmoo import acquisitions
+
+Current options are:
+
+.. toctree::
+    :maxdepth: 1
+    :caption: Modules:
+
+Weighted Sum Methods
+~~~~~~~~~~~~~~~~~~~~
 
 .. automodule:: acquisitions.weighted_sum
 ..    :members: acquisitions/weighted_sum
@@ -19,8 +36,8 @@ weighted_sum
 
    .. automethod:: __init__
 
-epsilon_constraint
-~~~~~~~~~~~~~~~~~~
+Epsilon Constraint Methods
+~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 .. automodule:: acquisitions.epsilon_constraint
 ..    :members: acquisitions/epsilon_constraint
@@ -30,4 +47,3 @@ epsilon_constraint
    :members:
 
    .. automethod:: __init__
-
diff --git a/docs/modules/class_api.rst b/docs/modules/class_api.rst
new file mode 100644
index 0000000..9d6b719
--- /dev/null
+++ b/docs/modules/class_api.rst
@@ -0,0 +1,17 @@
+Basic ParMOO Classes/Objects
+----------------------------
+
+ParMOO uses an object-oriented design, where users start
+by creating a ``MOOP`` object, defining their problem.
+
+The type of ``MOOP`` that you use determines what kind of resources you
+will use to solve the problem.
+
+Current options are:
+
+.. toctree::
+   :maxdepth: 1
+   :caption: Modules:
+
+   moop
+   libe
diff --git a/docs/modules/constraints.rst b/docs/modules/constraints.rst
new file mode 100644
index 0000000..6195279
--- /dev/null
+++ b/docs/modules/constraints.rst
@@ -0,0 +1,39 @@
+Constraint Function Templates (ABCs)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: constraints.const_func
+..    :members: constraints/const_func
+
+.. autoclass:: const_func
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+Constraint Function Library
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: constraints.const_lib
+..    :members: constraints/const_lib
+
+.. autoclass:: single_sim_bound
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: sos_sim_bound
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: sum_sim_bound
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
diff --git a/docs/modules/dev_tools.rst b/docs/modules/dev_tools.rst
new file mode 100644
index 0000000..4e18532
--- /dev/null
+++ b/docs/modules/dev_tools.rst
@@ -0,0 +1,12 @@
+Extra Developer Tools
+---------------------
+
+These are miscellaneous additional tools and definitions, which may be
+useful for developers.
+
+.. toctree::
+   :maxdepth: 1
+   :caption: Modules:
+
+   structs
+   util
diff --git a/docs/modules/dtlz.rst b/docs/modules/dtlz.rst
new file mode 100644
index 0000000..4be4d98
--- /dev/null
+++ b/docs/modules/dtlz.rst
@@ -0,0 +1,144 @@
+The DTLZ Problem Library
+------------------------
+
+To facilitate testing and comparison with other methods, we provide
+built-in implementations of the DTLZ problems as ParMOO Simulations and
+Objectives (with gradients defined).
+
+.. code-block:: python
+
+    from parmoo.simulations import dtlz
+    from parmoo.objectives import dtlz
+
+DTLZ Problems as Simulations
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: simulations.dtlz
+..    :members: simulations/dtlz
+
+.. autoclass:: g1_sim
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: g2_sim
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: g3_sim
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: g4_sim
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: dtlz1_sim
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: dtlz2_sim
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: dtlz3_sim
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: dtlz4_sim
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: dtlz5_sim
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: dtlz6_sim
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: dtlz7_sim
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: dtlz8_sim
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: dtlz9_sim
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autofunction:: __check_optionals__
+
+DTLZ Problems as Objectives
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: objectives.dtlz
+..    :members: objectives/dtlz
+
+.. autoclass:: dtlz1_obj
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: dtlz2_obj
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: dtlz3_obj
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: dtlz4_obj
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
diff --git a/docs/modules/extras.rst b/docs/modules/extras.rst
deleted file mode 100644
index 8a39283..0000000
--- a/docs/modules/extras.rst
+++ /dev/null
@@ -1,15 +0,0 @@
-extras
-------
-
-libE_MOOP
-~~~~~~~~~
-
-.. automodule:: extras.libe
-..    :members: extras/libe
-
-.. autoclass:: libE_MOOP
-   :member-order: bysource
-   :members:
-
-   .. automethod:: __init__
-
diff --git a/docs/modules/libe.rst b/docs/modules/libe.rst
new file mode 100644
index 0000000..a3e2184
--- /dev/null
+++ b/docs/modules/libe.rst
@@ -0,0 +1,20 @@
+Parallel Solvers using the libE_MOOP Class
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Solve MOOPs in parallel using ParMOO together with libEnsemble.
+
+.. code-block:: python
+
+    from parmoo.extras import libE_MOOP
+
+The ``libE_MOOP.solve(...)`` method will distribute simulations across
+parallel resources using libEnsemble for this class.
+
+.. automodule:: extras.libe
+..    :members: extras/libe
+
+.. autoclass:: libE_MOOP
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
diff --git a/docs/modules/libraries.rst b/docs/modules/libraries.rst
new file mode 100644
index 0000000..5051046
--- /dev/null
+++ b/docs/modules/libraries.rst
@@ -0,0 +1,32 @@
+Built-in Problem Libraries
+--------------------------
+
+We provide several modules containing common objective and constraint
+functions, which match the ParMOO interface and already support
+gradient-based solvers.
+
+You can import these and use them to help define your MOOP.
+
+.. code-block:: python
+
+    from parmoo import objectives
+    from parmoo import constraints
+
+We also provide templates for defining callable objects, which match
+ParMOO's interface.
+
+.. code-block:: python
+
+    from parmoo.simulations import sim_func
+    from parmoo.objectives import obj_func
+    from parmoo.constraints import const_func
+
+Current options are:
+
+.. toctree::
+   :maxdepth: 1
+   :caption: Modules:
+
+   simulations
+   objectives
+   constraints
diff --git a/docs/modules/module-home.rst b/docs/modules/module-home.rst
deleted file mode 100644
index 8feec58..0000000
--- a/docs/modules/module-home.rst
+++ /dev/null
@@ -1,17 +0,0 @@
-Module List
-===========
-
-This section contains the complete list of ParMOO modules.
-
-.. toctree::
-   :maxdepth: 1
-   :caption: Modules:
-
-   structs
-   util
-   objectives
-   acquisitions
-   optimizers
-   searches
-   surrogates
-   extras
diff --git a/docs/modules/moop.rst b/docs/modules/moop.rst
new file mode 100644
index 0000000..edccaad
--- /dev/null
+++ b/docs/modules/moop.rst
@@ -0,0 +1,26 @@
+Base (serial) MOOP Class
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+This is the base class for solving MOOPs with ParMOO.
+
+.. code-block:: python
+
+    from parmoo import moop
+
+Use this class to define and solve a MOOP.
+The ``MOOP.solve(...)`` method will perform simulations serially for this
+class.
+
+.. automodule:: moop
+..    :members: moop
+
+.. autoclass:: MOOP
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __extract__
+   .. automethod:: __embed__
+   .. automethod:: __generate_encoding__
+   .. automethod:: __unpack_sim__
+   .. automethod:: __pack_sim__
diff --git a/docs/modules/objectives.rst b/docs/modules/objectives.rst
index cd8283c..3d2750a 100644
--- a/docs/modules/objectives.rst
+++ b/docs/modules/objectives.rst
@@ -1,12 +1,39 @@
-moop
-----
+Objective Templates (ABCs)
+~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-.. automodule:: moop
-..    :members: moop
+.. automodule:: objectives.obj_func
+..    :members: objectives/obj_func
 
-.. autoclass:: MOOP
+.. autoclass:: obj_func
    :member-order: bysource
    :members:
 
    .. automethod:: __init__
+   .. automethod:: __call__
 
+Objective Function Library
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: objectives.obj_lib
+..    :members: objectives/obj_lib
+
+.. autoclass:: single_sim_out
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: sos_sim_out
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
+
+.. autoclass:: sum_sim_out
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
diff --git a/docs/modules/optimizers.rst b/docs/modules/optimizers.rst
index d45443d..869e1c2 100644
--- a/docs/modules/optimizers.rst
+++ b/docs/modules/optimizers.rst
@@ -1,8 +1,27 @@
-optimizers
-----------
+Surrogate Optimizers
+--------------------
 
-gps_search
-~~~~~~~~~~
+When initializing a new ``MOOP`` object
+(see :doc:`MOOP Classes <class_api>`),
+you must provide a surrogate optimization problem solver, which will
+be used to generate candidate solutions for each iteration.
+
+.. code-block:: python
+
+    from parmoo import optimizers
+
+*Note that when using a gradient-based technique, you must provide
+gradient evaluation options for all objective and constraint functions,
+by adding code to handle the optional ``der`` input.*
+
+.. code-block:: python
+
+    def f(x, sx, der=0):
+        # When using gradient-based solvers, define extra if-cases for
+        # handling der=1 (calculate df/dx) and der=2 (caldculate df/dsx).
+
+GPS Search Techniques (gradient-free)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 .. automodule:: optimizers.gps_search
 ..    :members: optimizers/gps_search
@@ -19,8 +38,9 @@ gps_search
 
    .. automethod:: __init__
 
-random_search
-~~~~~~~~~~~~~
+Random Search Techniques (gradient-free)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
 
 .. automodule:: optimizers.random_search
 ..    :members: optimizers/random_search
@@ -31,8 +51,8 @@ random_search
 
    .. automethod:: __init__
 
-lbfgsb
-~~~~~~
+L-BFGS-B Variations (gradient-based)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 .. automodule:: optimizers.lbfgsb
 ..    :members: optimizers/lbfgsb
diff --git a/docs/modules/searches.rst b/docs/modules/searches.rst
index 5795fe3..88a0cb0 100644
--- a/docs/modules/searches.rst
+++ b/docs/modules/searches.rst
@@ -1,8 +1,25 @@
-searches
---------
+Search Techniques
+-----------------
 
-latin_hypercube
-~~~~~~~~~~~~~~~
+A search technique is associated with each simulation when the
+simulation dictionary is added to the ``MOOP`` object.
+This technique is used for generating simulation data prior to the
+first iteration of ParMOO, so that the initial surrogate models can
+be fit.
+
+For most search techniques, it is highly recommended that you supply
+the following optional hyperparameter keys/values:
+ * ``search_budget (int)``: specifies how many samples will be generated
+   for this simulation.
+
+.. code-block:: python
+
+    from parmoo import searches
+
+Available search techniques are as follows:
+
+Latin Hypercube Sampling
+~~~~~~~~~~~~~~~~~~~~~~~~
 
 .. automodule:: searches.latin_hypercube
 ..    :members: searches/latin_hypercube
diff --git a/docs/modules/simulations.rst b/docs/modules/simulations.rst
new file mode 100644
index 0000000..203863d
--- /dev/null
+++ b/docs/modules/simulations.rst
@@ -0,0 +1,12 @@
+Simulation Templates (ABCs)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: simulations.sim_func
+..    :members: simulations/sim_func
+
+.. autoclass:: sim_func
+   :member-order: bysource
+   :members:
+
+   .. automethod:: __init__
+   .. automethod:: __call__
diff --git a/docs/modules/structs.rst b/docs/modules/structs.rst
index c7af729..c1da00d 100644
--- a/docs/modules/structs.rst
+++ b/docs/modules/structs.rst
@@ -1,5 +1,17 @@
-structs
--------
+ParMOO Solver and Component Definitions
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To implement a new acquisition function, solver, surrogate, or
+search technique for ParMOO, you must match its interface.
+An interface definition for each of these methods is provided in the
+``structs`` module in the corresponding Abstract Base Class (ABC).
+
+.. code-block:: python
+
+    from parmoo import structs
+
+When implementing one of these techniques, you should extend the corresponding
+ABC, defined below.
 
 .. automodule:: structs
 ..    :members: structs
diff --git a/docs/modules/surrogates.rst b/docs/modules/surrogates.rst
index 775a36f..7ad72f9 100644
--- a/docs/modules/surrogates.rst
+++ b/docs/modules/surrogates.rst
@@ -1,8 +1,19 @@
-surrogates
-----------
+Surrogate Functions
+-------------------
 
-gaussian_proc
-~~~~~~~~~~~~~
+A surrogte model is associated with each simulation when its
+simulation dictionary is added to the ``MOOP`` object.
+This technique is used for generatng an approximation to the simulation's
+response surface, based on data gathered during the solve.
+
+.. code-block:: python
+
+    from parmoo import surrogates
+
+Available techniques are:
+
+Gaussian Process (RBF) Models
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 .. automodule:: surrogates.gaussian_proc
 ..    :members: surrogates/gaussian_proc
@@ -18,4 +29,3 @@ gaussian_proc
    :members:
 
    .. automethod:: __init__
-
diff --git a/docs/modules/util.rst b/docs/modules/util.rst
index 78ea2f1..a30a5a4 100644
--- a/docs/modules/util.rst
+++ b/docs/modules/util.rst
@@ -1,5 +1,12 @@
-util
-----
+Utilities
+~~~~~~~~~
+
+This module contains additional utilities, which may be useful for some
+developers.
+
+.. code-block:: python
+
+    from parmoo import util
 
 .. automodule:: util
 ..    :members: util
@@ -11,3 +18,5 @@ util
 .. autofunction:: lex_leq
 
 .. autofunction:: updatePF
+
+.. autofunction:: unpack
diff --git a/docs/quickstart.rst b/docs/quickstart.rst
index 277f818..fa7efc0 100644
--- a/docs/quickstart.rst
+++ b/docs/quickstart.rst
@@ -20,16 +20,24 @@ To exploit structure, ParMOO models *simulations* separately from
  * a **constraint** is an algebraic function of the design variables
    and/or simulation outputs, which cannot exceed some bound.
 
-To solve a multiobjective optimization problem (MOOP), we use surrogate models
-of the simulation outputs, together with the algebraic definition of the
-objectives and constraints.
-
 .. figure:: img/des-sim-obj-space.png
     :alt: Designs, simulations, and objectives
     :align: center
 
 |
 
+To solve a multiobjective optimization problem (MOOP), we use surrogate models
+of the simulation outputs, together with the algebraic definition of the
+objectives and constraints.
+
+.. only:: html
+
+    .. figure:: img/parmoo_movie.gif
+        :alt: ParMOO animation
+        :align: center
+
+    |
+
 In order to achieve scalable parallelism, we use libEnsemble_ to distribute
 batches of simulation evaluations across parallel resources.
 
@@ -81,7 +89,7 @@ These tests are run regularly using GitHub Actions_.
 Basic Usage
 -----------
 
-ParMOO uses `numpy_ in an object oriented design,
+ParMOO uses numpy_ in an object oriented design,
 based around the :mod:`MOOP <moop.MOOP>` class.
 To get started, create a :mod:`MOOP <moop.MOOP>` object, using the
 :meth:`constructor <moop.MOOP.__init__>`.
@@ -188,16 +196,6 @@ results can be viewed using
 
 Congratulations, you now know enough to get started solving MOOPs!
 
-Next steps:
-
- * If you want to take advantage of all that ParMOO has to offer, 
-   please see :doc:`Writing a ParMOO Script <how-to-write>`.
- * If you would like more information on multiobjective optimization
-   terminology and ParMOO's methodology, see the
-   :doc:`Learn About MOOPs <about>` page.
- * See :doc:`More Tutorials <tutorials/basic-tutorials>`.
- * See the :doc:`libEnsemble tutorial <tutorials/libe-tutorial>`.
-
 Minimal Working Example
 -----------------------
 
@@ -210,6 +208,19 @@ The above code produces the output below.
 
 .. literalinclude:: ../examples/quickstart.out
 
+Next Steps
+----------
+
+ * If you want to take advantage of all that ParMOO has to offer, 
+   please see :doc:`Writing a ParMOO Script <how-to-write>`.
+ * If you would like more information on multiobjective optimization
+   terminology and ParMOO's methodology, see the
+   :doc:`Learn About MOOPs <about>` page.
+ * For a full list of basic usage tutorials, see
+   :doc:`More Tutorials <tutorials/basic-tutorials>`.
+ * To start solving MOOPs on parallel hardware, install libEnsemble_ and
+   see the :doc:`libEnsemble tutorial <tutorials/libe-tutorial>`.
+
 Resources
 ---------
 
@@ -221,11 +232,15 @@ Our full documentation is hosted on:
 
  * ReadTheDocs_
 
+Please read our LICENSE_ and CONTRIBUTING_ files.
+
 
 .. _Actions: https://github.com/parmoo/parmoo/actions
+.. _CONTRIBUTING: https://github.com/parmoo/parmoo/blob/main/CONTRIBUTING.rst
 .. _flake8: https://flake8.pycqa.org/en/latest
 .. _GitHub: https://github.com/parmoo/parmoo
 .. _libEnsemble: https://github.com/Libensemble/libensemble
+.. _LICENSE: https://github.com/parmoo/parmoo/blob/main/LICENSE
 .. _numpy: https://numpy.org
 .. _pyDOE: https://pythonhosted.org/pyDOE
 .. _pytest: https://docs.pytest.org/en/7.0.x
diff --git a/docs/refs.rst b/docs/refs.rst
index 6a780f4..a9961d9 100644
--- a/docs/refs.rst
+++ b/docs/refs.rst
@@ -4,17 +4,36 @@ References
 Additional Resources
 --------------------
 
-For questions, please contact
+For questions, please e-mail:
 
-parmoo@mcs.anl.gov
+ * ``parmoo@mcs.anl.gov``
+
+For permissions, see the following:
+
+ * LICENSE_
+ * CONTRIBUTING_
+
+Our full user guide is hosted here:
+
+ * ReadTheDocs_
 
 Reference Format
 ----------------
 
-To cite this work, please use
+ * Please use the following to cite ParMOO:
 
-.. code-block:: latex
+.. code-block:: bibtex
 
-    \cite{
-    ...
+    @techreport{parmoo-docs,
+        title       = {{ParMOO}: {P}ython library for parallel multiobjective simulation optimization},
+        author      = {Chang, Tyler H. and Wild, Stefan M.},
+        institution = {Argonne National Laboratory},
+        number      = {Version 0.1.0},
+        year        = {2022},
+        url         = {https://parmoo.readthedocs.io/en/latest}
     }
+
+
+.. _CONTRIBUTING: https://github.com/parmoo/parmoo/blob/main/CONTRIBUTING.rst
+.. _LICENSE: https://github.com/parmoo/parmoo/blob/main/LICENSE
+.. _ReadTheDocs: https://parmoo.readthedocs.org
diff --git a/docs/tutorials/basic-tutorials.rst b/docs/tutorials/basic-tutorials.rst
index 8e87485..fd2a24d 100644
--- a/docs/tutorials/basic-tutorials.rst
+++ b/docs/tutorials/basic-tutorials.rst
@@ -4,10 +4,12 @@ Basic Tutorials
 This is a collection of all tutorials demonstrating basic ParMOO functionality
 (collected from throughout the ParMOO User Guide).
 
+.. _quickstart_ex:
+
 Quickstart Demo
 ~~~~~~~~~~~~~~~
 
-This is a basic example of how to build and solve a MOOP with ParMOO,
+This is a basic example (see `quickstart.py <https://github.com/parmoo/parmoo/blob/main/examples/quickstart.py>`_) of how to build and solve a MOOP with ParMOO,
 taken from the :doc:`Quickstart <../quickstart>` guide.
 
 .. literalinclude:: ../../examples/quickstart.py
@@ -20,7 +22,7 @@ The above code produces the following output.
 Named Output Types
 ~~~~~~~~~~~~~~~~~~
 
-This code snippet demonstrates ParMOO's output datatype when the
+The following `named_var_ex.py <https://github.com/parmoo/parmoo/blob/main/examples/named_var_ex.py>`_ code demonstrates ParMOO's output datatype when the
 :mod:`MOOP <moop.MOOP>` object is defined using *named* variables.
 
 .. literalinclude:: ../../examples/named_var_ex.py
@@ -33,7 +35,7 @@ The above code produces the following output.
 Unnamed Output Types
 ~~~~~~~~~~~~~~~~~~~~
 
-This code snippet demonstrates ParMOO's output datatype when the
+The following `unnamed_var_ex.py <https://github.com/parmoo/parmoo/blob/main/examples/unnamed_var_ex.py>`_ code demonstrates ParMOO's output datatype when the
 :mod:`MOOP <moop.MOOP>` object is defined using *unnamed* variables.
 
 .. literalinclude:: ../../examples/unnamed_var_ex.py
@@ -46,7 +48,7 @@ The above code produces the following output.
 Adding Precomputed Simulation Values
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-This code snippet demonstrates how to add a precomputed simulation output
+The following `precomputed_data.py <https://github.com/parmoo/parmoo/blob/main/examples/precomputed_data.py>`_ code demonstrates how to add a precomputed simulation output
 to ParMOO's internal simulation databases.
 
 .. literalinclude:: ../../examples/precomputed_data.py
@@ -56,6 +58,31 @@ The above code produces the following output.
 
 .. literalinclude:: ../../examples/precomputed_data.out
 
+Logging and Checkpointing
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When solving a large or expensive problem, logging and checkpointing
+are recommended.
+The following code snippet shows how to solve the same problem from
+the `Quickstart example <quickstart_ex>`_, but with logging and checkpointing
+turned on.
+Then, another MOOP is created by reloading from the checkpoint file,
+and run for 1 extra iteration, in order to demonstrate how to reload
+from a saved checkpoint file.
+
+Note how the lambda functions from `Quickstart example <quickstart_ex>`_
+have been explicitly defined below.
+This is because ParMOO reloads functions by name, which means that it
+does not support checkpointing for lambda functions and any named function
+must be defined with the same name in the global scope during reloading.
+
+.. literalinclude:: ../../examples/checkpointing.py
+    :language: python
+
+The above `checkpointing.py <https://github.com/parmoo/parmoo/blob/main/examples/checkpointing.py>`_ code produces the following output.
+
+.. literalinclude:: ../../examples/checkpointing.out
+
 .. _advanced_ex:
 
 Solving a MOOP with Derivative-Based Solvers
@@ -77,7 +104,7 @@ to any value, without affecting the outcome.
 .. literalinclude:: ../../examples/advanced_ex.py
     :language: python
 
-The above code produces the following output.
+The above `advanced_ex.py <https://github.com/parmoo/parmoo/blob/main/examples/advanced_ex.py>`_ code produces the following output.
 
 .. literalinclude:: ../../examples/advanced_ex.out
 
diff --git a/docs/tutorials/libe-tutorial.rst b/docs/tutorials/libe-tutorial.rst
index 0804743..28e54cf 100644
--- a/docs/tutorials/libe-tutorial.rst
+++ b/docs/tutorials/libe-tutorial.rst
@@ -1,7 +1,7 @@
 libEnsemble Tutorial
 ====================
 
-This is an example of basic ParMOO + libEnsemble usage from the
+The following `libe_basic_ex.py <https://github.com/parmoo/parmoo/blob/main/examples/libe_basic_ex.py>`_ code is an example of basic ParMOO + libEnsemble usage from the
 :doc:`Extras and Plugins <../extras>` section of the User Guide.
 
 .. literalinclude:: ../../examples/libe_basic_ex.py
@@ -11,13 +11,13 @@ You can run the above script with MPI
 
 .. code-block:: bash
 
-    mpirun -np N python myscript.py
+    mpirun -np N python3 libe_basic_ex.py
 
 or with Python's built-in multiprocessing module.
 
 .. code-block:: bash
 
-    python myscript.py --comms local --nworkers N
+    python3 libe_basic_ex.py --comms local --nworkers N
 
 The resulting output is shown below.
 
diff --git a/examples/Makefile b/examples/Makefile
index 5ef9c2f..ea3b1b2 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -1,5 +1,6 @@
 OUT_FILES = quickstart.out named_var_ex.out unnamed_var_ex.out \
-			precomputed_data.out advanced_ex.out libe_basic_ex.out
+			precomputed_data.out checkpointing.out advanced_ex.out \
+			libe_basic_ex.out
 
 all: $(OUT_FILES)
 
@@ -15,6 +16,10 @@ unnamed_var_ex.out: unnamed_var_ex.py
 precomputed_data.out: precomputed_data.py
 	python3 precomputed_data.py > precomputed_data.out
 
+checkpointing.out: checkpointing.py
+	python3 checkpointing.py > checkpointing.out
+	rm -f parmoo.moop parmoo.surrogate.1
+
 advanced_ex.out: advanced_ex.py
 	python3 advanced_ex.py > advanced_ex.out
 	rm -f parmoo.moop parmoo.surrogate.1
diff --git a/examples/advanced_ex.out b/examples/advanced_ex.out
new file mode 100644
index 0000000..c08ed09
--- /dev/null
+++ b/examples/advanced_ex.out
@@ -0,0 +1,31 @@
+Simulation data:
+{'f_conv': array([(0.11022377, 0.23513168, 0.19981213, 1, [0.10736108, 2.0170259 ]),
+       (0.53579252, 0.76464951, 0.91814704, 2, [1.71475649, 0.27757835]),
+       (0.91905002, 0.11120525, 0.0262472 , 2, [0.85770847, 1.74470352]),
+       (0.29310833, 0.02111603, 0.36324516, 0, [0.21830543, 1.86336639]),
+       (0.70767269, 0.32984221, 0.69284079, 0, [1.08962488, 0.6289135 ]),
+       (0.81871679, 0.99787368, 0.72000579, 2, [2.18445741, 0.11126488]),
+       (0.6548903 , 0.57251322, 0.59872521, 2, [1.11512458, 0.4628671 ]),
+       (0.40692451, 0.82950591, 0.26550651, 0, [0.92416132, 0.92028746]),
+       (0.36296499, 0.4240694 , 0.85268714, 1, [1.0386538 , 0.75921074]),
+       (0.07970264, 0.6565336 , 0.41666456, 1, [0.61099824, 1.30519663]),
+       (1.        , 1.        , 1.        , 0, [3.        , 0.        ]),
+       (1.        , 0.        , 1.        , 0, [2.        , 1.        ]),
+       (1.        , 1.        , 0.        , 0, [2.        , 1.        ]),
+       (0.        , 1.        , 0.        , 0, [1.        , 2.        ]),
+       (0.        , 1.        , 1.        , 0, [2.        , 1.        ]),
+       (0.37029969, 0.0033497 , 0.58906285, 1, [0.48412812, 1.55870364]),
+       (0.        , 0.        , 0.        , 0, [0.        , 3.        ]),
+       (0.59290032, 0.50006659, 0.41667761, 0, [0.77521761, 0.75592858]),
+       (0.22483158, 0.00326198, 0.70273262, 2, [0.54439301, 1.68274067]),
+       (0.        , 0.        , 1.        , 0, [1.        , 2.        ])],
+      dtype=[('x1', '<f8'), ('x2', '<f8'), ('x3', '<f8'), ('x4', '<i4'), ('out', '<f8', (2,))])}
+
+
+
+Solution points:
+[(1.        , 1.        , 1.        , 0, 3.        , 0.        , 0.)
+ (0.70767269, 0.32984221, 0.69284079, 0, 1.08962488, 0.6289135 , 0.)
+ (0.59290032, 0.50006659, 0.41667761, 0, 0.77521761, 0.75592858, 0.)
+ (0.29310833, 0.02111603, 0.36324516, 0, 0.21830543, 1.86336639, 0.)
+ (0.        , 0.        , 0.        , 0, 0.        , 3.        , 0.)]
diff --git a/examples/checkpointing.out b/examples/checkpointing.out
new file mode 100644
index 0000000..8507263
--- /dev/null
+++ b/examples/checkpointing.out
@@ -0,0 +1,23 @@
+[(0.79211912, 0, 3.50605056e-01, 6.21082186e-05, -0.69211912)
+ (0.78284178, 0, 3.39704540e-01, 2.94404531e-04, -0.68284178)
+ (0.75488481, 0, 3.07897153e-01, 2.03538033e-03, -0.65488481)
+ (0.73852739, 0, 2.90011748e-01, 3.77888196e-03, -0.63852739)
+ (0.72387895, 0, 2.74449155e-01, 5.79441410e-03, -0.62387895)
+ (0.70898637, 0, 2.59067128e-01, 8.28348032e-03, -0.60898637)
+ (0.703127  , 0, 2.53136776e-01, 9.38437854e-03, -0.603127  )
+ (0.6953145 , 0, 2.45336452e-01, 1.09590544e-02, -0.5953145 )
+ (0.68066606, 0, 2.31039862e-01, 1.42405891e-02, -0.58066606)
+ (0.55200395, 0, 1.23906782e-01, 6.15020403e-02, -0.45200395)
+ (0.52221879, 0, 1.03824952e-01, 7.71623980e-02, -0.42221879)
+ (0.46631059, 0, 7.09213312e-02, 1.11348621e-01, -0.36631059)
+ (0.45849809, 0, 6.68212634e-02, 1.16623553e-01, -0.35849809)
+ (0.45190629, 0, 6.34567813e-02, 1.21169228e-01, -0.35190629)
+ (0.45044145, 0, 6.27209204e-02, 1.22191179e-01, -0.35044145)
+ (0.44848833, 0, 6.17464482e-02, 1.23560457e-01, -0.34848833)
+ (0.3270645 , 0, 1.61453859e-02, 2.23667992e-01, -0.2270645 )
+ (0.32315825, 0, 1.51679533e-02, 2.27378059e-01, -0.22315825)
+ (0.31339262, 0, 1.28578863e-02, 2.36786742e-01, -0.21339262)
+ (0.26212309, 0, 3.85927817e-03, 2.89311572e-01, -0.16212309)
+ (0.23438089, 0, 1.18204540e-03, 3.19924981e-01, -0.13438089)
+ (0.21753518, 0, 3.07482677e-04, 3.39265262e-01, -0.11753518)] 
+ dtype=[('x1', '<f8'), ('x2', '<i4'), ('f1', '<f8'), ('f2', '<f8'), ('c1', '<f8')]
diff --git a/examples/checkpointing.py b/examples/checkpointing.py
new file mode 100644
index 0000000..f1fd688
--- /dev/null
+++ b/examples/checkpointing.py
@@ -0,0 +1,74 @@
+
+import numpy as np
+from parmoo import MOOP
+from parmoo.searches import LatinHypercube
+from parmoo.surrogates import GaussRBF
+from parmoo.acquisitions import UniformWeights
+from parmoo.optimizers import LocalGPS
+import logging
+
+# Create a new MOOP
+my_moop = MOOP(LocalGPS)
+
+# Add 1 continuous and 1 categorical design variable
+my_moop.addDesign({'name': "x1",
+                   'des_type': "continuous",
+                   'lb': 0.0, 'ub': 1.0})
+my_moop.addDesign({'name': "x2", 'des_type': "categorical",
+                   'levels': 3})
+
+# Create a simulation function
+def sim_func(x):
+   if x["x2"] == 0:
+      return np.array([(x["x1"] - 0.2) ** 2, (x["x1"] - 0.8) ** 2])
+   else:
+      return np.array([99.9, 99.9])
+
+# Add the simulation function to the MOOP
+my_moop.addSimulation({'name': "MySim",
+                       'm': 2,
+                       'sim_func': sim_func,
+                       'search': LatinHypercube,
+                       'surrogate': GaussRBF,
+                       'hyperparams': {'search_budget': 20}})
+
+# Define the 2 objectives as named Python functions
+def obj1(x, s): return s["MySim"][0]
+def obj2(x, s): return s["MySim"][1]
+
+# Define the constraint as a function
+def const(x, s): return 0.1 - x["x1"]
+
+# Add 2 objectives
+my_moop.addObjective({'name': "f1", 'obj_func': obj1})
+my_moop.addObjective({'name': "f2", 'obj_func': obj2})
+
+# Add 1 constraint
+my_moop.addConstraint({'name': "c1", 'constraint': const})
+
+# Add 3 acquisition functions (generates batches of size 3)
+for i in range(3):
+   my_moop.addAcquisition({'acquisition': UniformWeights,
+                           'hyperparams': {}})
+
+# Turn on logging with timestamps
+logging.basicConfig(level=logging.INFO,
+                    format='%(asctime)s %(levelname)-8s %(message)s',
+                    datefmt='%Y-%m-%d %H:%M:%S')
+
+# Use checkpointing without saving a separate data file (in "parmoo.moop" file)
+my_moop.setCheckpoint(True, checkpoint_data=False, filename="parmoo")
+
+# Solve the problem with 4 iterations
+my_moop.solve(4)
+
+# Create a new MOOP object and reload the MOOP from parmoo.moop file
+new_moop = MOOP(LocalGPS)
+new_moop.load("parmoo")
+
+# Do another iteration
+new_moop.solve(5)
+
+# Display the solution
+results = new_moop.getPF()
+print(results, "\n dtype=" + str(results.dtype))
diff --git a/examples/libe_basic_ex.out b/examples/libe_basic_ex.out
new file mode 100644
index 0000000..1a53c4b
--- /dev/null
+++ b/examples/libe_basic_ex.out
@@ -0,0 +1,16 @@
+[(0.79984616, 0, 0.35981541, 2.36682476e-08, -0.69984616)
+ (0.77762936, 0, 0.33365568, 5.00445613e-04, -0.67762936)
+ (0.75345944, 0, 0.30631735, 2.16602406e-03, -0.65345944)
+ (0.68954002, 0, 0.23964943, 1.22014078e-02, -0.58954002)
+ (0.62433543, 0, 0.18006055, 3.08580422e-02, -0.52433543)
+ (0.6067573 , 0, 0.1654515 , 3.73427403e-02, -0.5067573 )
+ (0.59789855, 0, 0.15832326, 4.08449964e-02, -0.49789855)
+ (0.50186967, 0, 0.0911253 , 8.88816919e-02, -0.40186967)
+ (0.48746538, 0, 0.08263634, 9.76778911e-02, -0.38746538)
+ (0.46524858, 0, 0.07035681, 1.12058514e-01, -0.36524858)
+ (0.42472124, 0, 0.05049963, 1.40834151e-01, -0.32472124)
+ (0.32718049, 0, 0.01617488, 2.23558289e-01, -0.22718049)
+ (0.26468049, 0, 0.00418357, 2.86566978e-01, -0.16468049)
+ (0.26321565, 0, 0.00399622, 2.88137443e-01, -0.16321565)
+ (0.23233186, 0, 0.00104535, 3.22247121e-01, -0.13233186)] 
+ dtype=[('x1', '<f8'), ('x2', '<i4'), ('f1', '<f8'), ('f2', '<f8'), ('c1', '<f8')]
diff --git a/examples/named_var_ex.out b/examples/named_var_ex.out
new file mode 100644
index 0000000..1d322b3
--- /dev/null
+++ b/examples/named_var_ex.out
@@ -0,0 +1,3 @@
+Design variable type:   [('MyDes', '<f8'), ('MyCat', '<i4')]
+Simulation output type: [('MySim', '<f8', (2,))]
+Objective type:         [('MyObj', '<f8')]
diff --git a/examples/named_var_ex.py b/examples/named_var_ex.py
index 9ffea14..17a1b22 100644
--- a/examples/named_var_ex.py
+++ b/examples/named_var_ex.py
@@ -37,12 +37,12 @@ def sim_func(x):
 my_moop.addConstraint({'name': "MyCon",
                        'constraint': lambda x, s: 0.1 - x["MyDes"]})
 
-# Extract final objective and simulation databases
+# Extract numpy dtypes for all of this MOOP's inputs/outputs
 des_dtype = my_moop.getDesignType()
 obj_dtype = my_moop.getObjectiveType()
 sim_dtype = my_moop.getSimulationType()
 
-# Print the data types
+# Display the dtypes as strings
 print("Design variable type:   " + str(des_dtype))
 print("Simulation output type: " + str(sim_dtype))
 print("Objective type:         " + str(obj_dtype))
diff --git a/examples/precomputed_data.out b/examples/precomputed_data.out
new file mode 100644
index 0000000..4bba936
--- /dev/null
+++ b/examples/precomputed_data.out
@@ -0,0 +1,2 @@
+{'MySim': array([(0., 0, [0.04, 0.64])],
+      dtype=[('x1', '<f8'), ('x2', '<i4'), ('out', '<f8', (2,))])}
diff --git a/examples/quickstart.out b/examples/quickstart.out
new file mode 100644
index 0000000..be69cbc
--- /dev/null
+++ b/examples/quickstart.out
@@ -0,0 +1,21 @@
+[(0.77391519, 0, 3.29378651e-01, 0.00068042, -0.67391519)
+ (0.74071207, 0, 2.92369542e-01, 0.00351506, -0.64071207)
+ (0.69495041, 0, 2.44975906e-01, 0.01103542, -0.59495041)
+ (0.68982345, 0, 2.39927017e-01, 0.01213887, -0.58982345)
+ (0.6744426 , 0, 2.25095776e-01, 0.01576466, -0.5744426 )
+ (0.661259  , 0, 2.12759867e-01, 0.01924906, -0.561259  )
+ (0.50934553, 0, 9.56946597e-02, 0.08448002, -0.40934553)
+ (0.48102522, 0, 7.89751754e-02, 0.10174491, -0.38102522)
+ (0.44099983, 0, 5.80809160e-02, 0.12888113, -0.34099983)
+ (0.43660529, 0, 5.59820654e-02, 0.13205571, -0.33660529)
+ (0.43221076, 0, 5.39218386e-02, 0.13526892, -0.33221076)
+ (0.42781623, 0, 5.19002356e-02, 0.13852076, -0.32781623)
+ (0.40682014, 0, 4.27745696e-02, 0.1545904 , -0.30682014)
+ (0.32226131, 0, 1.49478271e-02, 0.22823426, -0.22226131)
+ (0.32030818, 0, 1.44740585e-02, 0.23010424, -0.22030818)
+ (0.30053279, 0, 1.01068420e-02, 0.24946749, -0.20053279)
+ (0.27709529, 0, 5.94368387e-03, 0.27342933, -0.17709529)
+ (0.27025935, 0, 4.93637673e-03, 0.28062515, -0.17025935)
+ (0.23778865, 0, 1.42798209e-03, 0.3160816 , -0.13778865)
+ (0.18261287, 0, 3.02312325e-04, 0.38116687, -0.08261287)] 
+ dtype=[('x1', '<f8'), ('x2', '<i4'), ('f1', '<f8'), ('f2', '<f8'), ('c1', '<f8')]
diff --git a/examples/unnamed_var_ex.out b/examples/unnamed_var_ex.out
new file mode 100644
index 0000000..34deed0
--- /dev/null
+++ b/examples/unnamed_var_ex.out
@@ -0,0 +1,20 @@
+Design variable type:   ('<f8', (1,))
+Simulation output type: ('<f8', (2,))
+Objective type:         ('<f8', (1,))
+Constraint type:        ('<f8', (1,))
+
+Objective database keys: ['x_vals', 'f_vals', 'c_vals']
+	'x_vals' dtype: float64
+	'x_vals' shape: (20, 1)
+	'f_vals' dtype: float64
+	'f_vals' shape: (20, 1)
+	'c_vals' dtype: float64
+	'c_vals' shape: (20, 1)
+
+Simulation database type: <class 'list'>
+Simulation database length: 1
+	sim_db[0] database keys: ['x_vals', 's_vals']
+		'x_vals' dtype: float64
+		'x_vals' shape: (20, 1)
+		's_vals' dtype: float64
+		's_vals' shape: (20, 2)
diff --git a/examples/unnamed_var_ex.py b/examples/unnamed_var_ex.py
index 15d3eca..7b54755 100644
--- a/examples/unnamed_var_ex.py
+++ b/examples/unnamed_var_ex.py
@@ -26,6 +26,19 @@ def sim_func(x):
 
 my_moop.addConstraint({'constraint': lambda x, s: 0.1 - x[0]})
 
+# Extract numpy dtypes for all of this MOOP's inputs/outputs
+des_dtype = my_moop.getDesignType()
+sim_dtype = my_moop.getSimulationType()
+obj_dtype = my_moop.getObjectiveType()
+const_dtype = my_moop.getConstraintType()
+
+# Display the dtypes as strings
+print("Design variable type:   " + str(des_dtype))
+print("Simulation output type: " + str(sim_dtype))
+print("Objective type:         " + str(obj_dtype))
+print("Constraint type:        " + str(const_dtype))
+print()
+
 # Add one acquisition and solve with 0 iterations to initialize databases
 my_moop.addAcquisition({'acquisition': UniformWeights})
 my_moop.solve(0)
@@ -34,11 +47,14 @@ def sim_func(x):
 obj_db = my_moop.getObjectiveData()
 sim_db = my_moop.getSimulationData()
 
-# Print the data types
+# Print the objective database dtypes
 print("Objective database keys: " + str([key for key in obj_db.keys()]))
 for key in obj_db.keys():
     print("\t'" + key + "'" + " dtype: " + str(obj_db[key].dtype))
     print("\t'" + key + "'" + " shape: " + str(obj_db[key].shape))
+print()
+
+# Print the simulation database dtypes
 print("Simulation database type: " + str(type(sim_db)))
 print("Simulation database length: " + str(len(sim_db)))
 for i, dbi in enumerate(sim_db):
diff --git a/parmoo/extras/libe.py b/parmoo/extras/libe.py
index 18dbd95..bd9dcfc 100644
--- a/parmoo/extras/libe.py
+++ b/parmoo/extras/libe.py
@@ -150,14 +150,10 @@ def parmoo_persis_gen(H, persis_info, gen_specs, libE_info):
 
 class libE_MOOP(MOOP):
     """ Class for solving a MOOP using libEnsemble to manage parallelism.
-    Upon initialization, supply a scalar optimization procedure and
-    dictionary of hyperparameters.
 
-    ``
-    from parmoo.extras.libE import libE_MOOP
-    from parmoo.optimizers import [name of scalar optimizer] as ScalarOpt
-    moop = libE_MOOP(ScalarOpt, [hyperparams={}])
-    ``
+    Upon initialization, supply a scalar optimization procedure and
+    dictionary of hyperparameters using the default constructor:
+     * ``moop = libE_MOOP.__init__(ScalarOpt, [hyperparams={}])``
 
     Class methods are summarized below.
 
@@ -321,19 +317,19 @@ def addObjective(self, *args):
         functions can be added.
 
         Args:
-            *args (dict): Python dictionary containing objective function
-            info, including:
-             * 'name' (str, optional): The name of this objective
-               (defaults to "obj" + str(i), where i = 1, 2, 3, ... for
-               the first, second, third, ... simulation added to the MOOP).
-             * 'obj_func' (function): An algebraic objective function that maps
-               from R^n X R^m --> R. Interface should match:
-               `cost = obj_func(x, sim_func(x), der=0)`,
-               where `der` is an optional argument specifying whether to
-               take the derivative of the objective function
-                * 0 -- no derivative taken, return f(x, sim_func(x))
-                * 1 -- return derivative wrt x, or
-                * 2 -- return derivative wrt sim(x).
+            args (dict): Python dictionary containing objective function
+                information, including:
+                 * 'name' (str, optional): The name of this objective
+                   (defaults to "obj" + str(i), where i = 1, 2, 3, ... for the
+                   first, second, third, ... simulation added to the MOOP).
+                 * 'obj_func' (function): An algebraic objective function that
+                   maps from R^n X R^m --> R. Interface should match:
+                   `cost = obj_func(x, sim_func(x), der=0)`,
+                   where `der` is an optional argument specifying whether to
+                   take the derivative of the objective function
+                    * 0 -- no derivative taken, return f(x, sim_func(x))
+                    * 1 -- return derivative wrt x, or
+                    * 2 -- return derivative wrt sim(x).
 
         """
 
@@ -349,29 +345,30 @@ def addConstraint(self, *args):
 
         Args:
             *args (dict): Python dictionary containing constraint function
-            information, including:
-             * 'name' (str, optional): The name of this constraint
-               (defaults to "const" + str(i), where i = 1, 2, 3, ... for
-               the first, second, third, ... constraint added to the MOOP).
-             * 'constraint' (function): An algebraic constraint function that
-               maps from R^n X R^m --> R and evaluates to zero or a
-               negative number when feasible and positive otherwise.
-               Interface should match:
-               `violation = constraint(x, sim_func(x), der=0)`,
-               where `der` is an optional argument specifying whether to
-               take the derivative of the constraint function
-                * 0 -- no derivative taken, return c(x, sim_func(x))
-                * 1 -- return derivative wrt x, or
-                * 2 -- return derivative wrt sim(x).
-               Note that any
-               ``constraint(x, sim_func(x), der=0) <= 0``
-               indicates that x is feaseible, while
-               ``constraint(x, sim_func(x), der=0) > 0``
-               indicates that x is infeasible, violating the constraint by
-               an amount proportional to the output.
-               It is the user's responsibility to ensure that after adding all
-               constraints, the feasible region is nonempty and has nonzero
-               measure in the design space.
+                information, including:
+                 * 'name' (str, optional): The name of this constraint
+                   (defaults to "const" + str(i), where i = 1, 2, 3, ... for
+                   the first, second, third, ... constraint added to the
+                   MOOP).
+                 * 'constraint' (function): An algebraic constraint function
+                   that maps from R^n X R^m --> R and evaluates to zero or a
+                   negative number when feasible and positive otherwise.
+                   Interface should match:
+                   `violation = constraint(x, sim_func(x), der=0)`,
+                   where `der` is an optional argument specifying whether to
+                   take the derivative of the constraint function
+                    * 0 -- no derivative taken, return c(x, sim_func(x))
+                    * 1 -- return derivative wrt x, or
+                    * 2 -- return derivative wrt sim(x).
+                   Note that any
+                   ``constraint(x, sim_func(x), der=0) <= 0``
+                   indicates that x is feaseible, while
+                   ``constraint(x, sim_func(x), der=0) > 0``
+                   indicates that x is infeasible, violating the constraint by
+                   an amount proportional to the output.
+                   It is the user's responsibility to ensure that after adding
+                   all constraints, the feasible region is nonempty and has
+                   nonzero measure in the design space.
 
         """
 
@@ -748,14 +745,14 @@ def moop_sim(H, persis_info, sim_specs, _):
                                  ('sim_name', int)],
                          'user': {}}
 
-        alloc_specs = {'alloc_f': alloc_f, 'out': [('given_back', bool)]}
+        alloc_specs = {'alloc_f': alloc_f, 'out': [('gen_informed', bool)]}
 
         persis_info = {}
         for i in range(nworkers + 1):
             persis_info[i] = {}
         persis_info[1]['moop'] = self.moop
 
-        exit_criteria = {'sim_max': sim_max, 'elapsed_wallclock_time': wt_max}
+        exit_criteria = {'sim_max': sim_max, 'wallclock_max': wt_max}
 
         # Perform the run
         H, persis_info, flag = libE(sim_specs, gen_specs, exit_criteria,
diff --git a/parmoo/moop.py b/parmoo/moop.py
index d69615c..0a542a7 100644
--- a/parmoo/moop.py
+++ b/parmoo/moop.py
@@ -17,13 +17,8 @@ class MOOP:
     """ Class for defining a multiobjective optimization problem (MOOP).
 
     Upon initialization, supply a scalar optimization procedure and
-    dictionary of hyperparameters.
-
-    ``
-    from parmoo import MOOP
-    from parmoo.optimizers import [name of scalar optimizer] as ScalarOpt
-    moop = MOOP(ScalarOpt, [hyperparams={}])
-    ``
+    dictionary of hyperparameters using the default constructor:
+     * ``MOOP.__init__(ScalarOpt, [hyperparams={}])``
 
     Class methods are summarized below.
 
@@ -54,13 +49,8 @@ class MOOP:
     To turn on checkpointing, use:
      * ``MOOP.setCheckpoint(checkpoint, [checkpoint_data, filename])``
 
-    ParMOO also offers logging. To turn on logging, use:
-    ``
-    import logging
-    logging.basicConfig(level=logging.INFO,
-        [format='%(asctime)s %(levelname)-8s %(message)s',
-         datefmt='%Y-%m-%d %H:%M:%S'])
-    ``
+    ParMOO also offers logging. To turn on logging, activate INFO-level
+    logging by importing Python's built-in logging module.
 
     After defining the MOOP and setting up checkpointing and logging info,
     use the following method to solve the MOOP (serially):
@@ -754,18 +744,18 @@ def addObjective(self, *args):
 
         Args:
             *args (dict): Python dictionary containing objective function
-            info, including:
-             * 'name' (str, optional): The name of this objective
-               (defaults to "obj" + str(i), where i = 1, 2, 3, ... for
-               the first, second, third, ... simulation added to the MOOP).
-             * 'obj_func' (function): An algebraic objective function that maps
-               from R^n X R^m --> R. Interface should match:
-               `cost = obj_func(x, sim_func(x), der=0)`,
-               where `der` is an optional argument specifying whether to
-               take the derivative of the objective function
-                * 0 -- no derivative taken, return f(x, sim_func(x))
-                * 1 -- return derivative wrt x, or
-                * 2 -- return derivative wrt sim(x).
+                information, including:
+                 * 'name' (str, optional): The name of this objective
+                   (defaults to "obj" + str(i), where i = 1, 2, 3, ... for the
+                   first, second, third, ... simulation added to the MOOP).
+                 * 'obj_func' (function): An algebraic objective function that
+                   maps from R^n X R^m --> R. Interface should match:
+                   `cost = obj_func(x, sim_func(x), der=0)`,
+                   where `der` is an optional argument specifying whether to
+                   take the derivative of the objective function
+                    * 0 -- no derivative taken, return f(x, sim_func(x))
+                    * 1 -- return derivative wrt x, or
+                    * 2 -- return derivative wrt sim(x).
 
         """
 
@@ -815,30 +805,30 @@ def addConstraint(self, *args):
         the design variables and/or the simulation outputs.
 
         Args:
-            *args (dict): Python dictionary containing constraint function
-            information, including:
-             * 'name' (str, optional): The name of this constraint
-               (defaults to "const" + str(i), where i = 1, 2, 3, ... for
-               the first, second, third, ... constraint added to the MOOP).
-             * 'constraint' (function): An algebraic constraint function that
-               maps from R^n X R^m --> R and evaluates to zero or a
-               negative number when feasible and positive otherwise.
-               Interface should match:
-               `violation = constraint(x, sim_func(x), der=0)`,
-               where `der` is an optional argument specifying whether to
-               take the derivative of the constraint function
-                * 0 -- no derivative taken, return c(x, sim_func(x))
-                * 1 -- return derivative wrt x, or
-                * 2 -- return derivative wrt sim(x).
-               Note that any
-               ``constraint(x, sim_func(x), der=0) <= 0``
-               indicates that x is feaseible, while
-               ``constraint(x, sim_func(x), der=0) > 0``
-               indicates that x is infeasible, violating the constraint by
-               an amount proportional to the output.
-               It is the user's responsibility to ensure that after adding all
-               constraints, the feasible region is nonempty and has nonzero
-               measure in the design space.
+            args (dict): Python dictionary containing constraint function
+                information, including:
+                 * 'name' (str, optional): The name of this constraint
+                   (defaults to "const" + str(i), where i = 1, 2, 3, ... for
+                   the first, second, third, ... constraint added to the MOOP).
+                 * 'constraint' (function): An algebraic constraint function
+                   that maps from R^n X R^m --> R and evaluates to zero or a
+                   negative number when feasible and positive otherwise.
+                   Interface should match:
+                   `violation = constraint(x, sim_func(x), der=0)`,
+                   where `der` is an optional argument specifying whether to
+                   take the derivative of the constraint function
+                    * 0 -- no derivative taken, return c(x, sim_func(x))
+                    * 1 -- return derivative wrt x, or
+                    * 2 -- return derivative wrt sim(x).
+                   Note that any
+                   ``constraint(x, sim_func(x), der=0) <= 0``
+                   indicates that x is feaseible, while
+                   ``constraint(x, sim_func(x), der=0) > 0``
+                   indicates that x is infeasible, violating the constraint by
+                   an amount proportional to the output.
+                   It is the user's responsibility to ensure that after adding
+                   all constraints, the feasible region is nonempty and has
+                   nonzero measure in the design space.
 
         """
 
@@ -2278,10 +2268,11 @@ def load(self, filename="parmoo"):
         self.n_lvls = parmoo_state['n_lvls']
         self.des_order = parmoo_state['des_order']
         self.cat_names = parmoo_state['cat_names']
-        self.sim_names = parmoo_state['sim_names']
-        self.des_names = parmoo_state['des_names']
-        self.obj_names = parmoo_state['obj_names']
-        self.const_names = parmoo_state['const_names']
+        self.sim_names = [tuple(item) for item in parmoo_state['sim_names']]
+        self.des_names = [tuple(item) for item in parmoo_state['des_names']]
+        self.obj_names = [tuple(item) for item in parmoo_state['obj_names']]
+        self.const_names = [tuple(item)
+                            for item in parmoo_state['const_names']]
         self.lam = parmoo_state['lam']
         self.des_tols = parmoo_state['des_tols']
         self.hyperparams = parmoo_state['hyperparams']
diff --git a/parmoo/version.py b/parmoo/version.py
index 01778a9..b794fd4 100644
--- a/parmoo/version.py
+++ b/parmoo/version.py
@@ -1,1 +1,1 @@
-__version__ = '0.0.0+dev'
+__version__ = '0.1.0'
diff --git a/setup.py b/setup.py
index 41a42a0..8470f8d 100644
--- a/setup.py
+++ b/setup.py
@@ -15,7 +15,7 @@ def run_tests(self):
         import sys
         py_version = sys.version_info[0]
         print("Python version from setup.py is", py_version)
-        run_string = "parmoo/tests/run-tests.sh -t" #+ str(py_version)
+        run_string = "parmoo/tests/run-tests.sh -curl" #+ str(py_version)
         os.system(run_string)
 
 
@@ -45,9 +45,13 @@ def run_tests(self):
               "parmoo.optimizers",
               "parmoo.searches",
               "parmoo.surrogates",
+              "parmoo.simulations",
+              "parmoo.objectives",
+              "parmoo.constraints",
               "parmoo.tests",
               "parmoo.tests.unit_tests",
-              "parmoo.tests.libe_tests"],
+              "parmoo.tests.libe_tests",
+              "parmoo.tests.regression_tests"],
 
     install_requires=["numpy", "scipy", "pyDOE"],
 
@@ -56,27 +60,26 @@ def run_tests(self):
 
     extras_require={
         'extras': ["libensemble"],
-        'docs': ['sphinx', 'sphinxcontrib.bibtex', 'sphinx_rtd_theme']},
+        'docs': ["sphinx", "sphinxcontrib.bibtex", "sphinx_rtd_theme"]},
 
     classifiers=[
-        'Development Status :: 4 - Beta',
-        'Intended Audience :: Developers',
-        'Intended Audience :: Science/Research',
-        'License :: OSI Approved :: BSD License',
-        'Natural Language :: English',
-        'Operating System :: POSIX :: Linux',
-        'Operating System :: Unix',
-        'Operating System :: MacOS',
-        'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.6',
-        'Programming Language :: Python :: 3.7',
-        'Programming Language :: Python :: 3.8',
-        'Programming Language :: Python :: 3.9',
-        'Programming Language :: Python :: 3.10',
-        'Programming Language :: Python :: Implementation :: CPython',
-        'Topic :: Scientific/Engineering',
-        'Topic :: Software Development :: Libraries :: Python Modules'
-    ],
+        "Development Status :: 4 - Beta",
+        "Intended Audience :: Developers",
+        "Intended Audience :: Science/Research",
+        "License :: OSI Approved :: BSD License",
+        "Natural Language :: English",
+        "Operating System :: POSIX :: Linux",
+        "Operating System :: Unix",
+        "Operating System :: MacOS",
+        "Programming Language :: Python :: 3",
+        "Programming Language :: Python :: 3.6",
+        "Programming Language :: Python :: 3.7",
+        "Programming Language :: Python :: 3.8",
+        "Programming Language :: Python :: 3.9",
+        "Programming Language :: Python :: 3.10",
+        "Programming Language :: Python :: Implementation :: CPython",
+        "Topic :: Scientific/Engineering",
+        "Topic :: Software Development :: Libraries :: Python Modules"],
 
     cmdclass={'test': Run_TestSuite, 'tox': ToxTest}
 )


Test patch:
diff --git a/parmoo/tests/__init__.py b/parmoo/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/parmoo/tests/libe_tests/__init__.py b/parmoo/tests/libe_tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/parmoo/tests/regression_tests/__init__.py b/parmoo/tests/regression_tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/parmoo/tests/unit_tests/__init__.py b/parmoo/tests/unit_tests/__init__.py
new file mode 100644
index 0000000..e69de29