diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..963e589a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,58 @@
+*.py[cod]
+
+# C extensions
+*.so
+
+# Packages
+*.egg*
+*.egg-info
+dist
+build
+eggs
+parts
+bin
+var
+sdist
+develop-eggs
+.installed.cfg
+lib
+lib64
+
+# Installer logs
+pip-log.txt
+
+# Unit test / coverage reports
+cover/
+.coverage*
+!.coveragerc
+.tox
+nosetests.xml
+.testrepository
+.venv
+
+# Translations
+*.mo
+
+# Mr Developer
+.mr.developer.cfg
+.project
+.pydevproject
+
+# Complexity
+output/*.html
+output/*/index.html
+
+# Sphinx
+doc/build
+
+# pbr generates these
+AUTHORS
+ChangeLog
+
+# Editors
+*~
+.*.swp
+.*sw?
+
+# Files created by releasenotes build
+releasenotes/build
\ No newline at end of file
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 00000000..c922f11a
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1 @@
+recursive-include public *
diff --git a/README.rst b/README.rst
new file mode 100644
index 00000000..c8a88e05
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,13 @@
+===============================
+orm
+===============================
+
+Openstack  Resource Management
+
+* TODO
+
+Features
+--------
+
+* TODO
+
diff --git a/babel.cfg b/babel.cfg
new file mode 100644
index 00000000..15cd6cb7
--- /dev/null
+++ b/babel.cfg
@@ -0,0 +1,2 @@
+[python: **.py]
+
diff --git a/config.py b/config.py
new file mode 100644
index 00000000..76a61999
--- /dev/null
+++ b/config.py
@@ -0,0 +1,54 @@
+# Server Specific Configurations
+server = {
+    'port': '9866',
+    'host': '0.0.0.0'
+}
+
+# Pecan Application Configurations
+app = {
+    'root': 'orm.controllers.root.RootController',
+    'modules': ['orm'],
+    'static_root': '%(confdir)s/public',
+    'template_path': '%(confdir)s/orm/templates',
+    'debug': True,
+    'errors': {
+        404: '/error/404',
+        '__force_dict__': True
+    }
+}
+
+logging = {
+    'root': {'level': 'INFO', 'handlers': ['console']},
+    'loggers': {
+        'orm': {'level': 'DEBUG', 'handlers': ['console']},
+        'pecan': {'level': 'DEBUG', 'handlers': ['console']},
+        'py.warnings': {'handlers': ['console']},
+        '__force_dict__': True
+    },
+    'handlers': {
+        'console': {
+            'level': 'DEBUG',
+            'class': 'logging.StreamHandler',
+            'formatter': 'color'
+        }
+    },
+    'formatters': {
+        'simple': {
+            'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]'
+                       '[%(threadName)s] %(message)s')
+        },
+        'color': {
+            '()': 'pecan.log.ColorFormatter',
+            'format': ('%(asctime)s [%(padded_color_levelname)s] [%(name)s]'
+                       '[%(threadName)s] %(message)s'),
+            '__force_dict__': True
+        }
+    }
+}
+
+# Custom Configurations must be in Python dictionary format::
+#
+# foo = {'bar':'baz'}
+#
+# All configurations are accessible at::
+# pecan.conf
diff --git a/doc/source/admin/index.rst b/doc/source/admin/index.rst
new file mode 100644
index 00000000..2199771d
--- /dev/null
+++ b/doc/source/admin/index.rst
@@ -0,0 +1,5 @@
+====================
+Administrators guide
+====================
+
+Administrators guide of ranger.
diff --git a/doc/source/cli/index.rst b/doc/source/cli/index.rst
new file mode 100644
index 00000000..a24b26cd
--- /dev/null
+++ b/doc/source/cli/index.rst
@@ -0,0 +1,5 @@
+================================
+Command line interface reference
+================================
+
+CLI reference of ranger.
diff --git a/doc/source/conf.py b/doc/source/conf.py
new file mode 100755
index 00000000..8ae92f59
--- /dev/null
+++ b/doc/source/conf.py
@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('../..'))
+# -- General configuration ----------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = [
+    'sphinx.ext.autodoc',
+    'openstackdocstheme',
+    #'sphinx.ext.intersphinx',
+]
+
+# autodoc generation is a bit aggressive and a nuisance when doing heavy
+# text edit cycles.
+# execute "export SPHINX_DEBUG=1" in your terminal to disable
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'ranger'
+copyright = u'2017, OpenStack Developers'
+
+# openstackdocstheme options
+repository_name = 'openstack/ranger'
+bug_project = 'ranger'
+bug_tag = ''
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+add_module_names = True
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# -- Options for HTML output --------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  Major themes that come with
+# Sphinx are currently 'default' and 'sphinxdoc'.
+# html_theme_path = ["."]
+# html_theme = '_theme'
+# html_static_path = ['static']
+html_theme = 'openstackdocs'
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = '%sdoc' % project
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass
+# [howto/manual]).
+latex_documents = [
+    ('index',
+     '%s.tex' % project,
+     u'%s Documentation' % project,
+     u'OpenStack Developers', 'manual'),
+]
+
+# Example configuration for intersphinx: refer to the Python standard library.
+#intersphinx_mapping = {'http://docs.python.org/': None}
diff --git a/doc/source/configuration/index.rst b/doc/source/configuration/index.rst
new file mode 100644
index 00000000..11524609
--- /dev/null
+++ b/doc/source/configuration/index.rst
@@ -0,0 +1,5 @@
+=============
+Configuration
+=============
+
+Configuration of ranger.
diff --git a/doc/source/contributor/contributing.rst b/doc/source/contributor/contributing.rst
new file mode 100644
index 00000000..2aa07077
--- /dev/null
+++ b/doc/source/contributor/contributing.rst
@@ -0,0 +1,4 @@
+============
+Contributing
+============
+.. include:: ../../../CONTRIBUTING.rst
diff --git a/doc/source/contributor/index.rst b/doc/source/contributor/index.rst
new file mode 100644
index 00000000..036e4494
--- /dev/null
+++ b/doc/source/contributor/index.rst
@@ -0,0 +1,9 @@
+===========================
+ Contributor Documentation
+===========================
+
+.. toctree::
+   :maxdepth: 2
+
+   contributing
+
diff --git a/doc/source/index.rst b/doc/source/index.rst
new file mode 100644
index 00000000..954bd235
--- /dev/null
+++ b/doc/source/index.rst
@@ -0,0 +1,30 @@
+.. ranger documentation master file, created by
+   sphinx-quickstart on Tue Jul  9 22:26:36 2013.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+======================================
+Welcome to the documentation of ranger
+======================================
+
+Contents:
+
+.. toctree::
+   :maxdepth: 2
+
+   readme
+   install/index
+   library/index
+   contributor/index
+   configuration/index
+   cli/index
+   user/index
+   admin/index
+   reference/index
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/doc/source/install/common_configure.rst b/doc/source/install/common_configure.rst
new file mode 100644
index 00000000..d68e82cc
--- /dev/null
+++ b/doc/source/install/common_configure.rst
@@ -0,0 +1,10 @@
+2. Edit the ``/etc/ranger/ranger.conf`` file and complete the following
+   actions:
+
+   * In the ``[database]`` section, configure database access:
+
+     .. code-block:: ini
+
+        [database]
+        ...
+        connection = mysql+pymysql://ranger:RANGER_DBPASS@controller/ranger
diff --git a/doc/source/install/common_prerequisites.rst b/doc/source/install/common_prerequisites.rst
new file mode 100644
index 00000000..a53c5786
--- /dev/null
+++ b/doc/source/install/common_prerequisites.rst
@@ -0,0 +1,75 @@
+Prerequisites
+-------------
+
+Before you install and configure the ranger service,
+you must create a database, service credentials, and API endpoints.
+
+#. To create the database, complete these steps:
+
+   * Use the database access client to connect to the database
+     server as the ``root`` user:
+
+     .. code-block:: console
+
+        $ mysql -u root -p
+
+   * Create the ``ranger`` database:
+
+     .. code-block:: none
+
+        CREATE DATABASE ranger;
+
+   * Grant proper access to the ``ranger`` database:
+
+     .. code-block:: none
+
+        GRANT ALL PRIVILEGES ON ranger.* TO 'ranger'@'localhost' \
+          IDENTIFIED BY 'RANGER_DBPASS';
+        GRANT ALL PRIVILEGES ON ranger.* TO 'ranger'@'%' \
+          IDENTIFIED BY 'RANGER_DBPASS';
+
+     Replace ``RANGER_DBPASS`` with a suitable password.
+
+   * Exit the database access client.
+
+     .. code-block:: none
+
+        exit;
+
+#. Source the ``admin`` credentials to gain access to
+   admin-only CLI commands:
+
+   .. code-block:: console
+
+      $ . admin-openrc
+
+#. To create the service credentials, complete these steps:
+
+   * Create the ``ranger`` user:
+
+     .. code-block:: console
+
+        $ openstack user create --domain default --password-prompt ranger
+
+   * Add the ``admin`` role to the ``ranger`` user:
+
+     .. code-block:: console
+
+        $ openstack role add --project service --user ranger admin
+
+   * Create the ranger service entities:
+
+     .. code-block:: console
+
+        $ openstack service create --name ranger --description "ranger" ranger
+
+#. Create the ranger service API endpoints:
+
+   .. code-block:: console
+
+      $ openstack endpoint create --region RegionOne \
+        ranger public http://controller:XXXX/vY/%\(tenant_id\)s
+      $ openstack endpoint create --region RegionOne \
+        ranger internal http://controller:XXXX/vY/%\(tenant_id\)s
+      $ openstack endpoint create --region RegionOne \
+        ranger admin http://controller:XXXX/vY/%\(tenant_id\)s
diff --git a/doc/source/install/get_started.rst b/doc/source/install/get_started.rst
new file mode 100644
index 00000000..9eb16cb4
--- /dev/null
+++ b/doc/source/install/get_started.rst
@@ -0,0 +1,9 @@
+=======================
+ranger service overview
+=======================
+The ranger service provides...
+
+The ranger service consists of the following components:
+
+``ranger-api`` service
+  Accepts and responds to end user compute API calls...
diff --git a/doc/source/install/index.rst b/doc/source/install/index.rst
new file mode 100644
index 00000000..19d2c65c
--- /dev/null
+++ b/doc/source/install/index.rst
@@ -0,0 +1,17 @@
+=================================
+ranger service installation guide
+=================================
+
+.. toctree::
+   :maxdepth: 2
+
+   get_started.rst
+   install.rst
+   verify.rst
+   next-steps.rst
+
+The ranger service (ranger) provides...
+
+This chapter assumes a working setup of OpenStack following the
+`OpenStack Installation Tutorial
+<https://docs.openstack.org/project-install-guide/ocata/>`_.
diff --git a/doc/source/install/install-obs.rst b/doc/source/install/install-obs.rst
new file mode 100644
index 00000000..eabf68f9
--- /dev/null
+++ b/doc/source/install/install-obs.rst
@@ -0,0 +1,34 @@
+.. _install-obs:
+
+
+Install and configure for openSUSE and SUSE Linux Enterprise
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This section describes how to install and configure the ranger service
+for openSUSE Leap 42.1 and SUSE Linux Enterprise Server 12 SP1.
+
+.. include:: common_prerequisites.rst
+
+Install and configure components
+--------------------------------
+
+#. Install the packages:
+
+   .. code-block:: console
+
+      # zypper --quiet --non-interactive install
+
+.. include:: common_configure.rst
+
+
+Finalize installation
+---------------------
+
+Start the ranger services and configure them to start when
+the system boots:
+
+.. code-block:: console
+
+   # systemctl enable openstack-ranger-api.service
+
+   # systemctl start openstack-ranger-api.service
diff --git a/doc/source/install/install-rdo.rst b/doc/source/install/install-rdo.rst
new file mode 100644
index 00000000..5c71c9ce
--- /dev/null
+++ b/doc/source/install/install-rdo.rst
@@ -0,0 +1,33 @@
+.. _install-rdo:
+
+Install and configure for Red Hat Enterprise Linux and CentOS
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+This section describes how to install and configure the ranger service
+for Red Hat Enterprise Linux 7 and CentOS 7.
+
+.. include:: common_prerequisites.rst
+
+Install and configure components
+--------------------------------
+
+#. Install the packages:
+
+   .. code-block:: console
+
+      # yum install
+
+.. include:: common_configure.rst
+
+Finalize installation
+---------------------
+
+Start the ranger services and configure them to start when
+the system boots:
+
+.. code-block:: console
+
+   # systemctl enable openstack-ranger-api.service
+
+   # systemctl start openstack-ranger-api.service
diff --git a/doc/source/install/install-ubuntu.rst b/doc/source/install/install-ubuntu.rst
new file mode 100644
index 00000000..58b8e300
--- /dev/null
+++ b/doc/source/install/install-ubuntu.rst
@@ -0,0 +1,31 @@
+.. _install-ubuntu:
+
+Install and configure for Ubuntu
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This section describes how to install and configure the ranger
+service for Ubuntu 14.04 (LTS).
+
+.. include:: common_prerequisites.rst
+
+Install and configure components
+--------------------------------
+
+#. Install the packages:
+
+   .. code-block:: console
+
+      # apt-get update
+
+      # apt-get install
+
+.. include:: common_configure.rst
+
+Finalize installation
+---------------------
+
+Restart the ranger services:
+
+.. code-block:: console
+
+   # service openstack-ranger-api restart
diff --git a/doc/source/install/install.rst b/doc/source/install/install.rst
new file mode 100644
index 00000000..bf0e3739
--- /dev/null
+++ b/doc/source/install/install.rst
@@ -0,0 +1,20 @@
+.. _install:
+
+Install and configure
+~~~~~~~~~~~~~~~~~~~~~
+
+This section describes how to install and configure the
+ranger service, code-named ranger, on the controller node.
+
+This section assumes that you already have a working OpenStack
+environment with at least the following components installed:
+.. (add the appropriate services here and further notes)
+
+Note that installation and configuration vary by distribution.
+
+.. toctree::
+   :maxdepth: 2
+
+   install-obs.rst
+   install-rdo.rst
+   install-ubuntu.rst
diff --git a/doc/source/install/next-steps.rst b/doc/source/install/next-steps.rst
new file mode 100644
index 00000000..5b26aa42
--- /dev/null
+++ b/doc/source/install/next-steps.rst
@@ -0,0 +1,9 @@
+.. _next-steps:
+
+Next steps
+~~~~~~~~~~
+
+Your OpenStack environment now includes the ranger service.
+
+To add additional services, see
+https://docs.openstack.org/project-install-guide/ocata/.
diff --git a/doc/source/install/verify.rst b/doc/source/install/verify.rst
new file mode 100644
index 00000000..9f7e7536
--- /dev/null
+++ b/doc/source/install/verify.rst
@@ -0,0 +1,24 @@
+.. _verify:
+
+Verify operation
+~~~~~~~~~~~~~~~~
+
+Verify operation of the ranger service.
+
+.. note::
+
+   Perform these commands on the controller node.
+
+#. Source the ``admin`` project credentials to gain access to
+   admin-only CLI commands:
+
+   .. code-block:: console
+
+      $ . admin-openrc
+
+#. List service components to verify successful launch and registration
+   of each process:
+
+   .. code-block:: console
+
+      $ openstack ranger service list
diff --git a/doc/source/library/index.rst b/doc/source/library/index.rst
new file mode 100644
index 00000000..50d25348
--- /dev/null
+++ b/doc/source/library/index.rst
@@ -0,0 +1,7 @@
+========
+Usage
+========
+
+To use ranger in a project::
+
+    import ranger
diff --git a/doc/source/readme.rst b/doc/source/readme.rst
new file mode 100644
index 00000000..a6210d3d
--- /dev/null
+++ b/doc/source/readme.rst
@@ -0,0 +1 @@
+.. include:: ../../README.rst
diff --git a/doc/source/reference/index.rst b/doc/source/reference/index.rst
new file mode 100644
index 00000000..a1c5ce57
--- /dev/null
+++ b/doc/source/reference/index.rst
@@ -0,0 +1,5 @@
+==========
+References
+==========
+
+References of ranger.
diff --git a/doc/source/user/index.rst b/doc/source/user/index.rst
new file mode 100644
index 00000000..4d58bdf8
--- /dev/null
+++ b/doc/source/user/index.rst
@@ -0,0 +1,5 @@
+===========
+Users guide
+===========
+
+Users guide of ranger.
diff --git a/etc/orm.conf b/etc/orm.conf
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/__init__.py b/orm/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/app.py b/orm/app.py
new file mode 100644
index 00000000..aa55a875
--- /dev/null
+++ b/orm/app.py
@@ -0,0 +1,14 @@
+from pecan import make_app
+from orm import model
+
+
+def setup_app(config):
+
+    model.init_model()
+    app_conf = dict(config.app)
+
+    return make_app(
+        app_conf.pop('root'),
+        logging=getattr(config, 'logging', {}),
+        **app_conf
+    )
diff --git a/orm/cmd/__init__.py b/orm/cmd/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/cmd/audit.py b/orm/cmd/audit.py
new file mode 100644
index 00000000..eb2230fc
--- /dev/null
+++ b/orm/cmd/audit.py
@@ -0,0 +1,19 @@
+#  Copyright 2016 ATT
+#
+#  Licensed under the Apache License, Version 2.0 (the "License"); you may
+#  not use this file except in compliance with the License. You may obtain
+#  a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#  License for the specific language governing permissions and limitations
+#  under the License.
+
+from orm.services.audit_trail_manager.audit_server import app
+
+
+def main():
+    app.main()
diff --git a/orm/cmd/cms.py b/orm/cmd/cms.py
new file mode 100644
index 00000000..01c14741
--- /dev/null
+++ b/orm/cmd/cms.py
@@ -0,0 +1,19 @@
+#  Copyright 2016 ATT
+#
+#  Licensed under the Apache License, Version 2.0 (the "License"); you may
+#  not use this file except in compliance with the License. You may obtain
+#  a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#  License for the specific language governing permissions and limitations
+#  under the License.
+
+from orm.services.customer_manager.cms_rest import app
+
+
+def main():
+    app.main()
diff --git a/orm/cmd/fms.py b/orm/cmd/fms.py
new file mode 100644
index 00000000..1abb35f7
--- /dev/null
+++ b/orm/cmd/fms.py
@@ -0,0 +1,19 @@
+#  Copyright 2016 ATT
+#
+#  Licensed under the Apache License, Version 2.0 (the "License"); you may
+#  not use this file except in compliance with the License. You may obtain
+#  a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#  License for the specific language governing permissions and limitations
+#  under the License.
+
+from orm.services.flavor_manager.fms_rest import app
+
+
+def main():
+    app.main()
diff --git a/orm/cmd/ims.py b/orm/cmd/ims.py
new file mode 100644
index 00000000..45b9fac0
--- /dev/null
+++ b/orm/cmd/ims.py
@@ -0,0 +1,19 @@
+#  Copyright 2016 ATT
+#
+#  Licensed under the Apache License, Version 2.0 (the "License"); you may
+#  not use this file except in compliance with the License. You may obtain
+#  a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#  License for the specific language governing permissions and limitations
+#  under the License.
+
+from orm.services.image_manager.ims import app
+
+
+def main():
+    app.main()
diff --git a/orm/cmd/keystone.py b/orm/cmd/keystone.py
new file mode 100644
index 00000000..6d7bada3
--- /dev/null
+++ b/orm/cmd/keystone.py
@@ -0,0 +1,19 @@
+#  Copyright 2016 ATT
+#
+#  Licensed under the Apache License, Version 2.0 (the "License"); you may
+#  not use this file except in compliance with the License. You may obtain
+#  a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#  License for the specific language governing permissions and limitations
+#  under the License.
+
+from orm.services.resource_distributor.rds import app
+
+
+def main():
+    app.main()
diff --git a/orm/cmd/rds.py b/orm/cmd/rds.py
new file mode 100644
index 00000000..6d7bada3
--- /dev/null
+++ b/orm/cmd/rds.py
@@ -0,0 +1,19 @@
+#  Copyright 2016 ATT
+#
+#  Licensed under the Apache License, Version 2.0 (the "License"); you may
+#  not use this file except in compliance with the License. You may obtain
+#  a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#  License for the specific language governing permissions and limitations
+#  under the License.
+
+from orm.services.resource_distributor.rds import app
+
+
+def main():
+    app.main()
diff --git a/orm/cmd/rms.py b/orm/cmd/rms.py
new file mode 100644
index 00000000..b6e6cffe
--- /dev/null
+++ b/orm/cmd/rms.py
@@ -0,0 +1,19 @@
+#  Copyright 2016 ATT
+#
+#  Licensed under the Apache License, Version 2.0 (the "License"); you may
+#  not use this file except in compliance with the License. You may obtain
+#  a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#  License for the specific language governing permissions and limitations
+#  under the License.
+
+from orm.services.region_manager.rms import app
+
+
+def main():
+    app.main()
diff --git a/orm/cmd/uuidgen.py b/orm/cmd/uuidgen.py
new file mode 100644
index 00000000..dbf8844f
--- /dev/null
+++ b/orm/cmd/uuidgen.py
@@ -0,0 +1,19 @@
+#  Copyright 2016 ATT
+#
+#  Licensed under the Apache License, Version 2.0 (the "License"); you may
+#  not use this file except in compliance with the License. You may obtain
+#  a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#  License for the specific language governing permissions and limitations
+#  under the License.
+
+from orm.services.id_generator.uuidgen import app
+
+
+def main():
+    app.main()
diff --git a/orm/common/__init__.py b/orm/common/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/client/__init__.py b/orm/common/client/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/client/audit/__init__.py b/orm/common/client/audit/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/client/keystone/CONTRIBUTING.rst b/orm/common/client/keystone/CONTRIBUTING.rst
new file mode 100644
index 00000000..1271f07d
--- /dev/null
+++ b/orm/common/client/keystone/CONTRIBUTING.rst
@@ -0,0 +1,17 @@
+If you would like to contribute to the development of OpenStack, you must
+follow the steps in this page:
+
+   http://docs.openstack.org/infra/manual/developers.html
+
+If you already have a good understanding of how the system works and your
+OpenStack accounts are set up, you can skip to the development workflow
+section of this documentation to learn how changes to OpenStack should be
+submitted for review via the Gerrit tool:
+
+   http://docs.openstack.org/infra/manual/developers.html#development-workflow
+
+Pull requests submitted through GitHub will be ignored.
+
+Bugs should be filed on Launchpad, not GitHub:
+
+   https://bugs.launchpad.net/keystone_utils
diff --git a/orm/common/client/keystone/HACKING.rst b/orm/common/client/keystone/HACKING.rst
new file mode 100644
index 00000000..923c0d23
--- /dev/null
+++ b/orm/common/client/keystone/HACKING.rst
@@ -0,0 +1,4 @@
+keystone_utils Style Commandments
+===============================================
+
+Read the OpenStack Style Commandments http://docs.openstack.org/developer/hacking/
diff --git a/orm/common/client/keystone/LICENSE b/orm/common/client/keystone/LICENSE
new file mode 100644
index 00000000..68c771a0
--- /dev/null
+++ b/orm/common/client/keystone/LICENSE
@@ -0,0 +1,176 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
diff --git a/orm/common/client/keystone/MANIFEST.in b/orm/common/client/keystone/MANIFEST.in
new file mode 100644
index 00000000..c978a52d
--- /dev/null
+++ b/orm/common/client/keystone/MANIFEST.in
@@ -0,0 +1,6 @@
+include AUTHORS
+include ChangeLog
+exclude .gitignore
+exclude .gitreview
+
+global-exclude *.pyc
diff --git a/orm/common/client/keystone/README.rst b/orm/common/client/keystone/README.rst
new file mode 100644
index 00000000..40da6123
--- /dev/null
+++ b/orm/common/client/keystone/README.rst
@@ -0,0 +1,19 @@
+===============================
+keystone_utils
+===============================
+
+keyKeystone utils
+
+Please feel here a long description which must be at least 3 lines wrapped on
+80 cols, so that distribution package maintainers can use it in their packages.
+Note that this is a hard requirement.
+
+* Free software: Apache license
+* Documentation: http://docs.openstack.org/developer/keystone_utils
+* Source: http://git.openstack.org/cgit/keystone_utils/keystone_utils
+* Bugs: http://bugs.launchpad.net/keystone_utils
+
+Features
+--------
+
+* TODO
diff --git a/orm/common/client/keystone/__init__.py b/orm/common/client/keystone/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/client/keystone/babel.cfg b/orm/common/client/keystone/babel.cfg
new file mode 100644
index 00000000..15cd6cb7
--- /dev/null
+++ b/orm/common/client/keystone/babel.cfg
@@ -0,0 +1,2 @@
+[python: **.py]
+
diff --git a/orm/common/client/keystone/debian/aic-orm-keystone.install b/orm/common/client/keystone/debian/aic-orm-keystone.install
new file mode 100644
index 00000000..a98784d5
--- /dev/null
+++ b/orm/common/client/keystone/debian/aic-orm-keystone.install
@@ -0,0 +1 @@
+aic-orm-keystone/* opt/app/orm/keystone_utils
diff --git a/orm/common/client/keystone/debian/changelog b/orm/common/client/keystone/debian/changelog
new file mode 100755
index 00000000..86458417
--- /dev/null
+++ b/orm/common/client/keystone/debian/changelog
@@ -0,0 +1,5 @@
+aic-orm-keystone (3.5.0) stable; urgency=low
+
+  * this is release 3.5.0
+
+ -- Jenkins job <jenkins@unknown>  Thu, 24 Jun 2016 14:48:02 +0000
diff --git a/orm/common/client/keystone/debian/compat b/orm/common/client/keystone/debian/compat
new file mode 100755
index 00000000..ec635144
--- /dev/null
+++ b/orm/common/client/keystone/debian/compat
@@ -0,0 +1 @@
+9
diff --git a/orm/common/client/keystone/debian/control b/orm/common/client/keystone/debian/control
new file mode 100755
index 00000000..72cab6d3
--- /dev/null
+++ b/orm/common/client/keystone/debian/control
@@ -0,0 +1,13 @@
+Source: aic-orm-keystone
+Section: unknown
+Priority: optional
+Maintainer: orm <orm@intl.att.com>
+Build-Depends: debhelper (>= 8.0.0)
+Standards-Version: 3.9.4
+XS-Python-Version: >= 2.7
+Homepage: <insert the upstream URL, if relevant>
+
+Package: aic-orm-keystone
+Architecture: any
+Depends: python-keystoneclient (>= 1.2.0), python-requests (>= 2.2.0)
+Description: aic-orm-keystone application for ORM
diff --git a/orm/common/client/keystone/debian/copyright b/orm/common/client/keystone/debian/copyright
new file mode 100755
index 00000000..60ee39f4
--- /dev/null
+++ b/orm/common/client/keystone/debian/copyright
@@ -0,0 +1,34 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: aic-orm-keystone
+Source: <url://example.com>
+
+Files: *
+Copyright: <years> <put author's name and email here>
+           <years> <likewise for another author>
+License: GPL-3.0+
+
+Files: debian/*
+Copyright: 2016 root <root@unknown>
+License: GPL-3.0+
+
+License: GPL-3.0+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+ .
+ This package is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU General
+ Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
+
+# Please also look if there are files or directories which have a
+# different copyright/license attached and list them here.
+# Please avoid to pick license terms that are more restrictive than the
+# packaged work, as it may make Debian's contributions unacceptable upstream.
diff --git a/orm/common/client/keystone/debian/docs b/orm/common/client/keystone/debian/docs
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/common/client/keystone/debian/postrm b/orm/common/client/keystone/debian/postrm
new file mode 100755
index 00000000..dc3dad32
--- /dev/null
+++ b/orm/common/client/keystone/debian/postrm
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+#rm -rf /opt/app/orm/keystone_utils
+#echo "Deleting /opt/app/orm/keystone_utils directory."
diff --git a/orm/common/client/keystone/debian/rules b/orm/common/client/keystone/debian/rules
new file mode 100755
index 00000000..db692436
--- /dev/null
+++ b/orm/common/client/keystone/debian/rules
@@ -0,0 +1,8 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+%:
+	dh $@ --buildsystem=python_distutils -D aic-orm-keystone
diff --git a/orm/common/client/keystone/debian/source/format b/orm/common/client/keystone/debian/source/format
new file mode 100755
index 00000000..89ae9db8
--- /dev/null
+++ b/orm/common/client/keystone/debian/source/format
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/orm/common/client/keystone/doc/source/contributing.rst b/orm/common/client/keystone/doc/source/contributing.rst
new file mode 100644
index 00000000..1728a61c
--- /dev/null
+++ b/orm/common/client/keystone/doc/source/contributing.rst
@@ -0,0 +1,4 @@
+============
+Contributing
+============
+.. include:: ../../CONTRIBUTING.rst
diff --git a/orm/common/client/keystone/doc/source/index.rst b/orm/common/client/keystone/doc/source/index.rst
new file mode 100644
index 00000000..e98a5d29
--- /dev/null
+++ b/orm/common/client/keystone/doc/source/index.rst
@@ -0,0 +1,25 @@
+.. keystone_utils documentation master file, created by
+   sphinx-quickstart on Tue Jul  9 22:26:36 2013.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Welcome to keystone_utils's documentation!
+========================================================
+
+Contents:
+
+.. toctree::
+   :maxdepth: 2
+
+   readme
+   installation
+   usage
+   contributing
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
diff --git a/orm/common/client/keystone/doc/source/installation.rst b/orm/common/client/keystone/doc/source/installation.rst
new file mode 100644
index 00000000..645e0aa1
--- /dev/null
+++ b/orm/common/client/keystone/doc/source/installation.rst
@@ -0,0 +1,12 @@
+============
+Installation
+============
+
+At the command line::
+
+    $ pip install keystone_utils
+
+Or, if you have virtualenvwrapper installed::
+
+    $ mkvirtualenv keystone_utils
+    $ pip install keystone_utils
diff --git a/orm/common/client/keystone/doc/source/readme.rst b/orm/common/client/keystone/doc/source/readme.rst
new file mode 100644
index 00000000..a6210d3d
--- /dev/null
+++ b/orm/common/client/keystone/doc/source/readme.rst
@@ -0,0 +1 @@
+.. include:: ../../README.rst
diff --git a/orm/common/client/keystone/doc/source/usage.rst b/orm/common/client/keystone/doc/source/usage.rst
new file mode 100644
index 00000000..b669d988
--- /dev/null
+++ b/orm/common/client/keystone/doc/source/usage.rst
@@ -0,0 +1,7 @@
+========
+Usage
+========
+
+To use keystone_utils in a project::
+
+    import keystone_utils
diff --git a/orm/common/client/keystone/keystone_utils.egg-info/PKG-INFO b/orm/common/client/keystone/keystone_utils.egg-info/PKG-INFO
new file mode 100644
index 00000000..d8d62d58
--- /dev/null
+++ b/orm/common/client/keystone/keystone_utils.egg-info/PKG-INFO
@@ -0,0 +1,21 @@
+Metadata-Version: 1.1
+Name: keystone-utils
+Version: 0.1
+Summary: keyKeystone utils
+Home-page: http://www.openstack.org/
+Author: OpenStack
+Author-email: openstack-dev@lists.openstack.org
+License: UNKNOWN
+Description: UNKNOWN
+Platform: UNKNOWN
+Classifier: Environment :: OpenStack
+Classifier: Intended Audience :: Information Technology
+Classifier: Intended Audience :: System Administrators
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Operating System :: POSIX :: Linux
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
diff --git a/orm/common/client/keystone/keystone_utils.egg-info/SOURCES.txt b/orm/common/client/keystone/keystone_utils.egg-info/SOURCES.txt
new file mode 100644
index 00000000..9522de07
--- /dev/null
+++ b/orm/common/client/keystone/keystone_utils.egg-info/SOURCES.txt
@@ -0,0 +1,25 @@
+MANIFEST.in
+README.rst
+setup.cfg
+setup.py
+keystone_utils/__init__.py
+keystone_utils/tokens.py
+keystone_utils.egg-info/PKG-INFO
+keystone_utils.egg-info/SOURCES.txt
+keystone_utils.egg-info/dependency_links.txt
+keystone_utils.egg-info/not-zip-safe
+keystone_utils.egg-info/pbr.json
+keystone_utils.egg-info/top_level.txt
+keystone_utils/tests/__init__.py
+keystone_utils/tests/unit/__init__.py
+keystone_utils/tests/unit/test_tokens.py
+mock_keystone/__init__.py
+mock_keystone/keystoneclient/__init__.py
+mock_keystone/keystoneclient/exceptions.py
+mock_keystone/keystoneclient/v2_0/__init__.py
+mock_keystone/keystoneclient/v2_0/client.py
+mock_keystone/keystoneclient/v3/__init__.py
+mock_keystone/keystoneclient/v3/client.py
+mock_keystone/orm_common/__init__.py
+mock_keystone/orm_common/utils/__init__.py
+mock_keystone/orm_common/utils/dictator.py
\ No newline at end of file
diff --git a/orm/common/client/keystone/keystone_utils.egg-info/dependency_links.txt b/orm/common/client/keystone/keystone_utils.egg-info/dependency_links.txt
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/orm/common/client/keystone/keystone_utils.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/orm/common/client/keystone/keystone_utils.egg-info/not-zip-safe b/orm/common/client/keystone/keystone_utils.egg-info/not-zip-safe
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/orm/common/client/keystone/keystone_utils.egg-info/not-zip-safe
@@ -0,0 +1 @@
+
diff --git a/orm/common/client/keystone/keystone_utils.egg-info/pbr.json b/orm/common/client/keystone/keystone_utils.egg-info/pbr.json
new file mode 100644
index 00000000..0b09e18b
--- /dev/null
+++ b/orm/common/client/keystone/keystone_utils.egg-info/pbr.json
@@ -0,0 +1 @@
+{"is_release": false, "git_version": ""}
\ No newline at end of file
diff --git a/orm/common/client/keystone/keystone_utils.egg-info/top_level.txt b/orm/common/client/keystone/keystone_utils.egg-info/top_level.txt
new file mode 100644
index 00000000..b6d50ed1
--- /dev/null
+++ b/orm/common/client/keystone/keystone_utils.egg-info/top_level.txt
@@ -0,0 +1,2 @@
+keystone_utils
+mock_keystone
diff --git a/orm/common/client/keystone/keystone_utils/__init__.py b/orm/common/client/keystone/keystone_utils/__init__.py
new file mode 100644
index 00000000..19f5e722
--- /dev/null
+++ b/orm/common/client/keystone/keystone_utils/__init__.py
@@ -0,0 +1,13 @@
+# -*- coding: utf-8 -*-
+
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
diff --git a/orm/common/client/keystone/keystone_utils/tests/__init__.py b/orm/common/client/keystone/keystone_utils/tests/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/client/keystone/keystone_utils/tests/unit/__init__.py b/orm/common/client/keystone/keystone_utils/tests/unit/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/client/keystone/keystone_utils/tests/unit/test_tokens.py b/orm/common/client/keystone/keystone_utils/tests/unit/test_tokens.py
new file mode 100755
index 00000000..be38f34d
--- /dev/null
+++ b/orm/common/client/keystone/keystone_utils/tests/unit/test_tokens.py
@@ -0,0 +1,219 @@
+"""keystone_utils token validator unittests."""
+import mock
+import unittest
+
+from keystone_utils import tokens
+
+
+class MyResponse(object):
+    def __init__(self, status, json_result):
+        self.status_code = status
+        self._json_result = json_result
+
+    def json(self):
+        return self._json_result
+
+
+class MyKeystone(object):
+    def validate(self, a):
+        raise tokens.v3_client.exceptions.NotFound('test')
+
+    def find(self, **kwargs):
+        raise tokens.v3_client.exceptions.NotFound('test')
+
+
+class MyClient(object):
+    def __init__(self, set_tokens=True):
+        if set_tokens:
+            self.tokens = MyKeystone()
+        else:
+            self.tokens = mock.MagicMock()
+
+        self.roles = MyKeystone()
+
+
+class TokensTest(unittest.TestCase):
+    def setUp(self):
+        tokens._KEYSTONES = {}
+
+    @mock.patch.object(tokens.requests, 'get', return_value=MyResponse(
+        tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test',
+                                                     'type': 'identity'}]}]}))
+    def test_find_keystone_ep_sanity(self, mock_get):
+        result = tokens._find_keystone_ep('a', 'b')
+        self.assertEqual(result, 'test')
+
+    @mock.patch.object(tokens.requests, 'get', return_value=MyResponse(
+        tokens.OK_CODE + 1, {'regions': [{'endpoints': [
+            {'publicURL': 'test', 'type': 'identity'}]}]}))
+    def test_find_keystone_ep_bad_return_code(self, mock_get):
+        result = tokens._find_keystone_ep('a', 'b')
+        self.assertIsNone(result)
+
+    @mock.patch.object(tokens.requests, 'get', return_value=MyResponse(
+        tokens.OK_CODE, {}))
+    def test_find_keystone_ep_no_keystone_ep_in_response(self, mock_get):
+        result = tokens._find_keystone_ep('a', 'b')
+        self.assertIsNone(result)
+
+    @mock.patch.object(tokens.requests, 'get', return_value=MyResponse(
+        tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test',
+                                                     'type': 'test'}]}]}))
+    def test_find_keystone_ep_no_identity_in_response(self, mock_get):
+        result = tokens._find_keystone_ep('a', 'b')
+        self.assertIsNone(result)
+
+    @mock.patch.object(tokens.requests, 'get', return_value=MyResponse(
+        tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test',
+                                                     'type': 'identity'}]}]}))
+    @mock.patch.object(tokens.v3_client, 'Client')
+    def test_is_token_valid_sanity(self, mock_get, mock_client):
+        self.assertTrue(tokens.is_token_valid('a', 'b', tokens.TokenConf(
+            'a', 'b', 'c', 'd', '3')))
+
+    @mock.patch.object(tokens.requests, 'get', return_value=MyResponse(
+        tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test',
+                                                     'type': 'identity'}]}]}))
+    @mock.patch.object(tokens.v3_client, 'Client')
+    def test_is_token_valid_sanity_role_required(self, mock_get, mock_client):
+        user = {'user': {'id': 'test_id', 'domain': {'id': 'test'}}}
+        mock_client.tokens.validate = mock.MagicMock(return_value=user)
+        self.assertTrue(tokens.is_token_valid('a', 'b', tokens.TokenConf(
+            'a', 'b', 'c', 'd', '3'), 'test', {'domain': 'test'}))
+
+    @mock.patch.object(tokens.requests, 'get', return_value=MyResponse(
+        tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test',
+                                                     'type': 'identity'}]}]}))
+    def test_is_token_valid_token_not_found(self, mock_get):
+        client_backup = tokens.v3_client.Client
+        tokens.v3_client.Client = mock.MagicMock(return_value=MyClient())
+        self.assertFalse(tokens.is_token_valid('a', 'b', tokens.TokenConf(
+            'a', 'b', 'c', 'd', '3')))
+        tokens.v3_client.Client = client_backup
+
+    @mock.patch.object(tokens.requests, 'get', return_value=MyResponse(
+        tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test',
+                                                     'type': 'identity'}]}]}))
+    def test_is_token_valid_invalid_version(self, mock_get):
+        client_backup = tokens.v3_client.Client
+        tokens.v3_client.Client = mock.MagicMock(return_value=MyClient())
+        self.assertRaises(ValueError, tokens.is_token_valid, 'a', 'b',
+                          tokens.TokenConf('a', 'b', 'c', 'd', '4'))
+        tokens.v3_client.Client = client_backup
+
+    @mock.patch.object(tokens.requests, 'get', return_value=MyResponse(
+        tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test',
+                                                     'type': 'identity'}]}]}))
+    def test_is_token_valid_keystone_v2(self, mock_get):
+        client_backup = tokens.v2_client.Client
+        tokens.v2_client.Client = mock.MagicMock()
+        self.assertFalse(tokens.is_token_valid('a', 'b',
+                                               tokens.TokenConf('a', 'b', 'c',
+                                                                'd', '2.0'),
+                                               'test',
+                                               {'tenant': 'test'}))
+        tokens.v2_client.Client = client_backup
+
+    @mock.patch.object(tokens.requests, 'get', return_value=MyResponse(
+        tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test',
+                                                     'type': 'identity'}]}]}))
+    def test_is_token_valid_keystone_v2_invalid_location(self, mock_get):
+        client_backup = tokens.v2_client.Client
+        tokens.v2_client.Client = mock.MagicMock()
+        self.assertRaises(ValueError, tokens.is_token_valid, 'a', 'b',
+                          tokens.TokenConf('a', 'b', 'c', 'd', '2.0'), 'test',
+                          {'domain': 'test'})
+        tokens.v2_client.Client = client_backup
+
+    @mock.patch.object(tokens.requests, 'get', return_value=MyResponse(
+        tokens.OK_CODE + 1, {'regions': [{'endpoints': [
+            {'publicURL': 'test', 'type': 'identity'}]}]}))
+    def test_is_token_valid_keystone_ep_not_found(self, mock_get):
+        self.assertRaises(tokens.KeystoneNotFoundError, tokens.is_token_valid,
+                          'a', 'b', tokens.TokenConf('a', 'b', 'c', 'd', '3'))
+
+    @mock.patch.object(tokens.requests, 'get', return_value=MyResponse(
+        tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test',
+                                                     'type': 'identity'}]}]}))
+    def test_is_token_valid_no_role_location(self, mock_get):
+        tokens.v3_client.Client = mock.MagicMock()
+        self.assertRaises(ValueError, tokens.is_token_valid, 'a', 'b',
+                          tokens.TokenConf('a', 'b', 'c', 'd', '3'), 'test')
+
+    @mock.patch.object(tokens.v3_client, 'Client')
+    def test_does_user_have_role_sanity_true(self, mock_client):
+        user = {'user': {'id': 'test_id', 'domain': {'id': 'test'}}}
+        self.assertTrue(tokens._does_user_have_role(mock_client, '3', user,
+                                                    'admin',
+                                                    {'domain': 'test'}))
+
+    @mock.patch.object(tokens.v3_client, 'Client')
+    def test_does_user_have_role_sanity_false(self, mock_client):
+        user = {'user': {'id': 'test_id', 'domain': {'id': 'test'}}}
+        mock_client.roles.check = mock.MagicMock(
+            side_effect=tokens.v3_client.exceptions.NotFound('test'))
+        self.assertFalse(tokens._does_user_have_role(mock_client, '3', user,
+                                                     'admin',
+                                                     {'domain': 'test'}))
+
+    @mock.patch.object(tokens.v3_client, 'Client')
+    def test_does_user_have_role_invalid_user(self, mock_client):
+        user = {}
+        self.assertFalse(tokens._does_user_have_role(mock_client, '3', user,
+                                                     'admin',
+                                                     {'domain': 'test'}))
+
+    @mock.patch.object(tokens.v3_client, 'Client')
+    def test_does_user_have_role_role_does_not_exist(self, mock_client):
+        user = {'user': {'id': 'test_id', 'domain': {'id': 'test'}}}
+        mock_client.roles.find = mock.MagicMock(
+            side_effect=tokens.v3_client.exceptions.NotFound('test'))
+        self.assertRaises(tokens.v3_client.exceptions.NotFound,
+                          tokens._does_user_have_role, mock_client, '3',
+                          user, 'test', {'domain': 'default'})
+
+    @mock.patch.object(tokens.requests, 'get', return_value=MyResponse(
+        tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test',
+                                                     'type': 'identity'}]}]}))
+    def test_is_token_valid_role_does_not_exist(self, mock_get):
+        tokens.v3_client.Client = mock.MagicMock(return_value=MyClient(False))
+        self.assertRaises(ValueError, tokens.is_token_valid, 'a', 'b',
+                          tokens.TokenConf('a', 'b', 'c', 'd', '3'), 'test',
+                          {'domain': 'test'})
+
+    def test_get_token_user_invalid_arguments(self):
+        self.assertRaises(ValueError, tokens.get_token_user, 'a', 'b')
+
+    @mock.patch.object(tokens, '_find_keystone_ep', return_value=None)
+    def test_get_token_user_keystone_ep_not_found(self,
+                                                  mock_find_keystone_ep):
+        self.assertRaises(tokens.KeystoneNotFoundError,
+                          tokens.get_token_user, 'a', mock.MagicMock(), 'c')
+
+    def test_get_token_user_invalid_keystone_version(self):
+        conf = tokens.TokenConf(*(None,)*5)
+        self.assertRaises(ValueError, tokens.get_token_user, 'a', conf, 'c',
+                          'd')
+
+    @mock.patch.object(tokens, '_get_keystone_client')
+    def test_get_token_user_token_not_found(self, mock_get_keystone_client):
+        ks = mock.MagicMock()
+        ks.tokens.validate.side_effect = tokens.v3_client.exceptions.NotFound()
+        mock_get_keystone_client.return_value = ks
+        conf = tokens.TokenConf(*('3',)*5)
+        self.assertIsNone(tokens.get_token_user('a', conf, 'c', 'd'))
+
+    @mock.patch.object(tokens, '_get_keystone_client')
+    def test_get_token_user_success(self, mock_get_keystone_client):
+        token_info = mock.MagicMock()
+        token_info.token = 'a'
+        token_info.user = 'test_user'
+        ks = mock.MagicMock()
+        ks.tokens.validate.return_value = token_info
+        mock_get_keystone_client.return_value = ks
+
+        conf = tokens.TokenConf(*('2.0',)*5)
+        result = tokens.get_token_user('a', conf, 'c', 'd')
+
+        self.assertEqual(result.token, 'a')
+        self.assertEqual(result.user, 'test_user')
diff --git a/orm/common/client/keystone/keystone_utils/tokens.py b/orm/common/client/keystone/keystone_utils/tokens.py
new file mode 100755
index 00000000..7a64153f
--- /dev/null
+++ b/orm/common/client/keystone/keystone_utils/tokens.py
@@ -0,0 +1,278 @@
+"""Token utility module."""
+import logging
+import requests
+
+from keystoneclient.v2_0 import client as v2_client
+from keystoneclient.v3 import client as v3_client
+
+from orm_common.utils import dictator
+
+_verify = False
+
+OK_CODE = 200
+_KEYSTONES = {}
+logger = logging.getLogger(__name__)
+
+
+class KeystoneNotFoundError(Exception):
+    """Indicates that the Keystone EP of a certain LCP was not found."""
+
+    pass
+
+
+class TokenConf(object):
+    """The Token Validator configuration class."""
+
+    def __init__(self, mech_id, password, rms_url, tenant_name, version):
+        """Initialize the Token Validator configuration.
+
+        :param mech_id: Username for Keystone
+        :param password: Password for Keystone
+        :param rms_url: The entire RMS URL, e.g. 'http://1.3.3.7:8080'
+        :param tenant_name: The ORM tenant name
+        :param version: Keystone version to use (a string: '3' or '2.0')
+        """
+        self.mech_id = mech_id
+        self.password = password
+        self.rms_url = rms_url
+        self.tenant_name = tenant_name
+        self.version = version
+
+
+class TokenUser(object):
+    """Class with details about the token user."""
+
+    def __init__(self, token):
+        """Initialize the Token User.
+
+        :param token: The token object (returned by tokens.validate)
+        """
+        self.token = token.token
+        self.user = token.user
+        self.tenant = getattr(token, 'tenant', None)
+        self.domain = getattr(token, 'domain', None)
+
+
+def get_token_user(token, conf, lcp_id=None, keystone_ep=None):
+    """Get a token user.
+
+    :param token: The token to validate
+    :param conf: A TokenConf object
+    :param lcp_id: The ID of the LCP associated with the Keystone instance
+    with which the token was created. Ignored if keystone_ep is not None
+    :param keystone_ep: The Keystone endpoint, in case we already have it
+    :return: False if one of the tokens received (or more) is invalid,
+    True otherwise.
+    """
+    # Not using logger.error/exception because in some cases, these flows
+    # can be completely valid
+    if keystone_ep is None:
+        if lcp_id is None:
+            message = 'Received None for both keystone_ep and lcp_id!'
+            logger.debug(message)
+            raise ValueError(message)
+        keystone_ep = _find_keystone_ep(conf.rms_url, lcp_id)
+        if keystone_ep is None:
+            message = 'Keystone EP of LCP %s not found in RMS' % (lcp_id,)
+            logger.debug(message)
+            logger.critical(
+                'CRITICAL|CON{}KEYSTONE002|X-Auth-Region: {} is not '
+                'reachable (not found in RMS)'.format(
+                    dictator.get('service_name', 'ORM'), lcp_id))
+            raise KeystoneNotFoundError(message)
+
+    if conf.version == '3':
+        client = v3_client
+    elif conf.version == '2.0':
+        client = v2_client
+    else:
+        message = 'Invalid Keystone version: %s' % (conf.version,)
+        logger.debug(message)
+        raise ValueError(message)
+
+    keystone = _get_keystone_client(client, conf, keystone_ep, lcp_id)
+
+    try:
+        token_info = keystone.tokens.validate(token)
+        logger.debug('User token found in Keystone')
+        return TokenUser(token_info)
+    # Other exceptions raised by validate() are critical errors,
+    # so instead of returning False, we'll just let them propagate
+    except client.exceptions.NotFound:
+        logger.debug('User token not found in Keystone! Make sure that it is '
+                     'correct and that it has not expired yet')
+        return None
+
+
+def _find_keystone_ep(rms_url, lcp_name):
+    """Get the Keystone EP from RMS.
+
+    :param rms_url: RMS server URL
+    :param lcp_name: The LCP name
+    :return: Keystone EP (string), None if it was not found
+    """
+    if not rms_url:
+        message = 'Invalid RMS URL: %s' % (rms_url,)
+        logger.debug(message)
+        raise ValueError(message)
+
+    logger.debug(
+        'Looking for Keystone EP of LCP {} using RMS URL {}'.format(
+            lcp_name, rms_url))
+
+    response = requests.get('%s/v2/orm/regions?regionname=%s' % (
+        rms_url, lcp_name, ), verify=_verify)
+    if response.status_code != OK_CODE:
+        # The LCP was not found in RMS
+        logger.debug('Received bad response code from RMS: {}'.format(
+            response.status_code))
+        return None
+
+    lcp = response.json()
+    try:
+        for endpoint in lcp['regions'][0]['endpoints']:
+            if endpoint['type'] == 'identity':
+                return endpoint['publicURL']
+    except KeyError:
+        logger.debug('Response from RMS came in an unsupported format. '
+                     'Make sure that you are using RMS 3.5')
+        return None
+
+    # Keystone EP not found in the response
+    logger.debug('No identity endpoint was found in the response from RMS')
+    return None
+
+
+def _does_user_have_role(keystone, version, user, role, location):
+    """Check whether a user has a role.
+
+    :param keystone: The Keystone client to use
+    :param version: Keystone version
+    :param user: A dict that represents the user in question
+    :param role: The role to check whether the user has
+    :param location: Keystone role location
+    :return: True if the user has the requested role, False otherwise.
+    :raise: client.exceptions.NotFound when the requested role does not exist,
+    ValueError when the version is 2.0 but the location is not 'tenant'
+    """
+    location = dict(location)
+    if version == '3':
+        role = keystone.roles.find(name=role)
+        try:
+            return keystone.roles.check(role, user=user['user']['id'],
+                                        **location)
+        except v3_client.exceptions.NotFound:
+            return False
+        except KeyError:
+            # Shouldn't be raised when using Keystone's v3/v2.0 API, but let's
+            #  play on the safe side
+            logger.debug('The user parameter came in a wrong format!')
+            return False
+    elif version == '2.0':
+        # v2.0 supports tenants only
+        if location.keys()[0] != 'tenant':
+            raise ValueError(
+                'Using Keystone v2.0, expected "tenant", received: "%s"' % (
+                    location.keys()[0],))
+
+        tenant = keystone.tenants.find(name=location['tenant'])
+        # v2.0 does not enable us to check for a specific role (unlike v3)
+        role_list = keystone.roles.roles_for_user(user.user['id'],
+                                                  tenant=tenant)
+        return any([user_role.name == role for user_role in role_list])
+
+
+def _get_keystone_client(client, conf, keystone_ep, lcp_id):
+    """Get the Keystone client.
+
+    :param client: keystoneclient package to use
+    :param conf: Token conf
+    :param keystone_ep: The Keystone endpoint that RMS returned
+    :param lcp_id: The region ID
+
+    :return: The instance of Keystone client to use
+    """
+    global _KEYSTONES
+    try:
+        if keystone_ep not in _KEYSTONES:
+            # Instantiate the Keystone client according to the configuration
+            _KEYSTONES[keystone_ep] = client.Client(
+                username=conf.mech_id,
+                password=conf.password,
+                tenant_name=conf.tenant_name,
+                auth_url=keystone_ep + '/v' + conf.version)
+
+        return _KEYSTONES[keystone_ep]
+    except Exception:
+        logger.critical(
+            'CRITICAL|CON{}KEYSTONE001|Cannot reach Keystone EP: {} of '
+            'region {}. Please contact Keystone team.'.format(
+                dictator.get('service_name', 'ORM'), keystone_ep, lcp_id))
+        raise
+
+
+def is_token_valid(token_to_validate, lcp_id, conf, required_role=None,
+                   role_location=None):
+    """Validate a token.
+
+    :param token_to_validate: The token to validate
+    :param lcp_id: The ID of the LCP associated with the Keystone instance
+    with which the token was created
+    :param conf: A TokenConf object
+    :param required_role: The required role for privileged actions,
+    e.g. 'admin' (optional).
+    :param role_location: The Keystone role location (a dict whose single
+    key is either 'domain' or 'tenant', whose value is the location name)
+    :return: False if one of the tokens received (or more) is invalid,
+    True otherwise.
+    :raise: KeystoneNotFoundError when the Keystone EP for the required LCP
+    was not found in RMS output,
+    client.exceptions.AuthorizationFailure when the connection with the
+    Keystone EP could not be established,
+    client.exceptions.EndpointNotFound when _our_ authentication
+    (as an admin) with Keystone failed,
+    ValueError when an invalid Keystone version was specified,
+    ValueError when a role or a tenant was not found,
+    ValueError when a role is required but role_location is None.
+    """
+    keystone_ep = _find_keystone_ep(conf.rms_url, lcp_id)
+    if keystone_ep is None:
+        raise KeystoneNotFoundError('Keystone EP of LCP %s not found in RMS' %
+                                    (lcp_id,))
+
+    if conf.version == '3':
+        client = v3_client
+    elif conf.version == '2.0':
+        client = v2_client
+    else:
+        raise ValueError('Invalid Keystone version: %s' % (conf.version,))
+
+    keystone = _get_keystone_client(client, conf, keystone_ep, lcp_id)
+
+    try:
+        user = keystone.tokens.validate(token_to_validate)
+        logger.debug('User token found in Keystone')
+    # Other exceptions raised by validate() are critical errors,
+    # so instead of returning False, we'll just let them propagate
+    except client.exceptions.NotFound:
+        logger.debug('User token not found in Keystone! Make sure that it is'
+                     'correct and that it has not expired yet')
+        return False
+
+    if required_role is not None:
+        if role_location is None:
+            raise ValueError(
+                'A role is required but no role location was specified!')
+
+        try:
+            logger.debug('Checking role...')
+            return _does_user_have_role(keystone, conf.version, user,
+                                        required_role, role_location)
+        except client.exceptions.NotFound:
+            raise ValueError('Role %s or tenant %s not found!' % (
+                required_role, role_location,))
+    else:
+        # We know that the token is valid and there's no need to enforce a
+        # policy on this operation, so we can let the user pass
+        logger.debug('No role to check, authentication finished successfully')
+        return True
diff --git a/orm/common/client/keystone/mock_keystone/__init__.py b/orm/common/client/keystone/mock_keystone/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/client/keystone/mock_keystone/keystoneclient/__init__.py b/orm/common/client/keystone/mock_keystone/keystoneclient/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/client/keystone/mock_keystone/keystoneclient/exceptions.py b/orm/common/client/keystone/mock_keystone/keystoneclient/exceptions.py
new file mode 100644
index 00000000..f88096f8
--- /dev/null
+++ b/orm/common/client/keystone/mock_keystone/keystoneclient/exceptions.py
@@ -0,0 +1,2 @@
+class NotFound(Exception):
+    pass
diff --git a/orm/common/client/keystone/mock_keystone/keystoneclient/v2_0/__init__.py b/orm/common/client/keystone/mock_keystone/keystoneclient/v2_0/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/client/keystone/mock_keystone/keystoneclient/v2_0/client.py b/orm/common/client/keystone/mock_keystone/keystoneclient/v2_0/client.py
new file mode 100644
index 00000000..b9600200
--- /dev/null
+++ b/orm/common/client/keystone/mock_keystone/keystoneclient/v2_0/client.py
@@ -0,0 +1,6 @@
+from keystoneclient import exceptions
+
+
+class Client(object):
+    def __init__(*args, **kwargs):
+        pass
diff --git a/orm/common/client/keystone/mock_keystone/keystoneclient/v3/__init__.py b/orm/common/client/keystone/mock_keystone/keystoneclient/v3/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/client/keystone/mock_keystone/keystoneclient/v3/client.py b/orm/common/client/keystone/mock_keystone/keystoneclient/v3/client.py
new file mode 100644
index 00000000..b9600200
--- /dev/null
+++ b/orm/common/client/keystone/mock_keystone/keystoneclient/v3/client.py
@@ -0,0 +1,6 @@
+from keystoneclient import exceptions
+
+
+class Client(object):
+    def __init__(*args, **kwargs):
+        pass
diff --git a/orm/common/client/keystone/mock_keystone/orm_common/__init__.py b/orm/common/client/keystone/mock_keystone/orm_common/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/client/keystone/mock_keystone/orm_common/utils/__init__.py b/orm/common/client/keystone/mock_keystone/orm_common/utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/client/keystone/mock_keystone/orm_common/utils/dictator.py b/orm/common/client/keystone/mock_keystone/orm_common/utils/dictator.py
new file mode 100644
index 00000000..0a299155
--- /dev/null
+++ b/orm/common/client/keystone/mock_keystone/orm_common/utils/dictator.py
@@ -0,0 +1,10 @@
+def get(*args, **kwargs):
+    pass
+
+
+def set(*args, **kwargs):
+    pass
+
+
+def soft_set(*args, **kwargs):
+    pass
diff --git a/orm/common/client/keystone/requirements.txt b/orm/common/client/keystone/requirements.txt
new file mode 100644
index 00000000..1719ed89
--- /dev/null
+++ b/orm/common/client/keystone/requirements.txt
@@ -0,0 +1,5 @@
+# The order of packages is significant, because pip processes them in the order
+# of appearance. Changing the order has an impact on the overall integration
+# process, which may cause wedges in the gate later.
+requests==2.2.1
+python-keystoneclient==1.3.1
diff --git a/orm/common/client/keystone/setup.cfg b/orm/common/client/keystone/setup.cfg
new file mode 100644
index 00000000..1fa083ad
--- /dev/null
+++ b/orm/common/client/keystone/setup.cfg
@@ -0,0 +1,46 @@
+[metadata]
+name = keystone_utils
+summary = keyKeystone utils
+description-file =
+    README.rst
+author = OpenStack
+author-email = openstack-dev@lists.openstack.org
+home-page = http://www.openstack.org/
+classifier =
+    Environment :: OpenStack
+    Intended Audience :: Information Technology
+    Intended Audience :: System Administrators
+    License :: OSI Approved :: Apache Software License
+    Operating System :: POSIX :: Linux
+    Programming Language :: Python
+    Programming Language :: Python :: 2
+    Programming Language :: Python :: 2.7
+    Programming Language :: Python :: 3
+    Programming Language :: Python :: 3.3
+    Programming Language :: Python :: 3.4
+
+[files]
+packages =
+    keystone_utils
+
+[build_sphinx]
+source-dir = doc/source
+build-dir = doc/build
+all_files = 1
+
+[upload_sphinx]
+upload-dir = doc/build/html
+
+[compile_catalog]
+directory = keystone_utils/locale
+domain = keystone_utils
+
+[update_catalog]
+domain = keystone_utils
+output_dir = keystone_utils/locale
+input_file = keystone_utils/locale/keystone_utils.pot
+
+[extract_messages]
+keywords = _ gettext ngettext l_ lazy_gettext
+mapping_file = babel.cfg
+output_file = keystone_utils/locale/keystone_utils.pot
diff --git a/orm/common/client/keystone/setup.py b/orm/common/client/keystone/setup.py
new file mode 100644
index 00000000..2ccca3c1
--- /dev/null
+++ b/orm/common/client/keystone/setup.py
@@ -0,0 +1,14 @@
+from setuptools import setup, find_packages
+
+setup(
+    name='keystone_utils',
+    version='0.1',
+    description='',
+    author='',
+    author_email='',
+    zip_safe=False,
+    include_package_data=True,
+    packages=find_packages(),
+    test_suite='keystone_utils/tests'
+
+)
diff --git a/orm/common/client/keystone/test-requirements.txt b/orm/common/client/keystone/test-requirements.txt
new file mode 100644
index 00000000..ee50a20b
--- /dev/null
+++ b/orm/common/client/keystone/test-requirements.txt
@@ -0,0 +1,15 @@
+# The order of packages is significant, because pip processes them in the order
+# of appearance. Changing the order has an impact on the overall integration
+# process, which may cause wedges in the gate later.
+
+oslo.i18n==3.9.0
+oslo.serialization==2.13.0
+oslo.utils==3.16.0
+hacking<0.11,>=0.10.0
+mock<1.1.0,>=1.0
+coverage>=3.6
+python-subunit>=0.0.18
+sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2
+testrepository>=0.0.18
+testscenarios==0.4
+testtools==1.4.0
diff --git a/orm/common/client/keystone/tox.ini b/orm/common/client/keystone/tox.ini
new file mode 100644
index 00000000..8bdf31df
--- /dev/null
+++ b/orm/common/client/keystone/tox.ini
@@ -0,0 +1,24 @@
+[tox]
+envlist = py27,cover
+skipsdist = True
+
+[testenv]
+install_command =
+#                  constraints: {[testenv:common-constraints]install_command}
+                  pip install -U --force-reinstall {opts} {packages}
+setenv = VIRTUAL_ENV={envdir}
+         OS_TEST_PATH=./keystone_utils/tests/unit
+         PYTHONPATH = {toxinidir}/mock_keystone/:/usr/local/lib/python2.7/dist-packages/
+deps = -r{toxinidir}/test-requirements.txt
+       -r{toxinidir}/requirements.txt
+
+[testenv:cover]
+commands =
+  coverage erase
+  python setup.py testr --coverage
+  coverage report --omit="keystone_utils/tests/*"
+  coverage html --omit="keystone_utils/tests/*"
+
+[testenv:pep8]
+commands=
+    py.test --pep8 -m pep8
diff --git a/orm/common/orm_common/__init__.py b/orm/common/orm_common/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/orm_common/extenal_mock/audit_client/__init__.py b/orm/common/orm_common/extenal_mock/audit_client/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/orm_common/extenal_mock/audit_client/api/__init__.py b/orm/common/orm_common/extenal_mock/audit_client/api/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/orm_common/extenal_mock/audit_client/api/audit.py b/orm/common/orm_common/extenal_mock/audit_client/api/audit.py
new file mode 100644
index 00000000..ec483bdd
--- /dev/null
+++ b/orm/common/orm_common/extenal_mock/audit_client/api/audit.py
@@ -0,0 +1,6 @@
+def audit(*args, **kwargs):
+    pass
+
+
+def init(*args, **kwargs):
+    pass
diff --git a/orm/common/orm_common/extenal_mock/keystone_utils/__init__.py b/orm/common/orm_common/extenal_mock/keystone_utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/orm_common/extenal_mock/keystone_utils/tokens.py b/orm/common/orm_common/extenal_mock/keystone_utils/tokens.py
new file mode 100644
index 00000000..2cc046ea
--- /dev/null
+++ b/orm/common/orm_common/extenal_mock/keystone_utils/tokens.py
@@ -0,0 +1,2 @@
+def get_token_user(*a, **k):
+    pass
diff --git a/orm/common/orm_common/hooks/__init__.py b/orm/common/orm_common/hooks/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/orm_common/hooks/api_error_hook.py b/orm/common/orm_common/hooks/api_error_hook.py
new file mode 100755
index 00000000..9cddff0c
--- /dev/null
+++ b/orm/common/orm_common/hooks/api_error_hook.py
@@ -0,0 +1,70 @@
+import json
+import logging
+from pecan.hooks import PecanHook
+
+from orm_common.utils import api_error_utils as err_utils
+
+logger = logging.getLogger(__name__)
+
+
+class APIErrorHook(PecanHook):
+
+    def after(self, state):
+        # Handle http errors. reformat returned body and header.
+        status_code = state.response.status_code
+
+        transaction_id = str(getattr(state.request,
+                                     'transaction_id',
+                                     'N/A'))
+        tracking_id = str(getattr(state.request,
+                                  'tracking_id',
+                                  'N/A'))
+
+        result_json = {}
+        if 400 <= status_code <= 500:
+
+            if status_code == 401:
+                result_json = err_utils.get_error_dict(401,
+                                                       transaction_id,
+                                                       None)
+
+            else:
+                dict_body = None
+                try:
+                    logger.debug('error: {}'.format(state.response))
+                    dict_body = json.loads(state.response.body)
+                    if 'line' in str(state.response.body) and 'column' in str(
+                            state.response.body):
+                        result_json = dict_body
+                        status_code = 400
+                        if 'faultstring' in dict_body:
+                            result_json = err_utils.get_error_dict(status_code,
+                                                                   transaction_id,
+                                                                   dict_body['faultstring'],
+                                                                   "")
+                    else:
+                        result_json = json.loads(dict_body['faultstring'])
+                        logger.debug('Received faultstring: {}'.format(result_json))
+                    # make sure status code in header and in body are the same
+                    if 'code' in result_json:
+                        status_code = result_json['code']
+
+                    logger.info('Received status code: {}, transaction_id: {}, tracking_id: {}'.
+                                format(status_code, transaction_id, tracking_id))
+
+                except ValueError:
+                    msg = 'Could not read faultstring from response body!'
+                    logger.error('{} {}'.format(msg, state.response.body))
+                    if 'faultstring' in state.response.headers:
+                        msg = state.response.headers['faultstring']
+                    elif dict_body and 'faultstring' in dict_body:
+                        msg = dict_body['faultstring']
+
+                    result_json = err_utils.get_error_dict(status_code,
+                                                           transaction_id,
+                                                           msg,
+                                                           "")
+
+            setattr(state.response, 'body', json.dumps(result_json))
+            state.response.status_code = status_code
+            state.response.headers.add('X-RANGER-Request-Id', tracking_id)
diff --git a/orm/common/orm_common/hooks/security_headers_hook.py b/orm/common/orm_common/hooks/security_headers_hook.py
new file mode 100755
index 00000000..75b36e00
--- /dev/null
+++ b/orm/common/orm_common/hooks/security_headers_hook.py
@@ -0,0 +1,18 @@
+import logging
+from pecan.hooks import PecanHook
+
+logger = logging.getLogger(__name__)
+
+
+class SecurityHeadersHook(PecanHook):
+    def after(self, state):
+        security_headers = {'X-Frame-Options': 'DENY',
+                            'X-Content-Type-Options': 'nosniff',
+                            'Strict-Transport-Security': 'max-age=31536000; includeSubDomains',
+                            'Content-Security-Policy': 'default-src \'self\'',
+                            'X-Permitted-Cross-Domain-Policies': 'none',
+                            'X-XSS-Protection': '1; mode=block'}
+
+        # Add all the security headers
+        for header, value in security_headers.items():
+            state.response.headers.add(header, value)
diff --git a/orm/common/orm_common/hooks/transaction_id_hook.py b/orm/common/orm_common/hooks/transaction_id_hook.py
new file mode 100755
index 00000000..a5780b2b
--- /dev/null
+++ b/orm/common/orm_common/hooks/transaction_id_hook.py
@@ -0,0 +1,17 @@
+from pecan import abort
+from pecan.hooks import PecanHook
+from orm_common.utils import utils
+
+
+class TransactionIdHook(PecanHook):
+
+    def before(self, state):
+        try:
+            transaction_id = utils.make_transid()
+        except Exception as exc:
+            abort(500, headers={'faultstring': exc.message})
+
+        tracking_id = state.request.headers['X-RANGER-Tracking-Id'] \
+            if 'X-RANGER-Tracking-Id' in state.request.headers else transaction_id
+        setattr(state.request, 'transaction_id', transaction_id)
+        setattr(state.request, 'tracking_id', tracking_id)
diff --git a/orm/common/orm_common/injector/__init__.py b/orm/common/orm_common/injector/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/orm_common/injector/fang/__init__.py b/orm/common/orm_common/injector/fang/__init__.py
new file mode 100755
index 00000000..18404b50
--- /dev/null
+++ b/orm/common/orm_common/injector/fang/__init__.py
@@ -0,0 +1,7 @@
+'''
+'''
+
+from .di import Di
+from .dependency_register import DependencyRegister
+from .resource_provider_register import ResourceProviderRegister
+from .resolver import DependencyResolver
diff --git a/orm/common/orm_common/injector/fang/dependency_register.py b/orm/common/orm_common/injector/fang/dependency_register.py
new file mode 100755
index 00000000..7b4d7093
--- /dev/null
+++ b/orm/common/orm_common/injector/fang/dependency_register.py
@@ -0,0 +1,77 @@
+from functools import partial
+import inspect
+
+from .errors import DependentNotFoundError
+
+try:
+    import click
+except ImportError:
+    click = None
+
+
+class DependencyRegister:
+    def __init__(self):
+        # Maps dependents to names of resources they require
+        self.dependents = {}
+        # Maps names of resources to their dependents
+        self.resources = {}
+
+    @classmethod
+    def _unwrap_func(cls, decorated_func):
+        '''
+        This unwraps a decorated func, returning the inner wrapped func.
+
+        This may become unnecessary with Python 3.4's inspect.unwrap().
+        '''
+        if click is not None:
+            # Workaround for click.command() decorator not setting
+            # __wrapped__
+            if isinstance(decorated_func, click.Command):
+                return cls._unwrap_func(decorated_func.callback)
+
+        if hasattr(decorated_func, '__wrapped__'):
+            # Recursion: unwrap more if needed
+            return cls._unwrap_func(decorated_func.__wrapped__)
+        else:
+            # decorated_func isn't actually decorated, no more
+            # unwrapping to do
+            return decorated_func
+
+    @classmethod
+    def _unwrap_dependent(cls, dependent):
+        # Dependent is effectively a class. Classes are registered as is.
+        if inspect.isclass(dependent):
+            return dependent
+        # dependent is some other kind of callable, eg a function
+        else:
+            return cls._unwrap_func(dependent)
+
+    def _register_dependent(self, dependent, resource_name):
+        if dependent not in self.dependents:
+            self.dependents[dependent] = []
+        self.dependents[dependent].insert(0, resource_name)
+
+    def _register_resource_dependency(self, resource_name, dependent):
+        if resource_name not in self.resources:
+            self.resources[resource_name] = set()
+        self.resources[resource_name].add(dependent)
+
+    def register(self, resource_name, dependent=None):
+        if dependent is None:
+            # Give a partial usable as a decorator
+            return partial(self.register, resource_name)
+
+        dependent = self._unwrap_dependent(dependent)
+        self._register_dependent(dependent, resource_name)
+        self._register_resource_dependency(resource_name, dependent)
+
+        # Return dependent to ease use as decorator
+        return dependent
+
+    def query_resources(self, dependent):
+        dependent = self._unwrap_dependent(dependent)
+
+        if dependent not in self.dependents:
+            raise DependentNotFoundError(dependent=dependent)
+
+        return self.dependents[dependent]
diff --git a/orm/common/orm_common/injector/fang/di.py b/orm/common/orm_common/injector/fang/di.py
new file mode 100755
index 00000000..6a436354
--- /dev/null
+++ b/orm/common/orm_common/injector/fang/di.py
@@ -0,0 +1,16 @@
+from .dependency_register import DependencyRegister
+from .resource_provider_register import ResourceProviderRegister
+from .resolver import DependencyResolver
+
+
+class Di:
+    def __init__(self, namespace=None):
+        self.namespace = namespace
+        self.dependencies = DependencyRegister()
+        self.providers = ResourceProviderRegister()
+        self.resolver = DependencyResolver(
+            dependency_register=self.dependencies,
+            resource_provider_register=self.providers)
+
+        # For use as a decorator
+        self.dependsOn = self.dependencies.register
diff --git a/orm/common/orm_common/injector/fang/errors.py b/orm/common/orm_common/injector/fang/errors.py
new file mode 100755
index 00000000..607cfb98
--- /dev/null
+++ b/orm/common/orm_common/injector/fang/errors.py
@@ -0,0 +1,47 @@
+class FangError(Exception):
+    pass
+
+
+class DependentNotFoundError(FangError):
+    def __init__(self, dependent=None):
+        self.dependent = dependent
+        if dependent:
+            message = (
+                "Couldn't find dependencies registered for {!r}"
+                "".format(dependent))
+        else:
+            message = (
+                "Couldn't find dependencies registered for the given "
+                "dependent")
+        super(DependentNotFoundError, self).__init__(message)
+
+
+class ProviderAlreadyRegisteredError(FangError):
+    def __init__(self, resource_name=None, existing_provider=None):
+        self.resource_name = resource_name
+        self.existing_provider = existing_provider
+        if resource_name and existing_provider:
+            message = (
+                'A provider ({provider!r}) has already been '
+                'registered for resource {resource_name!r}'.format(
+                    provider=existing_provider,
+                    resource_name=resource_name))
+        else:
+            message = (
+                'A provider has already been registered for the '
+                'resource')
+        super(ProviderAlreadyRegisteredError, self).__init__(message)
+
+
+class ProviderNotFoundError(FangError):
+    def __init__(self, resource_name=None):
+        self.resource_name = resource_name
+        if resource_name:
+            message = (
+                "A provider could not be found for resource {!r}"
+                "".format(resource_name))
+        else:
+            message = (
+                "A provider could not be found for the requested "
+                "resource")
+        super(ProviderNotFoundError, self).__init__(message)
diff --git a/orm/common/orm_common/injector/fang/resolver.py b/orm/common/orm_common/injector/fang/resolver.py
new file mode 100755
index 00000000..5a58f8d6
--- /dev/null
+++ b/orm/common/orm_common/injector/fang/resolver.py
@@ -0,0 +1,44 @@
+from .errors import ProviderNotFoundError
+
+
+# This is effectively what is sometimes termed a "dependency injection
+# container".
+class DependencyResolver:
+    def __init__(
+            self,
+            dependency_register=None,
+            resource_provider_register=None):
+        self.dependency_register = dependency_register
+        self.resource_provider_register = resource_provider_register
+
+        # Methods delegated to other objects
+        self.query_dependents_resources = \
+            self.dependency_register.query_resources
+        self.resolve = self.resource_provider_register.resolve
+
+    def resolve_all_dependencies(self, dependent):
+        return [
+            self.resolve(resource_name)
+            for resource_name in
+            self.query_dependents_resources(dependent)]
+
+    def unpack(self, dependent):
+        resources = self.resolve_all_dependencies(dependent)
+
+        # Never return a length-1 list/tuple, to allow easier unpacking
+        # eg, avoid need for comma in:
+        #   my_one_dep, = my_resolver.unpack_dependencies(my_func)
+        if len(resources) == 1:
+            return resources[0]
+        else:
+            return resources
+
+    def are_all_dependencies_met_for(self, dependent):
+        for resource_name in self.query_dependents_resources(dependent):
+            try:
+                self.resolve(resource_name)
+            except ProviderNotFoundError as e:
+                # TODO: Add error logging here
+                return False
+        else:
+            return True
diff --git a/orm/common/orm_common/injector/fang/resource_provider_register.py b/orm/common/orm_common/injector/fang/resource_provider_register.py
new file mode 100755
index 00000000..a9d6dbdf
--- /dev/null
+++ b/orm/common/orm_common/injector/fang/resource_provider_register.py
@@ -0,0 +1,68 @@
+from functools import partial
+
+from .errors import (
+    FangError,
+    ProviderAlreadyRegisteredError,
+    ProviderNotFoundError)
+
+
+class ResourceProviderRegister:
+    def __init__(self, namespace=None):
+        self.namespace = namespace
+        # Maps resource names to a provider
+        self.resource_providers = {}
+
+    def register(self, resource_name, provider=None, allow_override=False):
+        if provider is None:
+            # Give a partial usable as a decorator
+            return partial(
+                self.register,
+                resource_name, allow_override=allow_override)
+
+        if (not allow_override) and resource_name in self.resource_providers:
+            raise ProviderAlreadyRegisteredError(
+                resource_name=resource_name,
+                existing_provider=self.resource_providers[resource_name])
+
+        self.resource_providers[resource_name] = provider
+
+        # Return provider to ease use as decorator
+        return provider
+
+    register_callable = register
+
+    # For registering providers which always return the same instance
+    def register_instance(self, resource_name, instance=None, **kwargs):
+        if instance is None:
+            # Give a partial usable as a decorator
+            return partial(self.register_instance, resource_name, **kwargs)
+
+        self.register(resource_name, provider=(lambda: instance), **kwargs)
+        return instance
+
+    def mass_register(self, resource_names_to_providers, **kwargs):
+        for resource_name, provider in resource_names_to_providers.items():
+            self.register_instance(resource_name, provider, **kwargs)
+
+    def load(self, other_register, allow_overrides=False):
+        if not allow_overrides:
+            own_keys = self.resource_providers.keys()
+            other_keys = other_register.resource_providers.keys()
+            common_keys = own_keys & other_keys
+            if common_keys:
+                # TODO Add new FangError sub-class?
+                raise FangError(
+                    'This register already has providers for keys: '
+                    '{!r}'.format(common_keys))
+
+        self.resource_providers.update(
+            other_register.resource_providers)
+
+    def clear(self):
+        self.resource_providers.clear()
+
+    def resolve(self, resource_name):
+        if resource_name not in self.resource_providers:
+            raise ProviderNotFoundError(resource_name=resource_name)
+
+        return self.resource_providers[resource_name]()
diff --git a/orm/common/orm_common/injector/injector.py b/orm/common/orm_common/injector/injector.py
new file mode 100755
index 00000000..8babfdb4
--- /dev/null
+++ b/orm/common/orm_common/injector/injector.py
@@ -0,0 +1,59 @@
+from orm_common.injector import fang
+from orm_common.utils.sanitize import sanitize_symbol_name
+
+import os
+import imp
+
+_di = fang.Di()
+logger = None
+
+
+def register_providers(env_variable, providers_dir_path, _logger):
+    global logger
+    logger = _logger
+
+    # TODO: change all prints to logger
+    logger.info('Initializing dependency injector')
+    logger.info('Checking {0} variable'.format(env_variable))
+
+    env = None
+    if not (env_variable in os.environ):
+        logger.warn('No {0} variable found using `prod` injector'.format(env_variable))
+        env = 'prod'
+    elif os.environ[env_variable] == '__TEST__':
+        logger.info('__TEST__ variable found, explicitly skipping provider registration!!!')
+        return
+    else:
+        env = os.environ[env_variable]
+        log_message = '{0} found setting injector to {1} environment'.format(sanitize_symbol_name(env_variable), env)
+        log_message = log_message.replace('\n', '_').replace('\r', '_')
+        logger.info(log_message)
+
+    logger.info('Setting injector providers')
+
+    module = _import_file_by_name(env, providers_dir_path)
+
+    for provider in module.providers:
+        logger.info('Setting provider `{0}` to {1}'.format(provider[0], provider[1]))
+        _di.providers.register_instance(provider[0], provider[1])
+
+
+def get_di():
+    return _di
+
+
+def override_injected_dependency(dep_tuple):
+    _di.providers.register_instance(dep_tuple[0], dep_tuple[1], allow_override=True)
+
+
+def _import_file_by_name(env, providers_dir_path):
+    file_path = os.path.join(providers_dir_path, '{0}_providers.py'.format(env))
+    try:
+        module = imp.load_source('fms_providers', file_path)
+    except IOError as ex:
+        logger.log_exception(
+            'File with providers for the {0} environment, path: {1} wasnt found! Crushing!!!'.format(env, file_path),
+            ex)
+        raise ex
+
+    return module
diff --git a/orm/common/orm_common/policy/__init__.py b/orm/common/orm_common/policy/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/orm_common/policy/_checks.py b/orm/common/orm_common/policy/_checks.py
new file mode 100755
index 00000000..22fef170
--- /dev/null
+++ b/orm/common/orm_common/policy/_checks.py
@@ -0,0 +1,308 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2015 OpenStack Foundation.
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+import abc
+import logging
+
+import six
+from orm_common.utils import api_error_utils as err_utils
+from orm_common.utils import dictator
+
+
+logger = logging.getLogger(__name__)
+
+registered_checks = {}
+
+
+@six.add_metaclass(abc.ABCMeta)
+class BaseCheck(object):
+    """Abstract base class for Check classes."""
+
+    @abc.abstractmethod
+    def __str__(self):
+        """String representation of the Check tree rooted at this node."""
+
+        pass
+
+    @abc.abstractmethod
+    def __call__(self, target, cred, enforcer):
+        """Triggers if instance of the class is called.
+
+        Performs the check. Returns False to reject the access or a
+        true value (not necessary True) to accept the access.
+        """
+
+        pass
+
+
+class FalseCheck(BaseCheck):
+    """A policy check that always returns ``False`` (disallow)."""
+
+    def __str__(self):
+        """Return a string representation of this check."""
+
+        return '!'
+
+    def __call__(self, target, cred, enforcer):
+        """Check the policy."""
+
+        logger.debug('False check, never passing')
+        return False
+
+
+class TrueCheck(BaseCheck):
+    """A policy check that always returns ``True`` (allow)."""
+
+    def __str__(self):
+        """Return a string representation of this check."""
+
+        return '@'
+
+    def __call__(self, target, cred, enforcer):
+        """Check the policy."""
+
+        logger.debug('True check, always passing')
+        return True
+
+
+class Check(BaseCheck):
+    def __init__(self, kind, match):
+        self.kind = kind
+        self.match = match
+
+    def __str__(self):
+        """Return a string representation of this check."""
+
+        return '%s:%s' % (self.kind, self.match)
+
+
+class NotCheck(BaseCheck):
+    def __init__(self, rule):
+        self.rule = rule
+
+    def __str__(self):
+        """Return a string representation of this check."""
+
+        return 'not %s' % self.rule
+
+    def __call__(self, target, cred, enforcer):
+        """Check the policy.
+
+        Returns the logical inverse of the wrapped check.
+        """
+
+        return not self.rule(target, cred, enforcer)
+
+
+class AndCheck(BaseCheck):
+    def __init__(self, rules):
+        self.rules = rules
+
+    def __str__(self):
+        """Return a string representation of this check."""
+
+        return '(%s)' % ' and '.join(str(r) for r in self.rules)
+
+    def __call__(self, target, cred, enforcer):
+        """Check the policy.
+
+        Requires that all rules accept in order to return True.
+        """
+
+        for rule in self.rules:
+            if not rule(target, cred, enforcer):
+                return False
+
+        return True
+
+    def add_check(self, rule):
+        """Adds rule to be tested.
+
+        Allows addition of another rule to the list of rules that will
+        be tested.
+
+        :returns: self
+        :rtype: :class:`.AndCheck`
+        """
+
+        self.rules.append(rule)
+        return self
+
+
+class OrCheck(BaseCheck):
+    def __init__(self, rules):
+        self.rules = rules
+
+    def __str__(self):
+        """Return a string representation of this check."""
+
+        return '(%s)' % ' or '.join(str(r) for r in self.rules)
+
+    def __call__(self, target, cred, enforcer):
+        """Check the policy.
+
+        Requires that at least one rule accept in order to return True.
+        """
+
+        for rule in self.rules:
+            if rule(target, cred, enforcer):
+                return True
+        return False
+
+    def add_check(self, rule):
+        """Adds rule to be tested.
+
+        Allows addition of another rule to the list of rules that will
+        be tested.  Returns the OrCheck object for convenience.
+        """
+
+        self.rules.append(rule)
+        return self
+
+    def pop_check(self):
+        """Pops the last check from the list and returns them
+
+        :returns: self, the popped check
+        :rtype: :class:`.OrCheck`, class:`.Check`
+        """
+
+        check = self.rules.pop()
+        return self, check
+
+
+def register(name, func=None):
+    # Perform the actual decoration by registering the function or
+    # class.  Returns the function or class for compliance with the
+    # decorator interface.
+    def decorator(func):
+        registered_checks[name] = func
+        return func
+
+    # If the function or class is given, do the registration
+    if func:
+        return decorator(func)
+
+    return decorator
+
+
+@register('rule')
+class RuleCheck(Check):
+    def __call__(self, target, creds, enforcer):
+        try:
+            return enforcer.rules[self.match](target, creds, enforcer)
+        except KeyError:
+            # We don't have any matching rule; fail closed
+            return False
+
+
+@register('role')
+class RoleCheck(Check):
+    """Check that there is a matching role in the ``user`` object."""
+
+    def __call__(self, target, user, enforcer):
+        try:
+            logger.debug('Checking role:{}'.format(self.match))
+            result = any(
+                [role['name'] == self.match for role in user.user['roles']])
+            logger.debug('Role check result: {}'.format(result))
+            if not result:
+                logger.info(
+                    'INFO|CON{}AUTH001|Not allowed to perform this operation,'
+                    ' user:{} does not have role:{}'.format(
+                        dictator.get('service_name', 'ORM'),
+                        user.user['name'], self.match))
+                raise err_utils.get_error('N/A', status_code=403)
+            return result
+        except Exception:
+            logger.debug('Invalid user, failing role check')
+            raise
+
+
+@register('user')
+class UserCheck(Check):
+    """Check that the user matches."""
+
+    def __call__(self, target, user, enforcer):
+        try:
+            logger.debug('Checking user:{}'.format(self.match))
+            result = user.user['name'] == self.match
+            logger.debug('User check result: {}'.format(result))
+            if not result:
+                logger.info(
+                    'INFO|CON{}AUTH002|Not allowed to perform this operation,'
+                    ' user:{} is not the user:{}'.format(
+                        dictator.get('service_name', 'ORM'),
+                        user.user['name'], self.match))
+                raise err_utils.get_error('N/A', status_code=403)
+            return result
+        except Exception:
+            logger.debug('Invalid user, failing user check')
+            raise
+
+
+@register('tenant')
+class TenantCheck(Check):
+    """Check that the user's tenant matches."""
+
+    def __call__(self, target, user, enforcer):
+        try:
+            logger.debug('Checking tenant:{}'.format(self.match))
+            result = user.tenant['name'] == self.match
+            logger.debug('Tenant check result: {}'.format(result))
+            if not result:
+                logger.info(
+                    'INFO|CON{}AUTH003|Not allowed to perform this operation,'
+                    ' user:{} is not in tenant:{}'.format(
+                        dictator.get('service_name', 'ORM'),
+                        user.user['name'], self.match))
+            return result
+        except Exception:
+            logger.debug('Invalid user, failing tenant check')
+            return False
+
+
+@register('domain')
+class DomainCheck(Check):
+    """Check that the user's domain matches."""
+
+    def __call__(self, target, user, enforcer):
+        try:
+            logger.debug('Checking domain:{}'.format(self.match))
+            result = user.domain['name'] == self.match
+            logger.debug('Domain check result: {}'.format(result))
+            return result
+        except Exception:
+            logger.debug('Invalid user, failing domain check')
+            return False
+
+
+@register(None)
+class GenericCheck(Check):
+    """Check an individual match.
+
+    Matches look like:
+
+        - tenant:%(tenant_id)s
+        - role:compute:admin
+        - True:%(user.enabled)s
+        - 'Member':%(role.name)s
+    """
+
+    def __call__(self, target, creds, enforcer):
+        # We do not want anything besides role, tenant and domain
+        logger.debug('Received an unknown check!')
+        return False
diff --git a/orm/common/orm_common/policy/_parser.py b/orm/common/orm_common/policy/_parser.py
new file mode 100755
index 00000000..5ef04d26
--- /dev/null
+++ b/orm/common/orm_common/policy/_parser.py
@@ -0,0 +1,354 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2015 OpenStack Foundation.
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+import logging
+import re
+
+import six
+
+import _checks
+
+from oslo_policy._i18n import _LE
+
+
+LOG = logging.getLogger(__name__)
+
+
+def reducer(*tokens):
+    """Decorator for reduction methods.
+
+    Arguments are a sequence of tokens, in order, which should trigger running
+    this reduction method.
+    """
+
+    def decorator(func):
+        # Make sure we have a list of reducer sequences
+        if not hasattr(func, 'reducers'):
+            func.reducers = []
+
+        # Add the tokens to the list of reducer sequences
+        func.reducers.append(list(tokens))
+
+        return func
+
+    return decorator
+
+
+class ParseStateMeta(type):
+    """Metaclass for the :class:`.ParseState` class.
+
+    Facilitates identifying reduction methods.
+    """
+
+    def __new__(mcs, name, bases, cls_dict):
+        """Create the class.
+
+        Injects the 'reducers' list, a list of tuples matching token sequences
+        to the names of the corresponding reduction methods.
+        """
+
+        reducers = []
+
+        for key, value in cls_dict.items():
+            if not hasattr(value, 'reducers'):
+                continue
+            for reduction in value.reducers:
+                reducers.append((reduction, key))
+
+        cls_dict['reducers'] = reducers
+
+        return super(ParseStateMeta, mcs).__new__(mcs, name, bases, cls_dict)
+
+
+@six.add_metaclass(ParseStateMeta)
+class ParseState(object):
+    """Implement the core of parsing the policy language.
+
+    Uses a greedy reduction algorithm to reduce a sequence of tokens into
+    a single terminal, the value of which will be the root of the
+    :class:`Check` tree.
+
+    .. note::
+
+        Error reporting is rather lacking.  The best we can get with this
+        parser formulation is an overall "parse failed" error. Fortunately, the
+        policy language is simple enough that this shouldn't be that big a
+        problem.
+    """
+
+    def __init__(self):
+        """Initialize the ParseState."""
+
+        self.tokens = []
+        self.values = []
+
+    def reduce(self):
+        """Perform a greedy reduction of the token stream.
+
+        If a reducer method matches, it will be executed, then the
+        :meth:`reduce` method will be called recursively to search for any more
+        possible reductions.
+        """
+
+        for reduction, methname in self.reducers:
+            if (len(self.tokens) >= len(reduction) and
+                    self.tokens[-len(reduction):] == reduction):
+                # Get the reduction method
+                meth = getattr(self, methname)
+
+                # Reduce the token stream
+                results = meth(*self.values[-len(reduction):])
+
+                # Update the tokens and values
+                self.tokens[-len(reduction):] = [r[0] for r in results]
+                self.values[-len(reduction):] = [r[1] for r in results]
+
+                # Check for any more reductions
+                return self.reduce()
+
+    def shift(self, tok, value):
+        """Adds one more token to the state.
+
+        Calls :meth:`reduce`.
+        """
+
+        self.tokens.append(tok)
+        self.values.append(value)
+
+        # Do a greedy reduce...
+        self.reduce()
+
+    @property
+    def result(self):
+        """Obtain the final result of the parse.
+
+        :raises ValueError: If the parse failed to reduce to a single result.
+        """
+
+        if len(self.values) != 1:
+            raise ValueError('Could not parse rule')
+        return self.values[0]
+
+    @reducer('(', 'check', ')')
+    @reducer('(', 'and_expr', ')')
+    @reducer('(', 'or_expr', ')')
+    def _wrap_check(self, _p1, check, _p2):
+        """Turn parenthesized expressions into a 'check' token."""
+
+        return [('check', check)]
+
+    @reducer('check', 'and', 'check')
+    def _make_and_expr(self, check1, _and, check2):
+        """Create an 'and_expr'.
+
+        Join two checks by the 'and' operator.
+        """
+
+        return [('and_expr', _checks.AndCheck([check1, check2]))]
+
+    @reducer('or_expr', 'and', 'check')
+    def _mix_or_and_expr(self, or_expr, _and, check):
+        """Modify the case 'A or B and C'"""
+
+        or_expr, check1 = or_expr.pop_check()
+        if isinstance(check1, _checks.AndCheck):
+            and_expr = check1
+            and_expr.add_check(check)
+        else:
+            and_expr = _checks.AndCheck([check1, check])
+        return [('or_expr', or_expr.add_check(and_expr))]
+
+    @reducer('and_expr', 'and', 'check')
+    def _extend_and_expr(self, and_expr, _and, check):
+        """Extend an 'and_expr' by adding one more check."""
+
+        return [('and_expr', and_expr.add_check(check))]
+
+    @reducer('check', 'or', 'check')
+    @reducer('and_expr', 'or', 'check')
+    def _make_or_expr(self, check1, _or, check2):
+        """Create an 'or_expr'.
+
+        Join two checks by the 'or' operator.
+        """
+
+        return [('or_expr', _checks.OrCheck([check1, check2]))]
+
+    @reducer('or_expr', 'or', 'check')
+    def _extend_or_expr(self, or_expr, _or, check):
+        """Extend an 'or_expr' by adding one more check."""
+
+        return [('or_expr', or_expr.add_check(check))]
+
+    @reducer('not', 'check')
+    def _make_not_expr(self, _not, check):
+        """Invert the result of another check."""
+
+        return [('check', _checks.NotCheck(check))]
+
+
+def _parse_check(rule):
+    """Parse a single base check rule into an appropriate Check object."""
+
+    # Handle the special checks
+    if rule == '!':
+        return _checks.FalseCheck()
+    elif rule == '@':
+        return _checks.TrueCheck()
+
+    try:
+        kind, match = rule.split(':', 1)
+    except Exception:
+        LOG.exception(_LE('Failed to understand rule %s'), rule)
+        # If the rule is invalid, we'll fail closed
+        return _checks.FalseCheck()
+
+    # Find what implements the check
+    if kind in _checks.registered_checks:
+        return _checks.registered_checks[kind](kind, match)
+    elif None in _checks.registered_checks:
+        return _checks.registered_checks[None](kind, match)
+    else:
+        LOG.error(_LE('No handler for matches of kind %s'), kind)
+        return _checks.FalseCheck()
+
+
+def _parse_list_rule(rule):
+    """Translates the old list-of-lists syntax into a tree of Check objects.
+
+    Provided for backwards compatibility.
+    """
+
+    # Empty rule defaults to True
+    if not rule:
+        return _checks.TrueCheck()
+
+    # Outer list is joined by "or"; inner list by "and"
+    or_list = []
+    for inner_rule in rule:
+        # Skip empty inner lists
+        if not inner_rule:
+            continue
+
+        # Handle bare strings
+        if isinstance(inner_rule, six.string_types):
+            inner_rule = [inner_rule]
+
+        # Parse the inner rules into Check objects
+        and_list = [_parse_check(r) for r in inner_rule]
+
+        # Append the appropriate check to the or_list
+        if len(and_list) == 1:
+            or_list.append(and_list[0])
+        else:
+            or_list.append(_checks.AndCheck(and_list))
+
+    # If we have only one check, omit the "or"
+    if not or_list:
+        return _checks.FalseCheck()
+    elif len(or_list) == 1:
+        return or_list[0]
+
+    return _checks.OrCheck(or_list)
+
+
+# Used for tokenizing the policy language
+_tokenize_re = re.compile(r'\s+')
+
+
+def _parse_tokenize(rule):
+    """Tokenizer for the policy language.
+
+    Most of the single-character tokens are specified in the
+    _tokenize_re; however, parentheses need to be handled specially,
+    because they can appear inside a check string.  Thankfully, those
+    parentheses that appear inside a check string can never occur at
+    the very beginning or end ("%(variable)s" is the correct syntax).
+    """
+
+    for tok in _tokenize_re.split(rule):
+        # Skip empty tokens
+        if not tok or tok.isspace():
+            continue
+
+        # Handle leading parens on the token
+        clean = tok.lstrip('(')
+        for i in range(len(tok) - len(clean)):
+            yield '(', '('
+
+        # If it was only parentheses, continue
+        if not clean:
+            continue
+        else:
+            tok = clean
+
+        # Handle trailing parens on the token
+        clean = tok.rstrip(')')
+        trail = len(tok) - len(clean)
+
+        # Yield the cleaned token
+        lowered = clean.lower()
+        if lowered in ('and', 'or', 'not'):
+            # Special tokens
+            yield lowered, clean
+        elif clean:
+            # Not a special token, but not composed solely of ')'
+            if len(tok) >= 2 and ((tok[0], tok[-1]) in
+                                  [('"', '"'), ("'", "'")]):
+                # It's a quoted string
+                yield 'string', tok[1:-1]
+            else:
+                yield 'check', _parse_check(clean)
+
+        # Yield the trailing parens
+        for i in range(trail):
+            yield ')', ')'
+
+
+def _parse_text_rule(rule):
+    """Parses policy to the tree.
+
+    Translates a policy written in the policy language into a tree of
+    Check objects.
+    """
+
+    # Empty rule means always accept
+    if not rule:
+        return _checks.TrueCheck()
+
+    # Parse the token stream
+    state = ParseState()
+    for tok, value in _parse_tokenize(rule):
+        state.shift(tok, value)
+
+    try:
+        return state.result
+    except ValueError:
+        # Couldn't parse the rule
+        LOG.exception(_LE('Failed to understand rule %s'), rule)
+
+        # Fail closed
+        return _checks.FalseCheck()
+
+
+def parse_rule(rule):
+    """Parses a policy rule into a tree of :class:`.Check` objects."""
+
+    # If the rule is a string, it's in the policy language
+    if isinstance(rule, six.string_types):
+        return _parse_text_rule(rule)
+    return _parse_list_rule(rule)
diff --git a/orm/common/orm_common/policy/policy.py b/orm/common/orm_common/policy/policy.py
new file mode 100755
index 00000000..72c48200
--- /dev/null
+++ b/orm/common/orm_common/policy/policy.py
@@ -0,0 +1,184 @@
+"""Policy Engine For ORM."""
+
+import logging
+
+from keystone_utils import tokens
+from orm_common.utils import api_error_utils as err_utils
+from orm_common.utils import dictator
+from wsme.exc import ClientSideError
+
+
+import qolicy
+
+logger = logging.getLogger(__name__)
+_ENFORCER = None
+_POLICY_FILE = None
+_TOKEN_CONF = None
+
+
+def reset():
+    global _ENFORCER
+    if _ENFORCER:
+        _ENFORCER.clear()
+        _ENFORCER = None
+
+    global _POLICY_FILE
+    if _POLICY_FILE:
+        _POLICY_FILE = None
+
+
+class EnforcerError(Exception):
+    """An exception that receives *args and **kwargs, necessary for
+    Enforcer.enforce().
+    """
+    def __init__(self, *args, **kwargs):
+        super(EnforcerError, self).__init__()
+
+
+def _get_rules_from_file(path):
+    logger.debug('Reading policy file: {}'.format(path))
+
+    return qolicy.Rules.load_json(open(path, 'r').read(), 'default')
+
+
+def init(policy_file, token_conf, default_rule=None):
+    """Init an Enforcer class.
+
+       :param policy_file: Custom policy file to use.
+       :param default_rule: Default rule to use
+       :param token_conf: The Keystone utils token configuration
+    """
+    logger.info('Initializing policy enforcer...')
+
+    global _ENFORCER
+    global _POLICY_FILE
+    global _TOKEN_CONF
+    if not _ENFORCER:
+        loaded_rules = _get_rules_from_file(policy_file)
+        _POLICY_FILE = policy_file
+        _TOKEN_CONF = token_conf
+        _ENFORCER = qolicy.Enforcer(None,
+                                    policy_file=None,
+                                    rules=loaded_rules,
+                                    default_rule=default_rule,
+                                    use_conf=False)
+
+
+def reset_rules(overwrite=True, use_conf=False):
+    """Reset rules based on the provided dict of rules.
+
+       :param rules: New rules to use. It should be an instance of dict.
+       :param overwrite: Whether to overwrite current rules or update them
+                         with the new rules.
+       :param use_conf: Whether to reload rules from config file.
+    """
+    if not _POLICY_FILE:
+        message = 'Policy file not set (did you call policy.init?)'
+        logger.error(message)
+        raise ValueError(message)
+    _ENFORCER.set_rules(_get_rules_from_file(_POLICY_FILE),
+                        overwrite, use_conf)
+
+
+def enforce(action, token, user, lcp_id=None, keystone_ep=None,
+            do_raise=True):
+    """Verifies that the action is valid on the target in this context.
+
+       :param action: string representing the action to be checked
+           this should be colon separated for clarity.
+           i.e. ``compute:create_instance``,
+           ``compute:attach_volume``,
+           ``volume:attach_volume``
+       :param token: The token to validate
+       :param lcp_id: The ID of the LCP associated with the Keystone instance
+           with which the token was created
+       :param keystone_ep: The Keystone endpoint, in case we already have it
+       :param do_raise: if True (the default), raises Unauthorized (401);
+           if False, returns False
+
+       :raises EnforcerError if verification fails and do_raise is True.
+
+       :return: returns a non-False value (not necessarily "True") if
+           authorized, and the exact value False if not authorized and
+           do_raise is False.
+    """
+    logger.debug('Enforcing policy - action: {}, token: {}, lcp_id: {}, '
+                 'keystone_ep: {}'.format(action, token, lcp_id, keystone_ep))
+    # Re-read the rules, in case the policy file has changed
+    reset_rules()
+
+    # May raise EnforcerError, we'll let it propagate
+    result = _ENFORCER.enforce(action, {}, user, do_raise=do_raise,
+                               exc=EnforcerError, action=action)
+
+    return result
+
+
+def _is_authorization_enabled(app_conf):
+    return app_conf.authentication.enabled
+
+
+def authorize(action, request, app_conf, keystone_ep=None):
+    """Authorize a request.
+
+    :param action: The requested action, in the policy.json syntax
+    :param request: Pecan request object
+    :param app_conf: Application configuration
+    :param keystone_ep: Keystone endpoint, in case we already have it
+
+    :raises Unauthorized (401) in case anything fails in the authorization
+        process
+    """
+    logger.info('Authorize...start')
+
+    token_to_validate = request.headers.get('X-Auth-Token')
+    lcp_id = request.headers.get('X-Auth-Region')
+    try:
+        if _is_authorization_enabled(app_conf):
+            try:
+                # Set the service name for Nagios codes
+                dictator.soft_set('service_name', app_conf.server.name.upper())
+
+                user = tokens.get_token_user(token_to_validate, _TOKEN_CONF,
+                                             lcp_id, keystone_ep)
+                request.headers['X-RANGER-Client'] = user.user['name']
+                request.headers['X-RANGER-Owner'] = user.tenant['id']
+            except Exception:
+                user = None
+                request.headers['X-RANGER-Client'] = 'NA'
+                logger.exception(
+                    "policy - Failed to get_token_user, using user={}".format(
+                        user))
+
+            if token_to_validate is not None and lcp_id is not None and str(token_to_validate).strip() != '' and str(lcp_id).strip() != '':
+                logger.debug('Authorization: enforcing policy on token=[{}], lcp_id=[{}]'.format(token_to_validate, lcp_id))
+                enforce(action, token_to_validate, user, lcp_id, keystone_ep)
+                is_permitted = True
+                logger.debug('Authorization: policy check passed')
+            else:
+                logger.debug('Token=[{}] and/or Region=[{}] are empty/none.'.format(token_to_validate, lcp_id))
+                logger.info(
+                    'INFO|CON{}AUTH004|One or more of the authentication headers are missing'.format(
+                        dictator.get('service_name', 'ORM')))
+                # Enforce anyway, in case the policy for this is to always
+                # allow any user to perform this operation
+                enforce(action, token_to_validate, user)
+                is_permitted = True
+        else:
+            logger.debug('The authentication service is disabled. No authentication is needed.')
+            is_permitted = True
+    except ClientSideError as e:
+        logger.error('Fail to validate request. due to {}.'.format(e.message))
+        raise err_utils.get_error('N/A', status_code=e.code)
+    except EnforcerError:
+        logger.error('The token is unauthorized according to the policy')
+        is_permitted = False
+    except Exception as e:
+        msg = 'Fail to validate request. due to {}.'.format(e.message)
+        logger.error(msg)
+        logger.exception(e)
+        is_permitted = False
+
+    logger.info('Authorize...end')
+    if not is_permitted:
+        raise err_utils.get_error('N/A', status_code=401)
diff --git a/orm/common/orm_common/policy/qolicy.py b/orm/common/orm_common/policy/qolicy.py
new file mode 100755
index 00000000..5afc9700
--- /dev/null
+++ b/orm/common/orm_common/policy/qolicy.py
@@ -0,0 +1,536 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2012 OpenStack Foundation.
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+"""
+Common Policy Engine Implementation
+
+Policies are expressed as a target and an associated rule::
+
+    "<target>": <rule>
+
+The `target` is specific to the service that is conducting policy
+enforcement.  Typically, the target refers to an API call.
+
+For the `<rule>` part, see `Policy Rule Expressions`.
+
+Policy Rule Expressions
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Policy rules can be expressed in one of two forms: a string written in the new
+policy language or a list of lists. The string format is preferred since it's
+easier for most people to understand.
+
+In the policy language, each check is specified as a simple "a:b" pair that is
+matched to the correct class to perform that check:
+
+ +--------------------------------+------------------------------------------+
+ |            TYPE                |                SYNTAX                    |
+ +================================+==========================================+
+ |User's Role                     |              role:admin                  |
+ +--------------------------------+------------------------------------------+
+ |Rules already defined on policy |          rule:admin_required             |
+ +--------------------------------+------------------------------------------+
+ |Against URLs¹                   |         http://my-url.org/check          |
+ +--------------------------------+------------------------------------------+
+ |User attributes²                |    project_id:%(target.project.id)s      |
+ +--------------------------------+------------------------------------------+
+ |Strings                         |        - <variable>:'xpto2035abc'        |
+ |                                |        - 'myproject':<variable>          |
+ +--------------------------------+------------------------------------------+
+ |                                |         - project_id:xpto2035abc         |
+ |Literals                        |         - domain_id:20                   |
+ |                                |         - True:%(user.enabled)s          |
+ +--------------------------------+------------------------------------------+
+
+¹URL checking must return ``True`` to be valid
+
+²User attributes (obtained through the token): user_id, domain_id or project_id
+
+Conjunction operators ``and`` and ``or`` are available, allowing for more
+expressiveness in crafting policies. For example::
+
+    "role:admin or (project_id:%(project_id)s and role:projectadmin)"
+
+The policy language also has the ``not`` operator, allowing a richer
+policy rule::
+
+    "project_id:%(project_id)s and not role:dunce"
+
+Operator precedence is below:
+
+ +------------+-------------+-------------+
+ | PRECEDENCE |     TYPE    | EXPRESSION  |
+ +============+=============+=============+
+ |      4     |  Grouping   |    (...)    |
+ +------------+-------------+-------------+
+ |      3     | Logical NOT |   not ...   |
+ +------------+-------------+-------------+
+ |      2     | Logical AND | ... and ... |
+ +------------+-------------+-------------+
+ |      1     | Logical OR  | ... or ...  |
+ +------------+-------------+-------------+
+
+Operator with larger precedence number precedes others with smaller numbers.
+
+In the list-of-lists representation, each check inside the innermost
+list is combined as with an "and" conjunction -- for that check to pass,
+all the specified checks must pass.  These innermost lists are then
+combined as with an "or" conjunction. As an example, take the following
+rule, expressed in the list-of-lists representation::
+
+    [["role:admin"], ["project_id:%(project_id)s", "role:projectadmin"]]
+
+Finally, two special policy checks should be mentioned; the policy
+check "@" will always accept an access, and the policy check "!" will
+always reject an access.  (Note that if a rule is either the empty
+list (``[]``) or the empty string (``""``), this is equivalent to the "@"
+policy check.)  Of these, the "!" policy check is probably the most useful,
+as it allows particular rules to be explicitly disabled.
+
+Generic Checks
+~~~~~~~~~~~~~~
+
+A `generic` check is used to perform matching against attributes that are sent
+along with the API calls.  These attributes can be used by the policy engine
+(on the right side of the expression), by using the following syntax::
+
+    <some_attribute>:%(user.id)s
+
+The value on the right-hand side is either a string or resolves to a
+string using regular Python string substitution.  The available attributes
+and values are dependent on the program that is using the common policy
+engine.
+
+All of these attributes (related to users, API calls, and context) can be
+checked against each other or against constants.  It is important to note
+that these attributes are specific to the service that is conducting
+policy enforcement.
+
+Generic checks can be used to perform policy checks on the following user
+attributes obtained through a token:
+
+    - user_id
+    - domain_id or project_id (depending on the token scope)
+    - list of roles held for the given token scope
+
+For example, a check on the user_id would be defined as::
+
+    user_id:<some_value>
+
+Together with the previously shown example, a complete generic check
+would be::
+
+    user_id:%(user.id)s
+
+It is also possible to perform checks against other attributes that
+represent the credentials.  This is done by adding additional values to
+the ``creds`` dict that is passed to the
+:meth:`~oslo_policy.policy.Enforcer.enforce` method.
+
+Special Checks
+~~~~~~~~~~~~~~
+
+Special checks allow for more flexibility than is possible using generic
+checks.  The built-in special check types are ``role``, ``rule``, and ``http``
+checks.
+
+Role Check
+^^^^^^^^^^
+
+A ``role`` check is used to check if a specific role is present in the supplied
+credentials.  A role check is expressed as::
+
+    "role:<role_name>"
+
+Rule Check
+^^^^^^^^^^
+
+A :class:`rule check <oslo_policy.policy.RuleCheck>` is used to
+reference another defined rule by its name.  This allows for common
+checks to be defined once as a reusable rule, which is then referenced
+within other rules.  It also allows one to define a set of checks as a
+more descriptive name to aid in readability of policy.  A rule check is
+expressed as::
+
+    "rule:<rule_name>"
+
+The following example shows a role check that is defined as a rule,
+which is then used via a rule check::
+
+    "admin_required": "role:admin"
+    "<target>": "rule:admin_required"
+
+HTTP Check
+^^^^^^^^^^
+
+An ``http`` check is used to make an HTTP request to a remote server to
+determine the results of the check.  The target and credentials are passed to
+the remote server for evaluation.  The action is authorized if the remote
+server returns a response of ``True``. An http check is expressed as::
+
+    "http:<target URI>"
+
+It is expected that the target URI contains a string formatting keyword,
+where the keyword is a key from the target dictionary.  An example of an
+http check where the `name` key from the target is used to construct the
+URL is would be defined as::
+
+    "http://server.test/%(name)s"
+
+Registering New Special Checks
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+It is also possible for additional special check types to be registered
+using the :func:`~oslo_policy.policy.register` function.
+
+The following classes can be used as parents for custom special check types:
+
+    * :class:`~oslo_policy.policy.AndCheck`
+    * :class:`~oslo_policy.policy.NotCheck`
+    * :class:`~oslo_policy.policy.OrCheck`
+    * :class:`~oslo_policy.policy.RuleCheck`
+
+Default Rule
+~~~~~~~~~~~~
+
+A default rule can be defined, which will be enforced when a rule does
+not exist for the target that is being checked.  By default, the rule
+associated with the rule name of ``default`` will be used as the default
+rule.  It is possible to use a different rule name as the default rule
+by setting the ``policy_default_rule`` configuration setting to the
+desired rule name.
+"""
+
+import logging
+import os
+
+from oslo_config import cfg
+from oslo_serialization import jsonutils
+import six
+
+from oslo_policy import _checks
+from oslo_policy._i18n import _
+from oslo_policy import opts
+
+import _parser
+
+
+LOG = logging.getLogger(__name__)
+
+
+register = _checks.register
+"""Register a function or :class:`.Check` class as a policy check.
+
+:param name: Gives the name of the check type, e.g., "rule",
+             "role", etc.  If name is ``None``, a default check type
+             will be registered.
+:param func: If given, provides the function or class to register.
+             If not given, returns a function taking one argument
+             to specify the function or class to register,
+             allowing use as a decorator.
+"""
+
+Check = _checks.Check
+"""A base class to allow for user-defined policy checks.
+
+:param kind: The kind of the check, i.e., the field before the ``:``.
+:param match: The match of the check, i.e., the field after the ``:``.
+
+"""
+
+AndCheck = _checks.AndCheck
+"""Implements the "and" logical operator.
+
+A policy check that requires that a list of other checks all return True.
+
+:param list rules: rules that will be tested.
+
+"""
+
+NotCheck = _checks.NotCheck
+"""Implements the "not" logical operator.
+
+A policy check that inverts the result of another policy check.
+
+:param rule: The rule to negate.
+:type rule: oslo_policy.policy.Check
+
+"""
+
+OrCheck = _checks.OrCheck
+"""Implements the "or" operator.
+
+A policy check that requires that at least one of a list of other
+checks returns ``True``.
+
+:param rules: A list of rules that will be tested.
+
+"""
+
+RuleCheck = _checks.RuleCheck
+"""Recursively checks credentials based on the defined rules."""
+
+
+class PolicyNotAuthorized(Exception):
+    """Default exception raised for policy enforcement failure."""
+
+    def __init__(self, rule, target, creds):
+        msg = (_('%(rule)s on %(target)s by %(creds)s disallowed by policy') %
+               {'rule': rule, 'target': target, 'creds': creds})
+        super(PolicyNotAuthorized, self).__init__(msg)
+
+
+class Rules(dict):
+    """A store for rules. Handles the default_rule setting directly."""
+
+    @classmethod
+    def load_json(cls, data, default_rule=None):
+        """Allow loading of JSON rule data."""
+
+        # Suck in the JSON data and parse the rules
+        rules = {k: _parser.parse_rule(v)
+                 for k, v in jsonutils.loads(data).items()}
+
+        return cls(rules, default_rule)
+
+    @classmethod
+    def from_dict(cls, rules_dict, default_rule=None):
+        """Allow loading of rule data from a dictionary."""
+
+        # Parse the rules stored in the dictionary
+        rules = {k: _parser.parse_rule(v) for k, v in rules_dict.items()}
+
+        return cls(rules, default_rule)
+
+    def __init__(self, rules=None, default_rule=None):
+        """Initialize the Rules store."""
+
+        super(Rules, self).__init__(rules or {})
+        self.default_rule = default_rule
+
+    def __missing__(self, key):
+        """Implements the default rule handling."""
+
+        if isinstance(self.default_rule, dict):
+            raise KeyError(key)
+
+        # If the default rule isn't actually defined, do something
+        # reasonably intelligent
+        if not self.default_rule:
+            raise KeyError(key)
+
+        if isinstance(self.default_rule, _checks.BaseCheck):
+            return self.default_rule
+
+        # We need to check this or we can get infinite recursion
+        if self.default_rule not in self:
+            raise KeyError(key)
+
+        elif isinstance(self.default_rule, six.string_types):
+            return self[self.default_rule]
+
+    def __str__(self):
+        """Dumps a string representation of the rules."""
+
+        # Start by building the canonical strings for the rules
+        out_rules = {}
+        for key, value in self.items():
+            # Use empty string for singleton TrueCheck instances
+            if isinstance(value, _checks.TrueCheck):
+                out_rules[key] = ''
+            else:
+                out_rules[key] = str(value)
+
+        # Dump a pretty-printed JSON representation
+        return jsonutils.dumps(out_rules, indent=4)
+
+
+class Enforcer(object):
+    """Responsible for loading and enforcing rules.
+
+    :param conf: A configuration object.
+    :param policy_file: Custom policy file to use, if none is
+                        specified, ``conf.oslo_policy.policy_file`` will be
+                        used.
+    :param rules: Default dictionary / Rules to use. It will be
+                  considered just in the first instantiation. If
+                  :meth:`load_rules` with ``force_reload=True``,
+                  :meth:`clear` or :meth:`set_rules` with ``overwrite=True``
+                  is called this will be overwritten.
+    :param default_rule: Default rule to use, conf.default_rule will
+                         be used if none is specified.
+    :param use_conf: Whether to load rules from cache or config file.
+    :param overwrite: Whether to overwrite existing rules when reload rules
+                      from config file.
+    """
+
+    def __init__(self, conf, policy_file=None, rules=None,
+                 default_rule=None, use_conf=True, overwrite=True):
+        self.conf = conf
+
+        self.default_rule = default_rule or '!'
+        self.rules = Rules(rules, self.default_rule)
+
+        self.policy_path = None
+
+        self.policy_file = policy_file
+        self.use_conf = use_conf
+        self.overwrite = overwrite
+        self._loaded_files = []
+        self._policy_dir_mtimes = {}
+        self._file_cache = {}
+
+    def set_rules(self, rules, overwrite=True, use_conf=False):
+        """Create a new :class:`Rules` based on the provided dict of rules.
+
+        :param dict rules: New rules to use.
+        :param overwrite: Whether to overwrite current rules or update them
+                          with the new rules.
+        :param use_conf: Whether to reload rules from cache or config file.
+        """
+
+        if not isinstance(rules, dict):
+            raise TypeError(_('Rules must be an instance of dict or Rules, '
+                            'got %s instead') % type(rules))
+        self.use_conf = use_conf
+        if overwrite:
+            self.rules = Rules(rules, self.default_rule)
+        else:
+            self.rules.update(rules)
+
+    def clear(self):
+        """Clears :class:`Enforcer` contents.
+
+        This will clear this instances rules, policy's cache, file cache
+        and policy's path.
+        """
+        self.set_rules({})
+        self.default_rule = None
+        self.policy_path = None
+        self._loaded_files = []
+        self._policy_dir_mtimes = {}
+        self._file_cache.clear()
+
+    def load_rules(self, force_reload=False):
+        """Loads policy_path's rules.
+
+        Policy file is cached and will be reloaded if modified.
+
+        :param force_reload: Whether to reload rules from config file.
+        """
+
+        if force_reload:
+            self.use_conf = force_reload
+
+    @staticmethod
+    def _is_directory_updated(cache, path):
+        # Get the current modified time and compare it to what is in
+        # the cache and check if the new mtime is greater than what
+        # is in the cache
+        mtime = 0
+        if os.path.exists(path):
+            # Make a list of all the files
+            files = [path] + [os.path.join(path, file) for file in
+                              os.listdir(path)]
+            # Pick the newest one, let's use its time.
+            mtime = os.path.getmtime(max(files, key=os.path.getmtime))
+        cache_info = cache.setdefault(path, {})
+        if mtime > cache_info.get('mtime', 0):
+            cache_info['mtime'] = mtime
+            return True
+        return False
+
+    @staticmethod
+    def _walk_through_policy_directory(path, func, *args):
+        if not os.path.isdir(path):
+            raise ValueError('%s is not a directory' % path)
+        # We do not iterate over sub-directories.
+        policy_files = next(os.walk(path))[2]
+        policy_files.sort()
+        for policy_file in [p for p in policy_files if not p.startswith('.')]:
+            func(os.path.join(path, policy_file), *args)
+
+    def _get_policy_path(self, path):
+        """Locate the policy JSON data file/path.
+
+        :param path: It's value can be a full path or related path. When
+                     full path specified, this function just returns the full
+                     path. When related path specified, this function will
+                     search configuration directories to find one that exists.
+
+        :returns: The policy path
+
+        :raises: ConfigFilesNotFoundError if the file/path couldn't
+                 be located.
+        """
+        policy_path = self.conf.find_file(path)
+
+        if policy_path:
+            return policy_path
+
+        raise cfg.ConfigFilesNotFoundError((path,))
+
+    def enforce(self, rule, target, creds, do_raise=False,
+                exc=None, *args, **kwargs):
+        """Checks authorization of a rule against the target and credentials.
+
+        :param rule: The rule to evaluate.
+        :type rule: string or :class:`BaseCheck`
+        :param dict target: As much information about the object being operated
+                            on as possible.
+        :param dict creds: As much information about the user performing the
+                           action as possible.
+        :param do_raise: Whether to raise an exception or not if check
+                        fails.
+        :param exc: Class of the exception to raise if the check fails.
+                    Any remaining arguments passed to :meth:`enforce` (both
+                    positional and keyword arguments) will be passed to
+                    the exception class. If not specified,
+                    :class:`PolicyNotAuthorized` will be used.
+
+        :return: ``False`` if the policy does not allow the action and `exc` is
+                 not provided; otherwise, returns a value that evaluates to
+                 ``True``.  Note: for rules using the "case" expression, this
+                 ``True`` value will be the specified string from the
+                 expression.
+        """
+
+        self.load_rules()
+
+        # Allow the rule to be a Check tree
+        if isinstance(rule, _checks.BaseCheck):
+            result = rule(target, creds, self)
+        elif not self.rules:
+            # No rules to reference means we're going to fail closed
+            result = False
+        else:
+            try:
+                # Evaluate the rule
+                result = self.rules[rule](target, creds, self)
+            except KeyError:
+                LOG.debug('Rule [%s] does not exist', rule)
+                # If the rule doesn't exist, fail closed
+                result = False
+
+        # If it is False, raise the exception if requested
+        if do_raise and not result:
+            if exc:
+                raise exc(*args, **kwargs)
+
+            raise PolicyNotAuthorized(rule, target, creds)
+
+        return result
diff --git a/orm/common/orm_common/tests/__init__.py b/orm/common/orm_common/tests/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/orm_common/tests/hooks/__init__.py b/orm/common/orm_common/tests/hooks/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/orm_common/tests/hooks/test_api_error_hook.py b/orm/common/orm_common/tests/hooks/test_api_error_hook.py
new file mode 100755
index 00000000..6287d10e
--- /dev/null
+++ b/orm/common/orm_common/tests/hooks/test_api_error_hook.py
@@ -0,0 +1,68 @@
+import json
+import mock
+from orm_common.hooks import api_error_hook
+from unittest import TestCase
+import logging
+
+logger = logging.getLogger(__name__)
+
+
+class TestAPIErrorHook(TestCase):
+    @mock.patch.object(api_error_hook, 'err_utils')
+    @mock.patch.object(api_error_hook, 'json')
+    def test_after_401(self, mock_json, mock_err_utils):
+        a = api_error_hook.APIErrorHook()
+        state = mock.MagicMock()
+
+        mock_err_utils.get_error_dict.return_value = 'B'
+        mock_json.loads = json.loads
+        mock_json.dumps = json.dumps
+        state.response.status_code = 401
+        a.after(state)
+        self.assertEqual(state.response.body,
+                         json.dumps(mock_err_utils.get_error_dict.return_value))
+
+    @mock.patch.object(api_error_hook, 'err_utils')
+    def test_after_not_an_error(self, mock_err_utils):
+        a = api_error_hook.APIErrorHook()
+        state = mock.MagicMock()
+
+        mock_err_utils.get_error_dict.return_value = 'B'
+        state.response.body = 'AAAA'
+        temp = state.response.body
+        # A successful status code
+        state.response.status_code = 201
+        a.after(state)
+        # Assert that the response body hasn't changed
+        self.assertEqual(state.response.body, temp)
+
+    @mock.patch.object(api_error_hook, 'err_utils')
+    @mock.patch.object(api_error_hook.json, 'loads',
+                       side_effect=ValueError('test'))
+    def test_after_error(self, mock_json, mock_err_utils):
+        a = api_error_hook.APIErrorHook()
+        state = mock.MagicMock()
+
+        mock_err_utils.get_error_dict.return_value = 'B'
+        state.response.body = 'AAAA'
+
+        mock_json.loads = mock.MagicMock(side_effect=ValueError('sd'))
+        state.response.status_code = 402
+        a.after(state)
+        self.assertEqual(state.response.body,
+                         json.dumps(mock_err_utils.get_error_dict.return_value))
+
+    @mock.patch.object(api_error_hook, 'err_utils')
+    @mock.patch.object(api_error_hook, 'json')
+    def test_after_success(self, mock_json, mock_err_utils):
+        a = api_error_hook.APIErrorHook()
+        state = mock.MagicMock()
+
+        mock_err_utils.get_error_dict.return_value = 'B'
+        mock_json.loads = json.loads
+        mock_json.dumps = json.dumps
+        mock_json.loads = json.loads
+        state.response.body = '{"debuginfo": null, "faultcode": "Client", "faultstring": "{\\"code\\": 404, \\"created\\": \\"1475768730.95\\", \\"details\\": \\"\\", \\"message\\": \\"customer: q not found\\", \\"type\\": \\"Not Found\\", \\"transaction_id\\": \\"mock_json5efa7416fb4d408cc0e30e4373cf00\\"}"}'
+        state.response.status_code = 400
+        a.after(state)
+        self.assertEqual(json.loads(state.response.body), json.loads('{"message": "customer: q not found", "created": "1475768730.95", "type": "Not Found", "details": "", "code": 404, "transaction_id": "mock_json5efa7416fb4d408cc0e30e4373cf00"}'))
diff --git a/orm/common/orm_common/tests/hooks/test_security_headers_hook.py b/orm/common/orm_common/tests/hooks/test_security_headers_hook.py
new file mode 100755
index 00000000..ee5b2420
--- /dev/null
+++ b/orm/common/orm_common/tests/hooks/test_security_headers_hook.py
@@ -0,0 +1,31 @@
+import mock
+from orm_common.hooks import security_headers_hook
+from unittest import TestCase
+
+
+class MyHeaders(object):
+    def __init__(self):
+        self.headers = {}
+
+    def add(self, key, value):
+        self.headers[key] = value
+
+
+class TestSecurityHeadersHook(TestCase):
+    def test_after(self):
+        s = security_headers_hook.SecurityHeadersHook()
+        test_headers = MyHeaders()
+        state = mock.MagicMock()
+        state.response.headers = test_headers
+        s.after(state)
+
+        security_headers = {'X-Frame-Options': 'DENY',
+                            'X-Content-Type-Options': 'nosniff',
+                            'Strict-Transport-Security': 'max-age=31536000; includeSubDomains',
+                            'Content-Security-Policy': 'default-src \'self\'',
+                            'X-Permitted-Cross-Domain-Policies': 'none',
+                            'X-XSS-Protection': '1; mode=block'}
+
+        for header in security_headers:
+            self.assertEqual(security_headers[header],
+                             test_headers.headers[header])
diff --git a/orm/common/orm_common/tests/hooks/test_transaction_id_hook.py b/orm/common/orm_common/tests/hooks/test_transaction_id_hook.py
new file mode 100755
index 00000000..da1a6c22
--- /dev/null
+++ b/orm/common/orm_common/tests/hooks/test_transaction_id_hook.py
@@ -0,0 +1,17 @@
+import mock
+from orm_common.hooks import transaction_id_hook
+from unittest import TestCase
+import logging
+
+logger = logging.getLogger(__name__)
+
+
+class TestTransactionIdHook(TestCase):
+    @mock.patch.object(transaction_id_hook.utils, 'make_transid',
+                       return_value='test')
+    def test_before_sanity(self, mock_make_transid):
+        t = transaction_id_hook.TransactionIdHook()
+        state = mock.MagicMock()
+        t.before(state)
+        self.assertEqual(state.request.transaction_id, 'test')
+        self.assertEqual(state.request.tracking_id, 'test')
diff --git a/orm/common/orm_common/tests/injector/__init__.py b/orm/common/orm_common/tests/injector/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/orm_common/tests/injector/test_injector.py b/orm/common/orm_common/tests/injector/test_injector.py
new file mode 100755
index 00000000..1ac3bb04
--- /dev/null
+++ b/orm/common/orm_common/tests/injector/test_injector.py
@@ -0,0 +1,58 @@
+import mock
+from orm_common.injector import injector
+from unittest import TestCase
+import os
+import logging
+from orm_common.injector.fang.resource_provider_register import ResourceProviderRegister
+
+logger = logging.getLogger(__name__)
+
+
+class TestInjector(TestCase):
+    def setUp(self):
+        pass
+
+    @mock.patch.object(injector, '_import_file_by_name')
+    def test_register_providers(self, mock_import_file_by_name):
+        os.environ['CMS_ENV'] = 'test'
+        injector.register_providers('CMS_ENV', 'a/b/c', logger)
+
+    @mock.patch.object(injector, '_import_file_by_name')
+    def test_register_providers_env_not_exist(self, mock_import_file_by_name):
+        injector.register_providers('CMS_ENV1', 'a/b/c', logger)
+
+    @mock.patch.object(injector, '_import_file_by_name')
+    def test_register_providers_env_test(self, mock_import_file_by_name):
+        os.environ['CMS_ENV2'] = '__TEST__'
+        injector.register_providers('CMS_ENV2', 'a/b/c', logger)
+
+    @mock.patch.object(injector, '_import_file_by_name')
+    def test_register_providers_with_existing_provider(self, mock_import_file_by_name):
+        mock_import_file_by_name.return_value = type('module', (object,), {'providers': ['a1', 'b2']})()
+        os.environ['c3'] = 'test'
+        injector.register_providers('c3', 'a/b/c', logger)
+
+    def test_get_di(self):
+        injector.get_di()
+
+    @mock.patch.object(injector, 'logger')
+    def test_import_file_by_name_ioerror(self, mock_logger):
+        injector.logger = mock.MagicMock()
+        # Calling it with ('', '.') should raise an IOError
+        # (no such file or directory)
+        self.assertRaises(IOError, injector._import_file_by_name, '', '.')
+
+    @mock.patch.object(injector.imp, 'load_source', return_value='test')
+    def test_import_file_by_name_sanity(self, mock_load_source):
+        self.assertEqual(injector._import_file_by_name('', '.'), 'test')
+
+    @mock.patch.object(injector._di.providers, 'register_instance')
+    def test_override_injected_dependency(self, mock_di):
+        injector.override_injected_dependency((1, 2,))
+        self.assertTrue(mock_di.called)
+
+    '''
+    @mock.patch.object(ResourceProviderRegister, 'register_instance')
+    def test_override_injected_dependency(self, mock_resourceProviderRegister):
+        injector.override_injected_dependency(mock.Mock())
+    '''
diff --git a/orm/common/orm_common/tests/policy/__init__.py b/orm/common/orm_common/tests/policy/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/orm_common/tests/policy/test_checks.py b/orm/common/orm_common/tests/policy/test_checks.py
new file mode 100755
index 00000000..cf319474
--- /dev/null
+++ b/orm/common/orm_common/tests/policy/test_checks.py
@@ -0,0 +1,100 @@
+import mock
+import unittest
+
+from orm_common.policy import _checks
+from wsme.exc import ClientSideError
+
+
+class TestChecks(unittest.TestCase):
+    def test_call_simple_checks(self):
+        check = _checks.FalseCheck()
+        self.assertFalse(check(1, 2, 3))
+        check = _checks.TrueCheck()
+        self.assertTrue(check(1, 2, 3))
+
+        check = _checks.GenericCheck('a', 'b')
+        self.assertFalse(check(1, 2, 3))
+
+    def test_str_simple_checks(self):
+        check = _checks.FalseCheck()
+        self.assertEqual(str(check), '!')
+        check = _checks.TrueCheck()
+        self.assertEqual(str(check), '@')
+
+        check = _checks.GenericCheck('a', 'b')
+        self.assertEqual(str(check), 'a:b')
+
+    def test_call_complex_checks(self):
+        first_rule = _checks.TrueCheck()
+        second_rule = _checks.FalseCheck()
+
+        check = _checks.NotCheck(first_rule)
+        self.assertFalse(check(1, 2, 3))
+
+        check = _checks.AndCheck([first_rule])
+        check.add_check(second_rule)
+        self.assertFalse(check(1, 2, 3))
+        check = _checks.AndCheck([first_rule, first_rule])
+        self.assertTrue(check(1, 2, 3))
+
+        check = _checks.OrCheck([first_rule])
+        check.add_check(second_rule)
+        self.assertTrue(check(1, 2, 3))
+        self.assertEqual(check.pop_check(), (check, second_rule,))
+        check = _checks.OrCheck([second_rule, second_rule])
+        self.assertFalse(check(1, 2, 3))
+
+    def test_str_complex_checks(self):
+        first_rule = _checks.TrueCheck()
+        second_rule = _checks.FalseCheck()
+
+        check = _checks.NotCheck(first_rule)
+        self.assertEqual(str(check), 'not @')
+
+        check = _checks.AndCheck([first_rule])
+        check.add_check(second_rule)
+        self.assertEqual(str(check), '(@ and !)')
+
+        check = _checks.OrCheck([first_rule])
+        check.add_check(second_rule)
+        self.assertEqual(str(check), '(@ or !)')
+
+    def test_call_custom_checks_error(self):
+        check = _checks.RoleCheck('a', 'admin')
+        try:
+            check(1, mock.MagicMock(), 3)
+            self.fail('ClientSideError not raised!')
+        except ClientSideError as exc:
+            self.assertEqual(exc.code, 403)
+
+        for check_type in (_checks.TenantCheck,
+                           _checks.DomainCheck):
+            check = check_type('a', 'admin')
+            # 2 is not a user, so the check will fail
+            self.assertFalse(check(1, 2, 3))
+
+    def test_call_custom_checks_success(self):
+        user = mock.MagicMock()
+        user.user = {'roles': [{'name': 'admin'}]}
+        user.tenant = {'name': 'admin'}
+        user.domain = {'name': 'admin'}
+
+        for check_type in (_checks.RoleCheck,
+                           _checks.TenantCheck,
+                           _checks.DomainCheck):
+            check = check_type('a', 'admin')
+            # 2 is not a user, so the check will fail
+            self.assertTrue(check(1, user, 3))
+
+    def test_call_rule_check_error(self):
+        enforcer = mock.MagicMock()
+        enforcer.rules = {'test': mock.MagicMock(
+            side_effect=KeyError('test'))}
+        check = _checks.RuleCheck('rule', 'test')
+        self.assertFalse(check(1, 2, enforcer))
+
+    def test_call_rule_check_success(self):
+        enforcer = mock.MagicMock()
+        enforcer.rules = {'test': mock.MagicMock(return_value=True)}
+        check = _checks.RuleCheck('rule', 'test')
+        self.assertTrue(check(1, 2, enforcer))
diff --git a/orm/common/orm_common/tests/policy/test_policy.py b/orm/common/orm_common/tests/policy/test_policy.py
new file mode 100755
index 00000000..c670c04b
--- /dev/null
+++ b/orm/common/orm_common/tests/policy/test_policy.py
@@ -0,0 +1,130 @@
+import mock
+import unittest
+
+from orm_common.policy import policy
+from orm_common.utils import api_error_utils as err_utils
+
+
+class TestException(Exception):
+    pass
+
+
+class TestPolicy(unittest.TestCase):
+    def setUp(self):
+        policy._ENFORCER = None
+        policy._POLICY_FILE = None
+        policy._TOKEN_CONF = None
+
+    def test_reset(self):
+        policy._ENFORCER = mock.MagicMock()
+        policy._POLICY_FILE = mock.MagicMock()
+        policy.reset()
+        self.assertIsNone(policy._ENFORCER)
+        self.assertIsNone(policy._POLICY_FILE)
+        # Call it a second time when they are both None and see
+        # that no exception is raised
+        policy.reset()
+        self.assertIsNone(policy._ENFORCER)
+        self.assertIsNone(policy._POLICY_FILE)
+
+    @mock.patch.object(policy, 'open')
+    @mock.patch.object(policy.qolicy, 'Enforcer')
+    @mock.patch.object(policy.qolicy, 'Rules')
+    def test_init_success(self, mock_rules, mock_enforcer, mock_open):
+        policy_file = 'a'
+        token_conf = 'b'
+        mock_rules.load_json.return_value = 'c'
+        policy.init(policy_file, token_conf)
+        self.assertEqual(policy._POLICY_FILE, 'a')
+        self.assertEqual(policy._TOKEN_CONF, 'b')
+
+    def test_init_enforcer_already_exists(self):
+        policy._ENFORCER = mock.MagicMock()
+
+        # Nothing should happen when the enforcer already exists, so make sure
+        # that no exception is raised
+        policy.init('a', 'b')
+
+    @mock.patch.object(policy, 'open')
+    @mock.patch.object(policy.qolicy, 'Rules')
+    @mock.patch.object(policy, '_ENFORCER')
+    def test_reset_rules_no_policy_file(self, mock_enforcer,
+                                        mock_rules, mock_open):
+        self.assertRaises(ValueError, policy.reset_rules)
+
+    @mock.patch.object(policy, 'open')
+    @mock.patch.object(policy.qolicy, 'Rules')
+    @mock.patch.object(policy, '_ENFORCER')
+    def test_reset_rules_success(self, mock_enforcer,
+                                 mock_rules, mock_open):
+        policy._POLICY_FILE = mock.MagicMock()
+        policy.reset_rules()
+        self.assertTrue(mock_enforcer.set_rules.called)
+
+    @mock.patch.object(policy, 'reset_rules')
+    @mock.patch.object(policy.tokens, 'get_token_user',
+                       side_effect=ValueError('test'))
+    @mock.patch.object(policy, '_ENFORCER')
+    def test_enforce_enforcer_error(self, mock_enforcer,
+                                    mock_get_token_user,
+                                    mock_reset_rules):
+        mock_enforcer.enforce.side_effect = policy.EnforcerError()
+        self.assertRaises(policy.EnforcerError, policy.enforce, 'action',
+                          'token', mock.MagicMock())
+
+    @mock.patch.object(policy, 'reset_rules')
+    @mock.patch.object(policy.tokens, 'get_token_user')
+    @mock.patch.object(policy, '_ENFORCER')
+    def test_enforce_success(self, mock_enforcer,
+                             mock_get_token_user,
+                             mock_reset_rules):
+        mock_enforcer.enforce.return_value = True
+        self.assertTrue(policy.enforce('action', 'token', mock.MagicMock()))
+
+    def test_authorize_authorization_disabled(self):
+        request = mock.MagicMock()
+        app_conf = mock.MagicMock()
+        app_conf.authentication.enabled = False
+        # No exception should be raised
+        policy.authorize('a', request, app_conf)
+
+    @mock.patch.object(policy, 'enforce')
+    def test_authorize_no_token(self, mock_enforce):
+        request = mock.MagicMock()
+        request.headers.get.return_value = None
+        app_conf = mock.MagicMock()
+        app_conf.authentication.enabled = True
+        # No exception should be raised
+        policy.authorize('a', request, app_conf)
+
+    @mock.patch.object(policy, 'enforce', side_effect=policy.EnforcerError())
+    @mock.patch.object(policy.err_utils, 'get_error', return_value=TestException)
+    def test_authorize_enforce_failed(self, mock_enforce, mock_get_error):
+        request = mock.MagicMock()
+        request.headers.get.return_value = None
+        app_conf = mock.MagicMock()
+        app_conf.authentication.enabled = True
+
+        self.assertRaises(TestException, policy.authorize, 'a', request,
+                          app_conf)
+
+    @mock.patch.object(policy, 'enforce', side_effect=ValueError())
+    @mock.patch.object(policy.err_utils, 'get_error', return_value=TestException)
+    def test_authorize_other_error(self, mock_enforce, mock_get_error):
+        request = mock.MagicMock()
+        request.headers.get.return_value = None
+        app_conf = mock.MagicMock()
+        app_conf.authentication.enabled = True
+
+        self.assertRaises(TestException, policy.authorize, 'a', request,
+                          app_conf)
+
+    @mock.patch.object(policy, 'enforce')
+    def test_authorize_success(self, mock_enforce):
+        request = mock.MagicMock()
+        request.headers.get.return_value = 'test'
+        app_conf = mock.MagicMock()
+        app_conf.authentication.enabled = True
+
+        # No exception should be raised
+        policy.authorize('a', request, app_conf)
diff --git a/orm/common/orm_common/tests/utils/__init__.py b/orm/common/orm_common/tests/utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/orm_common/tests/utils/test_api_error_utils.py b/orm/common/orm_common/tests/utils/test_api_error_utils.py
new file mode 100755
index 00000000..7b7568b1
--- /dev/null
+++ b/orm/common/orm_common/tests/utils/test_api_error_utils.py
@@ -0,0 +1,14 @@
+import json
+import mock
+from orm_common.utils import api_error_utils
+from unittest import TestCase
+
+
+class TestCrossApiUtil(TestCase):
+    @mock.patch.object(api_error_utils.utils, 'get_time_human', return_value=1.337)
+    def test_get_error_default_message(self, mock_time):
+        self.assertEqual(
+            json.loads(api_error_utils.get_error('test', 'a').message),
+            {"details": "a", "message": "Incompatible JSON body",
+             "created": "1.337", "code": 400, "type": "Bad Request",
+             "transaction_id": "test"})
diff --git a/orm/common/orm_common/tests/utils/test_cross_api_utils.py b/orm/common/orm_common/tests/utils/test_cross_api_utils.py
new file mode 100755
index 00000000..76037ea0
--- /dev/null
+++ b/orm/common/orm_common/tests/utils/test_cross_api_utils.py
@@ -0,0 +1,79 @@
+import mock
+from orm_common.utils import cross_api_utils
+from testfixtures import log_capture
+from unittest import TestCase
+import requests
+import pecan
+import logging
+import pprint
+import time
+
+
+class TestCrossApiUtil(TestCase):
+    @mock.patch('pecan.conf')
+    def setUp(self, mock_conf):
+        self.mock_response = mock.Mock()
+        cross_api_utils.conf = mock_conf
+
+    def respond(self, value, code):
+        self.mock_response.json.return_value = value
+        self.mock_response.status_code = code
+        return self.mock_response
+
+    def test_set_utils_conf(self):
+        cross_api_utils.set_utils_conf(None)
+        self.assertEqual(cross_api_utils.conf, None)
+
+    def test_check_conf_initialization(self):
+        cross_api_utils.set_utils_conf(None)
+        self.assertRaises(AssertionError, cross_api_utils._check_conf_initialization)
+
+    @mock.patch('orm_common.utils.cross_api_utils.get_rms_region_group')
+    def test_is_region_group_exist(self, mock_rms_region_group):
+        mock_rms_region_group.return_value = 'test_group'
+        exist = cross_api_utils.is_region_group_exist('test_group_name')
+        self.assertEqual(exist, True)
+
+    @mock.patch('orm_common.utils.cross_api_utils.get_rms_region_group')
+    def test_is_region_group_exist_false(self, mock_rms_region_group):
+        mock_rms_region_group.return_value = None
+        exist = cross_api_utils.is_region_group_exist('test_group_name')
+        self.assertEqual(exist, False)
+
+    @mock.patch('orm_common.utils.cross_api_utils.get_rms_region_group')
+    def test_get_regions_of_group(self, mock_rms_region_group):
+        mock_rms_region_group.return_value = {'regions': 'group'}
+        exist = cross_api_utils.get_regions_of_group('test_group_name')
+        self.assertEqual(exist, 'group')
+
+    @mock.patch('orm_common.utils.cross_api_utils.get_rms_region_group')
+    def test_get_regions_of_group_false(self, mock_rms_region_group):
+        mock_rms_region_group.return_value = None
+        exist = cross_api_utils.get_regions_of_group('test_group_name')
+        self.assertEqual(exist, None)
+
+    @mock.patch('requests.get')
+    def test_get_rms_region_group(self, mock_get):
+        mock_get.return_value = self.respond({'result': 'success'}, 200)
+        result = cross_api_utils.get_rms_region_group('test_group_name')
+        self.assertEqual(result, {'result': 'success'})
+
+    def test_get_rms_region_group_cache_used(self):
+        cross_api_utils.prev_timestamp = time.time()
+        cross_api_utils.prev_group_name = 'test_group'
+        cross_api_utils.prev_resp = 'test_response'
+        cross_api_utils.conf.api.rms_server.cache_seconds = 14760251830
+        self.assertEqual(cross_api_utils.prev_resp,
+                         cross_api_utils.get_rms_region_group(
+                             cross_api_utils.prev_group_name))
+
+    @mock.patch.object(cross_api_utils, 'logger')
+    @mock.patch.object(time, 'time', side_effect=ValueError('test'))
+    def test_get_rms_region_group_cache_used(self, mock_time, mock_logger):
+        self.assertRaises(ValueError, cross_api_utils.get_rms_region_group,
+                          'test')
+
+    # @mock.patch('requests.get')
+    # def test_get_rms_region_group_with_exception(self, mock_get):
+    #    mock_get.side_affect = Exception('boom')
+    #    self.assertRaises(Exception, cross_api_utils.get_rms_region_group, 'test_group_name')
diff --git a/orm/common/orm_common/tests/utils/test_utils.py b/orm/common/orm_common/tests/utils/test_utils.py
new file mode 100755
index 00000000..d9640ef7
--- /dev/null
+++ b/orm/common/orm_common/tests/utils/test_utils.py
@@ -0,0 +1,175 @@
+import mock
+from orm_common.utils import utils
+from testfixtures import log_capture
+from unittest import TestCase
+import requests
+import pecan
+import logging
+import pprint
+
+
+class TestUtil(TestCase):
+    @mock.patch('pecan.conf')
+    def setUp(self, mock_conf):
+        self.mock_response = mock.Mock()
+        utils.conf = mock_conf
+
+    def respond(self, value, code):
+        self.mock_response.json.return_value = value
+        self.mock_response.status_code = code
+        return self.mock_response
+
+    @mock.patch('requests.post')
+    def test_make_uuid(self, mock_post):
+        mock_post.return_value = self.respond({'uuid': '987654321'}, 200)
+        uuid = utils.make_uuid()
+        self.assertEqual(uuid, '987654321')
+
+    @mock.patch('requests.post')
+    @log_capture('orm_common.utils.utils', level=logging.INFO)
+    def test_make_uuid_offline(self, mock_post, l):
+        mock_post.side_effect = Exception('boom')
+        uuid = utils.make_uuid()
+        self.assertEqual(uuid, None)
+        l.check(('orm_common.utils.utils', 'INFO', 'Failed in make_uuid:boom'))
+
+    @mock.patch('requests.post')
+    def test_make_transid(self, mock_post):
+        mock_post.return_value = self.respond({'uuid': '987654321'}, 200)
+        uuid = utils.make_transid()
+        self.assertEqual(uuid, '987654321')
+
+    @mock.patch('requests.post')
+    @log_capture('orm_common.utils.utils', level=logging.INFO)
+    def test_make_transid_offline(self, mock_post, l):
+        mock_post.side_effect = Exception('boom')
+        uuid = utils.make_transid()
+        self.assertEqual(uuid, None)
+        l.check(
+            ('orm_common.utils.utils', 'INFO', 'Failed in make_transid:boom'))
+
+    @mock.patch('audit_client.api.audit.init')
+    @mock.patch('audit_client.api.audit.audit')
+    def test_audit_trail(self, mock_init, mock_audit):
+        resp = utils.audit_trail('create customer', '1234',
+                                 {'X-RANGER-Client': 'Fred'}, '5678')
+        self.assertEqual(resp, 200)
+
+    @mock.patch('audit_client.api.audit.audit')
+    def test_audit_trail_offline(self, mock_audit):
+        mock_audit.side_effect = Exception('boom')
+        resp = utils.audit_trail('create customer', '1234',
+                                 {'X-RANGER-Client': 'Fred'}, '5678')
+        self.assertEqual(resp, None)
+
+    @mock.patch('audit_client.api.audit.init')
+    @mock.patch('audit_client.api.audit.audit')
+    def test_audit_service_args_least(self, mock_audit, mock_init):
+        resp = utils.audit_trail('create customer', '1234',
+                                 {'X-RANGER-Client': 'Fred'}, '5678')
+        self.assertEqual(mock_audit.call_args[0][1], 'Fred')  # application_id
+        self.assertEqual(mock_audit.call_args[0][2], '1234')  # tracking_id
+        self.assertEqual(mock_audit.call_args[0][3], '1234')  # transaction_id
+        self.assertEqual(mock_audit.call_args[0][4],
+                         'create customer')  # transaction_type
+        self.assertEqual(mock_audit.call_args[0][5], '5678')  # resource_id
+        # self.assertEqual(mock_audit.call_args[0][6], 'cms')  # service
+        self.assertEqual(mock_audit.call_args[0][7], '')  # user_id
+        self.assertEqual(mock_audit.call_args[0][8], 'NA')  # external_id
+        self.assertEqual(mock_audit.call_args[0][9], 'CMS')  # event_details
+        # self.assertEqual(mock_audit.call_args[0][10], 'Saved to DB')  # status
+
+    @mock.patch('audit_client.api.audit.init')
+    @mock.patch('audit_client.api.audit.audit')
+    def test_audit_service_with_tracking(self, mock_audit, mock_init):
+        utils.audit_trail('create customer', '1234',
+                          {'X-RANGER-Client': 'Fred',
+                           'X-RANGER-Tracking-Id': 'Track12'}, '5678')
+        self.assertEqual(mock_audit.call_args[0][1], 'Fred')  # application_id
+        self.assertEqual(mock_audit.call_args[0][2], 'Track12')  # tracking_id
+        self.assertEqual(mock_audit.call_args[0][3], '1234')  # transaction_id
+        self.assertEqual(mock_audit.call_args[0][4],
+                         'create customer')  # transaction_type
+        self.assertEqual(mock_audit.call_args[0][5], '5678')  # resource_id
+        # self.assertEqual(mock_audit.call_args[0][6], 'cms')  # service
+        self.assertEqual(mock_audit.call_args[0][7], '')  # user_id
+        self.assertEqual(mock_audit.call_args[0][8], 'NA')  # external_id
+        self.assertEqual(mock_audit.call_args[0][9], 'CMS')  # event_details
+        # self.assertEqual(mock_audit.call_args[0][10], 'Saved to DB')  # status
+
+    @mock.patch('audit_client.api.audit.init')
+    @mock.patch('audit_client.api.audit.audit')
+    def test_audit_service_with_requester(self, mock_audit, mock_init):
+        resp = utils.audit_trail('create customer', '1234',
+                                 {'X-RANGER-Client': 'Fred',
+                                  'X-RANGER-Requester': 'Req04'}, '5678')
+        self.assertEqual(mock_audit.call_args[0][1], 'Fred')  # application_id
+        self.assertEqual(mock_audit.call_args[0][2], '1234')  # tracking_id
+        self.assertEqual(mock_audit.call_args[0][3], '1234')  # transaction_id
+        self.assertEqual(mock_audit.call_args[0][4], 'create customer')  # transaction_type
+        self.assertEqual(mock_audit.call_args[0][5], '5678')  # resource_id
+        # self.assertEqual(mock_audit.call_args[0][6], 'cms')  # service
+        self.assertEqual(mock_audit.call_args[0][7], 'Req04')  # user_id
+        self.assertEqual(mock_audit.call_args[0][8], 'NA')  # external_id
+        self.assertEqual(mock_audit.call_args[0][9], 'CMS')  # event_details
+        # self.assertEqual(mock_audit.call_args[0][10], 'Saved to DB')  # status
+
+    def test_set_utils_conf(self):
+        utils.set_utils_conf('test')
+        self.assertEqual(utils.conf, 'test')
+
+    def test_check_conf_initialization(self):
+        utils.set_utils_conf(None)
+        self.assertRaises(AssertionError, utils._check_conf_initialization)
+
+    @mock.patch('requests.post')
+    def test_create_existing_uuid(self, mock_post):
+        uuid = '987654321'
+        mock_post.return_value = self.respond({'uuid': uuid}, 200)
+        returned_uuid = utils.create_existing_uuid(uuid)
+        self.assertEqual(returned_uuid, uuid)
+
+    @mock.patch('requests.post')
+    def test_create_existing_uuid_with_exception(self, mock_post):
+        mock_post.side_effect = Exception('boom')
+        uuid = '987654321'
+        returned_uuid = utils.create_existing_uuid(uuid)
+        self.assertEqual(returned_uuid, None)
+
+    @mock.patch('requests.post')
+    def test_create_existing_uuid_with_400(self, mock_post):
+        uuid = '987654321'
+        mock_post.return_value = self.respond({'uuid': uuid}, 400)
+        self.assertRaises(TypeError, utils.create_existing_uuid, uuid)
+
+    @mock.patch('pecan.conf')
+    def test_report_config(self, mock_conf):
+        expected_value = pprint.pformat(mock_conf.to_dict(), indent=4)
+        returned_value = utils.report_config(mock_conf)
+        self.assertEqual(expected_value, returned_value)
+
+    @mock.patch('pecan.conf')
+    def test_report_config_with_log_write(self, mock_conf):
+        expected_value = pprint.pformat(mock_conf.to_dict(), indent=4)
+        returned_value = utils.report_config(mock_conf, True)
+        self.assertEqual(expected_value, returned_value)
+
+    @mock.patch('requests.get')
+    def test_get_resource_status_sanity(self, mock_get):
+        my_response = mock.MagicMock()
+        my_response.status_code = 200
+        my_response.json.return_value = 'test'
+        mock_get.return_value = my_response
+        result = utils.get_resource_status('A')
+        self.assertEqual(result, 'test')
+
+    @mock.patch('requests.get', side_effect=ValueError())
+    def test_get_resource_status_get_failed(self, mock_get):
+        self.assertIsNone(utils.get_resource_status('A'))
+
+    @mock.patch('requests.get')
+    def test_get_resource_status_invalid_response(self, mock_get):
+        my_response = mock.MagicMock()
+        my_response.status_code = 404
+        mock_get.return_value = my_response
+        self.assertIsNone(utils.get_resource_status('A'))
diff --git a/orm/common/orm_common/utils/__init__.py b/orm/common/orm_common/utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/common/orm_common/utils/api_error_utils.py b/orm/common/orm_common/utils/api_error_utils.py
new file mode 100755
index 00000000..e1fa3cf3
--- /dev/null
+++ b/orm/common/orm_common/utils/api_error_utils.py
@@ -0,0 +1,45 @@
+import json
+from orm_common.utils import utils
+from wsme.exc import ClientSideError
+
+
+# This method creates a ClientSideError with given parameters
+# and returns it to caller.
+def get_error(transaction_id,
+              error_details="",
+              message=None,
+              status_code=400):
+
+    err = get_error_dict(status_code, transaction_id, message, error_details)
+    return ClientSideError(json.dumps(err), status_code)
+
+
+def get_error_dict(status_code, transaction_id, message, error_details=""):
+
+    if not message:
+        message = error_message[status_code]['message']
+
+    # In case error like 409.1 we need to remove the dot part.
+    status_code = int(status_code)
+
+    return {
+        'code': status_code,
+        'type': error_message[status_code]['type'],
+        'created': '{}'.format(utils.get_time_human()),
+        'transaction_id': transaction_id,
+        'message': message,
+        'details': error_details
+    }
+
+# Default error messages
+error_message = {
+    400: {'message': 'Incompatible JSON body', 'type': 'Bad Request'},
+    401: {'message': 'Unable to authenticate', 'type': 'Unauthorized'},
+    403: {'message': 'Not allowed to perform this operation', 'type': 'Forbidden'},
+    404: {'message': 'The specific transaction was not found', 'type': 'Not Found'},
+    405: {'message': 'This method is not allowed', 'type': 'Method Not Allowed'},
+    409: {'message': 'Current resource is busy', 'type': 'Conflict'},
+    409.1: {'message': 'Customer UUID already exists', 'type': 'Conflict'},
+    409.2: {'message': 'Customer name already exists', 'type': 'Conflict'},
+    500: {'message': 'Server error occurred', 'type': 'Internal Server Error'}
+}
diff --git a/orm/common/orm_common/utils/cross_api_utils.py b/orm/common/orm_common/utils/cross_api_utils.py
new file mode 100755
index 00000000..51ddac36
--- /dev/null
+++ b/orm/common/orm_common/utils/cross_api_utils.py
@@ -0,0 +1,86 @@
+import requests
+import logging
+from pecan import conf
+from audit_client.api import audit
+import time
+
+# from orm_common.logger import get_logger
+
+# logger = get_logger(__name__)
+logger = logging.getLogger(__name__)
+
+conf = None
+
+
+def set_utils_conf(_conf):
+    global conf
+    conf = _conf
+
+
+def _check_conf_initialization():
+    if not conf:
+        raise AssertionError('Configurations wasnt initiated, please run set_utils_conf and pass pecan configuration')
+
+
+def is_region_group_exist(group_name):
+    """ function to check whether region group exists
+        returns 200 for ok and None for error
+    """
+    group = get_rms_region_group(group_name)
+    if group is None:
+        return False
+
+    return True
+
+
+def get_regions_of_group(group_name):
+    """ function to get regions associated with group
+        returns 200 for ok and None for error
+    """
+    group = get_rms_region_group(group_name)
+    if group is None:
+        return None
+    if "regions" not in group:
+        return None
+    return group["regions"]
+
+
+prev_group_name = None
+
+
+def get_rms_region_group(group_name):
+    """ function to call rms api for group info
+        returns 200 for ok and None for error
+    """
+    global prev_group_name, prev_timestamp, prev_resp
+
+    _check_conf_initialization()
+    try:
+        timestamp = time.time()
+        if group_name == prev_group_name and timestamp - prev_timestamp <= conf.api.rms_server.cache_seconds:
+            return prev_resp
+
+        headers = {
+            'content-type': 'application/json',
+        }
+        # GET https://{serverRoot}/v1/orm/groups/{groupId}/
+        rms_server_url = '%s%s/%s' % (conf.api.rms_server.base, conf.api.rms_server.groups, group_name)
+        logger.info("RMS Server URL:" + rms_server_url)
+        resp = requests.get(rms_server_url, headers=headers, verify=conf.verify)
+        resp = resp.json()
+        logger.info("Response from RMS Server" + str(resp))
+        prev_resp = resp
+        prev_group_name = group_name
+        prev_timestamp = timestamp
+        return resp
+    except requests.exceptions.ConnectionError as exp:
+        nagois = 'CON{}RMS001'.format(conf.server.name.upper())
+        logger.error(
+            'CRITICAL|{}| Failed in getting data from rms: connection error'.format(
+                nagois) + str(exp))
+        exp.message = 'connection error: Failed to get get data from rms: unable to connect to server'
+        raise
+    except Exception as e:
+        logger.exception(" Exception: " + str(e))
+        # logger.log_exception('Failed in get_rms_region_group', e)
+        raise
diff --git a/orm/common/orm_common/utils/dictator.py b/orm/common/orm_common/utils/dictator.py
new file mode 100755
index 00000000..7e83fec2
--- /dev/null
+++ b/orm/common/orm_common/utils/dictator.py
@@ -0,0 +1,23 @@
+"""ORM Dictator module."""
+
+DICTATOR = {}
+
+
+def set(key, value):
+    """Set a key in the Dictator."""
+    global DICTATOR
+    DICTATOR[key] = value
+
+
+def soft_set(key, value):
+    """Set a key in the Dictator only if it doesn't exist."""
+    global DICTATOR
+    DICTATOR.setdefault(key, value)
+
+
+def get(key, default=None):
+    """Get a key from the Dictator.
+
+    :return: The value if it exists, default otherwise.
+    """
+    return DICTATOR[key] if key in DICTATOR else default
diff --git a/orm/common/orm_common/utils/sanitize.py b/orm/common/orm_common/utils/sanitize.py
new file mode 100644
index 00000000..e4f41e82
--- /dev/null
+++ b/orm/common/orm_common/utils/sanitize.py
@@ -0,0 +1,7 @@
+import re
+
+
+def sanitize_symbol_name(value, symbol_meaning=None):
+    name_re = re.compile('[A-Za-z0-9_]+$')
+    symbol_meaning = symbol_meaning if symbol_meaning else "name"
+    return value if name_re.match(value) else "unauthorized " + symbol_meaning
diff --git a/orm/common/orm_common/utils/utils.py b/orm/common/orm_common/utils/utils.py
new file mode 100755
index 00000000..0fb95fac
--- /dev/null
+++ b/orm/common/orm_common/utils/utils.py
@@ -0,0 +1,225 @@
+import requests
+import logging
+from pecan import conf
+from audit_client.api import audit
+import time
+import pprint
+
+# from cms_rest.logger import get_logger
+#
+
+conf = None
+logger = logging.getLogger(__name__)
+
+
+class ResponseError(Exception):
+    pass
+
+
+class ConnectionError(Exception):
+    pass
+
+
+def set_utils_conf(_conf):
+    global conf
+    conf = _conf
+
+
+def _check_conf_initialization():
+    if not conf:
+        raise AssertionError(
+            'Configurations wasnt initiated, please run set_utils_conf and '
+            'pass pecan coniguration')
+
+
+def make_uuid():
+    """ function to request new uuid from uuid_generator rest service
+        returns uuid string
+    """
+    _check_conf_initialization()
+    url = conf.api.uuid_server.base + conf.api.uuid_server.uuids
+
+    try:
+        logger.debug('Requesting new UUID from URL: {}'.format(url))
+        resp = requests.post(url, verify=conf.verify)
+    except requests.exceptions.ConnectionError as exp:
+        nagios = 'CON{}UUIDGEN001'.format(conf.server.name.upper())
+        logger.critical('CRITICAL|{}|Failed in make_uuid: connection error: {}'.format(nagios, str(exp)))
+        exp.message = 'connection error: Failed to get uuid: unable to connect to server'
+        raise
+    except Exception as e:
+        logger.info('Failed in make_uuid:' + str(e))
+        return None
+
+    resp = resp.json()
+    return resp['uuid']
+
+
+def create_existing_uuid(uuid):
+    """ function to request new uuid from uuid_generator rest service
+        returns uuid string
+    :param uuid:
+    :return:
+    """
+    _check_conf_initialization()
+    url = conf.api.uuid_server.base + conf.api.uuid_server.uuids
+
+    try:
+        logger.debug('Creating UUID: {}, using URL: {}'.format(uuid, url))
+        resp = requests.post(url, data={'uuid': uuid}, verify=conf.verify)
+    except requests.exceptions.ConnectionError as exp:
+        nagios = 'CON{}UUIDGEN001'.format(conf.server.name.upper())
+        logger.critical('CRITICAL|{}|Failed in create_existing_uuid: connection error: {}'.format(nagios, str(exp)))
+        exp.message = 'connection error: Failed to get uuid: unable to connect to server'
+        raise
+    except Exception as e:
+        logger.info('Failed in make_uuid:' + str(e))
+        return None
+
+    if resp.status_code == 400:
+        raise TypeError('duplicate key for uuid')
+    resp = resp.json()
+    return resp['uuid']
+
+
+def make_transid():
+    """ function to request new uuid of transaction type from uuid_generator
+    rest service
+        returns uuid string
+    """
+    _check_conf_initialization()
+    url = conf.api.uuid_server.base + conf.api.uuid_server.uuids
+
+    try:
+        logger.debug('Requesting transaction ID from: {}'.format(url))
+        resp = requests.post(url, data={'uuid_type': 'transaction'}, verify=conf.verify)
+    except requests.exceptions.ConnectionError as exp:
+        nagios = 'CON{}UUIDGEN001'.format(conf.server.name.upper())
+        logger.critical('CRITICAL|{}|Failed in make_transid: connection error: {}'.format(nagios, str(exp)))
+        exp.message = 'connection error: Failed to get uuid: unable to connect to server'
+        raise
+    except Exception as e:
+        logger.info('Failed in make_transid:' + str(e))
+        return None
+
+    resp = resp.json()
+    if 'uuid' in resp:
+        return resp['uuid']
+    else:
+        return None
+
+audit_setup = False
+
+
+def _get_event_details(cmd):
+    event = 'unknown'
+    if 'customer' in cmd:
+        event = 'CMS'
+    elif 'image' in cmd:
+        event = 'IMS'
+    elif 'flavor' in cmd:
+        event = 'FMS'
+    return event
+
+
+def audit_trail(cmd, transaction_id, headers, resource_id, message=None,
+                event_details=''):
+    """ function to send item to audit trail rest api
+        returns 200 for ok and None for error
+    :param cmd:
+    :param transaction_id:
+    :param headers:
+    :param resource_id:
+    :param message:
+    :return:
+    """
+    _check_conf_initialization()
+    global audit_setup, audit_server_url
+    if not audit_setup:
+        audit_server_url = '%s%s' % (
+            conf.api.audit_server.base, conf.api.audit_server.trans)
+        num_of_send_retries = 3
+        time_wait_between_retries = 1
+        logger.debug('Initializing Audit, using URL: {}'.format(
+            audit_server_url))
+        audit.init(audit_server_url, num_of_send_retries,
+                   time_wait_between_retries, conf.server.name.upper())
+        audit_setup = True
+
+    try:
+        timestamp = long(round(time.time() * 1000))
+        application_id = headers[
+            'X-RANGER-Client'] if 'X-RANGER-Client' in headers else \
+            'NA'
+        tracking_id = headers[
+            'X-RANGER-Tracking-Id'] if 'X-RANGER-Tracking-Id' in headers \
+            else transaction_id
+        # transaction_id is function argument
+        transaction_type = cmd
+        # resource_id is function argument
+        service_name = conf.server.name.upper()
+        user_id = headers[
+            'X-RANGER-Requester'] if 'X-RANGER-Requester' in headers else \
+            ''
+        external_id = 'NA'
+        logger.debug('Sending to audit: timestamp: {}, application_id: {}, '
+                     ' tracking_id: {},'
+                     ' transaction_type: {}'.format(timestamp, application_id,
+                                                    tracking_id,
+                                                    transaction_type))
+        audit.audit(timestamp, application_id, tracking_id, transaction_id,
+                    transaction_type, resource_id, service_name, user_id,
+                    external_id, event_details)
+    except Exception as e:
+        logger.exception('Failed in audit service. ' + str(e))
+        return None
+
+    return 200
+
+
+def report_config(conf, dump_to_log=False, my_logger=None):
+    """ return the configuration (which is set by config.py) as a string
+    :param conf:
+    :param dump_to_log:
+    :param my_logger:
+    :return:
+    """
+
+    ret = pprint.pformat(conf.to_dict(), indent=4)
+    effective_logger = my_logger if my_logger else logger
+    if dump_to_log:
+        effective_logger.info('Current Configuration:\n' + ret)
+
+    return ret
+
+
+def get_resource_status(resource_id):
+    """ Get a resource status from RDS.
+    :param resource_id:
+    :return:
+    """
+
+    url = "{}{}{}".format(conf.api.rds_server.base,
+                          conf.api.rds_server.status, resource_id)
+    logger.debug('Getting status from: {}'.format(url))
+    try:
+        result = requests.get(url, verify=conf.verify)
+    except Exception as exception:
+        logger.debug('Failed to get status: {}'.format(str(exception)))
+        return None
+
+    if result.status_code != 200:
+        logger.debug('Got invalid response from RDS: code {}'.format(
+            result.status_code))
+        return None
+    else:
+        logger.debug('Got response from RDS: {}'.format(result.json()))
+        return result.json()
+
+
+def get_time_human():
+    """
+    this function return the timestamp for output JSON
+    :return: timestamp in wanted format
+    """
+    return time.strftime("%a, %b %d %Y, %X (%Z)", time.gmtime())
diff --git a/orm/common/tox.ini b/orm/common/tox.ini
new file mode 100755
index 00000000..069b0d37
--- /dev/null
+++ b/orm/common/tox.ini
@@ -0,0 +1,18 @@
+[tox]
+envlist=py27,cover
+
+[testenv]
+setenv= CMS_ENV=mock
+        PYTHONPATH={toxinidir}:{toxinidir}/orm_common/extenal_mock/
+deps= -r{toxinidir}/requirements.txt
+      -r{toxinidir}/test-requirements.txt
+
+[testenv:pep8]
+commands =
+    py.test --pep8 -m pep8
+
+[testenv:cover]
+commands=
+    coverage run setup.py test
+    coverage report --omit=orm_common/policy/_parser.py,orm_common/policy/qolicy.py
+    coverage html
diff --git a/orm/orm_client/__init__.py b/orm/orm_client/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/__init__.py b/orm/services/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/audit_trail_manager/__init__.py b/orm/services/audit_trail_manager/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/MANIFEST.in b/orm/services/customer_manager/MANIFEST.in
new file mode 100755
index 00000000..c922f11a
--- /dev/null
+++ b/orm/services/customer_manager/MANIFEST.in
@@ -0,0 +1 @@
+recursive-include public *
diff --git a/orm/services/customer_manager/__init__.py b/orm/services/customer_manager/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest.conf b/orm/services/customer_manager/cms_rest.conf
new file mode 100644
index 00000000..56a429d9
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest.conf
@@ -0,0 +1,26 @@
+Listen 7080
+ 
+<VirtualHost *:7080>
+ 
+    WSGIDaemonProcess cms_rest user=orm group=orm threads=5
+    WSGIScriptAlias / /opt/app/orm/cms_rest/cms_rest.wsgi
+ 
+ 	<Location /v1/orm/logs>
+		Order deny,allow
+		Deny from all
+		Allow from localhost
+	</Location>
+
+	<Location /v1/orm/configuration>
+		Order deny,allow
+		Deny from all
+		Allow from localhost
+	</Location>
+	
+    <Directory /opt/app/orm/cms_rest/>
+        WSGIProcessGroup cms_rest
+        WSGIApplicationGroup %{GLOBAL}
+                Require all granted
+        Allow from all
+    </Directory>
+</VirtualHost>
diff --git a/orm/services/customer_manager/cms_rest.wsgi b/orm/services/customer_manager/cms_rest.wsgi
new file mode 100644
index 00000000..ed375b2e
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest.wsgi
@@ -0,0 +1,2 @@
+from pecan.deploy import deploy
+application = deploy('/opt/app/orm/cms_rest/config.py')
diff --git a/orm/services/customer_manager/cms_rest/__init__.py b/orm/services/customer_manager/cms_rest/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/app.py b/orm/services/customer_manager/cms_rest/app.py
new file mode 100755
index 00000000..57944115
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/app.py
@@ -0,0 +1,36 @@
+from pecan import make_app
+from cms_rest import model
+from orm_common.utils import utils
+from cms_rest.logger import get_logger
+from pecan.commands import CommandRunner
+from orm_common.policy import policy
+from cms_rest.utils import authentication
+import os
+
+logger = get_logger(__name__)
+
+
+def setup_app(config):
+    model.init_model()
+    token_conf = authentication._get_token_conf(config)
+    policy.init(config.authentication.policy_file, token_conf)
+    app_conf = dict(config.app)
+
+    # setting configurations for utils to be used from now and on
+    utils.set_utils_conf(config)
+
+    app = make_app(
+        app_conf.pop('root'),
+        logging=getattr(config, 'logging', {}),
+        **app_conf
+    )
+    logger.info('Starting CMS...')
+    return app
+
+
+def main():
+    dir_name = os.path.dirname(__file__)
+    drive, path_and_file = os.path.splitdrive(dir_name)
+    path, filename = os.path.split(path_and_file)
+    runner = CommandRunner()
+    runner.run(['serve', path+'/config.py'])
diff --git a/orm/services/customer_manager/cms_rest/controllers/__init__.py b/orm/services/customer_manager/cms_rest/controllers/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/controllers/root.py b/orm/services/customer_manager/cms_rest/controllers/root.py
new file mode 100755
index 00000000..ff4ba865
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/controllers/root.py
@@ -0,0 +1,34 @@
+from pecan import expose, request, response
+from webob.exc import status_map
+from pecan.secure import SecureController
+from cms_rest.controllers.v1 import root as v1
+from cms_rest.utils import authentication
+from pecan import conf
+
+
+class RootController(object):
+    # url/v1/
+    v1 = v1.V1Controller()
+
+    @expose(template='json')
+    def _default(self):
+        """
+            Method to handle GET /
+            parameters: None
+            return: dict describing cms rest version information
+        """
+        return {
+            "versions": {
+                "values": [
+                    {
+                        "status": "stable",
+                        "id": "v1",
+                        "links": [
+                            {
+                                "href": "http://localhost:7080/"
+                            }
+                        ]
+                    }
+                ]
+            }
+        }
diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/__init__.py b/orm/services/customer_manager/cms_rest/controllers/v1/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/base.py b/orm/services/customer_manager/cms_rest/controllers/v1/base.py
new file mode 100644
index 00000000..8fb3c48b
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/controllers/v1/base.py
@@ -0,0 +1,48 @@
+import wsme
+from pecan import response
+from wsme import types as wtypes
+import inspect
+
+
+class ClientSideError(wsme.exc.ClientSideError):
+    def __init__(self, error, status_code=400):
+        response.translatable_error = error
+        super(ClientSideError, self).__init__(error, status_code)
+
+
+class InputValueError(ClientSideError):
+    def __init__(self, name, value, status_code=400):
+        super(InputValueError, self).__init__("Invalid value for input {} : {}".format(name, value), status_code)
+
+
+class EntityNotFoundError(ClientSideError):
+    def __init__(self, id):
+        super(EntityNotFoundError, self).__init__("Entity not found for {}".format(id), status_code=404)
+
+
+class Base(wtypes.DynamicBase):
+    pass
+
+    '''
+    @classmethod
+    def from_model(cls, m):
+        return cls(**(m.as_dict()))
+
+    def as_dict(self, model):
+        valid_keys = inspect.getargspec(model.__init__)[0]
+        if 'self' in valid_keys:
+            valid_keys.remove('self')
+        return self.as_dict_from_keys(valid_keys)
+
+
+    def as_dict_from_keys(self, keys):
+        return dict((k, getattr(self, k))
+                    for k in keys
+                    if hasattr(self, k) and
+                    getattr(self, k) != wsme.Unset)
+
+    @classmethod
+    def from_db_and_links(cls, m, links):
+        return cls(links=links, **(m.as_dict()))
+
+    '''
diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/__init__.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/configuration.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/configuration.py
new file mode 100755
index 00000000..e30d4bee
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/controllers/v1/orm/configuration.py
@@ -0,0 +1,29 @@
+"""Configuration rest API input module."""
+
+import logging
+from orm_common.utils import utils
+from pecan import conf
+from pecan import rest
+from wsmeext.pecan import wsexpose
+
+
+logger = logging.getLogger(__name__)
+
+
+class ConfigurationController(rest.RestController):
+    """Configuration controller."""
+
+    @wsexpose(str, str, status_code=200)
+    def get(self, dump_to_log='false'):
+        """get method.
+
+        :param dump_to_log: A boolean string that says whether the
+        configuration should be written to log
+        :return: A pretty string that contains the service's configuration
+        """
+        logger.info("Get configuration...")
+
+        dump = dump_to_log.lower() == 'true'
+        utils.set_utils_conf(conf)
+        result = utils.report_config(conf, dump, logger)
+        return result
diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/__init__.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/enabled.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/enabled.py
new file mode 100755
index 00000000..0b3d0021
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/enabled.py
@@ -0,0 +1,55 @@
+from pecan import rest, request
+from wsmeext.pecan import wsexpose
+
+from orm_common.utils import utils
+from orm_common.utils import api_error_utils as err_utils
+from cms_rest.model.Models import Enabled, CustomerResultWrapper
+from cms_rest.logic.customer_logic import CustomerLogic
+from cms_rest.logic.error_base import ErrorStatus
+from cms_rest.utils import authentication
+
+from cms_rest.logger import get_logger
+LOG = get_logger(__name__)
+
+
+class EnabledController(rest.RestController):
+    @wsexpose(CustomerResultWrapper, str, body=Enabled, rest_content_types='json')
+    def put(self, customer_uuid, enable):
+        authentication.authorize(request, 'customers:enable')
+        try:
+            LOG.info("EnabledController - (put) customer id {0} enable: {1}".format(customer_uuid, enable))
+            customer_logic = CustomerLogic()
+            result = customer_logic.enable(customer_uuid, enable, request.transaction_id)
+            LOG.info("EnabledController - change enable (put) finished well: " + str(result))
+
+            event_details = 'Customer {} {}'.format(customer_uuid,
+                                                    'enabled' if enable.enabled else 'disabled')
+            utils.audit_trail('Change enable', request.transaction_id,
+                              request.headers, customer_uuid,
+                              event_details=event_details)
+
+        except ErrorStatus as exception:
+            LOG.log_exception("EnabledController - Failed to Change enable", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("EnabledController - change enable (put) - Failed to Change enable", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+        return result
+
+    @wsexpose(None, str, rest_content_types='json')
+    def post(self, customer_id):
+            raise err_utils.get_error(request.transaction_id, status_code=405)
+
+    @wsexpose(None, str, rest_content_types='json')
+    def get(self, customer_id):
+            raise err_utils.get_error(request.transaction_id, status_code=405)
+
+    @wsexpose(None, str, rest_content_types='json')
+    def delete(self, customer_id):
+            raise err_utils.get_error(request.transaction_id, status_code=405)
diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/metadata.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/metadata.py
new file mode 100755
index 00000000..2c4aae20
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/metadata.py
@@ -0,0 +1,75 @@
+from pecan import rest, request
+from wsmeext.pecan import wsexpose
+from cms_rest.model.Models import CustomerResultWrapper
+from orm_common.utils import utils
+from orm_common.utils import api_error_utils as err_utils
+
+from cms_rest.logic.error_base import ErrorStatus
+from cms_rest.model.Models import MetadataWrapper
+import cms_rest.logic.metadata_logic as logic
+from cms_rest.utils import authentication
+
+from cms_rest.logger import get_logger
+LOG = get_logger(__name__)
+
+
+class MetadataController(rest.RestController):
+    @wsexpose(CustomerResultWrapper, str, body=MetadataWrapper, rest_content_types='json')
+    def post(self, customer_uuid, metadata):
+        authentication.authorize(request, 'customers:add_metadata')
+        try:
+            res = logic.add_customer_metadata(customer_uuid, metadata, request.transaction_id)
+
+            event_details = 'Customer {} metadata added'.format(customer_uuid)
+            utils.audit_trail('add customer metadata', request.transaction_id,
+                              request.headers, customer_uuid,
+                              event_details=event_details)
+            return res
+        except AttributeError as ex:
+            raise err_utils.get_error(request.transaction_id,
+                                      message=ex.message, status_code=409)
+        except ValueError as ex:
+            raise err_utils.get_error(request.transaction_id,
+                                      message=ex.message, status_code=404)
+        except ErrorStatus as ex:
+            LOG.log_exception("MetaDataController - Failed to add metadata", ex)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=ex.status_code)
+        except LookupError as ex:
+            LOG.log_exception("MetaDataController - {0}".format(ex.message), ex)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=ex.message, status_code=400)
+        except Exception as ex:
+            LOG.log_exception("MetaDataController - Failed to add metadata", ex)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500, error_details=str(ex))
+
+    @wsexpose(CustomerResultWrapper, str, body=MetadataWrapper, rest_content_types='json')
+    def put(self, customer_uuid, metadata):
+        authentication.authorize(request, 'customers:update_metadata')
+        try:
+            res = logic.update_customer_metadata(customer_uuid, metadata, request.transaction_id)
+
+            event_details = 'Customer {} metadata updated'.format(customer_uuid)
+            utils.audit_trail('update customer metadata',
+                              request.transaction_id, request.headers,
+                              customer_uuid, event_details=event_details)
+            return res
+        except AttributeError as ex:
+            raise err_utils.get_error(request.transaction_id,
+                                      message=ex.message, status_code=400)
+        except ValueError as ex:
+            raise err_utils.get_error(request.transaction_id,
+                                      message=ex.message, status_code=404)
+        except ErrorStatus as ex:
+            LOG.log_exception("MetaDataController - Failed to add metadata", ex)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=ex.status_code)
+        except LookupError as ex:
+            LOG.log_exception("MetaDataController - {0}".format(ex.message), ex)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=ex.message, status_code=400)
+        except Exception as ex:
+            LOG.log_exception("MetaDataController - Failed to add metadata", ex)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500, error_details=str(ex))
diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/regions.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/regions.py
new file mode 100755
index 00000000..c830a552
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/regions.py
@@ -0,0 +1,133 @@
+from oslo_db.exception import DBDuplicateEntry
+from pecan import rest, request
+from wsmeext.pecan import wsexpose
+
+from orm_common.utils import utils
+from orm_common.utils import api_error_utils as err_utils
+
+from cms_rest.controllers.v1.orm.customer.users import UserController
+from cms_rest.model.Models import Region, RegionResultWrapper
+from cms_rest.logic.customer_logic import CustomerLogic
+from cms_rest.logic.error_base import ErrorStatus, DuplicateEntryError
+from cms_rest.utils import authentication
+
+from cms_rest.logger import get_logger
+LOG = get_logger(__name__)
+
+
+class RegionController(rest.RestController):
+
+    users = UserController()
+
+    @wsexpose([str], str, str, rest_content_types='json')
+    def get(self, customer_id, region_id):
+        return ["This is the regions controller ", "customer id: " + customer_id]
+
+    @wsexpose(RegionResultWrapper, str, body=[Region], rest_content_types='json', status_code=200)
+    def post(self, customer_id, regions):
+        LOG.info("RegionController - Add Regions (post) customer id {0} regions: {1}".format(customer_id, str(regions)))
+        authentication.authorize(request, 'customers:add_region')
+        try:
+            customer_logic = CustomerLogic()
+            result = customer_logic.add_regions(customer_id, regions, request.transaction_id)
+            LOG.info("RegionController - Add Regions (post) finished well: " + str(result))
+
+            event_details = 'Customer {} regions: {} added'.format(
+                customer_id, [r.name for r in regions])
+            utils.audit_trail('add regions', request.transaction_id,
+                              request.headers, customer_id,
+                              event_details=event_details)
+
+        except DBDuplicateEntry as exception:
+            LOG.log_exception("RegionController - Add Regions (post) - region already exists", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=409,
+                                      message='Region already exists',
+                                      error_details=exception.message)
+
+        except ErrorStatus as exception:
+            LOG.log_exception("CustomerController - Failed to update regions", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("RegionController - Add Regions (post) - Failed to update regions", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+        return result
+
+    @wsexpose(RegionResultWrapper, str, body=[Region], rest_content_types='json', status_code=200)
+    def put(self, customer_id, regions):
+        LOG.info("RegionController - Replace Regions (put) customer id {0} regions: {1}".format(customer_id, str(regions)))
+        authentication.authorize(request, 'customers:update_region')
+        self.validate_put_url()
+        try:
+            customer_logic = CustomerLogic()
+            result = customer_logic.replace_regions(customer_id, regions, request.transaction_id)
+            LOG.info("RegionController - Replace Regions (put) finished well: " + str(result))
+
+            event_details = 'Customer {} regions: {} updated'.format(
+                customer_id, [r.name for r in regions])
+            utils.audit_trail('Replace regions', request.transaction_id,
+                              request.headers, customer_id,
+                              event_details=event_details)
+
+        except ErrorStatus as exception:
+            LOG.log_exception("CustomerController - Failed to Replace regions", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("RegionController - Replace Regions (put) - Failed to replace regions", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+        return result
+
+    @wsexpose(None, str, str, status_code=204)
+    def delete(self, customer_id, region_id):
+        LOG.info("RegionController - Delete Region (delete) customer id {0} region_id: {1}".format(customer_id, region_id))
+        authentication.authorize(request, 'customers:delete_region')
+        try:
+            customer_logic = CustomerLogic()
+            customer_logic.delete_region(customer_id, region_id, request.transaction_id)
+            LOG.info("RegionController - Delete Region (delete) finished well")
+
+            event_details = 'Customer {} region: {} deleted'.format(
+                customer_id, region_id)
+            utils.audit_trail('delete region', request.transaction_id,
+                              request.headers, customer_id,
+                              event_details=event_details)
+
+        except ValueError as exception:
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=404)
+        except ErrorStatus as exception:
+            LOG.log_exception("CustomerController - Failed to delete region", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("RegionController - Failed in delete Region", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @staticmethod
+    def validate_put_url():
+        url_elements = request.path.split('/')
+        last_index = -2 if url_elements[-1] == '' else -1
+        # If there's an element after 'regions', it is a region ID
+        # which is currently unsupported
+        if url_elements[last_index - 1] == 'regions':
+            LOG.debug('Method not allowed for a specific region in Request: {}'.format(request.path))
+            raise err_utils.get_error(request.transaction_id,
+                                      message='Method not allowed for a specific region',
+                                      status_code=405)
diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/root.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/root.py
new file mode 100755
index 00000000..804c93e1
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/root.py
@@ -0,0 +1,184 @@
+from pecan import rest, request, response
+import oslo_db
+from wsmeext.pecan import wsexpose
+
+from cms_rest.model.Models import Customer, CustomerResultWrapper, CustomerSummaryResponse
+from cms_rest.controllers.v1.orm.customer.users import DefaultUserController
+from cms_rest.controllers.v1.orm.customer.regions import RegionController
+from cms_rest.controllers.v1.orm.customer.metadata import MetadataController
+from cms_rest.controllers.v1.orm.customer.enabled import EnabledController
+from cms_rest.logic.customer_logic import CustomerLogic
+
+from cms_rest.logic.error_base import ErrorStatus
+from orm_common.utils import utils
+from orm_common.utils import api_error_utils as err_utils
+from cms_rest.utils import authentication
+
+from cms_rest.logger import get_logger
+
+LOG = get_logger(__name__)
+
+
+class CustomerController(rest.RestController):
+    regions = RegionController()
+    users = DefaultUserController()
+    metadata = MetadataController()
+    enabled = EnabledController()
+
+    @wsexpose(Customer, str, rest_content_types='json')
+    def get(self, customer_uuid):
+        LOG.info("CustomerController - GetCustomerDetails: uuid is " + customer_uuid)
+        authentication.authorize(request, 'customers:get_one')
+        try:
+            customer_logic = CustomerLogic()
+            result = customer_logic.get_customer(customer_uuid)
+            LOG.info("CustomerController - GetCustomerDetails finished well: " + str(result))
+
+        except ErrorStatus as exception:
+            LOG.log_exception("CustomerController - Failed to GetCustomerDetails", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("CustomerController - Failed to GetCustomerDetails", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+        return result
+
+    @wsexpose(CustomerResultWrapper, body=Customer, rest_content_types='json', status_code=201)
+    def post(self, customer):
+        LOG.info("CustomerController - CreateCustomer: " + str(customer))
+        authentication.authorize(request, 'customers:create')
+        try:
+            uuid = None
+            if not customer.custId:
+                uuid = utils.make_uuid()
+            else:
+                if not CustomerController.validate_cust_id(customer.custId):
+                    utils.audit_trail('create customer', request.transaction_id, request.headers, customer.custId)
+                    raise ErrorStatus('400', None)
+                try:
+                    uuid = utils.create_existing_uuid(customer.custId)
+                except TypeError:
+                    raise ErrorStatus(409.1, 'Customer ID {0} already exists'.format(customer.custId))
+
+            customer_logic = CustomerLogic()
+            try:
+                result = customer_logic.create_customer(customer, uuid, request.transaction_id)
+            except oslo_db.exception.DBDuplicateEntry as exception:
+                raise ErrorStatus(409.2, 'Customer field {0} already exists'.format(exception.columns))
+
+            LOG.info("CustomerController - Customer Created: " + str(result))
+            event_details = 'Customer {} {} created in regions: {}, with users: {}'.format(
+                uuid, customer.name, [r.name for r in customer.regions],
+                [u.id for u in customer.users])
+            utils.audit_trail('create customer', request.transaction_id,
+                              request.headers, uuid,
+                              event_details=event_details)
+            return result
+
+        except ErrorStatus as exception:
+            LOG.log_exception("CustomerController - Failed to CreateCustomer", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("CustomerController - Failed to CreateCustomer", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+    @wsexpose(CustomerResultWrapper, str, body=Customer, rest_content_types='json', status_code=200)
+    def put(self, customer_id, customer):
+        LOG.info("CustomerController - UpdateCustomer: " + str(customer))
+        authentication.authorize(request, 'customers:update')
+        try:
+            customer_logic = CustomerLogic()
+            result = customer_logic.update_customer(customer, customer_id, request.transaction_id)
+            response.status = 200
+            LOG.info("CustomerController - UpdateCustomer finished well: " + str(customer))
+
+            event_details = 'Customer {} {} updated in regions: {}, with users: {}'.format(
+                customer_id, customer.name, [r.name for r in customer.regions],
+                [u.id for u in customer.users])
+            utils.audit_trail('update customer', request.transaction_id,
+                              request.headers, customer_id,
+                              event_details=event_details)
+
+        except ErrorStatus as exception:
+            LOG.log_exception("Failed in UpdateCustomer", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("CustomerController - Failed to UpdateCustomer", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+        return result
+
+    @wsexpose(CustomerSummaryResponse, str, str, str, str, [str],
+              rest_content_types='json')
+    def get_all(self, region=None, user=None, starts_with=None,
+                contains=None, metadata=None):
+        LOG.info("CustomerController - GetCustomerlist")
+        authentication.authorize(request, 'customers:get_all')
+        try:
+            customer_logic = CustomerLogic()
+            result = customer_logic.get_customer_list_by_criteria(region, user,
+                                                                  starts_with,
+                                                                  contains,
+                                                                  metadata)
+
+            return result
+        except ErrorStatus as exception:
+            LOG.log_exception("CustomerController - Failed to GetCustomerlist", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("CustomerController - Failed to GetCustomerlist", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+    @wsexpose(None, str, rest_content_types='json', status_code=204)
+    def delete(self, customer_id):
+        authentication.authorize(request, 'customers:delete')
+        customer_logic = CustomerLogic()
+
+        try:
+            LOG.info("CustomerController - DeleteCustomer: uuid is " + customer_id)
+            customer_logic.delete_customer_by_uuid(customer_id)
+            LOG.info("CustomerController - DeleteCustomer finished well")
+
+            event_details = 'Customer {} deleted'.format(customer_id)
+            utils.audit_trail('delete customer', request.transaction_id,
+                              request.headers, customer_id,
+                              event_details=event_details)
+
+        except ErrorStatus as exception:
+            LOG.log_exception("CustomerController - Failed to DeleteCustomer",
+                              exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("CustomerController - Failed to DeleteCustomer",
+                              exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+    @staticmethod
+    def validate_cust_id(cust_id):
+        # regex = re.compile('[a-zA-Z]')
+        # return regex.match(cust_id[0])
+        return True
diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/users.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/users.py
new file mode 100755
index 00000000..ab0876e1
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/users.py
@@ -0,0 +1,246 @@
+from pecan import rest, request
+from wsmeext.pecan import wsexpose
+
+from orm_common.utils import utils
+from orm_common.utils import api_error_utils as err_utils
+
+from cms_rest.model.Models import User, UserResultWrapper
+from cms_rest.logic.customer_logic import CustomerLogic
+from cms_rest.logic.error_base import ErrorStatus, NotFound
+from cms_rest.utils import authentication
+
+from cms_rest.logger import get_logger
+LOG = get_logger(__name__)
+
+
+class DefaultUserController(rest.RestController):
+
+    @wsexpose([str], str, rest_content_types='json')
+    def get(self, customer_id):
+        return ["This is the users controller ",
+                "customer id: " + customer_id,
+                "user " + "default user"]
+
+    @wsexpose(UserResultWrapper, str, body=[User], rest_content_types='json', status_code=200)
+    def put(self, customer_id, users):  # replace default users to customer
+        LOG.info("DefaultUserController - Replace DefaultUsers (put) customer id {0} users: {1}".format(customer_id, str(users)))
+        authentication.authorize(request, 'customers:update_default_user')
+        try:
+            customer_logic = CustomerLogic()
+            result = customer_logic.replace_default_users(customer_id, users, request.transaction_id)
+            LOG.info("DefaultUserController - Replace DefaultUsers (put) Finished well customer id {0} users: {1}".format(customer_id, str(users)))
+
+        except ErrorStatus as exception:
+            LOG.log_exception("DefaultUserController - Failed to replace default users", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except LookupError as exception:
+            LOG.log_exception("DefaultUserController - {0}".format(exception.message), exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=404)
+
+        except Exception as exception:
+            result = UserResultWrapper(transaction_id="Users Not Added", users=[])
+            LOG.log_exception("DefaultUserController - Failed to replace default users", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+        return result
+
+    @wsexpose(UserResultWrapper, str, body=[User], rest_content_types='json', status_code=200)
+    def post(self, customer_id, users):  # add default users to customer
+        LOG.info("DefaultUserController - Add DefaultUsers (put) customer id {0} users: {1}".format(customer_id, str(users)))
+        authentication.authorize(request, 'customers:add_default_user')
+        try:
+            customer_logic = CustomerLogic()
+            result = customer_logic.add_default_users(customer_id, users, request.transaction_id)
+            LOG.info("DefaultUserController - Add DefaultUsers (post) Finished well customer id {0} users: {1}".format(
+                customer_id, str(users)))
+
+        except ErrorStatus as exception:
+            LOG.log_exception("DefaultUserController - Failed to add default users", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except LookupError as exception:
+            LOG.log_exception("DefaultUserController - {0}".format(exception.message), exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=404)
+
+        except Exception as exception:
+            result = UserResultWrapper(transaction_id="Users Not Added", users=[])
+            LOG.log_exception("DefaultUserController - Failed to add default users", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+        return result
+
+    @wsexpose(None, str, str, status_code=204)
+    def delete(self, customer_id, user_id):
+        LOG.info("DefaultUserController - Delete DefaultUsers (delete) customer id {0} user_id: {1}".format(customer_id, user_id))
+        authentication.authorize(request, 'customers:delete_default_user')
+        try:
+            customer_logic = CustomerLogic()
+            customer_logic.delete_default_users(customer_id, user_id, request.transaction_id)
+            LOG.info("DefaultUserController - Delete DefaultUsers (delete) Finished well customer id {0} user_id: {1}".format(customer_id, user_id))
+            utils.audit_trail('delete default users', request.transaction_id, request.headers, customer_id)
+
+        except ErrorStatus as exception:
+            LOG.log_exception("DefaultUserController - Failed to delete default users", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=exception.status_code)
+
+        except LookupError as exception:
+            LOG.log_exception("DefaultUserController - {0}".format(exception.message), exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=404)
+
+        except NotFound as e:
+            raise err_utils.get_error(request.transaction_id,
+                                      message=e.message,
+                                      status_code=404)
+
+        except Exception as exception:
+            LOG.log_exception("DefaultUserController - Failed in Delete default User", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+
+class UserController(rest.RestController):
+
+    @staticmethod
+    def _validate(args):
+        # validate if user didnt provide input json for users
+        # to prevent wsme to take the input from url params
+        if 'users' in args and args['users'] and not request.body:
+            raise err_utils.get_error(request.transaction_id,
+                                      message="bad request, no json body",
+                                      status_code=400)
+
+    @wsexpose([str], str, str, rest_content_types='json')
+    def get(self, customer_id, region_id):
+        return ["This is the users controller ",
+                "customer id: " + customer_id,
+                "region id: " + region_id]
+
+    @wsexpose(UserResultWrapper, str, str, body=[User], rest_content_types='json', status_code=200)
+    def post(self, customer_id, region_id, users):
+        self._validate(locals())  # more validations for input
+        title = "Add users to Region '{}' for customer: '{}', users: {}".format(region_id, customer_id, str(users))
+        LOG.info("UserController - {}".format(title))
+        authentication.authorize(request, 'customers:add_region_user')
+        try:
+            customer_logic = CustomerLogic()
+            result = customer_logic.add_users(customer_id, region_id, users, request.transaction_id)
+            LOG.info("UserController - {} Finished well".format(title))
+
+            event_details = 'Customer {} users: {} added in region {}'.format(
+                customer_id, [u.id for u in users], region_id)
+            utils.audit_trail('add users', request.transaction_id,
+                              request.headers, customer_id,
+                              event_details=event_details)
+
+        except ErrorStatus as exception:
+            LOG.log_exception("DefaultUserController - Failed to {}".format(title), exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except LookupError as exception:
+            LOG.log_exception("DefaultUserController - {0}".format(exception.message), exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=404)
+
+        except Exception as exception:
+            result = UserResultWrapper(transaction_id="Users Not Added", users=[])
+            LOG.log_exception("UserController - Failed to Add Users (post)", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+        return result
+
+    @wsexpose(UserResultWrapper, str, str, body=[User], rest_content_types='json', status_code=200)
+    def put(self, customer_id, region_id, users):
+        self._validate(locals())  # more validations for input
+        title = "Replace users to Region '{}' for customer: '{}', users: {}".format(region_id, customer_id, str(users))
+        LOG.info("UserController - {}".format(title))
+        authentication.authorize(request, 'customers:update_region_user')
+        try:
+            customer_logic = CustomerLogic()
+            result = customer_logic.replace_users(customer_id, region_id, users, request.transaction_id)
+            LOG.info("UserController - {} Finished well".format(title))
+
+            event_details = 'Customer {} users: {} updated in region {}'.format(
+                customer_id, [u.id for u in users], region_id)
+            utils.audit_trail('replace users', request.transaction_id,
+                              request.headers, customer_id,
+                              event_details=event_details)
+
+        except ErrorStatus as exception:
+            LOG.log_exception("DefaultUserController - Failed to {}".format(title), exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except LookupError as exception:
+            LOG.log_exception("DefaultUserController - {0}".format(exception.message), exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=404)
+
+        except Exception as exception:
+            result = UserResultWrapper(transaction_id="Users Not Replaced", users=[])
+            LOG.log_exception("UserController - Failed to Replaced Users (put)", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+        return result
+
+    @wsexpose(None, str, str, str, status_code=204)
+    def delete(self, customer_id, region_id, user_id):
+        LOG.info("UserController - Delete User (delete) customer id {0} region_id: {1} user_id: {2}".format(customer_id, region_id, user_id))
+        authentication.authorize(request, 'customers:delete_region_user')
+        try:
+            customer_logic = CustomerLogic()
+            customer_logic.delete_users(customer_id, region_id, user_id, request.transaction_id)
+            LOG.info("UserController - Delete User (delete) Finished well customer id {0} region_id: {1} user_id: {2}".format(customer_id, region_id, user_id))
+
+            event_details = 'Customer {} user: {} deleted in region {}'.format(
+                customer_id, user_id, region_id)
+            utils.audit_trail('delete users', request.transaction_id,
+                              request.headers, customer_id,
+                              event_details=event_details)
+
+        except ErrorStatus as exception:
+            LOG.log_exception("DefaultUserController - Failed to delete users", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=exception.status_code)
+
+        except LookupError as exception:
+            LOG.log_exception("DefaultUserController - {0}".format(exception.message), exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=404)
+
+        except NotFound as e:
+            raise err_utils.get_error(request.transaction_id,
+                                      message=e.message,
+                                      status_code=404)
+
+        except Exception as exception:
+            LOG.log_exception("UserController - Failed to Delete User (delete) ", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/logs.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/logs.py
new file mode 100644
index 00000000..e8d7b1bb
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/controllers/v1/orm/logs.py
@@ -0,0 +1,65 @@
+import logging
+
+from pecan import rest
+import wsme
+from wsmeext.pecan import wsexpose
+
+logger = logging.getLogger(__name__)
+
+
+class LogChangeResultWSME(wsme.types.DynamicBase):
+    """log change result wsme type."""
+
+    result = wsme.wsattr(str, mandatory=True, default=None)
+
+    def __init__(self, **kwargs):
+        """"init method."""
+        super(LogChangeResult, self).__init__(**kwargs)
+
+
+class LogChangeResult(object):
+    """log change result type."""
+
+    def __init__(self, result):
+        """"init method."""
+        self.result = result
+
+
+class LogsController(rest.RestController):
+    """Logs Audit controller."""
+
+    @wsexpose(LogChangeResultWSME, str, status_code=201,
+              rest_content_types='json')
+    def put(self, level):
+        """update log level.
+
+        :param level: the log level text name
+        :return:
+        """
+
+        logger.info("Changing log level to [{}]".format(level))
+        try:
+            log_level = logging._levelNames.get(level.upper())
+            if log_level is not None:
+                self._change_log_level(log_level)
+                result = "Log level changed to {}.".format(level)
+                logger.info(result)
+            else:
+                raise Exception(
+                    "The given log level [{}] doesn't exist.".format(level))
+        except Exception as e:
+            result = "Fail to change log_level. Reason: {}".format(
+                e.message)
+            logger.error(result)
+        return LogChangeResult(result)
+
+    @staticmethod
+    def _change_log_level(log_level):
+        path = __name__.split('.')
+        if len(path) > 0:
+            root = path[0]
+            root_logger = logging.getLogger(root)
+            root_logger.setLevel(log_level)
+        else:
+            logger.info("Fail to change log_level to [{}]. "
+                        "the given log level doesn't exist.".format(log_level))
diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/root.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/root.py
new file mode 100755
index 00000000..f6708f01
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/controllers/v1/orm/root.py
@@ -0,0 +1,10 @@
+from cms_rest.controllers.v1.orm.customer.root import CustomerController
+from cms_rest.controllers.v1.orm.logs import LogsController
+from cms_rest.controllers.v1.orm.configuration import ConfigurationController
+from pecan.rest import RestController
+
+
+class OrmController(RestController):
+    configuration = ConfigurationController()
+    customers = CustomerController()
+    logs = LogsController()
diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/root.py b/orm/services/customer_manager/cms_rest/controllers/v1/root.py
new file mode 100644
index 00000000..e471f361
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/controllers/v1/root.py
@@ -0,0 +1,6 @@
+from cms_rest.controllers.v1.orm.root import OrmController
+from pecan.rest import RestController
+
+
+class V1Controller(RestController):
+    orm = OrmController()
diff --git a/orm/services/customer_manager/cms_rest/data/__init__.py b/orm/services/customer_manager/cms_rest/data/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/data/data_manager.py b/orm/services/customer_manager/cms_rest/data/data_manager.py
new file mode 100755
index 00000000..6ed9b19f
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/data/data_manager.py
@@ -0,0 +1,279 @@
+import oslo_db
+from oslo_db.sqlalchemy import session as db_session
+from sqlalchemy.event import listen
+from sqlalchemy import or_
+from cms_rest.logic.error_base import ErrorStatus
+
+from pecan import conf
+
+import logging
+
+from cms_rest.data.sql_alchemy.models import CmsRole, CmsUser, Customer, \
+    CustomerRegion, Quota, QuotaFieldDetail, \
+    Region, UserRole
+from cms_rest.data.sql_alchemy.customer_record import CustomerRecord
+from cms_rest.data.sql_alchemy.customer_region_record import \
+    CustomerRegionRecord
+from cms_rest.data.sql_alchemy.user_role_record import UserRoleRecord
+
+LOG = logging.getLogger(__name__)
+
+
+# event handling
+def on_before_flush(session, flush_context, instances):
+    print("on_before_flush:", str(flush_context))
+    for model in session.new:
+        if hasattr(model, "validate"):
+            model.validate("new")
+
+    for model in session.dirty:
+        if hasattr(model, "validate"):
+            model.validate("dirty")
+
+
+class DataManager(object):
+
+    def __init__(self, connection_string=None):
+
+        if not connection_string:
+            connection_string = conf.database.connection_string
+
+        self._engine_facade = db_session.EngineFacade(connection_string, autocommit=False)
+        self._session = None
+        listen(self.session, 'before_flush', on_before_flush)
+        self.image_record = None
+
+    def get_engine(self):
+        return self._engine_facade.get_engine()
+
+    @property
+    def engine(self):
+        return self.get_engine()
+
+    def get_session(self):
+        if not self._session:
+            self._session = self._engine_facade.get_session()
+        return self._session
+
+    @property
+    def session(self):
+        return self.get_session()
+
+    def flush(self):
+        try:
+            self.session.flush()
+        except oslo_db.exception.DBDuplicateEntry as exception:
+            raise ErrorStatus(409.2, 'Duplicate Entry {0} already exist'.format(exception.columns))
+        except Exception:
+            raise
+
+    def commit(self):
+        self.session.commit()
+
+    def expire_all(self):
+        self.session.expire_all()
+
+    def rollback(self):
+        self.session.rollback()
+
+    def close(self):
+        self.session.close()
+        self.engine.dispose()
+
+    def begin_transaction(self):
+        pass
+        # no need to begin transaction - the transaction is open automatically
+
+    def get_all_cms_users(self, start=0, limit=0):
+        cms_users = self.session.query(CmsUser)
+        return cms_users.all()
+
+    def get_cusomer_by_id(self, customer_id):
+        customer = self.session.query(Customer).filter(
+            Customer.id == customer_id)
+        return customer.first()
+
+    def get_cusomer_by_uuid(self, uuid):
+        customer = self.session.query(Customer).filter(Customer.uuid == uuid)
+        return customer.first()
+
+    def get_cusomer_by_name(self, name):
+        customer = self.session.query(Customer).filter(Customer.name == name)
+        return customer.first()
+
+    def get_cusomer_by_uuid_or_name(self, cust):
+        customer = self.session.query(Customer).filter(
+            or_(Customer.uuid == cust,
+                Customer.name == cust))
+
+        return customer.first()
+
+    def get_quota_by_id(self, quota_id):
+        quota = self.session.query(Quota).filter(Quota.id == quota_id)
+        return quota.first()
+
+    def get_record(self, record_name):
+        if record_name == "Customer" or record_name == "customer":
+            if not hasattr(self, "customer_record"):
+                self.customer_record = CustomerRecord(self.session)
+            return self.customer_record
+
+        if record_name == "CustomerRegion" or record_name == "customer_region":
+            if not hasattr(self, "customer_region_record"):
+                self.customer_region_record = CustomerRegionRecord(
+                    self.session)
+            return self.customer_region_record
+
+        if record_name == "UserRole" or record_name == "user_role":
+            if not hasattr(self, "user_role_record"):
+                self.user_role_record = UserRoleRecord(self.session)
+            return self.user_role_record
+        return None
+
+    def add_user(self, user):
+        db_user = self.session.query(CmsUser).filter(
+            CmsUser.name == user.id).first()
+        if not (db_user is None):
+            return db_user
+
+        db_user = CmsUser(name=user.id)
+        self.session.add(db_user)
+        self.flush()
+
+        return db_user
+
+    def add_role(self, role):
+        db_role = self.session.query(CmsRole).filter(
+            CmsRole.name == role).first()
+        if not (db_role is None):
+            return db_role
+
+        db_role = CmsRole(name=role)
+        self.session.add(db_role)
+        self.flush()
+
+        return db_role
+
+    def add_quota(self, customer_id, region_id, quota):
+        quota_attrs = ['compute', 'storage', 'network']
+        for quota_type in quota_attrs:
+            quota_by_type = getattr(quota, quota_type)
+            if len(quota_by_type) == 0:
+                continue
+
+            sql_quota = Quota(
+                customer_id=customer_id,
+                region_id=region_id,
+                quota_type=quota_type
+            )
+            self.session.add(sql_quota)
+            self.flush()
+
+            # FIXME: next line assumes that only one quota of each type is
+            # available and thus quota_by_type[0] is used
+            for field_key, field_value in DataManager.get_dict_from_quota(
+                    quota_by_type[0], quota_type).items():
+                sql_quota_field_detail = QuotaFieldDetail(
+                    quota_id=sql_quota.id,
+                    field_key=field_key,
+                    field_value=field_value
+                )
+                self.session.add(sql_quota_field_detail)
+
+        self.flush()
+
+    def add_customer(self, customer, uuid):
+        sql_customer = Customer(
+            uuid=uuid,
+            name=customer.name,
+            enabled=customer.enabled,
+            description=customer.description
+        )
+
+        self.session.add(sql_customer)
+        self.flush()
+
+        return sql_customer
+
+    def add_user_role(self, user_id, role_id, customer_id, region_id,
+                      adding=False):
+        try:
+            sql_user_role = self.session.query(UserRole).filter(
+                UserRole.customer_id == customer_id,
+                UserRole.user_id == user_id,
+                UserRole.region_id == region_id,
+                UserRole.role_id == role_id).first()
+            if sql_user_role:
+                if adding:
+                    raise Exception('Duplicate User Role')
+                return sql_user_role
+
+            sql_user_role = UserRole(
+                user_id=user_id,
+                role_id=role_id,
+                customer_id=customer_id,
+                region_id=region_id
+            )
+
+            self.session.add(sql_user_role)
+            self.flush()
+
+            return sql_user_role
+        except Exception as exception:
+            raise
+
+    def add_customer_region(self, customer_id, region_id):
+        customer_region = CustomerRegion(
+            customer_id=customer_id,
+            region_id=region_id
+        )
+
+        self.session.add(customer_region)
+        self.flush()
+
+    def add_region(self, region):
+        db_region = self.session.query(Region).filter(
+            Region.name == region.name).first()
+        if not (db_region is None):
+            return db_region
+
+        db_region = Region(name=region.name, type=region.type)
+        self.session.add(db_region)
+        self.flush()
+
+        return db_region
+
+    def get_region_id_by_name(self, name):
+        region_id = self.session.query(Region.id).filter(
+            Region.name == name).scalar()
+
+        return region_id
+
+    def get_customer_id_by_uuid(self, uuid):
+        customer_id = self.session.query(Customer.id).filter(
+            Customer.uuid == uuid).scalar()
+
+        return customer_id
+
+    @classmethod
+    def get_dict_from_quota(cls, quota, quota_type):
+        types = {
+            'compute': ['instances', 'injected_files', 'key_pairs', 'ram',
+                        'vcpus', 'metadata_items',
+                        'injected_file_content_bytes', 'floating_ips',
+                        'fixed_ips', 'injected_file_path_bytes',
+                        'server_groups', 'server_group_members'
+                        ],
+            'storage': ['gigabytes', 'snapshots', 'volumes'],
+            'network': ['floating_ips', 'networks', 'ports', 'routers',
+                        'subnets', 'security_groups', 'security_group_rules',
+                        'health_monitor', 'member', 'nat_instance', 'pool',
+                        'route_table', 'vip'
+                        ]
+        }
+
+        quota_dict = {}
+        for attr in types[quota_type]:
+            quota_dict[attr] = getattr(quota, attr)
+
+        return quota_dict
diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/__init__.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/base.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/base.py
new file mode 100644
index 00000000..c64447da
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/base.py
@@ -0,0 +1,2 @@
+from sqlalchemy.ext.declarative import declarative_base
+Base = declarative_base()
diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/cms_user_record.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/cms_user_record.py
new file mode 100755
index 00000000..c6aa2f5a
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/cms_user_record.py
@@ -0,0 +1,44 @@
+from cms_rest.data.sql_alchemy.models import CmsUser
+
+from cms_rest.logger import get_logger
+LOG = get_logger(__name__)
+
+
+class CmsUserRecord:
+
+    def __init__(self, session=None):
+
+        # this model uses for the parameters for any access methods - not as instance of record in the table
+        self.__cms_user = CmsUser()
+        # self.setRecordData(self.cms_user)
+        # self.cms_user.Clear()
+
+        self.__TableName = "cms_user"
+
+        if (session):
+            self.session = session
+
+    def setDBSession(self, session):
+        self.session = session
+
+    @property
+    def cms_user(self):
+        return self.__cms_user
+
+    @cms_user.setter
+    def cms_user(self, cms_user):
+        self.__cms_usern = cms_user
+
+    def insert(self, cms_user):
+        try:
+            self.session.add(cms_user)
+        except Exception as exception:
+            LOG.log_exception("Failed to insert cms_user", exception)
+            # LOG.error("Failed to insert cms_user" + str(cms_user)+" Exception:" + str(exception))
+            raise
+
+    def get_cms_user_id_from_name(self, cms_user_name):
+        result = self.session.connection().scalar("SELECT id from cms_user WHERE name = \"%s\"" % (cms_user_name))
+        if result is not None:
+            return int(result)
+        return result
diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_record.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_record.py
new file mode 100755
index 00000000..fc47a609
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_record.py
@@ -0,0 +1,173 @@
+from cms_rest.data.sql_alchemy.models import Customer, Region, CustomerRegion, UserRole, CmsUser, CustomerMetadata
+from sqlalchemy import and_, func
+from __builtin__ import int
+
+from cms_rest.logger import get_logger
+
+LOG = get_logger(__name__)
+
+
+class CustomerRecord:
+    def __init__(self, session):
+
+        # this model is uses only for the parameters of access mothods, not an instance of model in the database
+        self.__customers = Customer()
+        # self.setRecordData(self.__customers)
+        # self.__customers.Clear()
+        self.__TableName = "customer"
+
+        if session:
+            self.setDBSession(session)
+
+    def setDBSession(self, session):
+        self.session = session
+
+    @property
+    def customer(self):
+        return self.__customer
+
+    @customer.setter
+    def customer(self, customer):
+        self.__customer = customer
+
+    def insert(self, customer):
+        try:
+            self.session.add(customer)
+        except Exception as exception:
+            LOG.log_exception("Failed to insert Customer" + str(customer), exception)
+            # LOG.error("Failed to insert customer" + str(customer) + " Exception:" + str(exception))
+            raise
+
+    def delete_by_primary_key(self, customer_id):
+        result = self.session.connection().execute("delete from customer where id = %d" % (customer_id))
+        return result
+
+    def read_by_primary_key(self):
+        return self.read_customer(self.__customer.id)
+
+    def read_customer(self, customer_id):
+        try:
+            customer = self.session.query(Customer).filter(Customer.id == customer_id)
+            return customer.first()
+
+        except Exception as exception:
+            message = "Failed to read_customer:customer_id: %d " % (customer_id)
+            LOG.log_exception(message, exception)
+            raise
+
+    def read_customer_by_uuid(self, customer_uuid):
+        try:
+            customer = self.session.query(Customer).filter(Customer.uuid == customer_uuid)
+            return customer.first()
+
+        except Exception as exception:
+            message = "Failed to read_customer:customer_uuid: %d " % customer_uuid
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_customer_id_from_uuid(self, uuid):
+        result = self.session.connection().scalar("SELECT id from customer WHERE uuid = \"%s\"" % uuid)
+
+        if result:
+            return int(result)
+        else:
+            return None
+
+    def delete_customer_by_uuid(self, uuid):
+        try:
+            result = self.session.query(Customer).filter(
+                Customer.uuid == uuid).delete()
+            return result
+
+        except Exception as exception:
+            message = "Failed to delete_customer_by_uuid: uuid: {0}".format(uuid)
+            LOG.log_exception(message, exception)
+            raise
+
+    def _build_meta_query(self, metadata):
+        """
+        build query for having list of metadata
+        get list of keys and list of values quereis
+        :param metadata:
+        :return:
+        """
+        metadata_values = [value.split(':')[1] for value in metadata if
+                           ':' in value]
+        query = [CustomerMetadata.field_key.in_(
+            [key.split(':')[0] if ':' in key else key for key in metadata])]
+        # check if search by only keys ..
+        if metadata_values:
+            query.append(CustomerMetadata.field_value.in_(
+                [value.split(':')[1] if ':' in value else '' for value in
+                 metadata]))
+        return query
+
+    def get_customers_by_criteria(self, **criteria):
+
+        try:
+            LOG.info("get_customers_by_criteria: criteria: {0}".format(criteria))
+            region = criteria['region'] if 'region' in criteria else None
+            user = criteria['user'] if 'user' in criteria else None
+            rgroup = criteria['rgroup'] if 'rgroup' in criteria else None
+            starts_with = criteria['starts_with'] if 'starts_with' in criteria else None
+            contains = criteria['contains'] if 'contains' in criteria else None
+            metadata = criteria['metadata'] if 'metadata' in criteria else None
+
+            query = self.session.query(Customer)
+
+            if metadata:
+                query = query.join(CustomerMetadata).filter(
+                    *self._build_meta_query(metadata)).group_by(
+                    CustomerMetadata.customer_id).having(
+                    func.count() == len(metadata))
+
+            if starts_with:
+                query = query.filter(
+                    Customer.name.ilike("{}%".format(starts_with)))
+
+            if contains:
+                query = query.filter(
+                    Customer.name.ilike("%{}%".format(contains)))
+
+            if region:
+                query = query.join(CustomerRegion).filter(CustomerRegion.customer_id == Customer.id)
+                query = query.join(Region).filter(Region.id == CustomerRegion.region_id, Region.type == 'single', Region.name == region)
+
+                if user:
+                    query = query.join(UserRole, UserRole.customer_id == Customer.id).filter(UserRole.region_id == Region.id)
+                    query = query.join(CmsUser).filter(CmsUser.id == UserRole.user_id, CmsUser.name == user)
+            elif user:
+                query = query.join(UserRole, UserRole.customer_id == Customer.id)
+                query = query.join(CmsUser).filter(CmsUser.id == UserRole.user_id, CmsUser.name == user)
+
+            if rgroup:
+                if not region:  # avoid same CustomerRegion join twice
+                    query = query.join(CustomerRegion).filter(CustomerRegion.customer_id == Customer.id)
+
+                query = query.join(Region).filter(Region.id == CustomerRegion.region_id, Region.type == 'group', Region.name == rgroup)
+
+                if user:
+                    query = query.join(UserRole, UserRole.customer_id == Customer.id).filter(
+                        UserRole.region_id == Region.id)
+                    query = query.join(CmsUser).filter(CmsUser.id == UserRole.user_id, CmsUser.name == user)
+
+            query = self.customise_query(query, criteria)
+            return query.all()
+
+        except Exception as exception:
+            message = "Failed to get_customers_by_criteria: criteria: {0}".format(criteria)
+            LOG.log_exception(message, exception)
+            raise
+
+    def customise_query(self, query, kw):
+        start = int(kw['start']) if 'start' in kw else 0
+        limit = int(kw['limit']) if 'limit' in kw else 0
+
+        if start > 0:
+            query = query.offset(start)
+
+        if limit > 0:
+            query = query.limit(limit)
+
+        print str(query)
+        return query
diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_region_record.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_region_record.py
new file mode 100755
index 00000000..c3821795
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_region_record.py
@@ -0,0 +1,92 @@
+from cms_rest.data.sql_alchemy.models import CustomerRegion
+from cms_rest.data.sql_alchemy.customer_record import CustomerRecord
+from cms_rest.data.sql_alchemy.region_record import RegionRecord
+
+from cms_rest.logger import get_logger
+
+LOG = get_logger(__name__)
+
+
+class CustomerRegionRecord:
+    def __init__(self, session):
+
+        # thie model uses for the parameters for any acceess methods - not as instance of record in the table
+        self.__customer_region = CustomerRegion()
+        # self.setRecordData(self.__customers)
+        # self.__customers.Clear()
+
+        self.__TableName = "customer_region"
+
+        if (session):
+            self.session = session
+
+    def setDBSession(self, session):
+        self.session = session
+
+    @property
+    def customer_region(self):
+        return self.__customer_region
+
+    @customer_region.setter
+    def customer_region(self):
+        self.__customer_region = CustomerRegion()
+
+    def insert(self, customer_region):
+        try:
+            self.session.add(customer_region)
+        except Exception as exception:
+            LOG.log_exception("Failed to insert customer_region" + str(customer_region), exception)
+            raise
+
+    def get_regions_for_customer(self, customer_uuid):
+        customer_regions = []
+
+        try:
+            customer_record = CustomerRecord(self.session)
+            customer_id = customer_record.get_customer_id_from_uuid(customer_uuid)
+            query = self.session.query(CustomerRegion).filter(CustomerRegion.customer_id == customer_id)
+
+            for customer_region in query.all():
+                customer_regions.append(customer_region)
+            return customer_regions
+
+        except Exception as exception:
+            message = "Failed to get_region_names_for_customer: %d" % (customer_id)
+            LOG.log_exception(message, exception)
+            raise
+
+    def delete_region_for_customer(self, customer_id, region_name):
+        # customer_id can be a uuid (type of string) or id (type of int)
+        # if customer_id is uuid I get id from uuid and use the id in the next sql command
+        if isinstance(customer_id, basestring):
+            customer_record = CustomerRecord(self.session)
+            customer_id = customer_record.get_customer_id_from_uuid(customer_id)
+        # get region id by the name I got (region_name)
+        region_record = RegionRecord(self.session)
+        region_id = region_record.get_region_id_from_name(region_name)
+        if region_id is None:
+            raise ValueError(
+                'region with the region name {0} not found'.format(
+                    region_name))
+        result = self.session.connection().execute(
+            "delete from customer_region where customer_id = %d and region_id = %d" % (customer_id, region_id))
+        self.session.flush()
+
+        if result.rowcount == 0:
+            LOG.warn('region with the region name {0} not found'.format(region_name))
+            raise ValueError('region with the region name {0} not found'.format(region_name))
+
+        LOG.debug("num records deleted: " + str(result.rowcount))
+        return result
+
+    def delete_all_regions_for_customer(self, customer_id):  # not including default region which is -1
+        # customer_id can be a uuid (type of string) or id (type of int)
+        # if customer_id is uuid I get id from uuid and use the id in the next sql command
+        if isinstance(customer_id, basestring):
+            customer_record = CustomerRecord(self.session)
+            customer_id = customer_record.get_customer_id_from_uuid(customer_id)
+
+        result = self.session.connection().execute(
+            "delete from customer_region where customer_id = {} and region_id <> -1 ".format(customer_id))
+        print "num records deleted from customer regions: " + str(result.rowcount)
+        return result
diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/models.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/models.py
new file mode 100755
index 00000000..3fe7d474
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/models.py
@@ -0,0 +1,406 @@
+from sqlalchemy import Column, Integer, String, SmallInteger, ForeignKey
+from sqlalchemy.orm import relationship
+from cms_rest.data.sql_alchemy.base import Base
+import wsme
+
+from oslo_db.sqlalchemy import models
+
+import cms_rest.model.Models as WsmeModels
+
+
+class CMSBaseModel(models.ModelBase):
+    """Base class from CMS Models."""
+
+    __table_args__ = {'mysql_engine': 'InnoDB'}
+
+
+'''
+' CmsUser is a DataObject and contains all the fields defined in CmsUser table record.
+' defined as SqlAlchemy model map to a table
+'''
+
+
+class CmsRole(Base, CMSBaseModel):
+    __tablename__ = 'cms_role'
+
+    id = Column(Integer, primary_key=True)
+    name = Column(String(64), nullable=False)
+
+    def __json__(self):
+        return dict(
+            id=self.id,
+            name=self.name
+        )
+
+
+'''
+' CmsUser is a DataObject and contains all the fields defined in CmsUser table record.
+' defined as SqlAlchemy model map to a table
+'''
+
+
+class CmsUser(Base, CMSBaseModel):
+    __tablename__ = 'cms_user'
+
+    id = Column(Integer, primary_key=True)
+    name = Column(String(64), nullable=False, unique=True)
+
+    def __json__(self):
+        return dict(
+            id=self.id,
+            name=self.name
+        )
+
+
+'''
+' Customer is a DataObject and contains all the fields defined in Customer table record.
+' defined as SqlAlchemy model map to a table
+'''
+
+
+class Customer(Base, CMSBaseModel):
+    __tablename__ = "customer"
+
+    id = Column(Integer, primary_key=True)
+    uuid = Column(String(64), nullable=False, unique=True)
+    name = Column(String(64), nullable=False, unique=True)
+    description = Column(String(255), nullable=False)
+    enabled = Column(SmallInteger, nullable=False)
+    customer_customer_regions = relationship("CustomerRegion", cascade="all, delete, delete-orphan")
+    customer_metadata = relationship("CustomerMetadata", cascade="all, delete, delete-orphan")
+
+    def __json__(self):
+        return dict(
+            id=self.id,
+            uuid=self.uuid,
+            name=self.name,
+            description=self.description,
+            enabled=self.enabled,
+            customer_customer_regions=[customer_region.__json__() for customer_region in
+                                       self.customer_customer_regions],
+            customer_metadata=[customer_metadata.__json__() for customer_metadata in self.customer_metadata]
+        )
+
+    def get_dict(self):
+        return self.__json__()
+
+    def get_proxy_dict(self):
+        proxy_dict = {
+            "uuid": self.uuid,
+            "name": self.name,
+            "description": self.description,
+            "enabled": 1 if self.enabled else 0
+        }
+
+        default_customer_region = self.get_default_customer_region()
+        if default_customer_region:
+            proxy_dict["default_region"] = default_customer_region.get_proxy_dict()
+
+        real_customer_regions = self.get_real_customer_regions()
+        proxy_dict["regions"] = [customer_region.get_proxy_dict() for customer_region in real_customer_regions]
+        proxy_dict["metadata"] = [customer_metadata.get_proxy_dict() for customer_metadata in self.customer_metadata]
+
+        return proxy_dict
+
+    def get_default_customer_region(self):
+        for customer_region in self.customer_customer_regions:
+            if customer_region.region_id == -1:
+                return customer_region
+        return None
+
+    def get_real_customer_regions(self):
+        real_customer_regions = []
+        for customer_region in self.customer_customer_regions:
+            if customer_region.region_id != -1:
+                real_customer_regions.append(customer_region)
+        return real_customer_regions
+
+    def to_wsme(self):
+        name = self.name
+        description = self.description
+        enabled = True if self.enabled else False
+        regions = [customer_region.to_wsme() for customer_region in self.customer_customer_regions if
+                   customer_region.region_id != -1]
+        defaultRegion = [customer_region.to_wsme() for customer_region in self.customer_customer_regions if
+                         customer_region.region_id == -1]
+        metadata = {}
+        for metadata1 in self.customer_metadata:
+            metadata[metadata1.field_key] = metadata1.field_value
+
+        result = WsmeModels.Customer(description=description,
+                                     enabled=enabled,
+                                     name=name,
+                                     regions=regions,
+                                     users=defaultRegion[0].users if defaultRegion else [],
+                                     metadata=metadata,
+                                     defaultQuotas=defaultRegion[0].quotas if defaultRegion else [],
+                                     custId=self.uuid,
+                                     uuid=self.uuid)
+        return result
+
+
+'''
+' CustomerMetadata is a DataObject and contains all the fields defined in customer_metadata table record.
+' defined as SqlAlchemy model map to a table
+'''
+
+
+class CustomerMetadata(Base, CMSBaseModel):
+    __tablename__ = "customer_metadata"
+
+    customer_id = Column(Integer, ForeignKey('customer.id'), primary_key=True, nullable=False)
+    field_key = Column(String(64), primary_key=True, nullable=False)
+    field_value = Column(String(64), nullable=False)
+
+    def __json__(self):
+        return dict(
+            customer_id=self.customer_id,
+            field_key=self.field_key,
+            field_value=self.field_value
+        )
+
+    def get_proxy_dict(self):
+        proxy_dict = {
+            self.field_key: self.field_value
+        }
+
+        return proxy_dict
+
+
+'''
+' CustomerRegion is a DataObject and contains all the fields defined in CustomerRegion table record.
+' defined as SqlAlchemy model map to a table
+'''
+
+
+class CustomerRegion(Base, CMSBaseModel):
+    __tablename__ = "customer_region"
+
+    customer_id = Column(Integer, ForeignKey('customer.id'), primary_key=True, nullable=False)
+    region_id = Column(Integer, ForeignKey('region.id'), primary_key=True, nullable=False, index=True)
+
+    customer_region_quotas = relationship("Quota",
+                                          uselist=True,
+                                          primaryjoin="and_(CustomerRegion.customer_id==Quota.customer_id,"
+                                                      "CustomerRegion.region_id==Quota.region_id)")
+
+    customer_region_user_roles = relationship("UserRole",
+                                              uselist=True,
+                                              order_by="UserRole.user_id",
+                                              primaryjoin="and_(CustomerRegion.customer_id==UserRole.customer_id,"
+                                                          "CustomerRegion.region_id==UserRole.region_id)")
+
+    region = relationship("Region", viewonly=True)
+
+    def __json__(self):
+        return dict(
+            customer_id=self.customer_id,
+            region_id=self.region_id,
+            customer_region_quotas=[quota.__json__() for quota in self.customer_region_quotas],
+            customer_region_user_roles=[user_role.__json__() for user_role in self.customer_region_user_roles]
+        )
+
+    def get_proxy_dict(self):
+        proxy_dict = {
+            "name": self.region.name,
+            "action": "modify"
+        }
+        proxy_dict["quotas"] = [quota.get_proxy_dict() for quota in self.customer_region_quotas]
+
+        proxy_dict["users"] = []
+        user = None
+
+        for user_role in self.customer_region_user_roles:
+            if user and user["id"] != user_role.user.name:
+                proxy_dict["users"].append(user)
+                user = {"id": user_role.user.name, "roles": [user_role.role.name]}
+            elif user is None:
+                user = {"id": user_role.user.name, "roles": [user_role.role.name]}
+            else:
+                user["roles"].append(user_role.role.name)
+        if user:
+            proxy_dict["users"].append(user)
+
+        return proxy_dict
+
+    def to_wsme(self):
+        name = self.region.name
+        type = self.region.type
+        quota = []
+        quotas = {}
+        for region_quota in self.customer_region_quotas:
+            quotas[region_quota.quota_type] = {}
+            for quota_field in region_quota.quota_field_details:
+                quotas[region_quota.quota_type][quota_field.field_key] = quota_field.field_value or wsme.Unset
+
+        if quotas:
+            compute = None
+            storage = None
+            network = None
+
+            if 'compute' in quotas:
+                compute = [WsmeModels.Compute(**quotas['compute'])]
+            if 'storage' in quotas:
+                storage = [WsmeModels.Storage(**quotas['storage'])]
+            if 'network' in quotas:
+                network = [WsmeModels.Network(**quotas['network'])]
+
+            quota = [WsmeModels.Quota(compute=compute, storage=storage, network=network)]
+
+        users = []
+        user = None
+        for user_role in self.customer_region_user_roles:
+            if user and user.id != user_role.user.name:
+                users.append(user)
+                user = WsmeModels.User(id=user_role.user.name, role=[user_role.role.name])
+            elif user is None:
+                user = WsmeModels.User(id=user_role.user.name, role=[user_role.role.name])
+            else:
+                user.role.append(user_role.role.name)
+        if user:
+            users.append(user)
+
+        region = WsmeModels.Region(name=name,
+                                   type=type,
+                                   quotas=quota,
+                                   users=users)
+        return region
+
+
+'''
+' Quota is a DataObject and contains all the fields defined in Quota table record.
+' defined as SqlAlchemy model map to a table
+'''
+
+
+class Quota(Base, CMSBaseModel):
+    __tablename__ = "quota"
+
+    id = Column(Integer, primary_key=True)
+    customer_id = Column(Integer, ForeignKey('customer_region.customer_id'), nullable=False)
+    region_id = Column(Integer, ForeignKey('customer_region.region_id'), nullable=False)
+    quota_type = Column(String(64))
+    quota_field_details = relationship("QuotaFieldDetail")
+
+    def __json__(self):
+        return dict(
+            id=self.id,
+            customer_id=self.customer_id,
+            region_id=self.region_id,
+            quota_type=self.quota_type,
+            quota_field_details=[quota_field_detail.__json__() for quota_field_detail in self.quota_field_details]
+        )
+
+    def get_proxy_dict(self):
+        proxy_dict = {}
+        field_items = {}
+        for quota_field_detail in self.quota_field_details:
+            if quota_field_detail.field_value:
+                key = quota_field_detail.field_key
+                # key.replace("-", "_")
+                field_items[key] = quota_field_detail.field_value
+
+        proxy_dict[self.quota_type] = field_items
+
+        return proxy_dict
+
+    def to_wsme(self):
+        compute = {}
+        storage = {}
+        network = {}
+        for quota_field in self.quota_field_details:
+            if self.quota_type == "compute":
+                if not quota_field.field_value:
+                    quota_field.field_value = wsme.Unset
+                compute[quota_field.field_key] = quota_field.field_value
+            elif self.quota_type == "storage":
+                if not quota_field.field_value:
+                    quota_field.field_value = wsme.Unset
+                storage[quota_field.field_key] = quota_field.field_value
+            elif self.quota_type == "network":
+                if not quota_field.field_value:
+                    quota_field.field_value = wsme.Unset
+                network[quota_field.field_key] = quota_field.field_value
+
+        quota = WsmeModels.Quota(compute=[WsmeModels.Compute(**compute)],
+                                 storage=[WsmeModels.Storage(**storage)],
+                                 network=[WsmeModels.Network(**network)])
+        return quota
+
+
+'''
+' QuotaFieldDetail is a DataObject and contains all the fields defined in QuotaFieldDetail table record.
+' defined as SqlAlchemy model map to a table
+'''
+
+
+class QuotaFieldDetail(Base, CMSBaseModel):
+    __tablename__ = "quota_field_detail"
+
+    id = Column(Integer, primary_key=True)
+    # quota_id = Column(Integer, ForeignKey('Quota.id'))
+    quota_id = Column(Integer, ForeignKey('quota.id'), nullable=False)
+    field_key = Column(String(64), nullable=False)
+    field_value = Column(String(64), nullable=False)
+
+    def __json__(self):
+        return dict(
+            id=self.id,
+            quota_id=self.quota_id,
+            field_key=self.field_key,
+            field_value=self.field_value
+        )
+
+
+'''
+' Region is a DataObject and contains all the fields defined in Region table record.
+' defined as SqlAlchemy model map to a table
+'''
+
+
+class Region(Base, CMSBaseModel):
+    __tablename__ = "region"
+
+    id = Column(Integer, primary_key=True)
+    name = Column(String(64), nullable=False, unique=True)
+    type = Column(String(64), nullable=False)
+
+    def __json__(self):
+        return dict(
+            id=self.id,
+            name=self.name,
+            type=self.type
+        )
+
+
+'''
+' UserRole is a DataObject and contains all the fields defined in UserRole table record.
+' defined as SqlAlchemy model map to a table
+'''
+
+
+class UserRole(Base, CMSBaseModel):
+    __tablename__ = "user_role"
+
+    customer_id = Column(Integer, ForeignKey('customer_region.customer_id'), primary_key=True, nullable=False)
+    region_id = Column(Integer, ForeignKey('customer_region.region_id'), primary_key=True, nullable=False)
+    user_id = Column(Integer, ForeignKey('cms_user.id'), primary_key=True, nullable=False)
+    role_id = Column(Integer, ForeignKey('cms_role.id'), primary_key=True, nullable=False)
+
+    user = relationship("CmsUser", viewonly=True)
+    role = relationship("CmsRole", viewonly=True)
+
+    def __json__(self):
+        return dict(
+            customer_id=self.customer_id,
+            region_id=self.region_id,
+            user_id=self.user_id,
+            role_id=self.role_id
+        )
+
+    def to_wsme(self):
+        id = ""
+        role = []
+
+        user = WsmeModels.User(id=id, role=role)
+        return user
diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/region_record.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/region_record.py
new file mode 100755
index 00000000..d6909d1b
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/region_record.py
@@ -0,0 +1,44 @@
+from cms_rest.data.sql_alchemy.models import Region
+from cms_rest.data.sql_alchemy.customer_record import CustomerRecord
+
+from cms_rest.logger import get_logger
+LOG = get_logger(__name__)
+
+
+class RegionRecord:
+
+    def __init__(self, session=None):
+
+        # this model uses for the parameters for any access methods - not as instance of record in the table
+        self.__region = Region()
+        # self.setRecordData(self.region)
+        # self.region.Clear()
+
+        self.__TableName = "region"
+
+        if (session):
+            self.session = session
+
+    def setDBSession(self, session):
+        self.session = session
+
+    @property
+    def region(self):
+        return self.__region
+
+    @region.setter
+    def region(self, region):
+        self.__regionn = region
+
+    def insert(self, region):
+        try:
+            self.session.add(region)
+        except Exception as exception:
+            LOG.log_exception("Failed to insert region" + str(region), exception)
+            raise
+
+    def get_region_id_from_name(self, region_name):
+        result = self.session.connection().scalar("SELECT id from region WHERE name = \"%s\"" % (region_name))
+        if result is not None:
+            return int(result)
+        return result
diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/user_role_record.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/user_role_record.py
new file mode 100755
index 00000000..9ec6f636
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/user_role_record.py
@@ -0,0 +1,83 @@
+from cms_rest.data.sql_alchemy.models import *
+from cms_rest.data.sql_alchemy.customer_record import CustomerRecord
+from cms_rest.data.sql_alchemy.cms_user_record import CmsUserRecord
+from cms_rest.data.sql_alchemy.region_record import RegionRecord
+from cms_rest.logic.error_base import NotFound
+
+from cms_rest.logger import get_logger
+LOG = get_logger(__name__)
+
+
+class UserRoleRecord:
+
+    def __init__(self, session=None):
+
+        # this model uses for the parameters for any access methods - not as instance of record in the table
+        self.__user_role = UserRole()
+        # self.setRecordData(self.user_role)
+        # self.user_role.Clear()
+
+        self.__TableName = "user_role"
+
+        if (session):
+            self.session = session
+
+    def setDBSession(self, session):
+        self.session = session
+
+    @property
+    def user_role(self):
+        return self.__user_role
+
+    @user_role.setter
+    def user_role(self, user_role):
+        self.__user_rolen = user_role
+
+    def insert(self, user_role):
+        try:
+            self.session.add(user_role)
+        except Exception as exception:
+            LOG.log_exception("Failed to insert user_role" + str(user_role), exception)
+            raise
+
+    def delete_user_from_region(self, customer_id, region_id, user_id):
+        # customer_id can be a uuid (type of string) or id (type of int)
+        # if customer_id is uuid I get id from uuid and use the id in the next sql command
+        if isinstance(customer_id, basestring):
+            customer_record = CustomerRecord(self.session)
+            customer_id = customer_record.get_customer_id_from_uuid(customer_id)
+
+        if isinstance(region_id, basestring):
+            region_query = region_id
+            region_record = RegionRecord(self.session)
+            region_id = region_record.get_region_id_from_name(region_id)
+            if region_id is None:
+                raise NotFound("region %s is not found" % region_query)
+
+        if isinstance(user_id, basestring):
+            user_query = user_id
+            cms_user_record = CmsUserRecord(self.session)
+            user_id = cms_user_record.get_cms_user_id_from_name(user_id)
+            if user_id is None:
+                raise NotFound("user %s is not found" % user_query)
+
+        result = self.session.connection().execute("delete from user_role where customer_id = %d and region_id = %d and user_id = %d" % (customer_id, region_id, user_id))
+        print "num records deleted: " + str(result.rowcount)
+        return result
+
+    def delete_all_users_from_region(self, customer_id, region_id):
+        # customer_id can be a uuid (type of string) or id (type of int)
+        # if customer_id is uuid I get id from uuid and use the id in the next sql command
+        if isinstance(customer_id, basestring):
+            customer_record = CustomerRecord(self.session)
+            customer_id = customer_record.get_customer_id_from_uuid(customer_id)
+
+        if isinstance(region_id, basestring):
+            region_record = RegionRecord(self.session)
+            region_id = region_record.get_region_id_from_name(region_id)
+
+        result = self.session.connection().execute(
+            "delete from user_role where customer_id = {} and region_id = {}".format(customer_id, region_id))
+
+        print "num records deleted: " + str(result.rowcount)
+        return result
diff --git a/orm/services/customer_manager/cms_rest/etc/policy.json b/orm/services/customer_manager/cms_rest/etc/policy.json
new file mode 100755
index 00000000..62e5b6e0
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/etc/policy.json
@@ -0,0 +1,32 @@
+{
+    "default": "!",
+    "admin": "role:admin",
+    "admin_support": "role:admin_support",
+    "admin_viewer": "role:admin_viewer",
+
+    "admin_or_admin_support": "rule:admin or rule:admin_support",
+    "admin_or_admin_support_or_admin_viewer": "rule:admin or rule:admin_support or rule:admin_viewer",
+
+    "customers:get_one": "rule:admin_or_admin_support_or_admin_viewer",
+    "customers:get_all": "rule:admin_or_admin_support_or_admin_viewer",
+    "customers:create": "rule:admin_or_admin_support",
+    "customers:update": "rule:admin",
+    "customers:delete": "rule:admin",
+
+    "customers:add_region": "rule:admin_or_admin_support",
+    "customers:update_region": "rule:admin",
+    "customers:delete_region": "rule:admin",
+
+    "customers:add_region_user": "rule:admin",
+    "customers:update_region_user": "rule:admin",
+    "customers:delete_region_user": "rule:admin",
+
+    "customers:add_default_user": "rule:admin",
+    "customers:update_default_user": "rule:admin",
+    "customers:delete_default_user": "rule:admin",
+
+    "customers:add_metadata": "rule:admin",
+    "customers:update_metadata": "rule:admin",
+
+    "customers:enable": "rule:admin"
+}
\ No newline at end of file
diff --git a/orm/services/customer_manager/cms_rest/extenal_mock/audit_client/__init__.py b/orm/services/customer_manager/cms_rest/extenal_mock/audit_client/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/extenal_mock/audit_client/api/__init__.py b/orm/services/customer_manager/cms_rest/extenal_mock/audit_client/api/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/extenal_mock/audit_client/api/audit.py b/orm/services/customer_manager/cms_rest/extenal_mock/audit_client/api/audit.py
new file mode 100644
index 00000000..ec483bdd
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/extenal_mock/audit_client/api/audit.py
@@ -0,0 +1,6 @@
+def audit(*args, **kwargs):
+    pass
+
+
+def init(*args, **kwargs):
+    pass
diff --git a/orm/services/customer_manager/cms_rest/extenal_mock/keystone_utils/__init__.py b/orm/services/customer_manager/cms_rest/extenal_mock/keystone_utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/extenal_mock/keystone_utils/tokens.py b/orm/services/customer_manager/cms_rest/extenal_mock/keystone_utils/tokens.py
new file mode 100755
index 00000000..99708117
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/extenal_mock/keystone_utils/tokens.py
@@ -0,0 +1,6 @@
+def is_token_valid(token_to_validate, lcp_id, conf, token_role):
+    pass
+
+
+def TokenConf(mech_id, mech_password, rms_url, tenant_name, keystone_version):
+    pass
diff --git a/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/__init__.py b/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/logger.py b/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/logger.py
new file mode 100644
index 00000000..77f80741
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/logger.py
@@ -0,0 +1,2 @@
+def get_logger(*a, **k):
+    pass
diff --git a/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/policy/__init__.py b/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/policy/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/policy/policy.py b/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/policy/policy.py
new file mode 100755
index 00000000..9d652b2b
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/policy/policy.py
@@ -0,0 +1,6 @@
+def init(*a, **kw):
+    pass
+
+
+def enforce(*a, **kw):
+    pass
diff --git a/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/utils.py b/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/utils.py
new file mode 100755
index 00000000..c3591af4
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/utils.py
@@ -0,0 +1,23 @@
+class utils:
+    @staticmethod
+    def set_utils_conf(conf):
+        pass
+
+    @staticmethod
+    def report_config(conf, dump_to_log):
+        pass
+
+    @staticmethod
+    def create_existing_uuid(uuid):
+        pass
+
+
+class api_error_utils:
+
+    @staticmethod
+    def get_error(transaction_id,
+                  error_details="",
+                  message=None,
+                  status_code=400):
+
+        pass
diff --git a/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/utils/__init__.py b/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/utils/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/utils/api_error_utils.py b/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/utils/api_error_utils.py
new file mode 100755
index 00000000..e2b3efee
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/utils/api_error_utils.py
@@ -0,0 +1,8 @@
+
+
+def get_error(transaction_id,
+              error_details="",
+              message=None,
+              status_code=400):
+
+    pass
diff --git a/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/utils/cross_api_utils.py b/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/utils/cross_api_utils.py
new file mode 100755
index 00000000..d27dd1c9
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/utils/cross_api_utils.py
@@ -0,0 +1,6 @@
+def get_regions_of_group(*a, **k):
+    pass
+
+
+def set_utils_conf(*a, **k):
+    pass
diff --git a/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/utils/utils.py b/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/utils/utils.py
new file mode 100755
index 00000000..8cd48467
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/extenal_mock/orm_common/utils/utils.py
@@ -0,0 +1,10 @@
+def set_utils_conf(conf):
+    pass
+
+
+def report_config(conf, dump_to_log):
+    pass
+
+
+def create_existing_uuid(uuid):
+    pass
diff --git a/orm/services/customer_manager/cms_rest/logger/__init__.py b/orm/services/customer_manager/cms_rest/logger/__init__.py
new file mode 100644
index 00000000..1894cbbe
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/logger/__init__.py
@@ -0,0 +1,10 @@
+import logging
+
+
+def get_logger(name):
+    logger = logging.getLogger(name)
+    logger.log_exception = lambda msg, exception: logger.exception(msg + " Exception: " + str(exception))
+
+    return logger
+
+__all__ = ['get_logger']
diff --git a/orm/services/customer_manager/cms_rest/logic/__init__.py b/orm/services/customer_manager/cms_rest/logic/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/logic/customer_logic.py b/orm/services/customer_manager/cms_rest/logic/customer_logic.py
new file mode 100755
index 00000000..df2fc94a
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/logic/customer_logic.py
@@ -0,0 +1,721 @@
+from cms_rest.model.Models import CustomerResultWrapper
+from cms_rest.model.Models import RegionResultWrapper
+from cms_rest.model.Models import UserResultWrapper
+from cms_rest.model.Models import CustomerSummaryResponse, CustomerSummary
+from cms_rest.rds_proxy import RdsProxy
+from cms_rest.data.data_manager import DataManager
+from cms_rest.data.sql_alchemy.models import UserRole
+from cms_rest.logic.error_base import ErrorStatus, NotFound, DuplicateEntryError
+from cms_rest.data.sql_alchemy.models import CustomerMetadata
+from orm_common.utils.cross_api_utils import get_regions_of_group, set_utils_conf
+from orm_common.utils import utils
+
+from pecan import conf, request
+
+import pecan
+import requests
+
+from cms_rest.logger import get_logger
+
+LOG = get_logger(__name__)
+
+
+class CustomerLogic(object):
+    def build_full_customer(self, customer, uuid, datamanager):
+        sql_customer = datamanager.add_customer(customer, uuid)
+
+        for key, value in customer.metadata.iteritems():
+            metadata = CustomerMetadata(field_key=key, field_value=value)
+            sql_customer.customer_metadata.append(metadata)
+
+        datamanager.add_customer_region(sql_customer.id, -1)
+
+        default_region_users = []
+        for user in customer.users:
+            sql_user = datamanager.add_user(user)
+            default_region_users.append(sql_user)
+            sql_user.sql_roles = []
+            for role in user.role:
+                sql_role = datamanager.add_role(role)
+                sql_user.sql_roles.append(sql_role)
+
+        default_quotas = []
+        for quota in customer.defaultQuotas:
+            sql_quota = datamanager.add_quota(sql_customer.id, -1, quota)
+            default_quotas.append(sql_quota)
+
+        for sql_user in default_region_users:
+            for sql_role in sql_user.sql_roles:
+                datamanager.add_user_role(sql_user.id, sql_role.id,
+                                          sql_customer.id, -1)
+
+        self.add_regions_to_db(customer.regions, sql_customer.id, datamanager, customer.users)
+        return sql_customer
+
+    def add_regions_to_db(self, regions, sql_customer_id, datamanager, default_users=[]):
+        for region in regions:
+            users_roles = self.add_user_and_roles_to_db(region.users, default_users,
+                                                        datamanager)
+
+            # NOTE: if region has no users there is no need to update the
+            # default users in that region
+            # if len(region.users) == 0:
+            #     users_roles.extend(self.add_user_and_roles_to_db(
+            # customer.users, datamanager))
+            # else:
+            #     users_roles.extend(self.add_user_and_roles_to_db(
+            # region.users, datamanager))
+
+            sql_region = datamanager.add_region(region)
+            try:
+                datamanager.add_customer_region(sql_customer_id, sql_region.id)
+            except Exception as ex:
+                if hasattr(ex, 'orig') and ex.orig[0] == 1062:
+                    raise DuplicateEntryError(
+                        'Error, duplicate entry, region ' + region.name + ' already associated with customer')
+                raise ex
+
+            for user_role in users_roles:
+                datamanager.add_user_role(user_role[0].id, user_role[1].id,
+                                          sql_customer_id, sql_region.id)
+
+            for quota in region.quotas:
+                datamanager.add_quota(sql_customer_id, sql_region.id, quota)
+
+                # NOTE: if region has no quotas there is no need to update
+                # the default quotas in that region
+                # if len(region.quotas) == 0:
+                #     for quota in customer.defaultQuotas:
+                #         datamanager.add_quota(sql_customer_id,
+                # sql_region.id, quota)
+                # else:
+                #     for quota in region.quotas:
+                #         datamanager.add_quota(sql_customer_id,
+                # sql_region.id, quota)
+
+    def add_user_and_roles_to_db(self, users, default_users, datamanager):
+        users_roles = []
+        for user in users:
+            sql_user = datamanager.add_user(user)
+            for role in user.role:
+                sql_role = datamanager.add_role(role)
+                users_roles.append((sql_user, sql_role))
+        for default_user in default_users:
+            sql_user = datamanager.add_user(default_user)
+            for role in default_user.role:
+                sql_role = datamanager.add_role(role)
+                users_roles.append((sql_user, sql_role))
+
+        return users_roles
+
+    def create_customer(self, customer, uuid, transaction_id):
+        datamanager = DataManager()
+        try:
+            customer.handle_region_group()
+            sql_customer = self.build_full_customer(customer, uuid, datamanager)
+            customer_result_wrapper = build_response(uuid, transaction_id, 'create')
+
+            sql_customer = self.add_default_users_to_empty_regions(sql_customer)
+            if sql_customer.customer_customer_regions and len(sql_customer.customer_customer_regions) > 1:
+                customer_dict = sql_customer.get_proxy_dict()
+                for region in customer_dict["regions"]:
+                    region["action"] = "create"
+
+                datamanager.flush()  # i want to get any exception created by this insert
+                RdsProxy.send_customer_dict(customer_dict, transaction_id, "POST")
+            else:
+                LOG.debug("Customer with no regions - wasn't send to RDS Proxy " + str(customer))
+
+            datamanager.commit()
+
+        except Exception as exp:
+            LOG.log_exception("CustomerLogic - Failed to CreateCustomer", exp)
+            datamanager.rollback()
+            raise
+
+        return customer_result_wrapper
+
+    def update_customer(self, customer, customer_uuid, transaction_id):
+        datamanager = DataManager()
+        try:
+            customer.validate_model('update')
+            customer_record = datamanager.get_record('customer')
+            cutomer_id = customer_record.get_customer_id_from_uuid(
+                customer_uuid)
+
+            sql_customer = customer_record.read_customer_by_uuid(customer_uuid)
+            if not sql_customer:
+                raise ErrorStatus(404, 'customer {0} was not found'.format(customer_uuid))
+            old_customer_dict = sql_customer.get_proxy_dict()
+            customer_record.delete_by_primary_key(cutomer_id)
+            datamanager.flush()
+
+            sql_customer = self.build_full_customer(customer, customer_uuid,
+                                                    datamanager)
+            sql_customer = self.add_default_users_to_empty_regions(sql_customer)
+            new_customer_dict = sql_customer.get_proxy_dict()
+            new_customer_dict["regions"] = self.resolve_regions_actions(old_customer_dict["regions"],
+                                                                        new_customer_dict["regions"])
+
+            customer_result_wrapper = build_response(customer_uuid, transaction_id, 'update')
+            datamanager.flush()  # i want to get any exception created by this insert
+            if not len(new_customer_dict['regions']) == 0:
+                RdsProxy.send_customer_dict(new_customer_dict, transaction_id, "PUT")
+            datamanager.commit()
+
+            return customer_result_wrapper
+
+        except Exception as exp:
+            LOG.log_exception("CustomerLogic - Failed to CreateCustomer", exp)
+            datamanager.rollback()
+            raise
+
+    def resolve_regions_actions(self, old_regions_dict, new_regions_dict):
+        for region in new_regions_dict:
+            old_region = next((r for r in old_regions_dict if r["name"] == region["name"]), None)
+            if old_region:
+                region["action"] = "modify"
+            else:
+                region["action"] = "create"
+
+        for region in old_regions_dict:
+            new_region = next((r for r in new_regions_dict if r["name"] == region["name"]), None)
+            if not new_region:
+                region["action"] = "delete"
+                new_regions_dict.append(region)
+
+        return new_regions_dict
+
+    def add_users(self, customer_uuid, region_name, users, transaction_id, p_datamanager=None):
+        datamanager = None
+        try:
+            if p_datamanager is None:
+                datamanager = DataManager()
+                datamanager.begin_transaction()
+            else:
+                datamanager = p_datamanager
+
+            region_id = datamanager.get_region_id_by_name(region_name)
+            customer_id = datamanager.get_customer_id_by_uuid(customer_uuid)
+
+            if customer_id is None:
+                raise ErrorStatus(404, "customer {} does not exist".format(customer_uuid))
+
+            if region_id is None:
+                raise ErrorStatus(404, "region {} not found".format(region_name))
+
+            self.add_users_to_db(datamanager, customer_id, region_id, users, adding=True)
+
+            customer_record = datamanager.get_record('customer')
+            customer = customer_record.read_customer(customer_id)
+
+            timestamp = utils.get_time_human()
+            datamanager.flush()  # i want to get any exception created by this insert
+            RdsProxy.send_customer(customer, transaction_id, "PUT")
+            if p_datamanager is None:
+                datamanager.commit()
+
+            base_link = '{0}{1}/'.format(conf.server.host_ip,
+                                         pecan.request.path)
+
+            result_users = [{'id': user.id, 'added': timestamp,
+                             'links': {'self': base_link + user.id}} for user in
+                            users]
+            user_result_wrapper = UserResultWrapper(
+                transaction_id=transaction_id, users=result_users)
+
+            return user_result_wrapper
+        except Exception as exception:
+            if 'Duplicate' in exception.message:
+                raise ErrorStatus(409, exception.message)
+            datamanager.rollback()
+            LOG.log_exception("Failed to add_users", exception)
+            raise exception
+
+    def replace_users(self, customer_uuid, region_name, users, transaction_id):
+        datamanager = None
+        try:
+            datamanager = DataManager()
+            datamanager.begin_transaction()
+
+            customer_id = datamanager.get_customer_id_by_uuid(customer_uuid)
+            if customer_id is None:
+                raise ErrorStatus(404, "customer {} does not exist".format(customer_uuid))
+
+            region_id = datamanager.get_region_id_by_name(region_name)
+            if region_id is None:
+                raise ErrorStatus(404, "region {} not found".format(region_name))
+
+            # delete older default user
+            user_role_record = datamanager.get_record('user_role')
+            user_role_record.delete_all_users_from_region(customer_uuid, region_name)  # -1 is default region
+            result = self.add_users(customer_uuid, region_name, users, transaction_id, datamanager)
+            datamanager.commit()
+            return result
+
+        except Exception as exception:
+            datamanager.rollback()
+            LOG.log_exception("Failed to replace_default_users", exception)
+            raise
+
+    def add_users_to_db(self, datamanager, customer_id, region_id, users, adding=False):
+        try:
+            users_roles = []
+            for user in users:
+                sql_user = datamanager.add_user(user)
+                for role in user.role:
+                    sql_role = datamanager.add_role(role)
+                    users_roles.append((sql_user, sql_role))
+            for user_role in users_roles:
+                # TODO: change add_use_role to receive sqlalchemy model (UserRole)
+                datamanager.add_user_role(user_role[0].id, user_role[1].id,
+                                          customer_id, region_id, adding)
+            datamanager.flush()
+        except Exception as exception:
+            LOG.log_exception("Failed to add users", exception)
+            raise
+
+    def delete_users(self, customer_uuid, region_id, user_id, transaction_id):
+        datamanager = DataManager()
+        try:
+            user_role_record = datamanager.get_record('user_role')
+
+            customer = datamanager.get_cusomer_by_uuid(customer_uuid)
+            if customer is None:
+                raise ErrorStatus(404, "customer {} does not exist".format(customer_uuid))
+
+            result = user_role_record.delete_user_from_region(customer_uuid,
+                                                              region_id,
+                                                              user_id)
+            if result.rowcount == 0:
+                raise NotFound("user {} is not found".format(user_id))
+
+            RdsProxy.send_customer(customer, transaction_id, "PUT")
+            datamanager.commit()
+
+            print "User {0} from region {1} in customer {2} deleted".format(
+                user_id, region_id, customer_uuid)
+        except NotFound as e:
+            datamanager.rollback()
+            LOG.log_exception("Failed to delete_users, user not found",
+                              e.message)
+            raise NotFound("Failed to delete users,  %s not found" %
+                           e.message)
+        except Exception as exception:
+            datamanager.rollback()
+            LOG.log_exception("Failed to delete_users", exception)
+            raise exception
+
+    def add_default_users(self, customer_uuid, users, transaction_id, p_datamanager=None):
+        datamanager = None
+        try:
+            if p_datamanager is None:
+                datamanager = DataManager()
+                datamanager.begin_transaction()
+            else:
+                datamanager = p_datamanager
+
+            customer_id = datamanager.get_customer_id_by_uuid(customer_uuid)
+
+            if customer_id is None:
+                raise ErrorStatus(404, "customer {} does not exist".format(customer_uuid))
+
+            self.add_users_to_db(datamanager, customer_id, -1, users, adding=True)
+
+            customer_record = datamanager.get_record('customer')
+            customer = customer_record.read_customer(customer_id)
+
+            timestamp = utils.get_time_human()
+            datamanager.flush()  # i want to get any exception created by this insert
+            if len(customer.customer_customer_regions) > 1:
+                RdsProxy.send_customer(customer, transaction_id, "PUT")
+
+            if p_datamanager is None:
+                datamanager.commit()
+
+            base_link = '{0}{1}/'.format(conf.server.host_ip,
+                                         pecan.request.path)
+
+            result_users = [{'id': user.id, 'added': timestamp,
+                             'links': {'self': base_link + user.id}} for user in
+                            users]
+            user_result_wrapper = UserResultWrapper(
+                transaction_id=transaction_id, users=result_users)
+
+            return user_result_wrapper
+
+        except Exception as exception:
+            datamanager.rollback()
+            if 'Duplicate' in exception.message:
+                raise ErrorStatus(409, exception.message)
+            LOG.log_exception("Failed to add_default_users", exception)
+            raise
+
+    def replace_default_users(self, customer_uuid, users, transaction_id):
+        datamanager = None
+        try:
+            datamanager = DataManager()
+            datamanager.begin_transaction()
+
+            customer_id = datamanager.get_customer_id_by_uuid(customer_uuid)
+            if customer_id is None:
+                raise ErrorStatus(404, "customer {} does not exist".format(customer_uuid))
+
+            # delete older default user
+            user_role_record = datamanager.get_record('user_role')
+            user_role_record.delete_all_users_from_region(customer_uuid, -1)  # -1 is default region
+            result = self.add_default_users(customer_uuid, users, transaction_id, datamanager)
+            datamanager.commit()
+            return result
+
+        except Exception as exception:
+            datamanager.rollback()
+            LOG.log_exception("Failed to replace_default_users", exception)
+            raise
+
+    def delete_default_users(self, customer_uuid, user_id, transaction_id):
+        datamanager = DataManager()
+        try:
+            customer = datamanager.get_cusomer_by_uuid(customer_uuid)
+            if customer is None:
+                raise ErrorStatus(404, "customer {} does not exist".format(customer_uuid))
+
+            user_role_record = datamanager.get_record('user_role')
+            result = user_role_record.delete_user_from_region(customer_uuid,
+                                                              'DEFAULT',
+                                                              user_id)
+
+            if result.rowcount == 0:
+                raise NotFound("user {} is not found".format(user_id))
+
+            datamanager.commit()
+
+            print "User {0} from region {1} in customer {2} deleted".format(
+                user_id, 'DEFAULT', customer_uuid)
+
+        except NotFound as e:
+            datamanager.rollback()
+            LOG.log_exception("Failed to delete_users, user not found",
+                              e.message)
+            raise NotFound("Failed to delete users,  %s not found" %
+                           e.message)
+
+        except Exception as exp:
+            datamanager.rollback()
+            raise exp
+
+    def add_regions(self, customer_uuid, regions, transaction_id):
+        datamanager = DataManager()
+        customer_record = datamanager.get_record('customer')
+        try:
+            # TODO DataBase action
+            customer_id = datamanager.get_customer_id_by_uuid(customer_uuid)
+            if customer_id is None:
+                raise ErrorStatus(404,
+                                  "customer with id {} does not exist".format(
+                                      customer_uuid))
+            self.add_regions_to_db(regions, customer_id, datamanager)
+
+            sql_customer = customer_record.read_customer_by_uuid(customer_uuid)
+
+            sql_customer = self.add_default_users_to_empty_regions(sql_customer)
+            new_customer_dict = sql_customer.get_proxy_dict()
+
+            for region in new_customer_dict["regions"]:
+                new_region = next((r for r in regions if r.name == region["name"]), None)
+                if new_region:
+                    region["action"] = "create"
+                else:
+                    region["action"] = "modify"
+
+            timestamp = utils.get_time_human()
+            datamanager.flush()  # i want to get any exception created by this insert
+            RdsProxy.send_customer_dict(new_customer_dict, transaction_id, "POST")
+            datamanager.commit()
+
+            base_link = '{0}{1}/'.format(conf.server.host_ip,
+                                         pecan.request.path)
+
+            result_regions = [{'id': region.name, 'added': timestamp,
+                               'links': {'self': base_link + region.name}} for
+                              region in regions]
+            region_result_wrapper = RegionResultWrapper(
+                transaction_id=transaction_id, regions=result_regions)
+
+            return region_result_wrapper
+        except Exception as exp:
+            datamanager.rollback()
+            raise
+
+    def replace_regions(self, customer_uuid, regions, transaction_id):
+        datamanager = DataManager()
+        customer_record = datamanager.get_record('customer')
+        customer_region = datamanager.get_record('customer_region')
+        try:
+            customer_id = datamanager.get_customer_id_by_uuid(customer_uuid)
+            if customer_id is None:
+                raise ErrorStatus(404,
+                                  "customer with id {} does not exist".format(
+                                      customer_uuid))
+
+            old_sql_customer = customer_record.read_customer_by_uuid(customer_uuid)
+            if old_sql_customer is None:
+                raise ErrorStatus(404,
+                                  "customer with id {} does not exist".format(
+                                      customer_id))
+            old_customer_dict = old_sql_customer.get_proxy_dict()
+            datamanager.session.expire(old_sql_customer)
+
+            customer_region.delete_all_regions_for_customer(customer_id)
+
+            self.add_regions_to_db(regions, customer_id, datamanager)
+            timestamp = utils.get_time_human()
+
+            new_sql_customer = datamanager.get_cusomer_by_id(customer_id)
+
+            new_sql_customer = self.add_default_users_to_empty_regions(new_sql_customer)
+            new_customer_dict = new_sql_customer.get_proxy_dict()
+
+            datamanager.flush()  # i want to get any exception created by this insert
+
+            new_customer_dict["regions"] = self.resolve_regions_actions(old_customer_dict["regions"],
+                                                                        new_customer_dict["regions"])
+
+            RdsProxy.send_customer_dict(new_customer_dict, transaction_id, "PUT")
+            datamanager.commit()
+
+            base_link = '{0}{1}/'.format(conf.server.host_ip,
+                                         pecan.request.path)
+
+            result_regions = [{'id': region.name, 'added': timestamp,
+                               'links': {'self': base_link + region.name}} for
+                              region in regions]
+            region_result_wrapper = RegionResultWrapper(
+                transaction_id=transaction_id, regions=result_regions)
+
+            return region_result_wrapper
+        except Exception as exp:
+            datamanager.rollback()
+            raise exp
+
+    def delete_region(self, customer_id, region_id, transaction_id):
+        datamanager = DataManager()
+        try:
+            customer_region = datamanager.get_record('customer_region')
+
+            sql_customer = datamanager.get_cusomer_by_uuid(customer_id)
+            if sql_customer is None:
+                raise ErrorStatus(404,
+                                  "customer with id {} does not exist".format(
+                                      customer_id))
+            customer_dict = sql_customer.get_proxy_dict()
+
+            customer_region.delete_region_for_customer(customer_id, region_id)
+            datamanager.flush()  # i want to get any exception created by this insert
+
+            # i want to get any exception created by this insert
+            datamanager.flush()
+
+            region = next((r.region for r in sql_customer.customer_customer_regions if r.region.name == region_id), None)
+            if region:
+                if region.type == 'group':
+                    set_utils_conf(conf)
+                    regions = get_regions_of_group(region.name)
+                else:
+                    regions = [region_id]
+            for region in customer_dict['regions']:
+                if region['name'] in regions:
+                    region['action'] = 'delete'
+
+            RdsProxy.send_customer_dict(customer_dict, transaction_id, "PUT")
+            datamanager.commit()
+
+            LOG.debug("Region {0} in customer {1} deleted".format(region_id,
+                                                                  customer_id))
+        except Exception as exp:
+            datamanager.rollback()
+            raise
+
+    def get_customer(self, customer):
+
+        datamanager = DataManager()
+
+        sql_customer = datamanager.get_cusomer_by_uuid_or_name(customer)
+
+        if not sql_customer:
+            raise ErrorStatus(404, 'customer: {0} not found'.format(customer))
+
+        ret_customer = sql_customer.to_wsme()
+        if sql_customer.get_real_customer_regions():
+            # if we have regions in sql_customer
+
+            resp = requests.get(conf.api.rds_server.base +
+                                conf.api.rds_server.status +
+                                sql_customer.uuid, verify=conf.verify).json()
+
+            for item in ret_customer.regions:
+                for status in resp['regions']:
+                    if status['region'] == item.name:
+                        item.status = status['status']
+                        if status['error_msg']:
+                            item.error_message = status['error_msg']
+            ret_customer.status = resp['status']
+        else:
+            ret_customer.status = 'no regions'
+
+        return ret_customer
+
+    def get_customer_list_by_criteria(self, region, user, starts_with, contains,
+                                      metadata):
+        datamanager = DataManager()
+        customer_record = datamanager.get_record('customer')
+        sql_customers = customer_record.get_customers_by_criteria(region=region,
+                                                                  user=user,
+                                                                  starts_with=starts_with,
+                                                                  contains=contains,
+                                                                  metadata=metadata)
+
+        response = CustomerSummaryResponse()
+        for sql_customer in sql_customers:
+            # get aggregate status for each customer
+            customer_status = RdsProxy.get_status(sql_customer.uuid)
+            customer = CustomerSummary.from_db_model(sql_customer)
+            if customer_status.status_code == 200:
+                customer.status = customer_status.json()['status']
+            response.customers.append(customer)
+
+        return response
+
+    def enable(self, customer_uuid, enabled, transaction_id):
+        try:
+            datamanager = DataManager()
+
+            customer_record = datamanager.get_record('customer')
+            sql_customer = customer_record.read_customer_by_uuid(customer_uuid)
+
+            if not sql_customer:
+                raise ErrorStatus(404, 'customer: {0} not found'.format(customer_uuid))
+
+            sql_customer.enabled = 1 if enabled.enabled else 0
+
+            RdsProxy.send_customer(sql_customer, transaction_id, "PUT")
+
+            datamanager.flush()  # get any exception created by this action
+            datamanager.commit()
+
+        except Exception as exp:
+            datamanager.rollback()
+            raise exp
+
+    def add_default_users_to_empty_regions(self, sql_customer):
+        if len(sql_customer.customer_customer_regions) > 0:
+            for region in sql_customer.customer_customer_regions:
+                if region.region_id == -1:
+                    users = region.customer_region_user_roles[:]
+                    break
+
+            for region in sql_customer.customer_customer_regions:
+                if region.region_id != -1:
+                    for user in users:
+                        u = UserRole()
+                        u.customer_id = region.customer_id
+                        u.region_id = region.region_id
+                        u.user_id = user.user_id
+                        u.role_id = user.role_id
+                        region.customer_region_user_roles.append(u)
+
+        return sql_customer
+
+    def delete_customer_by_uuid(self, customer_id):
+        datamanager = DataManager()
+
+        try:
+            datamanager.begin_transaction()
+            customer_record = datamanager.get_record('customer')
+
+            sql_customer = customer_record.read_customer_by_uuid(customer_id)
+            if sql_customer is None:
+                # The customer does not exist, so the delete operation is
+                # considered successful
+                return
+
+            real_regions = sql_customer.get_real_customer_regions()
+            if len(real_regions) > 0:
+                # Do not delete a customer that still has some regions
+                raise ErrorStatus(405,
+                                  "Cannot delete a customer that has regions. "
+                                  "Please delete the regions first and then "
+                                  "delete the customer.")
+            else:
+                expected_status = 'Success'
+                invalid_status = 'N/A'
+                # Get status from RDS
+                resp = RdsProxy.get_status(sql_customer.uuid)
+                if resp.status_code == 200:
+                    status_resp = resp.json()
+                    if 'status' in status_resp.keys():
+                        LOG.debug(
+                            'RDS returned status: {}'.format(
+                                status_resp['status']))
+                        status = status_resp['status']
+                    else:
+                        # Invalid response from RDS
+                        LOG.error('Response from RDS did not contain status')
+                        status = invalid_status
+                elif resp.status_code == 404:
+                    # Customer not found in RDS, that means it never had any regions
+                    # So it is OK to delete it
+                    LOG.debug(
+                        'Resource not found in RDS, so it is OK to delete')
+                    status = expected_status
+                else:
+                    # Invalid status code from RDS
+                    log_message = 'Invalid response code from RDS: {}'.format(
+                        resp.status_code)
+                    log_message = log_message.replace('\n', '_').replace('\r',
+                                                                         '_')
+                    LOG.warning(log_message)
+                    status = invalid_status
+
+                if status == invalid_status:
+                    raise ErrorStatus(500, "Could not get customer status")
+                elif status != expected_status:
+                    raise ErrorStatus(409,
+                                      "The customer has not been deleted "
+                                      "successfully from all of its regions "
+                                      "(either the deletion failed on one of the "
+                                      "regions or it is still in progress)")
+
+            # OK to delete
+            customer_record.delete_customer_by_uuid(customer_id)
+
+            datamanager.flush()  # i want to get any exception created by this delete
+            datamanager.commit()
+        except Exception as exp:
+            LOG.log_exception("CustomerLogic - Failed to delete customer", exp)
+            datamanager.rollback()
+            raise
+
+
+def build_response(customer_uuid, transaction_id, context):
+    """
+        this function generate th customer action response JSON
+    :param customer_uuid:
+    :param transaction_id:
+    :param context: create or update
+    :return:
+    """
+    # The link should point to the customer itself (/v1/orm/customers/{id})
+    link_elements = request.url.split('/')
+    base_link = '/'.join(link_elements)
+    if context == 'create':
+        base_link += customer_uuid
+
+    timestamp = utils.get_time_human()
+    customer_result_wrapper = CustomerResultWrapper(
+        transaction_id=transaction_id,
+        id=customer_uuid,
+        updated=None,
+        created=timestamp,
+        links={'self': base_link})
+    return customer_result_wrapper
diff --git a/orm/services/customer_manager/cms_rest/logic/error_base.py b/orm/services/customer_manager/cms_rest/logic/error_base.py
new file mode 100755
index 00000000..48b70590
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/logic/error_base.py
@@ -0,0 +1,20 @@
+class Error(Exception):
+    pass
+
+
+class ErrorStatus(Error):
+    def __init__(self, status_code, message=None):
+        self.status_code = status_code
+        self.message = message
+
+
+class NotFound(Error):
+    def __init__(self, message=None, status_code=404):
+        self.status_code = status_code
+        self.message = message
+
+
+class DuplicateEntryError(Error):
+    def __init__(self, message=None, status_code=409):
+        self.status_code = status_code
+        self.message = message
diff --git a/orm/services/customer_manager/cms_rest/logic/metadata_logic.py b/orm/services/customer_manager/cms_rest/logic/metadata_logic.py
new file mode 100755
index 00000000..1de4a6b6
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/logic/metadata_logic.py
@@ -0,0 +1,109 @@
+from cms_rest.data.sql_alchemy.models import CustomerMetadata
+from cms_rest.data.data_manager import DataManager
+from cms_rest.rds_proxy import RdsProxy
+from cms_rest.model.Models import CustomerResultWrapper
+from orm_common.utils import utils
+from pecan import request
+from pecan import conf
+import json
+from cms_rest.logger import get_logger
+
+logger = get_logger(__name__)
+
+
+def add_customer_metadata(customer_uuid, metadata_wrapper, transaction_id):
+    sql_metadata_collection = map_metadata(customer_uuid, metadata_wrapper)
+
+    datamanager = DataManager()
+
+    try:
+        customer_record = datamanager.get_record('customer')
+        sql_customer = customer_record.read_customer_by_uuid(customer_uuid)
+        if not sql_customer:
+            logger.error('customer not found, customer uuid: {0}'.format(customer_uuid))
+            raise ValueError('customer not found, customer uuid: {0}'.format(customer_uuid))
+
+        for metadata in sql_metadata_collection:
+            metadata_match = [m for m in sql_customer.customer_metadata if m.field_key == metadata.field_key]
+            if len(metadata_match) > 0:
+                logger.error('Duplicate metadata key, key already exits: {0}'.format(metadata.field_key))
+                raise AttributeError('Duplicate metadata key, key already exits: {0}'.format(metadata.field_key))
+
+        for metadata in sql_metadata_collection:
+            sql_customer.customer_metadata.append(metadata)
+            logger.debug('updating metadata {0}'.format(json.dumps(metadata.get_proxy_dict())))
+
+        logger.debug('finished appending metadata to customer')
+        if len(sql_customer.customer_customer_regions) > 1:
+            RdsProxy.send_customer(sql_customer, transaction_id, "PUT")
+        datamanager.commit()
+
+        customer_result_wrapper = build_response(customer_uuid, transaction_id)
+
+        return customer_result_wrapper
+
+    except Exception as exp:
+        datamanager.rollback()
+        raise exp
+
+
+def update_customer_metadata(customer_uuid, metadata_wrapper, transaction_id):
+    sql_metadata_collection = map_metadata(customer_uuid, metadata_wrapper)
+
+    datamanager = DataManager()
+
+    try:
+        customer_record = datamanager.get_record('customer')
+        sql_customer = customer_record.read_customer_by_uuid(customer_uuid)
+
+        if not sql_customer:
+            logger.error('customer not found, customer uuid: {0}'.format(customer_uuid))
+            raise ValueError('customer not found, customer uuid: {0}'.format(customer_uuid))
+
+        while len(sql_customer.customer_metadata) > 0:
+            sql_customer.customer_metadata.remove(sql_customer.customer_metadata[0])
+
+        for metadata in sql_metadata_collection:
+            sql_customer.customer_metadata.append(metadata)
+            logger.debug('updating metadata {0}'.format(json.dumps(metadata.get_proxy_dict())))
+
+        if len(sql_customer.customer_customer_regions) > 1:
+            RdsProxy.send_customer(sql_customer, transaction_id, "PUT")
+        datamanager.commit()
+
+        customer_result_wrapper = build_response(customer_uuid, transaction_id)
+
+        return customer_result_wrapper
+
+    except Exception as exp:
+        datamanager.rollback()
+        raise exp
+
+
+def map_metadata(customer_id, metadata_wrapper):
+    sql_metadata_collection = []
+    for key, value in metadata_wrapper.metadata.iteritems():
+        sql_metadata = CustomerMetadata()
+        sql_metadata.customer_id = customer_id
+        sql_metadata.field_key = key
+        sql_metadata.field_value = value
+
+        sql_metadata_collection.append(sql_metadata)
+    return sql_metadata_collection
+
+
+def build_response(customer_uuid, transaction_id):
+    # The link should point to the customer itself (/v1/orm/customers/{id}),
+    # so the 'metadata' element should be removed.
+    link_elements = request.url.split('/')
+    link_elements.remove('metadata')
+    base_link = '/'.join(link_elements)
+
+    timestamp = utils.get_time_human()
+    customer_result_wrapper = CustomerResultWrapper(
+        transaction_id=transaction_id,
+        id=customer_uuid,
+        updated=None,
+        created=timestamp,
+        links={'self': base_link})
+    return customer_result_wrapper
diff --git a/orm/services/customer_manager/cms_rest/model/Model.py b/orm/services/customer_manager/cms_rest/model/Model.py
new file mode 100644
index 00000000..f6a4fd67
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/model/Model.py
@@ -0,0 +1,38 @@
+import inspect
+from wsme import types as wtypes
+from wsme.rest.json import tojson
+
+
+class Model(wtypes.DynamicBase):
+    """Base class for CMS models.
+    """
+
+    def tojson(self):
+        return tojson(type(self), self)
+
+    """
+    def __init__(self, **kwds):
+        self.fields = list(kwds)
+        for k, v in kwds.iteritems():
+            setattr(self, k, v)
+
+    def as_dict(self):
+        d = {}
+        for f in self.fields:
+            v = getattr(self, f)
+            if isinstance(v, Model):
+                v = v.as_dict()
+            elif isinstance(v, list) and v and isinstance(v[0], Model):
+                v = [sub.as_dict() for sub in v]
+            d[f] = v
+        return d
+
+    def __eq__(self, other):
+        return self.as_dict() == other.as_dict()
+
+    @classmethod
+    def get_field_names(cls):
+        fields = inspect.getargspec(cls.__init__)[0]
+        return set(fields) - set(["self"])
+
+    """
diff --git a/orm/services/customer_manager/cms_rest/model/Models.py b/orm/services/customer_manager/cms_rest/model/Models.py
new file mode 100755
index 00000000..8a9a2d45
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/model/Models.py
@@ -0,0 +1,444 @@
+import wsme
+from wsme import types as wtypes
+from cms_rest.model.Model import Model
+from cms_rest.logic.error_base import ErrorStatus
+from pecan import conf
+from orm_common.utils.cross_api_utils import set_utils_conf, get_regions_of_group
+
+
+class Enabled(Model):
+    """enable model the customer
+
+    """
+    enabled = wsme.wsattr(bool, mandatory=True)
+
+    def __init__(self, enabled=None):
+        """Create a new enables class.
+
+        :param enabled: customer status
+        """
+        self.enabled = enabled
+
+
+class Compute(Model):
+    """compute model the customer
+
+    """
+    instances = wsme.wsattr(wsme.types.text, mandatory=True)
+    injected_files = wsme.wsattr(wsme.types.text, mandatory=True, name="injected-files")
+    key_pairs = wsme.wsattr(wsme.types.text, mandatory=True, name="key-pairs")
+    ram = wsme.wsattr(wsme.types.text, mandatory=True)
+    vcpus = wsme.wsattr(wsme.types.text, mandatory=False)
+    metadata_items = wsme.wsattr(wsme.types.text, mandatory=False, name="metadata-items")
+    injected_file_content_bytes = wsme.wsattr(wsme.types.text, mandatory=False, name="injected-file-content-bytes")
+    floating_ips = wsme.wsattr(wsme.types.text, mandatory=False, name="floating-ips")
+    fixed_ips = wsme.wsattr(wsme.types.text, mandatory=False, name="fixed-ips")
+    injected_file_path_bytes = wsme.wsattr(wsme.types.text, mandatory=False, name="injected-file-path-bytes")
+    server_groups = wsme.wsattr(wsme.types.text, mandatory=False, name="server-groups")
+    server_group_members = wsme.wsattr(wsme.types.text, mandatory=False, name="server-group-members")
+
+    def __init__(self, instances='', injected_files='', key_pairs='', ram='',
+                 vcpus=None, metadata_items=None, injected_file_content_bytes=None,
+                 floating_ips='', fixed_ips='', injected_file_path_bytes='',
+                 server_groups='', server_group_members=''):
+        """
+        Create a new compute instance.
+        :param instances:
+        :param injected_files:
+        :param key_pairs:
+        :param ram:
+        :param vcpus:
+        :param metadata_items:
+        :param injected_file_content_bytes:
+        :param floating_ips:
+        :param fixed_ips:
+        :param injected_file_path_bytes:
+        :param server_groups:
+        :param server_group_members:
+        """
+        self.instances = instances
+        self.injected_files = injected_files
+        self.key_pairs = key_pairs
+        self.ram = ram
+        if vcpus is None:
+            self.vcpus = conf.quotas_default_values.compute.vcpus
+        else:
+            self.vcpus = vcpus
+        if metadata_items is None:
+            self.metadata_items = \
+                conf.quotas_default_values.compute.metadata_items
+        else:
+            self.metadata_items = metadata_items
+        if injected_file_content_bytes is None:
+            self.injected_file_content_bytes = \
+                conf.quotas_default_values.compute.injected_file_content_bytes
+        else:
+            self.injected_file_content_bytes = injected_file_content_bytes
+
+        self.floating_ips = floating_ips
+        self.fixed_ips = fixed_ips
+        self.injected_file_path_bytes = injected_file_path_bytes
+        self.server_groups = server_groups
+        self.server_group_members = server_group_members
+
+
+class Storage(Model):
+    """storage info model for customer
+
+    """
+    gigabytes = wsme.wsattr(wsme.types.text, mandatory=True)
+    snapshots = wsme.wsattr(wsme.types.text, mandatory=True)
+    volumes = wsme.wsattr(wsme.types.text, mandatory=True)
+
+    def __init__(self, gigabytes='', snapshots='', volumes=''):
+        """
+        create a new Storage instance.
+        :param gigabytes:
+        :param snapshots:
+        :param volumes:
+        """
+        self.gigabytes = gigabytes
+        self.snapshots = snapshots
+        self.volumes = volumes
+
+
+class Network(Model):
+    """network model the customer
+
+    """
+    floating_ips = wsme.wsattr(wsme.types.text, mandatory=True, name="floating-ips")
+    networks = wsme.wsattr(wsme.types.text, mandatory=True)
+    ports = wsme.wsattr(wsme.types.text, mandatory=True)
+    routers = wsme.wsattr(wsme.types.text, mandatory=True)
+    subnets = wsme.wsattr(wsme.types.text, mandatory=True)
+    security_groups = wsme.wsattr(wsme.types.text, mandatory=False, name="security-groups")
+    security_group_rules = wsme.wsattr(wsme.types.text, mandatory=False, name="security-group-rules")
+    health_monitor = wsme.wsattr(wsme.types.text, mandatory=False, name="health-monitor")
+    member = wsme.wsattr(wsme.types.text, mandatory=False)
+    nat_instance = wsme.wsattr(wsme.types.text, mandatory=False, name="nat-instance")
+    pool = wsme.wsattr(wsme.types.text, mandatory=False)
+    route_table = wsme.wsattr(wsme.types.text, mandatory=False, name="route-table")
+    vip = wsme.wsattr(wsme.types.text, mandatory=False)
+
+    def __init__(self, floating_ips='', networks='', ports='', routers='',
+                 subnets='', security_groups=None, security_group_rules=None,
+                 health_monitor='', member='', nat_instance='',
+                 pool='', route_table='', vip=''):
+
+        """
+        Create a new Network instance.
+        :param floating_ips:  num of floating_ips
+        :param networks:  num of networks
+        :param ports:  num of ports
+        :param routers:  num of routers
+        :param subnets:  num of subnets
+        :param security_groups: security groups
+        :param security_group_rules: security group rules
+        :param health_monitor:
+        :param member:
+        :param nat_instance:
+        :param pool:
+        :param route_table:
+        :param vip:
+        """
+        self.floating_ips = floating_ips
+        self.networks = networks
+        self.ports = ports
+        self.routers = routers
+        self.subnets = subnets
+        if security_groups is None:
+            self.security_groups = conf.quotas_default_values.network.security_groups
+        else:
+            self.security_groups = security_groups
+        if security_group_rules is None:
+            self.security_group_rules = conf.quotas_default_values.network.security_group_rules
+        else:
+            self.security_group_rules = security_group_rules
+
+        self.health_monitor = health_monitor
+        self.member = member
+        self.nat_instance = nat_instance
+        self.pool = pool
+        self.route_table = route_table
+        self.vip = vip
+
+
+class Quota(Model):
+    """network model the customer
+
+    """
+    compute = wsme.wsattr([Compute], mandatory=False)
+    storage = wsme.wsattr([Storage], mandatory=False)
+    network = wsme.wsattr([Network], mandatory=False)
+
+    def __init__(self, compute=None, storage=None, network=None):
+        """Create a new compute.
+
+        :param compute:  compute quota
+        :param storage:  storage quota
+        :param network:  network quota
+        """
+        self.compute = compute
+        self.storage = storage
+        self.network = network
+
+
+class User(Model):
+    """user model the customer
+
+    """
+    id = wsme.wsattr(wsme.types.text, mandatory=True)
+    role = wsme.wsattr([str])
+
+    def __init__(self, id="", role=[]):
+        """Create a new compute.
+
+        :param id:  user id
+        :param role:  roles this use belong to
+        """
+        self.id = id
+        self.role = role
+
+
+class Region(Model):
+    """network model the customer
+
+    """
+    name = wsme.wsattr(wsme.types.text, mandatory=True)
+    type = wsme.wsattr(wsme.types.text, default="single", mandatory=False)
+    quotas = wsme.wsattr([Quota], mandatory=False)
+    users = wsme.wsattr([User], mandatory=False)
+    status = wsme.wsattr(wsme.types.text, mandatory=False)
+    error_message = wsme.wsattr(wsme.types.text, mandatory=False)
+
+    def __init__(self, name="", type="single", quotas=[], users=[], status="",
+                 error_message=""):
+        """Create a new compute.
+
+        :param name:  region name
+        :param type:  region type
+        :param quotas:  quotas ( array of Quota)
+        :param users:   array of users of specific region
+        :param status: status of creation
+        :param error_message: error message if status is error
+        """
+
+        self.name = name
+        self.type = type
+        self.quotas = quotas
+        self.users = users
+        self.status = status
+        if error_message:
+            self.error_message = error_message
+
+
+class Customer(Model):
+    """customer entity with all it's related data
+
+    """
+    description = wsme.wsattr(wsme.types.text, mandatory=True)
+    enabled = wsme.wsattr(bool, mandatory=True)
+    name = wsme.wsattr(wsme.types.text, mandatory=True)
+    metadata = wsme.wsattr(wsme.types.DictType(str, str), mandatory=False)
+    regions = wsme.wsattr([Region], mandatory=False)
+    users = wsme.wsattr([User], mandatory=True)
+    defaultQuotas = wsme.wsattr([Quota], mandatory=True)
+    status = wsme.wsattr(wsme.types.text, mandatory=False)
+    custId = wsme.wsattr(wsme.types.text, mandatory=False)
+    uuid = wsme.wsattr(wsme.types.text, mandatory=False)
+
+    def __init__(self, description="", enabled=False, name="", metadata={}, regions=[], users=[],
+                 defaultQuotas=[], status="", custId="", uuid=None):
+        """Create a new Customer.
+
+        :param description:  Server name
+        :param enabled:  I don't know
+        :param status: status of creation
+        """
+        self.description = description
+        self.enabled = enabled
+        self.name = name
+        self.metadata = metadata
+        self.regions = regions
+        self.users = users
+        self.defaultQuotas = defaultQuotas
+        self.status = status
+        self.custId = custId
+        if uuid is not None:
+            self.uuid = uuid
+
+    def validate_model(self, context=None):
+        """
+        this function check if the customer model meet the demands
+        :param context: i.e. 'create 'update'
+        :return: none
+        """
+        if context == "update":
+            for region in self.regions:
+                if region.type == "group":
+                    raise ErrorStatus(400, "region type is invalid for update, \'group\' can be only in create")
+
+    def handle_region_group(self):
+        regions_to_add = []
+        for region in self.regions[:]:  # get copy of it to be able to delete from the origin
+            if region.type == "group":
+                group_regions = self.get_regions_for_group(region.name)
+                if not group_regions:
+                    raise ErrorStatus(404, 'Group {} Not found'.format(region.name))
+                for group_region in group_regions:
+                    regions_to_add.append(Region(name=group_region,
+                                                 type='single',
+                                                 quotas=region.quotas,
+                                                 users=region.users))
+                self.regions.remove(region)
+
+        self.regions.extend(set(regions_to_add))  # remove duplicates if exist
+
+    def get_regions_for_group(self, group_name):
+        set_utils_conf(conf)
+        regions = get_regions_of_group(group_name)
+        return regions
+
+
+""" Customer Result Handler """
+
+
+class CustomerResult(Model):
+    id = wsme.wsattr(wsme.types.text, mandatory=True)
+    updated = wsme.wsattr(wsme.types.text, mandatory=False)
+    created = wsme.wsattr(wsme.types.text, mandatory=False)
+    links = wsme.wsattr({str: str}, mandatory=True)
+
+    def __init__(self, id, links={}, updated=None, created=None):
+        self.id = id
+        if updated:
+            self.updated = updated
+        elif created:
+            self.created = created
+        self.links = links
+
+
+class CustomerResultWrapper(Model):
+    transaction_id = wsme.wsattr(wsme.types.text, mandatory=True)
+    customer = wsme.wsattr(CustomerResult, mandatory=True)
+
+    def __init__(self, transaction_id, id, links, updated, created):
+        customer_result = CustomerResult(id, links, updated, created)
+        self.transaction_id = transaction_id
+        self.customer = customer_result
+
+
+""" ****************************************************************** """
+
+""" User Result Handler """
+
+
+class UserResult(Model):
+    id = wsme.wsattr(wsme.types.text, mandatory=True)
+    added = wsme.wsattr(wsme.types.text, mandatory=False)
+    links = wsme.wsattr({str: str}, mandatory=True)
+
+    def __init__(self, id=None, added=None, links={}):
+        self.id = id
+        self.added = added
+        self.links = links
+
+
+class UserResultWrapper(Model):
+    transaction_id = wsme.wsattr(wsme.types.text, mandatory=True)
+    users = wsme.wsattr([UserResult], mandatory=True)
+
+    def __init__(self, transaction_id, users):
+        users_result = [UserResult(user['id'], user['added'], user['links']) for user in users]
+
+        self.transaction_id = transaction_id
+        self.users = users_result
+
+
+class MetadataWrapper(Model):
+    metadata = wsme.wsattr(wsme.types.DictType(str, str), mandatory=True)
+
+    def __init__(self, metadata={}):
+        self.metadata = metadata
+
+
+""" ****************************************************************** """
+
+""" Region Result Handler """
+
+
+class RegionResult(Model):
+    id = wsme.wsattr(wsme.types.text, mandatory=True)
+    added = wsme.wsattr(wsme.types.text, mandatory=False)
+    links = wsme.wsattr({str: str}, mandatory=True)
+
+    def __init__(self, id, added=None, links={}):
+        self.id = id
+        self.added = added
+        self.links = links
+
+
+class RegionResultWrapper(Model):
+    transaction_id = wsme.wsattr(wsme.types.text, mandatory=True)
+    regions = wsme.wsattr([RegionResult], mandatory=True)
+
+    def __init__(self, transaction_id, regions):
+        regions_result = [RegionResult(region['id'], region['added'], region['links']) for region in regions]
+
+        self.transaction_id = transaction_id
+        self.regions = regions_result
+
+
+""" ****************************************************************** """
+
+""" CustomerSummary is a DataObject and contains all the fields defined in CustomerSummary structure. """
+
+
+class CustomerSummary(Model):
+    name = wsme.wsattr(wsme.types.text)
+    id = wsme.wsattr(wsme.types.text)
+    description = wsme.wsattr(wsme.types.text)
+    enabled = wsme.wsattr(bool, mandatory=True)
+    num_regions = wsme.wsattr(int, mandatory=True)
+    status = wsme.wsattr(wtypes.text, mandatory=True)
+    regions = wsme.wsattr([str], mandatory=True)
+
+    def __init__(self, name='', id='', description='',
+                 enabled=True, status="", regions=[], num_regions=0):
+        Model.__init__(self)
+
+        self.name = name
+        self.id = id
+        self.description = description
+        self.enabled = enabled
+        self.num_regions = num_regions
+        self.status = status
+        self.regions = regions
+
+    @staticmethod
+    def from_db_model(sql_customer):
+        regions = [region.region.name for region in
+                   sql_customer.customer_customer_regions if
+                   region.region_id != -1]
+        # default region is -1 , check if -1 in customer list if yes it will return (true, flase) equal to (0, 1)
+        num_regions = len(sql_customer.customer_customer_regions) - (-1 in [region.region_id for region in sql_customer.customer_customer_regions])
+        customer = CustomerSummary()
+        customer.id = sql_customer.uuid
+        customer.name = sql_customer.name
+        customer.description = sql_customer.description
+        customer.enabled = bool(sql_customer.enabled)
+        customer.num_regions = num_regions
+        customer.regions = regions
+
+        return customer
+
+
+class CustomerSummaryResponse(Model):
+    customers = wsme.wsattr([CustomerSummary], mandatory=True)
+
+    def __init__(self):
+        Model.__init__(self)
+        self.customers = []
+
+
+""" ****************************************************************** """
diff --git a/orm/services/customer_manager/cms_rest/model/__init__.py b/orm/services/customer_manager/cms_rest/model/__init__.py
new file mode 100644
index 00000000..d983f7bc
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/model/__init__.py
@@ -0,0 +1,15 @@
+from pecan import conf  # noqa
+
+
+def init_model():
+    """
+    This is a stub method which is called at application startup time.
+
+    If you need to bind to a parsed database configuration, set up tables or
+    ORM classes, or perform any database initialization, this is the
+    recommended place to do it.
+
+    For more information working with databases, and some common recipes,
+    see http://pecan.readthedocs.org/en/latest/databases.html
+    """
+    pass
diff --git a/orm/services/customer_manager/cms_rest/rds_proxy.py b/orm/services/customer_manager/cms_rest/rds_proxy.py
new file mode 100755
index 00000000..e205abb9
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/rds_proxy.py
@@ -0,0 +1,106 @@
+import pprint
+import requests
+import json
+from pecan import conf
+from pecan import request
+from cms_rest.logic.error_base import ErrorStatus
+from cms_rest.logger import get_logger
+
+LOG = get_logger(__name__)
+headers = {'content-type': 'application/json'}
+
+
+class RdsProxy(object):
+
+    @staticmethod
+    def get_status(resource_id):
+        try:
+            LOG.debug(
+                "Sending to RDS Server to get status: " + conf.api.rds_server.base + conf.api.rds_server.status + resource_id)
+            resp = requests.get(
+                conf.api.rds_server.base + conf.api.rds_server.status + resource_id,
+                verify=conf.verify)
+            LOG.debug(
+                "Sending to RDS Server to get status: " + conf.api.rds_server.base + conf.api.rds_server.status + resource_id)
+            pp = pprint.PrettyPrinter(width=30)
+            pretty_text = pp.pformat(resp.json())
+            LOG.debug("Response from RDS Server:\n" + pretty_text)
+            return resp
+        except Exception as exp:
+            LOG.log_exception(
+                "CustomerLogic - Failed to Get status for customer : " + resource_id,
+                exp)
+            raise
+
+    @staticmethod
+    def send_customer(customer, transaction_id, method):  # method is "POST" or "PUT"
+        return RdsProxy.send_customer_dict(customer.get_proxy_dict(), transaction_id, method)
+
+    @staticmethod
+    def send_customer_dict(customer_dict, transaction_id, method):  # method is "POST" or "PUT"
+        data = {
+            "service_template":
+                {
+                    "resource": {
+                        "resource_type": "customer"
+                    },
+                    "model": str(json.dumps(customer_dict)),
+                    "tracking": {
+                        "external_id": "",
+                        "tracking_id": transaction_id
+                    }
+                }
+        }
+
+        data_to_display = {
+            "service_template":
+                {
+                    "resource": {
+                        "resource_type": "customer"
+                    },
+                    "model": customer_dict,
+                    "tracking": {
+                        "external_id": "",
+                        "tracking_id": transaction_id
+                    }
+                }
+        }
+
+        pp = pprint.PrettyPrinter(width=30)
+        pretty_text = pp.pformat(data_to_display)
+        wrapper_json = json.dumps(data)
+
+        headers['X-RANGER-Client'] = request.headers[
+            'X-RANGER-Client'] if 'X-RANGER-Client' in request.headers else \
+            'NA'
+        headers['X-RANGER-Requester'] = request.headers[
+            'X-RANGER-Requester'] if 'X-RANGER-Requester' in request.headers else \
+            ''
+
+        LOG.debug("Wrapper JSON before sending action: {0} to Rds Proxy\n{1}".format(method, pretty_text))
+        LOG.info("Sending to RDS Server: " + conf.api.rds_server.base + conf.api.rds_server.resources)
+
+        wrapper_json = json.dumps(data)
+
+        if method == "POST":
+            resp = requests.post(conf.api.rds_server.base + conf.api.rds_server.resources,
+                                 data=wrapper_json,
+                                 headers=headers,
+                                 verify=conf.verify)
+        else:
+            resp = requests.put(conf.api.rds_server.base + conf.api.rds_server.resources,
+                                data=wrapper_json,
+                                headers=headers,
+                                verify=conf.verify)
+        if resp.content:
+            LOG.debug("Response Content from rds server: {0}".format(resp.content))
+
+        content = resp.content
+        if resp.content:
+            content = resp.json()
+
+        if resp.content and 200 <= resp.status_code < 300:
+            content = resp.json()
+            return content
+
+        raise ErrorStatus(resp.status_code, content)
diff --git a/orm/services/customer_manager/cms_rest/templates/error.html b/orm/services/customer_manager/cms_rest/templates/error.html
new file mode 100644
index 00000000..f2d97961
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/templates/error.html
@@ -0,0 +1,12 @@
+<%inherit file="layout.html" />
+
+## provide definitions for blocks we want to redefine
+<%def name="title()">
+    Server Error ${status}
+</%def>
+
+## now define the body of the template
+    <header>
+        <h1>Server Error ${status}</h1>
+    </header>
+    <p>${message}</p>
diff --git a/orm/services/customer_manager/cms_rest/templates/index.html b/orm/services/customer_manager/cms_rest/templates/index.html
new file mode 100644
index 00000000..f17c3862
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/templates/index.html
@@ -0,0 +1,34 @@
+<%inherit file="layout.html" />
+
+## provide definitions for blocks we want to redefine
+<%def name="title()">
+    Welcome to Pecan!
+</%def>
+
+## now define the body of the template
+    <header>
+        <h1><img src="/images/logo.png" /></h1>
+    </header>
+
+    <div id="content">
+
+        <p>This is a sample Pecan project.</p>
+
+        <p>
+            Instructions for getting started can be found online at <a
+            href="http://pecanpy.org" target="window">pecanpy.org</a>
+        </p>
+
+        <p>
+            ...or you can search the documentation here:
+        </p>
+
+        <form method="POST" action="/">
+            <fieldset>
+                <input name="q" />
+                <input type="submit" value="Search" />
+            </fieldset>
+            <small>Enter search terms or a module, class or function name.</small>
+        </form>
+
+    </div>
diff --git a/orm/services/customer_manager/cms_rest/templates/layout.html b/orm/services/customer_manager/cms_rest/templates/layout.html
new file mode 100644
index 00000000..40908591
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/templates/layout.html
@@ -0,0 +1,22 @@
+<html>
+    <head>
+        <title>${self.title()}</title>
+        ${self.style()}
+        ${self.javascript()}
+    </head>
+    <body>
+        ${self.body()}
+    </body>
+</html>
+
+<%def name="title()">
+    Default Title
+</%def>
+
+<%def name="style()">
+    <link rel="stylesheet" type="text/css" media="screen" href="/css/style.css" />
+</%def>
+
+<%def name="javascript()">
+    <script language="text/javascript" src="/javascript/shared.js"></script>
+</%def>
diff --git a/orm/services/customer_manager/cms_rest/tests/__init__.py b/orm/services/customer_manager/cms_rest/tests/__init__.py
new file mode 100644
index 00000000..78ea5274
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/tests/__init__.py
@@ -0,0 +1,22 @@
+import os
+from unittest import TestCase
+from pecan import set_config
+from pecan.testing import load_test_app
+
+__all__ = ['FunctionalTest']
+
+
+class FunctionalTest(TestCase):
+    """
+    Used for functional tests where you need to test your
+    literal application and its integration with the framework.
+    """
+
+    def setUp(self):
+        self.app = load_test_app(os.path.join(
+            os.path.dirname(__file__),
+            'config.py'
+        ))
+
+    def tearDown(self):
+        set_config({}, overwrite=True)
diff --git a/orm/services/customer_manager/cms_rest/tests/config.py b/orm/services/customer_manager/cms_rest/tests/config.py
new file mode 100755
index 00000000..5d1cd11f
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/tests/config.py
@@ -0,0 +1,130 @@
+import os
+from cms_rest.tests.simple_hook_mock import SimpleHookMock
+
+global SimpleHookMock
+
+# Server Specific Configurations
+server = {
+    'port': '7080',
+    'host': '0.0.0.0',
+    'name': 'cms',
+    'host_ip': '0.0.0.0'
+}
+
+# Pecan Application Configurations
+app = {
+    'root': 'cms_rest.controllers.root.RootController',
+    'modules': ['cms_rest'],
+    'static_root': '%(confdir)s/../../public',
+    'template_path': '%(confdir)s/../templates',
+    'debug': True,
+    'errors': {
+        '404': '/error/404',
+        '__force_dict__': True
+    },
+    'hooks': lambda: [SimpleHookMock()]
+}
+
+logging = {
+    'root': {'level': 'INFO', 'handlers': ['console']},
+    'loggers': {
+        'cms_rest': {'level': 'DEBUG', 'handlers': ['console'], 'propagate': False},
+        'pecan': {'level': 'DEBUG', 'handlers': ['console'], 'propagate': False},
+        'py.warnings': {'handlers': ['console']},
+        '__force_dict__': True
+    },
+    'handlers': {
+        'console': {
+            'level': 'DEBUG',
+            'class': 'logging.StreamHandler',
+            'formatter': 'color'
+        }
+    },
+    'formatters': {
+        'simple': {
+            'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]'
+                       '[%(threadName)s] %(message)s')
+        },
+        'color': {
+            '()': 'pecan.log.ColorFormatter',
+            'format': ('%(asctime)s [%(padded_color_levelname)s] [%(name)s]'
+                       '[%(threadName)s] %(message)s'),
+            '__force_dict__': True
+        }
+    }
+}
+
+quotas_default_values = {
+    'compute': {
+        'vcpus': '20',
+        'metadata_items': '128',
+        'injected_file_content_bytes': '10240'
+    },
+    'network': {
+        'security_groups': '10',
+        'security_group_rules': '20'
+    }
+}
+
+api_options = {
+    'mock': {
+        'uuid_server': {
+            'base': 'http://127.0.0.1:3000/uuid/',
+            'uuids': 'v1/uuids'
+        },
+        'rds_server': {
+            'base': 'http://127.0.0.1:3000/rds/',
+            'resources': 'v1/rds/resources',
+            'status': 'v1/rds/status/resource/'
+        },
+        'audit_server': {
+            'base': 'http://127.0.0.1:8776/',
+            'trans': 'v1/audit/transaction'
+        }
+    },
+    'dev': {
+        'uuid_server': {
+            'base': 'http://127.0.0.1:8090/',
+            'uuids': 'v1/uuids'
+        },
+        'rds_server': {
+            'base': 'http://172.20.90.219:8777/',
+            'resources': 'v1/rds/resources',
+            'status': 'v1/rds/status/resource/'
+        },
+        'audit_server': {
+            'base': 'http://127.0.0.1:8776/',
+            'trans': 'v1/audit/transaction'
+        }
+
+    }
+}
+
+cms_mode = None
+if not ('CMS_ENV' in os.environ) or not (os.environ['CMS_ENV'] in api_options):
+    print('!!! NO ENVIRONMENT VARIABLE CMS_ENV SPECIFIED OR NO ENV VARIABLE '
+          'WITH THIS NAME AVAILABLE, RUNNING WITH DEFAULT <dev>')
+    cms_mode = 'dev'
+else:
+    cms_mode = os.environ['CMS_ENV']
+    print('Environment variable found, running under <{0}> environment'.format(cms_mode))
+
+api = api_options[cms_mode]
+
+database = {
+    'connection_string': 'mysql://root:root@localhost:3306/orm_cms_db'
+}
+
+verify = False
+
+authentication = {
+    "enabled": False,
+    "mech_id": "admin",
+    "mech_pass": "stack",
+    "rms_url": "http://127.0.0.1:8080",
+    "tenant_name": "admin",
+    "token_role": "admin",
+    "role_location": {"tenant": "admin"},
+    "keystone_version": "2.0",
+    "policy_file": "/opt/app/orm/aic-orm-cms/cms_rest/etc/policy.json"
+}
diff --git a/orm/services/customer_manager/cms_rest/tests/logic/__init__.py b/orm/services/customer_manager/cms_rest/tests/logic/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/tests/logic/test_customer_logic.py b/orm/services/customer_manager/cms_rest/tests/logic/test_customer_logic.py
new file mode 100755
index 00000000..014e0ddc
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/tests/logic/test_customer_logic.py
@@ -0,0 +1,563 @@
+from cms_rest.data.sql_alchemy import models as sql_models
+from cms_rest.logic import customer_logic
+from cms_rest.tests import FunctionalTest
+from cms_rest.logic.error_base import ErrorStatus
+import cms_rest.model.Models as models
+import mock
+
+customer = None
+data_manager_mock = None
+record_mock = None
+mock_returns_error = False
+flow_type = 0
+rowcount = 1
+
+
+class resultobj():
+    def __init__(self, rowcount=1):
+        self.rowcount = rowcount
+
+
+class RdsStatus(object):
+
+    def __init__(self, status_code=200, status="Success", oy=False):
+        self.status_code = status_code
+        self.status = status
+        self.oy = oy
+
+    def json(self):
+        if self.oy:
+            return {}
+        else:
+            return {"status": self.status}
+
+
+class TestCustomerLogic(FunctionalTest):
+    def setUp(self):
+        global customer
+
+        FunctionalTest.setUp(self)
+        customer_logic.DataManager = get_mock_datamanager
+        customer_logic.pecan = mock.MagicMock()
+
+        customer_logic.utils = mock.MagicMock()
+        customer_logic.utils.make_transid.return_value = 'some_trans_id'
+        customer_logic.utils.audit_trail.return_value = None
+        customer_logic.utils.make_uuid.return_value = 'some_uuid'
+        customer_logic.utils.get_time_human.return_value = '1337'
+
+        customer_logic.RdsProxy = mock.MagicMock()
+        customer_logic.RdsProxy.send_customer.return_value = None
+        customer_logic.RdsProxy.get_status.return_value = RdsStatus()
+
+        customer_logic.build_response = mock.MagicMock()
+
+        customer = models.Customer()
+        user = models.User()
+        customer.users = [user, models.User()]
+        user.role = ['user', 'admin']
+
+        global flow_type
+        flow_type = 0
+
+    def tearDown(self):
+        global mock_returns_error
+        FunctionalTest.tearDown(self)
+
+        mock_returns_error = False
+
+    def test_create_customer_success_with_regions(self):
+        customer.regions = [models.Region(name="a")]
+        logic = customer_logic.CustomerLogic()
+        logic.create_customer(customer, 'some_uuid', 'some_trans_id')
+
+        # sql_customer, trans_id = customer_logic.RdsProxy.send_customer.call_args_list[0][0]
+        # assert trans_id is 'some_trans_id'
+        # assert type(sql_customer) is sql_models.Customer
+        assert data_manager_mock.commit.called
+        assert not data_manager_mock.rollback.called
+
+    def test_add_regions_action(self):
+        regions = [models.Region(), models.Region()]
+        logic = customer_logic.CustomerLogic()
+        logic.add_regions('some_uuid', regions, 'some_trans_id')
+
+        res = customer_logic.RdsProxy.send_customer.call_args_list
+
+    def test_create_customer_add_all_default_users(self):
+        logic = customer_logic.CustomerLogic()
+        logic.create_customer(customer, 'some_uuid', 'some_trans_id')
+
+        assert data_manager_mock.add_user.call_count == 2
+
+    def test_create_customer_fail_rollback(self):
+        global mock_returns_error
+        mock_returns_error = True
+
+        logic = customer_logic.CustomerLogic()
+
+        self.assertRaises(SystemError, logic.create_customer, customer, 'some_uuid', 'some_trans_id')
+
+    def test_update_customer_success(self):
+        logic = customer_logic.CustomerLogic()
+        logic.update_customer(customer, 'some_uuid', 'some_trans_id')
+
+        assert record_mock.delete_by_primary_key.called
+        assert data_manager_mock.commit.called
+        assert not data_manager_mock.rollback.called
+
+    def test_update_customer_fail_rollback(self):
+        global mock_returns_error
+        mock_returns_error = True
+
+        logic = customer_logic.CustomerLogic()
+
+        self.assertRaises(SystemError, logic.update_customer, customer, 'some_uuid', 'some_trans_id')
+
+    def test_add_users_success(self):
+        logic = customer_logic.CustomerLogic()
+        users = [models.User(), models.User()]
+
+        logic.add_users('some_uuid', 'some_region', users, 'some_transaction')
+
+        assert data_manager_mock.add_user.call_count == 2
+        assert data_manager_mock.commit.called
+
+    def test_add_users_error(self):
+        global mock_returns_error
+        mock_returns_error = True
+
+        logic = customer_logic.CustomerLogic()
+        users = [models.User()]
+
+        self.assertRaises(SystemError, logic.add_users, 'id', 'region', users, 'trans_id')
+
+    def test_replace_users_success(self):
+        logic = customer_logic.CustomerLogic()
+        users = [models.User(), models.User()]
+
+        logic.replace_users('some_uuid', 'some_region', users, 'some_transaction')
+
+        assert record_mock.delete_all_users_from_region.called
+        assert data_manager_mock.add_user.called
+        assert data_manager_mock.commit.called
+
+    def test_replace_users_error(self):
+        global mock_returns_error
+        mock_returns_error = True
+
+        logic = customer_logic.CustomerLogic()
+        users = [models.User()]
+
+        self.assertRaises(SystemError, logic.replace_users, 'id', 'region', users, 'trans_id')
+
+    def test_add_customer_with_default_users(self):
+        default_quota = models.Quota()
+        customer.defaultQuotas = [default_quota]
+
+        default_region = models.Region()
+        customer.regions = [default_region]
+
+        default_user = models.User()
+        default_user.role = ['user', 'admin']
+
+        default_region.users = [default_user]
+
+        logic = customer_logic.CustomerLogic()
+
+        logic.create_customer(customer, 'some_uuid', 'some_trans_id')
+
+        assert data_manager_mock.add_user.called
+
+    def test_add_users_with_roles_success(self):
+        user = models.User()
+        user.role = ['user', 'admin']
+
+        users = [user, models.User()]
+
+        logic = customer_logic.CustomerLogic()
+        logic.add_users('some_uuid', 'region_name', users, 'some_trans_id')
+
+        assert data_manager_mock.add_user.call_count == 2
+        assert data_manager_mock.add_role.call_count == 2
+        assert data_manager_mock.commit.called
+
+    def test_delete_users_succes(self):
+        logic = customer_logic.CustomerLogic()
+        logic.delete_users('customer_id', 'region_id', 'user_id', 'transaction_is')
+
+        assert record_mock.delete_user_from_region.called
+        assert data_manager_mock.commit.called
+        assert customer_logic.RdsProxy.send_customer.called
+
+    def test_delete_users_fail_notfound(self):
+        global rowcount
+        rowcount = 0
+        logic = customer_logic.CustomerLogic()
+        with self.assertRaises(customer_logic.NotFound):
+            logic.delete_users('customer_id', 'region_id', 'user_id',
+                               'transaction_is')
+        rowcount = 1
+        assert record_mock.delete_user_from_region.called
+        assert data_manager_mock.rollback.called
+
+    def test_delete_users_error(self):
+        global mock_returns_error
+        mock_returns_error = True
+
+        logic = customer_logic.CustomerLogic()
+
+        self.assertRaises(SystemError, logic.delete_users, 'customer_id', 'region_id', 'user_id', 'transaction_is')
+        assert data_manager_mock.rollback.called
+
+    def test_add_default_users_with_regions_success(self):
+        user = models.User()
+        user.role = ['user', 'admin']
+
+        users = [user, models.User()]
+        logic = customer_logic.CustomerLogic()
+
+        logic.add_default_users('customer_uuid', users, 'transaction_id')
+
+        assert data_manager_mock.commit.called
+        assert data_manager_mock.add_user.call_count == 2
+        assert data_manager_mock.add_role.call_count == 2
+
+    def test_add_default_users_no_regions_success(self):
+        user = models.User()
+        user.role = ['user', 'admin']
+
+        users = [user, models.User()]
+        logic = customer_logic.CustomerLogic()
+
+        logic.add_default_users('customer_uuid', users, 'transaction_id')
+
+        assert data_manager_mock.commit.called
+        assert not customer_logic.RdsProxy.send_customer.called
+        assert data_manager_mock.add_user.call_count == 2
+        assert data_manager_mock.add_role.call_count == 2
+
+    def test_add_default_users_fail(self):
+        global mock_returns_error
+        mock_returns_error = True
+        users = [models.User(), models.User()]
+
+        logic = customer_logic.CustomerLogic()
+
+        self.assertRaises(SystemError, logic.add_default_users, 'customer_uuid', users, 'transaction_id')
+        assert data_manager_mock.rollback.called
+
+    def test_replace_default_users_no_regions_success(self):
+        user = models.User()
+        user.role = ['user', 'admin']
+
+        users = [user, models.User()]
+        logic = customer_logic.CustomerLogic()
+
+        logic.replace_default_users('customer_uuid', users, 'transaction_id')
+
+        assert data_manager_mock.commit.called
+        assert record_mock.delete_all_users_from_region.called
+        assert not customer_logic.RdsProxy.send_customer.called
+        assert data_manager_mock.add_user.call_count == 2
+        assert data_manager_mock.add_role.call_count == 2
+
+    def test_replace_default_users_fail(self):
+        global mock_returns_error
+        mock_returns_error = True
+        users = [models.User(), models.User()]
+
+        logic = customer_logic.CustomerLogic()
+
+        self.assertRaises(SystemError, logic.replace_default_users, 'id', users, 'trans_id')
+        assert data_manager_mock.rollback.called
+
+    def test_delete_default_users_succes(self):
+        logic = customer_logic.CustomerLogic()
+        logic.delete_default_users('customer_id', 'user_id', 'transaction_is')
+
+        assert record_mock.delete_user_from_region.called
+        assert data_manager_mock.commit.called
+
+    def test_delete_default_users_fail_notfound(self):
+        global rowcount
+        rowcount = 0
+        logic = customer_logic.CustomerLogic()
+        with self.assertRaises(customer_logic.NotFound):
+            logic.delete_default_users('customer_id', 'user_id',
+                                       'transaction_is')
+        rowcount = 1
+        assert record_mock.delete_user_from_region.called
+        assert data_manager_mock.rollback.called
+
+    def test_delete_default_users_error(self):
+        global mock_returns_error
+        mock_returns_error = True
+
+        logic = customer_logic.CustomerLogic()
+
+        self.assertRaises(SystemError, logic.delete_default_users, 'customer_id', 'user_id', 'transaction_is')
+        assert data_manager_mock.rollback.called
+
+    def test_add_regions_success(self):
+        regions = [models.Region(), models.Region()]
+        logic = customer_logic.CustomerLogic()
+
+        logic.add_regions('customer_uuid', regions, 'transaction_id')
+
+        assert data_manager_mock.commit.called
+        assert customer_logic.RdsProxy.send_customer_dict.called
+        # assert data_manager_mock.add_region.called
+
+    def test_add_regions_fail(self):
+        global mock_returns_error
+        mock_returns_error = True
+        regions = [models.Region(), models.Region()]
+        logic = customer_logic.CustomerLogic()
+
+        self.assertRaises(SystemError, logic.add_regions, 'customer_uuid', regions, 'transaction_id')
+        assert data_manager_mock.rollback.called
+
+    def test_replace_regions_success(self):
+        regions = [models.Region(), models.Region()]
+        logic = customer_logic.CustomerLogic()
+
+        logic.replace_regions('customer_uuid', regions, 'transaction_id')
+
+        assert data_manager_mock.commit.called
+        assert customer_logic.RdsProxy.send_customer_dict.called
+        assert record_mock.delete_all_regions_for_customer.called
+
+    def test_replace_regions_fail(self):
+        global mock_returns_error
+        mock_returns_error = True
+        regions = [models.Region(), models.Region()]
+        logic = customer_logic.CustomerLogic()
+
+        self.assertRaises(SystemError, logic.replace_regions, 'customer_uuid', regions, 'transaction_id')
+        assert data_manager_mock.rollback.called
+
+    def test_delete_regions_succes(self):
+        logic = customer_logic.CustomerLogic()
+        logic.delete_region('customer_id', 'region_id', 'transaction_is')
+
+        assert record_mock.delete_region_for_customer.called
+        assert data_manager_mock.commit.called
+        assert customer_logic.RdsProxy.send_customer_dict.called
+
+    def test_delete_regions_error(self):
+        global mock_returns_error
+        mock_returns_error = True
+
+        logic = customer_logic.CustomerLogic()
+
+        self.assertRaises(SystemError, logic.delete_region, 'customer_id', 'region_id', 'transaction_is')
+        assert data_manager_mock.rollback.called
+
+    def test_get_customer_list_by_criteria(self):
+        logic = customer_logic.CustomerLogic()
+        result = logic.get_customer_list_by_criteria(None, None, None, None,
+                                                     {"key:value"})
+
+    def test_delete_customer_by_uuid_success(self):
+        logic = customer_logic.CustomerLogic()
+        logic.delete_customer_by_uuid('customer_id')
+
+        # Customer found in CMS DB but not found in RDS
+        customer_logic.RdsProxy.get_status.return_value = RdsStatus(
+            status_code=404)
+        logic.delete_customer_by_uuid('customer_id')
+
+        global flow_type
+        # Change the flow to "customer not found in CMS DB"
+        flow_type = 1
+        logic.delete_customer_by_uuid('customer_id')
+
+    def test_delete_customer_by_uuid_errors(self):
+        global mock_returns_error
+        mock_returns_error = True
+        logic = customer_logic.CustomerLogic()
+        self.assertRaises(SystemError, logic.delete_customer_by_uuid, 'customer_id')
+
+        # RDS returned an empty json
+        mock_returns_error = False
+        customer_logic.RdsProxy.get_status.return_value = RdsStatus(oy=True)
+        self.assertRaises(customer_logic.ErrorStatus,
+                          logic.delete_customer_by_uuid,
+                          'customer_id')
+
+        # RDS returned 500
+        customer_logic.RdsProxy.get_status.return_value = RdsStatus(
+            status_code=500)
+        self.assertRaises(customer_logic.ErrorStatus,
+                          logic.delete_customer_by_uuid,
+                          'customer_id')
+
+        # RDS returned Error status
+        customer_logic.RdsProxy.get_status.return_value = RdsStatus(
+            status='Error')
+        self.assertRaises(customer_logic.ErrorStatus,
+                          logic.delete_customer_by_uuid,
+                          'customer_id')
+
+    def test_delete_customer_by_uuid_conflict(self):
+        global flow_type
+        flow_type = 2
+        logic = customer_logic.CustomerLogic()
+        self.assertRaises(customer_logic.ErrorStatus, logic.delete_customer_by_uuid,
+                          'customer_id')
+
+    def test_enable_success(self):
+        logic = customer_logic.CustomerLogic()
+        logic.enable('customer_id', models.Enabled(True), 'transaction_is')
+
+        self.assertTrue(record_mock.read_customer_by_uuid.called)
+        self.assertTrue(customer_logic.RdsProxy.send_customer.called)
+
+    def test_enable_error(self):
+        global mock_returns_error
+        mock_returns_error = True
+
+        logic = customer_logic.CustomerLogic()
+
+        self.assertRaises(SystemError, logic.enable, 'id', models.Enabled(True), 'trans_id')
+        self.assertTrue(data_manager_mock.rollback.called)
+
+    def test_get_customer_success(self):
+        logic = customer_logic.CustomerLogic()
+        get_mock = mock.MagicMock()
+        get_mock.json.return_value = STATUS_JSON
+        customer_logic.requests.get = mock.MagicMock(return_value=get_mock)
+        logic.get_customer('customer_id')
+
+        self.assertTrue(data_manager_mock.get_cusomer_by_uuid_or_name.called)
+
+    def test_get_customer_not_found(self):
+        global flow_type
+        flow_type = 1
+        # customer_logic.requests.get = mock.MagicMock(return_value=None)
+
+        logic = customer_logic.CustomerLogic()
+
+        self.assertRaises(ErrorStatus, logic.get_customer, 'id')
+
+
+def get_mock_datamanager():
+    global data_manager_mock
+    global record_mock
+    global rowcount
+
+    sql_customer = sql_models.Customer(name='a')
+    sql_customer.customer_customer_regions = []
+
+    sql_customer.add_default_users_to_empty_regions = sql_customer
+
+    data_manager_mock = mock.MagicMock()
+    record_mock = mock.MagicMock()
+    record_mock.get_customers_by_criteria.return_value = [sql_customer]
+
+    def _get_proxy_dict():
+        return {
+            "uuid": 'a',
+            "name": 'a',
+            "description": 'a',
+            "enabled": 1,
+            "regions": []
+        }
+
+    def _get_customer():
+        def mock_to_wsme():
+            return models.Customer(regions=[models.Region(name='DPK', status='Success')])
+
+        def mock_get_real():
+            return True
+
+        sql_customer = sql_models.Customer()
+        sql_customer.get_real_customer_regions = mock_get_real
+        sql_customer.to_wsme = mock_to_wsme
+        sql_customer.uuid = '1337'
+        sql_customer.status = 'Success'
+        sql_customer.name = 'DPK'
+
+        return sql_customer
+
+    def _add_customer(*args, **kwargs):
+        global sql_customer
+        sql_customer = sql_models.Customer()
+        sql_customer.customer_customer_regions = [sql_models.CustomerRegion(region_id=-1)]
+        sql_customer.customer_customer_regions.customer_region_user_roles = [sql_models.UserRole()]
+        sql_customer.add_default_users_to_empty_regions = sql_customer
+        sql_customer.get_proxy_dict = _get_proxy_dict
+        return sql_customer
+
+    def _update_customer(*args, **kwargs):
+        global sql_customer
+        sql_customer = sql_models.Customer(name='a')
+        sql_customer.customer_customer_regions = [sql_models.CustomerRegion(region_id=-1)]
+        sql_customer.customer_customer_regions.customer_region_user_roles = [sql_models.UserRole()]
+        sql_customer.add_default_users_to_empty_regions = sql_customer
+        sql_customer.get_proxy_dict = _get_proxy_dict
+        return sql_customer
+
+    def _add_region(*args, **kwargs):
+        global sql_customer
+        region = sql_models.Region()
+
+        # sql_customer.customer_customer_regions.append(region)
+        return region
+
+    def _add_users(*args, **kwargs):
+        global sql_customer
+        users = sql_models.UserRole()
+
+        sql_customer.customer_customer_regions.customer_region_user_roles = users
+        return users
+
+    if not mock_returns_error:
+        data_manager_mock.add_customer = _add_customer
+        data_manager_mock.update_customer = _update_customer
+        data_manager_mock.add_region = _add_region
+        data_manager_mock.add_user.return_value = sql_models.CmsUser()
+        data_manager_mock.get_cusomer_by_uuid_or_name.return_value = _get_customer()
+
+        record_mock.delete_region_for_customer.return_value = None
+        record_mock.delete_customer_by_uuid.return_value = None
+        if flow_type == 1:
+            record_mock.read_customer_by_uuid.return_value = None
+            data_manager_mock.get_cusomer_by_uuid_or_name.return_value = None
+        elif flow_type == 2:
+            q = mock.MagicMock()
+            q.get_real_customer_regions.return_value = [mock.MagicMock()]
+            record_mock.read_customer_by_uuid.return_value = q
+
+        record_mock.delete_user_from_region.return_value = resultobj(rowcount)
+    else:
+        record_mock.read_customer_by_uuid.side_effect = SystemError()
+        data_manager_mock.add_customer.side_effect = SystemError()
+        data_manager_mock.add_user.side_effect = SystemError()
+        data_manager_mock.add_region.side_effect = SystemError()
+
+        record_mock.delete_region_for_customer.side_effect = SystemError()
+        record_mock.delete_user_from_region.side_effect = SystemError()
+        record_mock.delete_customer_by_uuid.side_effect = SystemError()
+
+    data_manager_mock.get_record.return_value = record_mock
+    data_manager_mock.add_user.return_value = sql_models.CmsUser()
+    data_manager_mock.add_role.return_value = sql_models.CmsRole()
+
+    data_manager_mock.get_cusomer_by_id.return_value = sql_customer
+
+    return data_manager_mock
+
+
+STATUS_JSON = {
+    "regions": [
+        {
+            "status": "Success",
+            "region": "DPK",
+            "error_code": "",
+            "error_msg": ""
+        }
+    ],
+    "status": "Success"
+}
diff --git a/orm/services/customer_manager/cms_rest/tests/rest/__init__.py b/orm/services/customer_manager/cms_rest/tests/rest/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/tests/rest/test_customer.py b/orm/services/customer_manager/cms_rest/tests/rest/test_customer.py
new file mode 100755
index 00000000..142e79e7
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/tests/rest/test_customer.py
@@ -0,0 +1,475 @@
+import mock
+import requests
+import sqlalchemy
+from wsme.exc import ClientSideError
+
+from cms_rest.controllers.v1.orm.customer import root
+from cms_rest.logic.error_base import ErrorStatus
+
+from cms_rest.model import Models
+from cms_rest.tests import FunctionalTest
+from cms_rest.tests import test_utils
+
+customer_logic_mock = None
+
+
+class TestCustomerController(FunctionalTest):
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+        root.authentication = mock.MagicMock()
+
+        root.CustomerLogic = get_mock_customer_logic
+        root.CustomerLogic.return_error = 0
+
+        root.utils = mock.MagicMock()
+        root.utils.make_transid.return_value = 'some_trans_id'
+        root.utils.audit_trail.return_value = None
+        root.utils.make_uuid.return_value = 'some_uuid'
+
+        root.err_utils = mock.MagicMock()
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_create_customer(self):
+        # given
+        requests.post = mock.MagicMock(return_value=ResponseMock(201))
+
+        # when
+        response = self.app.post_json('/v1/orm/customers', CUSTOMER_JSON)
+
+        # assert
+        assert response.status_int == 201
+        assert root.utils.audit_trail.called
+        assert root.utils.make_uuid.called
+        assert customer_logic_mock.create_customer.called
+
+    def test_create_customer_fail(self):
+        # given
+        requests.post = mock.MagicMock()
+
+        root.CustomerLogic.return_error = 1
+
+        root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                               500))
+
+        # when
+        response = self.app.post_json('/v1/orm/customers', CUSTOMER_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    @mock.patch.object(root, 'CustomerLogic')
+    def test_create_flavor_duplicate_name(self, mock_customerlogic):
+        my_mock = mock.MagicMock()
+        my_mock.create_customer = mock.MagicMock(
+            side_effect=sqlalchemy.exc.IntegrityError(
+                'a', 'b',
+                'Duplicate entry \'customer\' for key \'name_idx\''))
+        mock_customerlogic.return_value = my_mock
+
+        root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                               409))
+
+        response = self.app.post_json('/v1/orm/customers', CUSTOMER_JSON,
+                                      expect_errors=True)
+
+        self.assertEqual(response.status_int, 409)
+
+    def test_create_flavor_duplicate_uuid(self):
+        CUSTOMER_JSON['custId'] = 'test'
+        create_existing_uuid = root.utils.create_existing_uuid
+
+        root.utils.create_existing_uuid = mock.MagicMock(side_effect=TypeError('test'))
+
+        root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                               409))
+        response = self.app.post_json('/v1/orm/customers', CUSTOMER_JSON,
+                                      expect_errors=True)
+
+        root.utils.create_existing_uuid = create_existing_uuid
+        del CUSTOMER_JSON['custId']
+
+        self.assertEqual(response.status_int, 409)
+
+    @mock.patch.object(root, 'CustomerLogic')
+    def test_create_flavor_other_error(self, mock_customerlogic):
+        my_mock = mock.MagicMock()
+        my_mock.create_customer = mock.MagicMock(
+            side_effect=sqlalchemy.exc.IntegrityError(
+                'a', 'b',
+                'test \'customer\' for key \'name_idx\''))
+        mock_customerlogic.return_value = my_mock
+
+        root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                               500))
+
+        response = self.app.post_json('/v1/orm/customers', CUSTOMER_JSON,
+                                      expect_errors=True)
+
+        self.assertEqual(response.status_int, 500)
+
+    def test_create_customer_fail_bad_request(self):
+        # given
+        requests.post = mock.MagicMock()
+
+        root.CustomerLogic.return_error = 2
+
+        root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                               404))
+
+        # when
+        response = self.app.post_json('/v1/orm/customers', CUSTOMER_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 404)
+
+    def test_update_customer(self):
+        # given
+        requests.put = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/some_id', CUSTOMER_JSON)
+
+        # assert
+        assert response.status_int == 200
+        assert root.utils.audit_trail.called
+        assert customer_logic_mock.update_customer.called
+
+    def test_update_customer_fail(self):
+        # given
+        requests.put = mock.MagicMock()
+
+        root.CustomerLogic.return_error = 1
+
+        root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                               500))
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/some_id', CUSTOMER_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_update_customer_fail_bad_request(self):
+        # given
+        requests.put = mock.MagicMock()
+
+        root.CustomerLogic.return_error = 2
+
+        root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                               404))
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/some_id', CUSTOMER_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 404)
+
+    def test_get_customer(self):
+        # given
+        requests.get = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.get('/v1/orm/customers/some_id')
+
+        # assert
+        assert response.status_int == 200
+        assert customer_logic_mock.get_customer.called
+
+    def test_get_customer_fail_bad_request(self):
+        # given
+        requests.put = mock.MagicMock()
+
+        root.CustomerLogic.return_error = 1
+
+        root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                               500))
+
+        # when
+        response = self.app.get('/v1/orm/customers/some_id', expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+        assert customer_logic_mock.get_customer.called
+
+    def test_get_customer_fail(self):
+        # given
+        requests.put = mock.MagicMock()
+
+        root.CustomerLogic.return_error = 2
+
+        root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                               404))
+
+        # when
+        response = self.app.get('/v1/orm/customers/some_id', expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 404)
+        assert customer_logic_mock.get_customer.called
+
+    def test_get_list_customer(self):
+        # given
+        requests.get = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.get('/v1/orm/customers?region=SAN1')
+
+        # assert
+        assert customer_logic_mock.get_customer_list_by_criteria.called
+
+    def test_get_list_customer_fail(self):
+        # given
+        requests.get = mock.MagicMock()
+        root.CustomerLogic.return_error = 1
+
+        root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                               500))
+
+        # when
+        response = self.app.get('/v1/orm/customers?region=region', expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_get_list_customer_bad_request(self):
+        # given
+        requests.get = mock.MagicMock()
+        root.CustomerLogic.return_error = 2
+
+        root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                               500))
+
+        # when
+        response = self.app.get('/v1/orm/customers?region=region', expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    @mock.patch.object(root, 'authentication')
+    def test_delete_customer_success(self, mock_auth):
+        response = self.app.delete('/v1/orm/customers/test')
+        self.assertEqual(response.status_int, 204)
+
+    @mock.patch.object(root, 'authentication')
+    def test_delete_customer_conflict(self, mock_auth):
+        root.CustomerLogic.return_error = 2
+        root.err_utils.get_error = test_utils.get_error
+        response = self.app.delete('/v1/orm/customers/test', expect_errors=True)
+
+        self.assertEqual(response.status_int, 409)
+
+    @mock.patch.object(root, 'authentication')
+    def test_delete_customer_error(self, mock_auth):
+        root.CustomerLogic.return_error = 1
+        root.err_utils.get_error = test_utils.get_error
+        response = self.app.delete('/v1/orm/customers/test', expect_errors=True)
+
+        self.assertEqual(response.status_int, 500)
+
+
+def get_mock_customer_logic():
+    global customer_logic_mock
+    customer_logic_mock = mock.MagicMock()
+
+    if root.CustomerLogic.return_error == 0:
+        res = Models.CustomerResultWrapper(transaction_id='1',
+                                           id='1',
+                                           links={},
+                                           updated=None,
+                                           created='1')
+
+        list_res = Models.CustomerSummaryResponse()
+        list_res.customers.append(Models.CustomerSummary(name='1', id='1', description='1'))
+
+        customer_logic_mock.create_customer.return_value = res
+        customer_logic_mock.update_customer.return_value = res
+        customer_logic_mock.get_customer.return_value = Models.Customer(**RET_CUSTOMER_JSON)
+        customer_logic_mock.get_customer_list_by_criteria.return_value = list_res
+
+    elif root.CustomerLogic.return_error == 1:
+        customer_logic_mock.create_customer.side_effect = SystemError()
+        customer_logic_mock.update_customer.side_effect = SystemError()
+        customer_logic_mock.get_customer.side_effect = SystemError()
+        customer_logic_mock.delete_customer_by_uuid.side_effect = SystemError()
+        customer_logic_mock.get_customer_list_by_criteria.side_effect = SystemError()
+
+    else:
+        customer_logic_mock.create_customer.side_effect = ErrorStatus(status_code=404)
+        customer_logic_mock.update_customer.side_effect = ErrorStatus(status_code=404)
+        customer_logic_mock.get_customer.side_effect = ErrorStatus(status_code=404)
+        customer_logic_mock.delete_customer_by_uuid.side_effect = ErrorStatus(
+            status_code=409)
+        customer_logic_mock.get_customer_list_by_criteria.side_effect = ErrorStatus(status_code=404)
+
+    return customer_logic_mock
+
+
+class ResponseMock:
+    def __init__(self, status_code=200):
+        self.status_code = status_code
+
+
+CUSTOMER_JSON = {
+    "description": "Customer description",
+    "enabled": True,
+    "name": "myDomain",
+    "metadata": {
+        "my_server_name": "Apache1",
+        "ocx_cust": "123456889"
+    },
+    "regions": [
+        {
+            "name": "SAN1",
+            "type": "single",
+            "quotas": [
+                {
+                    "compute": [
+                        {
+                            "instances": "10",
+                            "injected-files": "10",
+                            "key-pairs": "10",
+                            "ram": "10"
+                        }
+                    ],
+                    "storage": [
+                        {
+                            "gigabytes": "10",
+                            "snapshots": "10",
+                            "volumes": "10"
+                        }
+                    ],
+                    "network": [
+                        {
+                            "floating-ips": "10",
+                            "networks": "10",
+                            "ports": "10",
+                            "routers": "10",
+                            "subnets": "10"
+                        }
+                    ]
+                }
+            ]
+        },
+        {
+            "name": "AIC_MEDIUM",
+            "type": "group",
+            "quotas": [
+                {
+                    "compute": [
+                        {
+                            "instances": "10",
+                            "injected-files": "10",
+                            "key-pairs": "10",
+                            "ram": "10"
+                        }
+                    ],
+                    "storage": [
+                        {
+                            "gigabytes": "10",
+                            "snapshots": "10",
+                            "volumes": "10"
+                        }
+                    ],
+                    "network": [
+                        {
+                            "floating-ips": "10",
+                            "networks": "10",
+                            "ports": "10",
+                            "routers": "10",
+                            "subnets": "10"
+                        }
+                    ]
+                }
+            ]
+        }
+    ],
+    "users": [
+        {
+            "id": "userId1",
+            "role": [
+                "admin",
+                "other"
+            ]
+        },
+        {
+            "id": "userId2",
+            "role": [
+                "storage"
+            ]
+        }
+    ],
+    "defaultQuotas": [
+        {
+            "compute": [
+                {
+                    "instances": "10",
+                    "injected-files": "10",
+                    "key-pairs": "10",
+                    "ram": "10"
+                }
+            ],
+            "storage": [
+                {
+                    "gigabytes": "10",
+                    "snapshots": "10",
+                    "volumes": "10"
+                }
+            ],
+            "network": [
+                {
+                    "floating-ips": "10",
+                    "networks": "10",
+                    "ports": "10",
+                    "routers": "10",
+                    "subnets": "10"
+                }
+            ]
+        }
+    ]
+}
+
+RET_CUSTOMER_JSON = {
+    "description": "Customer description",
+    "enabled": True,
+    "name": "myDomain",
+    "metadata": {
+        "my_server_name": "Apache1",
+        "ocx_cust": "123456889"
+    },
+    "regions": [Models.Region(**{"name": "SAN1", "type": "single", "quotas": [Models.Quota(**{
+        "compute": [Models.Compute(instances='1', injected_files='1', key_pairs='1', ram='1',
+                                   vcpus='1', metadata_items='1', injected_file_content_bytes='1',
+                                   floating_ips='1', fixed_ips='1', injected_file_path_bytes='1',
+                                   server_groups='1', server_group_members='1')],
+        "storage": [Models.Storage(gigabytes='1', snapshots='1', volumes='1')],
+        "network": [Models.Network(floating_ips='1', networks='1', ports='1', routers='1', subnets='1',
+                                   security_groups='1', security_group_rules='1', health_monitor='1',
+                                   member='1', pool='1', nat_instance='1', route_table='1', vip='1')]
+    })]})],
+    "users": [Models.User(**
+                          {"id": "userId1", "role": ["admin", "other"]})
+              ],
+    "defaultQuotas": [Models.Quota(**{
+        "compute": [Models.Compute(instances='1', injected_files='1', key_pairs='1', ram='1',
+                                   vcpus='1', metadata_items='1', injected_file_content_bytes='1',
+                                   floating_ips='1', fixed_ips='1', injected_file_path_bytes='1',
+                                   server_groups='1', server_group_members='1')],
+        "storage": [Models.Storage(gigabytes='1', snapshots='1', volumes='1')],
+        "network": [Models.Network(floating_ips='1', networks='1', ports='1', routers='1', subnets='1',
+                                   security_groups='1', security_group_rules='1', health_monitor='1',
+                                   member='1', pool='1', nat_instance='1', route_table='1', vip='1')]
+    })]
+}
+
+INVALID_CREATE_CUSTOMER_DATA = {
+    "descriptionInvalid": "Customer description",
+    "enabled": True,
+    "name": "myDomain",
+    "metadata": {
+        "my_server_name": "Apache1",
+        "ocx_cust": "123456889"
+    }
+}
diff --git a/orm/services/customer_manager/cms_rest/tests/rest/test_enable.py b/orm/services/customer_manager/cms_rest/tests/rest/test_enable.py
new file mode 100755
index 00000000..ccbb3733
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/tests/rest/test_enable.py
@@ -0,0 +1,101 @@
+import mock
+import requests
+
+from cms_rest.controllers.v1.orm.customer import enabled
+from cms_rest.logic.error_base import ErrorStatus
+from cms_rest.model import Models
+from cms_rest.tests import FunctionalTest
+
+customer_logic_mock = None
+
+
+class TestEnabledController(FunctionalTest):
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+        enabled.authentication = mock.MagicMock()
+
+        enabled.CustomerLogic = get_mock_customer_logic
+        enabled.CustomerLogic.return_error = 0
+
+        enabled.utils = mock.MagicMock()
+        enabled.utils.make_transid.return_value = 'some_trans_id'
+        enabled.utils.audit_trail.return_value = None
+        enabled.utils.make_uuid.return_value = 'some_uuid'
+
+        enabled.err_utils = mock.MagicMock()
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_enable(self):
+        # given
+        requests.put = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{customer id}/enabled/', ENABLED_JSON)
+
+        # assert
+        self.assertTrue(response.status_int, 200)
+        self.assertTrue(enabled.utils.audit_trail.called)
+        self.assertTrue(customer_logic_mock.enable.called)
+
+    def test_enable_fail(self):
+        # given
+        requests.put = mock.MagicMock()
+        enabled.CustomerLogic.return_error = 2
+        enabled.CustomerLogic = get_mock_customer_logic
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{customer id}/enabled/',
+                                     ENABLED_JSON, expect_errors=True)
+
+        # assert
+        self.assertTrue(response.status_int, 404)
+        self.assertTrue(customer_logic_mock.enable.called)
+
+    def test_enable_bad_request(self):
+        # given
+        requests.put = mock.MagicMock()
+        enabled.CustomerLogic.return_error = 1
+        enabled.CustomerLogic = get_mock_customer_logic
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{customer id}/enabled/',
+                                     ENABLED_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+        self.assertTrue(customer_logic_mock.enable.called)
+
+
+def get_mock_customer_logic():
+    global customer_logic_mock
+    customer_logic_mock = mock.MagicMock()
+
+    if enabled.CustomerLogic.return_error == 0:
+        res = Models.CustomerResultWrapper(transaction_id='1',
+                                           id='1',
+                                           links={},
+                                           updated=None,
+                                           created='1')
+
+        customer_logic_mock.enable.return_value = res
+
+    elif enabled.CustomerLogic.return_error == 1:
+        customer_logic_mock.enable.side_effect = SystemError()
+
+    elif enabled.CustomerLogic.return_error == 2:
+        customer_logic_mock.enable.side_effect = ErrorStatus(status_code=404)
+
+    return customer_logic_mock
+
+
+class ResponseMock:
+    def __init__(self, status_code=200):
+        self.status_code = status_code
+
+
+ENABLED_JSON = {
+    "enabled": "true"
+}
diff --git a/orm/services/customer_manager/cms_rest/tests/rest/test_metadata.py b/orm/services/customer_manager/cms_rest/tests/rest/test_metadata.py
new file mode 100755
index 00000000..6e7f2057
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/tests/rest/test_metadata.py
@@ -0,0 +1,243 @@
+import mock
+import requests
+
+from cms_rest.controllers.v1.orm.customer import metadata
+from cms_rest.logic.error_base import ErrorStatus
+from cms_rest.model import Models
+from cms_rest.tests import FunctionalTest
+
+metadata_logic_mock = None
+
+
+class TestMetadataController(FunctionalTest):
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+        metadata.authentication = mock.MagicMock()
+
+        metadata.logic.return_error = 0
+        metadata.logic = get_mock_customer_logic()
+
+        metadata.utils = mock.MagicMock()
+        metadata.utils.make_transid.return_value = 'some_trans_id'
+        metadata.utils.audit_trail.return_value = None
+        metadata.utils.make_uuid.return_value = 'some_uuid'
+
+        metadata.err_utils = mock.MagicMock()
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_add_metadata(self):
+        # given
+        requests.post = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.post_json('/v1/orm/customers/{customer id}/metadata/', METADATA_JSON)
+
+        # assert
+        self.assertTrue(response.status_int, 200)
+        self.assertTrue(metadata.utils.audit_trail.called)
+        self.assertTrue(metadata_logic_mock.add_customer_metadata.called)
+
+    def test_add_metadata_fail(self):
+        # given
+        requests.post = mock.MagicMock()
+        metadata.logic.return_error = 2
+        metadata.logic = get_mock_customer_logic()
+
+        # when
+        response = self.app.post_json('/v1/orm/customers/{customer id}/metadata/',
+                                      METADATA_JSON, expect_errors=True)
+
+        # assert
+        self.assertTrue(response.status_int, 404)
+        self.assertTrue(metadata_logic_mock.add_customer_metadata.called)
+
+    def test_add_metadata_bad_request(self):
+        # given
+        requests.post = mock.MagicMock()
+        metadata.logic.return_error = 1
+        metadata.logic = get_mock_customer_logic()
+
+        # when
+        response = self.app.post_json('/v1/orm/customers/{customer id}/metadata/',
+                                      METADATA_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+        self.assertTrue(metadata_logic_mock.add_customer_metadata.called)
+
+    def test_add_metadata_lu_Error(self):
+        # given
+        requests.post = mock.MagicMock()
+        metadata.logic.return_error = 3
+        metadata.logic = get_mock_customer_logic()
+
+        # when
+        response = self.app.post_json('/v1/orm/customers/{customer id}/metadata/',
+                                      METADATA_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+        self.assertTrue(metadata_logic_mock.add_customer_metadata.called)
+
+    def test_add_metadata_att_Error(self):
+        # given
+        requests.post = mock.MagicMock()
+        metadata.logic.return_error = 4
+        metadata.logic = get_mock_customer_logic()
+
+        # when
+        response = self.app.post_json('/v1/orm/customers/{customer id}/metadata/',
+                                      METADATA_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+        self.assertTrue(metadata_logic_mock.add_customer_metadata.called)
+
+    def test_add_metadata_value_Error(self):
+        # given
+        requests.post = mock.MagicMock()
+        metadata.logic.return_error = 5
+        metadata.logic = get_mock_customer_logic()
+
+        # when
+        response = self.app.post_json('/v1/orm/customers/{customer id}/metadata/',
+                                      METADATA_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+        self.assertTrue(metadata_logic_mock.add_customer_metadata.called)
+
+    def test_update_metadata(self):
+        # given
+        requests.put = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{customer id}/metadata/', METADATA_JSON)
+
+        # assert
+        self.assertTrue(response.status_int, 200)
+        self.assertTrue(metadata.utils.audit_trail.called)
+        self.assertTrue(metadata_logic_mock.update_customer_metadata.called)
+
+    def test_update_metadata_fail(self):
+        # given
+        requests.put = mock.MagicMock()
+        metadata.logic.return_error = 2
+        metadata.logic = get_mock_customer_logic()
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{customer id}/metadata/',
+                                     METADATA_JSON, expect_errors=True)
+
+        # assert
+        self.assertTrue(response.status_int, 404)
+        self.assertTrue(metadata_logic_mock.update_customer_metadata.called)
+
+    def test_update_metadata_bad_request(self):
+        # given
+        requests.put = mock.MagicMock()
+        metadata.logic.return_error = 1
+        metadata.logic = get_mock_customer_logic()
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{customer id}/metadata/',
+                                     METADATA_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+        self.assertTrue(metadata_logic_mock.update_customer_metadata.called)
+
+    def test_update_metadata_lu_Error(self):
+        # given
+        requests.put = mock.MagicMock()
+        metadata.logic.return_error = 3
+        metadata.logic = get_mock_customer_logic()
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{customer id}/metadata/',
+                                     METADATA_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+        self.assertTrue(metadata_logic_mock.update_customer_metadata.called)
+
+    def test_update_metadata_att_Error(self):
+        # given
+        requests.put = mock.MagicMock()
+        metadata.logic.return_error = 4
+        metadata.logic = get_mock_customer_logic()
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{customer id}/metadata/',
+                                     METADATA_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+        self.assertTrue(metadata_logic_mock.update_customer_metadata.called)
+
+    def test_update_metadata_value_Error(self):
+        # given
+        requests.put = mock.MagicMock()
+        metadata.logic.return_error = 5
+        metadata.logic = get_mock_customer_logic()
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{customer id}/metadata/',
+                                     METADATA_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+        self.assertTrue(metadata_logic_mock.update_customer_metadata.called)
+
+
+def get_mock_customer_logic():
+    global metadata_logic_mock
+    metadata_logic_mock = mock.MagicMock()
+
+    if metadata.logic.return_error == 0:
+        res = Models.CustomerResultWrapper(transaction_id='1',
+                                           id='1',
+                                           links={},
+                                           updated=None,
+                                           created='1')
+
+        metadata_logic_mock.add_customer_metadata.return_value = res
+        metadata_logic_mock.update_customer_metadata.return_value = res
+
+    elif metadata.logic.return_error == 1:
+        metadata_logic_mock.add_customer_metadata.side_effect = SystemError()
+        metadata_logic_mock.update_customer_metadata.side_effect = SystemError()
+
+    elif metadata.logic.return_error == 2:
+        metadata_logic_mock.add_customer_metadata.side_effect = ErrorStatus(status_code=404)
+        metadata_logic_mock.update_customer_metadata.side_effect = ErrorStatus(status_code=404)
+
+    elif metadata.logic.return_error == 3:
+        metadata_logic_mock.add_customer_metadata.side_effect = LookupError()
+        metadata_logic_mock.update_customer_metadata.side_effect = LookupError()
+
+    elif metadata.logic.return_error == 4:
+        metadata_logic_mock.add_customer_metadata.side_effect = AttributeError()
+        metadata_logic_mock.update_customer_metadata.side_effect = AttributeError()
+
+    elif metadata.logic.return_error == 5:
+        metadata_logic_mock.add_customer_metadata.side_effect = ValueError()
+        metadata_logic_mock.update_customer_metadata.side_effect = ValueError()
+
+    return metadata_logic_mock
+
+
+class ResponseMock:
+    def __init__(self, status_code=200):
+        self.status_code = status_code
+
+
+METADATA_JSON = {
+    "metadata": {
+        "my_server_name": "Apache1",
+        "ocx_cust": "12356889"
+    }
+}
diff --git a/orm/services/customer_manager/cms_rest/tests/rest/test_regions.py b/orm/services/customer_manager/cms_rest/tests/rest/test_regions.py
new file mode 100755
index 00000000..07b135fd
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/tests/rest/test_regions.py
@@ -0,0 +1,240 @@
+import mock
+import requests
+
+from wsme.exc import ClientSideError
+
+from cms_rest.controllers.v1.orm.customer import regions
+from cms_rest.logic.error_base import ErrorStatus
+from cms_rest.model import Models
+from cms_rest.tests import FunctionalTest
+
+customer_logic_mock = None
+
+
+class TestRegionController(FunctionalTest):
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+        regions.authentication = mock.MagicMock()
+
+        regions.CustomerLogic = get_mock_customer_logic
+        regions.CustomerLogic.return_error = 0
+
+        regions.utils = mock.MagicMock()
+        regions.utils.make_transid.return_value = 'some_trans_id'
+        regions.utils.audit_trail.return_value = None
+        regions.utils.make_uuid.return_value = 'some_uuid'
+
+        regions.err_utils = mock.MagicMock()
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_add_regions(self):
+        # given
+        requests.post = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.post_json('/v1/orm/customers/{customer id}/regions/', REGION_JSON)
+
+        # assert
+        assert response.status_int == 200
+        assert regions.utils.audit_trail.called
+        assert customer_logic_mock.add_regions.called
+
+    def test_add_regions_fail(self):
+        # given
+        requests.post = mock.MagicMock()
+
+        regions.CustomerLogic.return_error = 1
+
+        regions.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                  500))
+
+        # when
+        response = self.app.post_json('/v1/orm/customers/{customer id}/regions/', REGION_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_replace_regions_specific_region(self):
+        regions.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                  405))
+
+        response = self.app.put_json(
+            '/v1/orm/customers/{customer id}/regions/test', REGION_JSON,
+            expect_errors=True)
+        self.assertEqual(response.status_int, 405)
+
+    def test_add_regions_fail_bad(self):
+        # given
+        requests.post = mock.MagicMock()
+
+        regions.CustomerLogic.return_error = 2
+
+        regions.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                  404))
+
+        # when
+        response = self.app.post_json('/v1/orm/customers/{customer id}/regions/', REGION_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 404)
+
+    def test_replace_regions(self):
+        # given
+        requests.put = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{customer id}/regions/', REGION_JSON)
+
+        # assert
+        assert response.status_int == 200
+        assert regions.utils.audit_trail.called
+        assert customer_logic_mock.replace_regions.called
+
+    def test_replace_regions_fail(self):
+        # given
+        requests.put = mock.MagicMock()
+
+        regions.CustomerLogic.return_error = 1
+
+        regions.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                  500))
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{customer id}/regions/', REGION_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_replace_regions_fail_bad(self):
+        # given
+        requests.put = mock.MagicMock()
+
+        regions.CustomerLogic.return_error = 2
+
+        regions.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                  404))
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{customer id}/regions/', REGION_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 404)
+
+    def test_delete_regions(self):
+        # given
+        requests.delete = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.delete('/v1/orm/customers/{customer id}/regions/{region_id}')
+
+        # assert
+        assert response.status_int == 204
+        assert regions.utils.audit_trail.called
+        assert customer_logic_mock.delete_region.called
+
+    def test_delete_regions_fail_bad(self):
+        # given
+        requests.delete = mock.MagicMock()
+
+        regions.CustomerLogic.return_error = 1
+
+        regions.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                  500))
+
+        # when
+        response = self.app.delete('/v1/orm/customers/{customer id}/regions/{region_id}', expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_delete_regions_fail(self):
+        # given
+        requests.delete = mock.MagicMock()
+
+        regions.CustomerLogic.return_error = 2
+
+        regions.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                  404))
+
+        # when
+        response = self.app.delete('/v1/orm/customers/{customer id}/regions/{region_id}', expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 404)
+
+    def test_get(self):
+        # given
+        requests.get = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.get('/v1/orm/customers/some_id/regions/some_id')
+
+        # assert
+        assert response.status_int == 200
+
+
+def get_mock_customer_logic():
+    global customer_logic_mock
+    customer_logic_mock = mock.MagicMock()
+
+    if regions.CustomerLogic.return_error == 0:
+        res = Models.RegionResultWrapper(transaction_id='1', regions=[])
+
+        customer_logic_mock.add_regions.return_value = res
+        customer_logic_mock.replace_regions.return_value = res
+
+    elif regions.CustomerLogic.return_error == 1:
+        customer_logic_mock.add_regions.side_effect = SystemError()
+        customer_logic_mock.replace_regions.side_effect = SystemError()
+        customer_logic_mock.delete_region.side_effect = SystemError()
+
+    else:
+        customer_logic_mock.add_regions.side_effect = ErrorStatus(status_code=404)
+        customer_logic_mock.replace_regions.side_effect = ErrorStatus(status_code=404)
+        customer_logic_mock.delete_region.side_effect = ErrorStatus(status_code=404)
+
+    return customer_logic_mock
+
+
+class ResponseMock:
+    def __init__(self, status_code=200):
+        self.status_code = status_code
+
+
+REGION_JSON = [
+    {
+        "name": "SAN1",
+        "type": "single",
+        "quotas": [
+            {
+                "compute": [
+                    {
+                        "instances": "10",
+                        "injected-files": "10",
+                        "key-pairs": "10",
+                        "ram": "10"
+                    }
+                ],
+                "storage": [
+                    {
+                        "gigabytes": "10",
+                        "snapshots": "10",
+                        "volumes": "10"
+                    }
+                ],
+                "network": [
+                    {
+                        "floating-ips": "10",
+                        "networks": "10",
+                        "ports": "10",
+                        "routers": "10",
+                        "subnets": "10"
+                    }
+                ]
+            }
+        ]
+    }
+]
diff --git a/orm/services/customer_manager/cms_rest/tests/rest/test_users.py b/orm/services/customer_manager/cms_rest/tests/rest/test_users.py
new file mode 100755
index 00000000..fc1f6d70
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/tests/rest/test_users.py
@@ -0,0 +1,363 @@
+import mock
+import requests
+from wsme.exc import ClientSideError
+
+from cms_rest.controllers.v1.orm.customer import users
+from cms_rest.logic.error_base import ErrorStatus
+from cms_rest.model import Models
+from cms_rest.tests import FunctionalTest
+
+customer_logic_mock = None
+
+
+class TestUserController(FunctionalTest):
+    def setUp(self):
+        global original_audit_trail
+        FunctionalTest.setUp(self)
+
+        users.authentication = mock.MagicMock()
+
+        users.CustomerLogic = get_mock_customer_logic
+        users.CustomerLogic.return_error = 0
+
+        users.utils = mock.MagicMock()
+
+        users.utils = mock.MagicMock()
+        users.utils.make_transid.return_value = 'some_trans_id'
+        users.utils.audit_trail.return_value = None
+        users.utils.make_uuid.return_value = 'some_uuid'
+        users.utils.make_userstransid.return_value = 'some_trans_id'
+
+        users.err_utils = mock.MagicMock()
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_add_default_users(self):
+        # given
+        requests.post = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.post_json('/v1/orm/customers/{customer id}/users/', USER_JSON)
+
+        # assert
+        self.assertEqual(response.status_int, 200)
+        self.assertTrue(customer_logic_mock.add_default_users.called)
+
+    def test_add_default_users_fail(self):
+        # given
+        requests.post = mock.MagicMock()
+
+        users.CustomerLogic.return_error = 1
+
+        users.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                500))
+
+        # when
+        response = self.app.post_json('/v1/orm/customers/{customer id}/users/', USER_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_add_default_users_fail_bad_request(self):
+        # given
+        requests.post = mock.MagicMock()
+
+        users.CustomerLogic.return_error = 2
+
+        users.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                404))
+
+        # when
+        response = self.app.post_json('/v1/orm/customers/{customer id}/users/', USER_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 404)
+
+    def test_replace_default_users(self):
+        # given
+        requests.put = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{customer id}/users/', USER_JSON)
+
+        # assert
+        self.assertEqual(response.status_int, 200)
+        self.assertTrue(customer_logic_mock.replace_default_users.called)
+
+    def test_replace_default_users_fail(self):
+        # given
+        requests.put = mock.MagicMock()
+
+        users.CustomerLogic.return_error = 1
+
+        users.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                500))
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{customer id}/users/',
+                                     USER_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_replace_default_users_fail_bad_request(self):
+        # given
+        requests.put = mock.MagicMock()
+
+        users.CustomerLogic.return_error = 2
+
+        users.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                404))
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{customer id}/users/',
+                                     USER_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 404)
+
+    def test_delete_default_user(self):
+        # given
+        requests.delete = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.delete('/v1/orm/customers/{customer id}/users/{user_id}')
+
+        # assert
+        self.assertEqual(response.status_int, 204)
+        self.assertTrue(users.utils.audit_trail.called)
+        self.assertTrue(customer_logic_mock.delete_default_users.called)
+
+    def test_delete_default_user_fail(self):
+        # given
+        requests.delete = mock.MagicMock()
+
+        users.CustomerLogic.return_error = 1
+
+        users.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                500))
+
+        # when
+        response = self.app.delete('/v1/orm/customers/{customer id}/users/{user_id}', expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_delete_default_user_fail_bad_request(self):
+        # given
+        requests.delete = mock.MagicMock()
+
+        users.CustomerLogic.return_error = 2
+
+        users.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                404))
+
+        # when
+        response = self.app.delete('/v1/orm/customers/{customer id}/users/{user_id}', expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 404)
+
+    def test_get_default(self):
+        # given
+        requests.get = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.get('/v1/orm/customers/some_id/users')
+
+        # assert
+        self.assertEqual(response.status_int, 200)
+
+    def test_add_users(self):
+        # given
+        requests.post = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.post_json('/v1/orm/customers/{some_id}/regions/{some_id}/users/', USER_JSON)
+
+        # assert
+        self.assertEqual(response.status_int, 200)
+        self.assertTrue(users.utils.audit_trail.called)
+        self.assertTrue(customer_logic_mock.add_users.called)
+
+    def test_add_users_fail(self):
+        # given
+        requests.post = mock.MagicMock()
+
+        users.CustomerLogic.return_error = 1
+
+        users.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                500))
+
+        # when
+        response = self.app.post_json('/v1/orm/customers/{some_id}/regions/{some_id}/users/', USER_JSON,
+                                      expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_add_users_fail_bad_request(self):
+        # given
+        requests.post = mock.MagicMock()
+
+        users.CustomerLogic.return_error = 2
+
+        users.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                404))
+
+        # when
+        response = self.app.post_json('/v1/orm/customers/{some_id}/regions/{some_id}/users/', USER_JSON,
+                                      expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 404)
+
+    def test_replace_users(self):
+        # given
+        requests.put = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{some_id}/regions/{some_id}/users/', USER_JSON)
+
+        # assert
+        self.assertEqual(response.status_int, 200)
+        self.assertTrue(users.utils.audit_trail.called)
+        self.assertTrue(customer_logic_mock.replace_users.called)
+
+    def test_replace_users_fail(self):
+        # given
+        requests.put = mock.MagicMock()
+
+        users.CustomerLogic.return_error = 1
+
+        users.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                500))
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{some_id}/regions/{some_id}/users/',
+                                     USER_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_replace_users_fail_bad_request(self):
+        # given
+        requests.put = mock.MagicMock()
+
+        users.CustomerLogic.return_error = 2
+
+        users.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                404))
+
+        # when
+        response = self.app.put_json('/v1/orm/customers/{some_id}/regions/{some_id}/users/',
+                                     USER_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 404)
+
+    def test_delete_user(self):
+        # given
+        requests.delete = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.delete('/v1/orm/customers/{some_id}/regions/{some_id}/users/{user_id}')
+
+        # assert
+        self.assertEqual(response.status_int, 204)
+        self.assertTrue(users.utils.audit_trail.called)
+        self.assertTrue(customer_logic_mock.delete_users.called)
+
+    def test_delete_user_fail(self):
+        # given
+        requests.delete = mock.MagicMock()
+
+        users.CustomerLogic.return_error = 1
+
+        users.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                500))
+
+        # when
+        response = self.app.delete('/v1/orm/customers/{some_id}/regions/{some_id}/users/{user_id}', expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_delete_user_fail_bad_request(self):
+        # given
+        requests.delete = mock.MagicMock()
+
+        users.CustomerLogic.return_error = 2
+
+        users.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
+                                                                                404))
+
+        # when
+        response = self.app.delete('/v1/orm/customers/{some_id}/regions/{some_id}/users/{user_id}', expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 404)
+
+    def test_get(self):
+        # given
+        requests.get = mock.MagicMock(return_value=ResponseMock(200))
+
+        # when
+        response = self.app.get('/v1/orm/customers/{some_id}/regions/{some_id}/users')
+
+        # assert
+        self.assertEqual(response.status_int, 200)
+
+
+def get_mock_customer_logic():
+    global customer_logic_mock
+    customer_logic_mock = mock.MagicMock()
+
+    if users.CustomerLogic.return_error == 0:
+        res = Models.UserResultWrapper(transaction_id='1', users=[])
+
+        customer_logic_mock.add_default_users.return_value = res
+        customer_logic_mock.add_users.return_value = res
+        customer_logic_mock.replace_default_users.return_value = res
+        customer_logic_mock.replace_users.return_value = res
+
+    elif users.CustomerLogic.return_error == 1:
+        customer_logic_mock.add_users.side_effect = SystemError()
+        customer_logic_mock.add_default_users.side_effect = SystemError()
+        customer_logic_mock.replace_users.side_effect = SystemError()
+        customer_logic_mock.replace_default_users.side_effect = SystemError()
+        customer_logic_mock.delete_users.side_effect = SystemError()
+        customer_logic_mock.delete_default_users.side_effect = SystemError()
+
+    else:
+        customer_logic_mock.add_users.side_effect = ErrorStatus(status_code=404)
+        customer_logic_mock.add_default_users.side_effect = ErrorStatus(status_code=404)
+        customer_logic_mock.replace_users.side_effect = ErrorStatus(status_code=404)
+        customer_logic_mock.replace_default_users.side_effect = ErrorStatus(status_code=404)
+        customer_logic_mock.delete_users.side_effect = ErrorStatus(status_code=404)
+        customer_logic_mock.delete_default_users.side_effect = ErrorStatus(status_code=404)
+
+    return customer_logic_mock
+
+
+class ResponseMock:
+    def __init__(self, status_code=200):
+        self.status_code = status_code
+
+
+USER_JSON = [
+    {
+        "id": "userId1",
+        "role": [
+            "admin",
+            "other"
+        ]
+    },
+    {
+        "id": "userId2",
+        "role": [
+            "storage"
+        ]
+    }
+]
diff --git a/orm/services/customer_manager/cms_rest/tests/simple_hook_mock.py b/orm/services/customer_manager/cms_rest/tests/simple_hook_mock.py
new file mode 100644
index 00000000..73b98ed1
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/tests/simple_hook_mock.py
@@ -0,0 +1,6 @@
+from pecan.hooks import PecanHook
+
+
+class SimpleHookMock(PecanHook):
+    def before(self, state):
+        setattr(state.request, 'transaction_id', 'some_id')
diff --git a/orm/services/customer_manager/cms_rest/tests/test_authentication.py b/orm/services/customer_manager/cms_rest/tests/test_authentication.py
new file mode 100644
index 00000000..418e2e3f
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/tests/test_authentication.py
@@ -0,0 +1,53 @@
+import mock
+from cms_rest.tests import FunctionalTest
+from pecan import conf
+
+from cms_rest.utils import authentication
+
+
+class TestUtil(FunctionalTest):
+
+    def setUp(self):
+        FunctionalTest.setUp(self)
+        self.mock_response = mock.Mock()
+
+    @mock.patch('keystone_utils.tokens.TokenConf')
+    def test_get_token_conf(self, mock_TokenConf):
+        mock_TokenConf.return_value = 123
+        token_conf = authentication._get_token_conf(conf)
+        self.assertEqual(token_conf, 123)
+
+    @mock.patch('keystone_utils.tokens.is_token_valid')
+    @mock.patch('keystone_utils.tokens.TokenConf')
+    def test_check_permissions_token_valid(self, mock_get_token_conf, mock_is_token_valid):
+        setattr(conf.authentication, 'enabled', True)
+        mock_get_token_conf.return_value = 123
+        mock_is_token_valid.return_value = True
+        is_permitted = authentication.check_permissions(conf, 'asher', 0)
+        self.assertEqual(is_permitted, True)
+
+    @mock.patch('keystone_utils.tokens.is_token_valid')
+    @mock.patch('keystone_utils.tokens.TokenConf')
+    def test_check_permissions_token_invalid(self, mock_get_token_conf, mock_is_token_valid):
+        setattr(conf.authentication, 'enabled', True)
+        mock_get_token_conf.return_value = 123
+        mock_is_token_valid.return_value = False
+        is_permitted = authentication.check_permissions(conf, 'asher', 0)
+        self.assertEqual(is_permitted, False)
+
+    @mock.patch('keystone_utils.tokens.is_token_valid')
+    @mock.patch('keystone_utils.tokens.TokenConf')
+    def test_check_permissions_disabled(self, mock_get_token_conf, mock_is_token_valid):
+        setattr(conf.authentication, 'enabled', False)
+        mock_get_token_conf.return_value = 123
+        mock_is_token_valid.return_value = False
+        is_permitted = authentication.check_permissions(conf, 'asher', 0)
+        self.assertEqual(is_permitted, True)
+
+    @mock.patch('keystone_utils.tokens.is_token_valid')
+    @mock.patch('keystone_utils.tokens.TokenConf')
+    def test_check_permissions_is_token_valid_breaks(self, mock_get_token_conf, mock_is_token_valid):
+        setattr(conf.authentication, 'enabled', True)
+        mock_is_token_valid.side_effect = Exception('boom')
+        is_permitted = authentication.check_permissions(conf, 'asher', 0)
+        self.assertEqual(is_permitted, False)
diff --git a/orm/services/customer_manager/cms_rest/tests/test_configuration.py b/orm/services/customer_manager/cms_rest/tests/test_configuration.py
new file mode 100755
index 00000000..d9528ee8
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/tests/test_configuration.py
@@ -0,0 +1,14 @@
+"""Get configuration module unittests."""
+from cms_rest.tests import FunctionalTest
+from mock import patch
+
+
+class TestGetConfiguration(FunctionalTest):
+    """Main get configuration test case."""
+
+    @patch('orm_common.utils.utils.report_config')
+    def test_get_configuration_success(self, mock_report):
+        """Test get_configuration returns the expected value on success."""
+        mock_report.return_value = '12345'
+        response = self.app.get('/v1/orm/configuration')
+        self.assertEqual(response.json, '12345')
diff --git a/orm/services/customer_manager/cms_rest/tests/test_models.py b/orm/services/customer_manager/cms_rest/tests/test_models.py
new file mode 100755
index 00000000..91009893
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/tests/test_models.py
@@ -0,0 +1,49 @@
+import mock
+from cms_rest.tests import FunctionalTest
+
+from cms_rest.model import Models as models
+
+GROUP_REGIONS = [
+    "DPK",
+    "SNA1",
+    "SNA2"
+]
+
+
+class TestModels(FunctionalTest):
+
+    def setUp(self):
+        FunctionalTest.setUp(self)
+        models.get_regions_of_group = mock.MagicMock(return_value=GROUP_REGIONS)
+        models.set_utils_conf = mock.MagicMock()
+
+    def test_handle_group_success(self):
+        cust = get_cust_model()
+        cust.handle_region_group()
+
+        self.assertEqual(len(cust.regions), 3)
+
+    def test_handle_group_not_found(self):
+        models.get_regions_of_group = mock.MagicMock(return_value=None)
+        cust = get_cust_model()
+
+        self.assertRaises(models.ErrorStatus, cust.handle_region_group,)
+
+
+def get_cust_model():
+    """
+    this function create a customer model object for testing
+    :return: new customer object
+    """
+
+    cust = models.Customer(enabled=False,
+                           name='a',
+                           metadata={'a': 'b'},
+                           regions=[models.Region(name='r1',
+                                                  type='group',
+                                                  quotas=[models.Quota()],
+                                                  users=[models.User(id='a', role=['admin'])])],
+                           users=[models.User(id='b', role=['admin'])],
+                           defaultQuotas=[models.Quota()])
+
+    return cust
diff --git a/orm/services/customer_manager/cms_rest/tests/test_rds_proxy.py b/orm/services/customer_manager/cms_rest/tests/test_rds_proxy.py
new file mode 100755
index 00000000..b612ad07
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/tests/test_rds_proxy.py
@@ -0,0 +1,55 @@
+import mock
+from mock import MagicMock
+from cms_rest.tests import FunctionalTest
+from cms_rest.logger import get_logger
+from testfixtures import log_capture, compare, Comparison as C
+import logging
+from cms_rest import rds_proxy
+from cms_rest.data.sql_alchemy import models
+from cms_rest.logic.error_base import ErrorStatus
+
+
+class Response:
+    def __init__(self, status_code, content):
+        self.status_code = status_code
+        self.content = content
+
+    def json(self):
+        return self.content
+
+
+class TestUtil(FunctionalTest):
+    def setUp(self):
+        FunctionalTest.setUp(self)
+        self.rp = rds_proxy.RdsProxy()
+
+    @mock.patch.object(rds_proxy, 'request')
+    @mock.patch('requests.post')
+    @log_capture('cms_rest.rds_proxy')
+    def test_send_good(self, mock_post, mock_request, l):
+        resp = Response(200, 'my content')
+        mock_post.return_value = resp
+        send_res = self.rp.send_customer(models.Customer(), "1234", "POST")
+        self.assertRegexpMatches(l.records[-3].getMessage(), 'Wrapper JSON before sending action')
+        self.assertRegexpMatches(l.records[-1].getMessage(), 'Response Content from rds server')
+        self.assertEqual(send_res, 'my content')
+
+    @mock.patch.object(rds_proxy, 'request')
+    @mock.patch('requests.post')
+    @log_capture('cms_rest.rds_proxy')
+    def test_bad_status(self, mock_post, mock_request, l):
+        resp = Response(400, 'my content')
+        mock_post.return_value = resp
+        self.assertRaises(ErrorStatus, self.rp.send_customer, models.Customer(), "1234", "POST")
+        self.assertRegexpMatches(l.records[-3].getMessage(), 'Wrapper JSON before sending action')
+        self.assertRegexpMatches(l.records[-1].getMessage(), 'Response Content from rds server')
+
+    @mock.patch.object(rds_proxy, 'request')
+    @mock.patch('requests.post')
+    @log_capture('cms_rest.rds_proxy')
+    def test_no_content(self, mock_post, mock_request, l):
+        resp = Response(200, None)
+        mock_post.return_value = resp
+        self.assertRaises(ErrorStatus, self.rp.send_customer, models.Customer(), "1234", "POST")
+        for r in l.records:
+            self.assertNotRegexpMatches(r.getMessage(), 'Response Content from rds server')
diff --git a/orm/services/customer_manager/cms_rest/tests/test_utils.py b/orm/services/customer_manager/cms_rest/tests/test_utils.py
new file mode 100755
index 00000000..a56e0953
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/tests/test_utils.py
@@ -0,0 +1,14 @@
+import json
+from wsme.exc import ClientSideError
+
+
+def get_error(transaction_id, status_code, error_details=None,
+              message=None):
+    return ClientSideError(json.dumps({
+        'code': status_code,
+        'type': 'test',
+        'created': '0.0',
+        'transaction_id': transaction_id,
+        'message': message if message else error_details,
+        'details': 'test'
+    }), status_code=status_code)
diff --git a/orm/services/customer_manager/cms_rest/utils/__init__.py b/orm/services/customer_manager/cms_rest/utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/customer_manager/cms_rest/utils/authentication.py b/orm/services/customer_manager/cms_rest/utils/authentication.py
new file mode 100755
index 00000000..46b1b27a
--- /dev/null
+++ b/orm/services/customer_manager/cms_rest/utils/authentication.py
@@ -0,0 +1,58 @@
+import logging
+from keystone_utils import tokens
+from orm_common.policy import policy
+from pecan import conf
+
+from orm_common.utils import api_error_utils as err_utils
+logger = logging.getLogger(__name__)
+
+
+def authorize(request, action):
+    if not _is_authorization_enabled(conf):
+        return
+
+    auth_region = request.headers.get('X-Auth-Region')
+    if not auth_region:
+        raise err_utils.get_error('N/A', message='X-Auth-Region is missing',
+                                  status_code=401)
+    policy.authorize(action, request, conf)
+
+
+def _is_authorization_enabled(app_conf):
+    return app_conf.authentication.enabled
+
+
+def _get_token_conf(app_conf):
+    mech_id = app_conf.authentication.mech_id
+    mech_password = app_conf.authentication.mech_pass
+    rms_url = app_conf.authentication.rms_url
+    tenant_name = app_conf.authentication.tenant_name
+    keystone_version = app_conf.authentication.keystone_version
+    conf = tokens.TokenConf(mech_id, mech_password, rms_url, tenant_name,
+                            keystone_version)
+    return conf
+
+
+def check_permissions(app_conf, token_to_validate, lcp_id):
+    logger.debug("Check permissions...start")
+    token_role = app_conf.authentication.token_role
+    try:
+        if _is_authorization_enabled(app_conf):
+            if token_to_validate is not None and lcp_id is not None and str(token_to_validate).strip() != '' and str(lcp_id).strip() != '':
+                token_conf = _get_token_conf(app_conf)
+                logger.debug("Authorization: validating token=[{}] on lcp_id=[{}]".format(token_to_validate, lcp_id))
+                is_permitted = tokens.is_token_valid(token_to_validate, lcp_id, token_conf, token_role, app_conf.authentication.role_location)
+                logger.debug("Authorization: The token=[{}] on lcp_id=[{}] is [{}]"
+                             .format(token_to_validate, lcp_id, "valid" if is_permitted else "invalid"))
+            else:
+                raise Exception("Token=[{}] and/or Region=[{}] are empty/none.".format(token_to_validate, lcp_id))
+        else:
+            logger.debug("The authentication service is disabled. No authentication is needed.")
+            is_permitted = True
+    except Exception as e:
+        msg = "Fail to validate request. due to {}.".format(e.message)
+        logger.error(msg)
+        logger.exception(e)
+        is_permitted = False
+    logger.debug("Check permissions...end")
+    return is_permitted
diff --git a/orm/services/customer_manager/config.py b/orm/services/customer_manager/config.py
new file mode 100755
index 00000000..9fa85c38
--- /dev/null
+++ b/orm/services/customer_manager/config.py
@@ -0,0 +1,125 @@
+import os
+from orm_common.hooks.transaction_id_hook import TransactionIdHook
+from orm_common.hooks.security_headers_hook import SecurityHeadersHook
+from orm_common.hooks.api_error_hook import APIErrorHook
+
+global TransactionIdHook
+global APIErrorHook
+global SecurityHeadersHook
+
+# Server Specific Configurations
+server = {
+    'port': '7080',
+    'host': '0.0.0.0',
+    'name': 'cms',
+    'host_ip': '0.0.0.0'
+}
+
+# Pecan Application Configurations
+
+app = {
+    'root': 'cms_rest.controllers.root.RootController',
+    'modules': ['cms_rest'],
+    'static_root': '%(confdir)s/public',
+    'template_path': '%(confdir)s/cms_rest/templates',
+    'debug': True,
+    'hooks': lambda: [TransactionIdHook(), APIErrorHook(), SecurityHeadersHook()]
+}
+
+logging = {
+    'root': {'level': 'INFO', 'handlers': ['console']},
+    'loggers': {
+        'cms_rest': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'], 'propagate': False},
+        'orm_common': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'], 'propagate': False},
+        'keystone_utils': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'], 'propagate': False},
+        'pecan': {'level': 'DEBUG', 'handlers': ['console'], 'propagate': False},
+        'orm_common': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'], 'propagate': False},
+        'keystone_utils': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'], 'propagate': False},
+        'audit_client': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'], 'propagate': False},
+        'py.warnings': {'handlers': ['console']},
+        '__force_dict__': True
+    },
+    'handlers': {
+        'console': {
+            'level': 'DEBUG',
+            'class': 'logging.StreamHandler',
+            'formatter': 'color'
+        },
+        'Logfile': {
+            'level': 'DEBUG',
+            'class': 'logging.handlers.RotatingFileHandler',
+            'maxBytes': 50000000,
+            'backupCount': 10,
+            'filename': '/opt/app/orm/cms_rest/cms_rest.log',
+            'formatter': 'simple'
+        }
+    },
+    'formatters': {
+        'simple': {
+            'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]'
+                       '[%(threadName)s] %(message)s')
+        },
+        'color': {
+            '()': 'pecan.log.ColorFormatter',
+            'format': ('%(asctime)s [%(padded_color_levelname)s] [%(name)s]'
+                       '[%(threadName)s] %(message)s'),
+            '__force_dict__': True
+        }
+    }
+}
+
+quotas_default_values = {
+    'compute': {
+        'vcpus': '20',
+        'metadata_items': '128',
+        'injected_file_content_bytes': '10240'
+    },
+    'network': {
+        'security_groups': '10',
+        'security_group_rules': '20'
+    }
+}
+
+database = {
+    'connection_string': 'mysql://root:stack@localhost:3306/orm_cms_db'
+}
+
+api = {
+    'uuid_server': {
+        'base': 'http://127.0.0.1:8090/',
+        'uuids': 'v1/uuids'
+    },
+    'rds_server': {
+        'base': 'http://127.0.0.1:8777/',
+        'resources': 'v1/rds/resources',
+        'status': 'v1/rds/status/resource/'
+    },
+    'rms_server': {
+        'base': 'http://127.0.0.1:8080/',
+        'regions': 'v2/orm/regions',
+        'groups': 'v2/orm/groups',
+        'cache_seconds': 30
+    },
+    'audit_server': {
+        'base': 'http://127.0.0.1:8776/',
+        'trans': 'v1/audit/transaction'
+    }
+}
+
+verify = False
+
+authentication = {
+    "enabled": True,
+    "mech_id": "admin",
+    "mech_pass": "stack",
+    "rms_url": "http://127.0.0.1:8080",
+    "tenant_name": "admin",
+    "token_role": "admin",
+    # The Keystone collection under which the role was granted.
+    # The key can be either "tenant" (for Keystone v2.0) or "domain"
+    # (for Keystone v3) and the value is the tenant/domain name.
+    "role_location": {"tenant": "admin"},
+    # The Keystone version currently in use. Can be either "2.0" or "3".
+    "keystone_version": "2.0",
+    "policy_file": "/opt/app/orm/cms_rest/cms_rest/etc/policy.json"
+}
diff --git a/orm/services/customer_manager/gulpfile.js b/orm/services/customer_manager/gulpfile.js
new file mode 100755
index 00000000..0621b269
--- /dev/null
+++ b/orm/services/customer_manager/gulpfile.js
@@ -0,0 +1,21 @@
+var gulp = require('gulp');
+var nodemon = require('gulp-nodemon');
+var shell = require('gulp-shell');
+var minimist = require('minimist');
+var env = require('gulp-env');
+
+var defaultOptions = {
+  string: 'env',
+  default: { env: 'dev' }
+};
+var options = minimist(process.argv.slice(2), defaultOptions);
+
+gulp.task('default', ['run-mock', 'run-pecan']);
+
+gulp.task('run-pecan', shell.task(['export CMS_ENV=' + options.env + '; pecan serve config.py --reload']));
+gulp.task('run-mock', function(){
+	nodemon({
+    script: 'rds_mock/bin/www',
+    env: {'NODE_ENV': 'development'}
+  });
+});
\ No newline at end of file
diff --git a/orm/services/customer_manager/htmlcov/cms_rest___init___py.html b/orm/services/customer_manager/htmlcov/cms_rest___init___py.html
new file mode 100644
index 00000000..c68bcbc0
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest___init___py.html
@@ -0,0 +1,91 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_app_py.html b/orm/services/customer_manager/htmlcov/cms_rest_app_py.html
new file mode 100644
index 00000000..fe68435b
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_app_py.html
@@ -0,0 +1,161 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/app.py: 83%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/app.py</b> :
+            <span class="pc_cov">83%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            22 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">19 run</span>
+            <span class="mis shortkey_m button_toggle_mis">3 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">1 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="stm run hide_run"><a href="#n30">30</a></p>
+<p id="n31" class="stm mis"><a href="#n31">31</a></p>
+<p id="n32" class="stm mis"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="stm par run hide_run"><a href="#n34">34</a></p>
+<p id="n35" class="stm mis"><a href="#n35">35</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">make_app</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span> <span class="key">import</span> <span class="nam">model</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logger</span> <span class="key">import</span> <span class="nam">get_logger</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span><span class="op">.</span><span class="nam">commands</span> <span class="key">import</span> <span class="nam">CommandRunner</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">policy</span> <span class="key">import</span> <span class="nam">policy</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">get_logger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="key">def</span> <span class="nam">setup_app</span><span class="op">(</span><span class="nam">config</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run">    <span class="nam">model</span><span class="op">.</span><span class="nam">init_model</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run">    <span class="nam">token_conf</span> <span class="op">=</span> <span class="nam">authentication</span><span class="op">.</span><span class="nam">_get_token_conf</span><span class="op">(</span><span class="nam">config</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run">    <span class="nam">policy</span><span class="op">.</span><span class="nam">init</span><span class="op">(</span><span class="nam">config</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">policy_file</span><span class="op">,</span> <span class="nam">token_conf</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm run hide_run">    <span class="nam">app_conf</span> <span class="op">=</span> <span class="nam">dict</span><span class="op">(</span><span class="nam">config</span><span class="op">.</span><span class="nam">app</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln">    <span class="com"># setting configurations for utils to be used from now and on</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run">    <span class="nam">utils</span><span class="op">.</span><span class="nam">set_utils_conf</span><span class="op">(</span><span class="nam">config</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run">    <span class="nam">app</span> <span class="op">=</span> <span class="nam">make_app</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">        <span class="nam">app_conf</span><span class="op">.</span><span class="nam">pop</span><span class="op">(</span><span class="str">'root'</span><span class="op">)</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln">        <span class="nam">logging</span><span class="op">=</span><span class="nam">getattr</span><span class="op">(</span><span class="nam">config</span><span class="op">,</span> <span class="str">'logging'</span><span class="op">,</span> <span class="op">{</span><span class="op">}</span><span class="op">)</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln">        <span class="op">**</span><span class="nam">app_conf</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln">    <span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">    <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">'Starting CMS...'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run">    <span class="key">return</span> <span class="nam">app</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t30" class="stm run hide_run"><span class="key">def</span> <span class="nam">main</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm mis">    <span class="nam">runner</span> <span class="op">=</span> <span class="nam">CommandRunner</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm mis">    <span class="nam">runner</span><span class="op">.</span><span class="nam">run</span><span class="op">(</span><span class="op">[</span><span class="str">'serve'</span><span class="op">,</span> <span class="str">'../config.py'</span><span class="op">]</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm par run hide_run"><span class="annotate short">34&#x202F;&#x219B;&#x202F;35</span><span class="annotate long">line 34 didn't jump to line 35, because the condition on line 34 was never true</span><span class="key">if</span> <span class="nam">__name__</span> <span class="op">==</span> <span class="str">"__main__"</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm mis">    <span class="nam">main</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_controllers___init___py.html b/orm/services/customer_manager/htmlcov/cms_rest_controllers___init___py.html
new file mode 100644
index 00000000..aabf50d6
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_controllers___init___py.html
@@ -0,0 +1,91 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/controllers/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/controllers/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_controllers_root_py.html b/orm/services/customer_manager/htmlcov/cms_rest_controllers_root_py.html
new file mode 100644
index 00000000..67d2afa9
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_controllers_root_py.html
@@ -0,0 +1,159 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/controllers/root.py: 90%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/controllers/root.py</b> :
+            <span class="pc_cov">90%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            10 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">9 run</span>
+            <span class="mis shortkey_m button_toggle_mis">1 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="stm mis"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">expose</span><span class="op">,</span> <span class="nam">request</span><span class="op">,</span> <span class="nam">response</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">webob</span><span class="op">.</span><span class="nam">exc</span> <span class="key">import</span> <span class="nam">status_map</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span><span class="op">.</span><span class="nam">secure</span> <span class="key">import</span> <span class="nam">SecureController</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v1</span> <span class="key">import</span> <span class="nam">root</span> <span class="key">as</span> <span class="nam">v1</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">class</span> <span class="nam">RootController</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln">    <span class="com"># url/v1/</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run">    <span class="nam">v1</span> <span class="op">=</span> <span class="nam">v1</span><span class="op">.</span><span class="nam">V1Controller</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run">    <span class="op">@</span><span class="nam">expose</span><span class="op">(</span><span class="nam">template</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln">    <span class="key">def</span> <span class="nam">_default</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="str">            Method to handle GET /</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="str">            parameters: None</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="str">            return: dict describing cms rest version information</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm mis">        <span class="key">return</span> <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln">            <span class="str">"versions"</span><span class="op">:</span> <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">                <span class="str">"values"</span><span class="op">:</span> <span class="op">[</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln">                    <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln">                        <span class="str">"status"</span><span class="op">:</span> <span class="str">"stable"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln">                        <span class="str">"id"</span><span class="op">:</span> <span class="str">"v1"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln">                        <span class="str">"links"</span><span class="op">:</span> <span class="op">[</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln">                            <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln">                                <span class="str">"href"</span><span class="op">:</span> <span class="str">"http://localhost:7080/"</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln">                            <span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln">                        <span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln">                    <span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln">                <span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln">            <span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln">        <span class="op">}</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1___init___py.html b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1___init___py.html
new file mode 100644
index 00000000..3f476b00
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1___init___py.html
@@ -0,0 +1,91 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/controllers/v1/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/controllers/v1/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_base_py.html b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_base_py.html
new file mode 100644
index 00000000..4a02153d
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_base_py.html
@@ -0,0 +1,187 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/controllers/v1/base.py: 75%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/controllers/v1/base.py</b> :
+            <span class="pc_cov">75%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            16 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">12 run</span>
+            <span class="mis shortkey_m button_toggle_mis">4 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm mis"><a href="#n9">9</a></p>
+<p id="n10" class="stm mis"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="stm mis"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="stm mis"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="stm run hide_run"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="pln"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="pln"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="pln"><a href="#n48">48</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">wsme</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">response</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsme</span> <span class="key">import</span> <span class="nam">types</span> <span class="key">as</span> <span class="nam">wtypes</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">import</span> <span class="nam">inspect</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">class</span> <span class="nam">ClientSideError</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">exc</span><span class="op">.</span><span class="nam">ClientSideError</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">error</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">400</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm mis">        <span class="nam">response</span><span class="op">.</span><span class="nam">translatable_error</span> <span class="op">=</span> <span class="nam">error</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm mis">        <span class="nam">super</span><span class="op">(</span><span class="nam">ClientSideError</span><span class="op">,</span> <span class="nam">self</span><span class="op">)</span><span class="op">.</span><span class="nam">__init__</span><span class="op">(</span><span class="nam">error</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">class</span> <span class="nam">InputValueError</span><span class="op">(</span><span class="nam">ClientSideError</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">name</span><span class="op">,</span> <span class="nam">value</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">400</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm mis">        <span class="nam">super</span><span class="op">(</span><span class="nam">InputValueError</span><span class="op">,</span> <span class="nam">self</span><span class="op">)</span><span class="op">.</span><span class="nam">__init__</span><span class="op">(</span><span class="str">"Invalid value for input {} : {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">name</span><span class="op">,</span> <span class="nam">value</span><span class="op">)</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run"><span class="key">class</span> <span class="nam">EntityNotFoundError</span><span class="op">(</span><span class="nam">ClientSideError</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm mis">        <span class="nam">super</span><span class="op">(</span><span class="nam">EntityNotFoundError</span><span class="op">,</span> <span class="nam">self</span><span class="op">)</span><span class="op">.</span><span class="nam">__init__</span><span class="op">(</span><span class="str">"Entity not found for {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">id</span><span class="op">)</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm run hide_run"><span class="key">class</span> <span class="nam">Base</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">    <span class="str">'''</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln"><span class="str">    @classmethod</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln"><span class="str">    def from_model(cls, m):</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln"><span class="str">        return cls(**(m.as_dict()))</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln"><span class="str">    def as_dict(self, model):</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln"><span class="str">        valid_keys = inspect.getargspec(model.__init__)[0]</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln"><span class="str">        if 'self' in valid_keys:</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="str">            valid_keys.remove('self')</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln"><span class="str">        return self.as_dict_from_keys(valid_keys)</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln"><span class="str">    def as_dict_from_keys(self, keys):</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln"><span class="str">        return dict((k, getattr(self, k))</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln"><span class="str">                    for k in keys</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln"><span class="str">                    if hasattr(self, k) and</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln"><span class="str">                    getattr(self, k) != wsme.Unset)</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln"><span class="str">    @classmethod</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="pln"><span class="str">    def from_db_and_links(cls, m, links):</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln"><span class="str">        return cls(links=links, **(m.as_dict()))</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t48" class="pln"><span class="str">    '''</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm___init___py.html b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm___init___py.html
new file mode 100644
index 00000000..6a9316ac
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm___init___py.html
@@ -0,0 +1,91 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/controllers/v1/orm/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/controllers/v1/orm/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_configuration_py.html b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_configuration_py.html
new file mode 100644
index 00000000..e4905b32
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_configuration_py.html
@@ -0,0 +1,149 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/controllers/v1/orm/configuration.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/controllers/v1/orm/configuration.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            14 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">14 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p>
+<p id="n17" class="stm run hide_run"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="stm run hide_run"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""Configuration rest API input module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">class</span> <span class="nam">ConfigurationController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln">    <span class="str">"""Configuration controller."""</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">dump_to_log</span><span class="op">=</span><span class="str">'false'</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln">        <span class="str">"""get method.</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="str">        :param dump_to_log: A boolean string that says whether the</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln"><span class="str">        configuration should be written to log</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln"><span class="str">        :return: A pretty string that contains the service's configuration</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Get configuration..."</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">        <span class="nam">dump</span> <span class="op">=</span> <span class="nam">dump_to_log</span><span class="op">.</span><span class="nam">lower</span><span class="op">(</span><span class="op">)</span> <span class="op">==</span> <span class="str">'true'</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run">        <span class="nam">utils</span><span class="op">.</span><span class="nam">set_utils_conf</span><span class="op">(</span><span class="nam">conf</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm run hide_run">        <span class="nam">result</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">report_config</span><span class="op">(</span><span class="nam">conf</span><span class="op">,</span> <span class="nam">dump</span><span class="op">,</span> <span class="nam">logger</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer___init___py.html b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer___init___py.html
new file mode 100644
index 00000000..f562f282
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer___init___py.html
@@ -0,0 +1,91 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/controllers/v1/orm/customer/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/controllers/v1/orm/customer/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer_enabled_py.html b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer_enabled_py.html
new file mode 100644
index 00000000..bc48ca15
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer_enabled_py.html
@@ -0,0 +1,201 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/controllers/v1/orm/customer/enabled.py: 91%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/controllers/v1/orm/customer/enabled.py</b> :
+            <span class="pc_cov">91%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            33 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">30 run</span>
+            <span class="mis shortkey_m button_toggle_mis">3 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="stm run hide_run"><a href="#n22">22</a></p>
+<p id="n23" class="stm run hide_run"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="stm run hide_run"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="stm run hide_run"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="stm mis"><a href="#n47">47</a></p>
+<p id="n48" class="pln"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="stm mis"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="pln"><a href="#n54">54</a></p>
+<p id="n55" class="stm mis"><a href="#n55">55</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">model</span><span class="op">.</span><span class="nam">Models</span> <span class="key">import</span> <span class="nam">Enabled</span><span class="op">,</span> <span class="nam">CustomerResultWrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logic</span><span class="op">.</span><span class="nam">customer_logic</span> <span class="key">import</span> <span class="nam">CustomerLogic</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logic</span><span class="op">.</span><span class="nam">error_base</span> <span class="key">import</span> <span class="nam">ErrorStatus</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logger</span> <span class="key">import</span> <span class="nam">get_logger</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="nam">LOG</span> <span class="op">=</span> <span class="nam">get_logger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="key">class</span> <span class="nam">EnabledController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">CustomerResultWrapper</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">Enabled</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">enable</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:enable'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"EnabledController - (put) customer id {0} enable: {1}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">enable</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run">            <span class="nam">customer_logic</span> <span class="op">=</span> <span class="nam">CustomerLogic</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">customer_logic</span><span class="op">.</span><span class="nam">enable</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">enable</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"EnabledController - change enable (put) finished well: "</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t25" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Customer {} {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln">                                                    <span class="str">'enabled'</span> <span class="key">if</span> <span class="nam">enable</span><span class="op">.</span><span class="nam">enabled</span> <span class="key">else</span> <span class="str">'disabled'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'Change enable'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"EnabledController - Failed to Change enable"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"EnabledController - change enable (put) - Failed to Change enable"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">str</span><span class="op">(</span><span class="nam">exception</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">None</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln">    <span class="key">def</span> <span class="nam">post</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">405</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">None</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln">    <span class="key">def</span> <span class="nam">get</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">405</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">None</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="pln">    <span class="key">def</span> <span class="nam">delete</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">405</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer_metadata_py.html b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer_metadata_py.html
new file mode 100644
index 00000000..a9b7212b
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer_metadata_py.html
@@ -0,0 +1,241 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/controllers/v1/orm/customer/metadata.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/controllers/v1/orm/customer/metadata.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            52 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">52 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p>
+<p id="n17" class="stm run hide_run"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="stm run hide_run"><a href="#n23">23</a></p>
+<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="stm run hide_run"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="stm run hide_run"><a href="#n39">39</a></p>
+<p id="n40" class="stm run hide_run"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="stm run hide_run"><a href="#n42">42</a></p>
+<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p>
+<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p>
+<p id="n45" class="pln"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="stm run hide_run"><a href="#n47">47</a></p>
+<p id="n48" class="pln"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="stm run hide_run"><a href="#n50">50</a></p>
+<p id="n51" class="stm run hide_run"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="pln"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="stm run hide_run"><a href="#n58">58</a></p>
+<p id="n59" class="stm run hide_run"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="stm run hide_run"><a href="#n61">61</a></p>
+<p id="n62" class="stm run hide_run"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="stm run hide_run"><a href="#n64">64</a></p>
+<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="pln"><a href="#n67">67</a></p>
+<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p>
+<p id="n69" class="stm run hide_run"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="pln"><a href="#n71">71</a></p>
+<p id="n72" class="stm run hide_run"><a href="#n72">72</a></p>
+<p id="n73" class="stm run hide_run"><a href="#n73">73</a></p>
+<p id="n74" class="stm run hide_run"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">model</span><span class="op">.</span><span class="nam">Models</span> <span class="key">import</span> <span class="nam">CustomerResultWrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logic</span><span class="op">.</span><span class="nam">error_base</span> <span class="key">import</span> <span class="nam">ErrorStatus</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">model</span><span class="op">.</span><span class="nam">Models</span> <span class="key">import</span> <span class="nam">MetadataWrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">import</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logic</span><span class="op">.</span><span class="nam">metadata_logic</span> <span class="key">as</span> <span class="nam">logic</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logger</span> <span class="key">import</span> <span class="nam">get_logger</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="nam">LOG</span> <span class="op">=</span> <span class="nam">get_logger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm run hide_run"><span class="key">class</span> <span class="nam">MetadataController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">CustomerResultWrapper</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">MetadataWrapper</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln">    <span class="key">def</span> <span class="nam">post</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:add_metadata'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run">            <span class="nam">res</span> <span class="op">=</span> <span class="nam">logic</span><span class="op">.</span><span class="nam">add_customer_metadata</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Customer {} metadata added'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'add customer metadata'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run">            <span class="key">return</span> <span class="nam">res</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm run hide_run">        <span class="key">except</span> <span class="nam">AttributeError</span> <span class="key">as</span> <span class="nam">ex</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">ex</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">409</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ValueError</span> <span class="key">as</span> <span class="nam">ex</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">ex</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">ex</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"MetaDataController - Failed to add metadata"</span><span class="op">,</span> <span class="nam">ex</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">ex</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">        <span class="key">except</span> <span class="nam">LookupError</span> <span class="key">as</span> <span class="nam">ex</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"MetaDataController - {0}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ex</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">,</span> <span class="nam">ex</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">ex</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">400</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">ex</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"MetaDataController - Failed to add metadata"</span><span class="op">,</span> <span class="nam">ex</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span> <span class="nam">error_details</span><span class="op">=</span><span class="nam">str</span><span class="op">(</span><span class="nam">ex</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t47" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">CustomerResultWrapper</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">MetadataWrapper</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:update_metadata'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm run hide_run">            <span class="nam">res</span> <span class="op">=</span> <span class="nam">logic</span><span class="op">.</span><span class="nam">update_customer_metadata</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Customer {} metadata updated'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'update customer metadata'</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="pln">                              <span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">            <span class="key">return</span> <span class="nam">res</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm run hide_run">        <span class="key">except</span> <span class="nam">AttributeError</span> <span class="key">as</span> <span class="nam">ex</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">ex</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">400</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ValueError</span> <span class="key">as</span> <span class="nam">ex</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">ex</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">ex</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"MetaDataController - Failed to add metadata"</span><span class="op">,</span> <span class="nam">ex</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">ex</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm run hide_run">        <span class="key">except</span> <span class="nam">LookupError</span> <span class="key">as</span> <span class="nam">ex</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"MetaDataController - {0}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ex</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">,</span> <span class="nam">ex</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">ex</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">400</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">ex</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"MetaDataController - Failed to add metadata"</span><span class="op">,</span> <span class="nam">ex</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span> <span class="nam">error_details</span><span class="op">=</span><span class="nam">str</span><span class="op">(</span><span class="nam">ex</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer_regions_py.html b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer_regions_py.html
new file mode 100644
index 00000000..0be6fee3
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer_regions_py.html
@@ -0,0 +1,357 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/controllers/v1/orm/customer/regions.py: 94%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/controllers/v1/orm/customer/regions.py</b> :
+            <span class="pc_cov">94%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            75 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">72 run</span>
+            <span class="mis shortkey_m button_toggle_mis">3 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">2 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="stm run hide_run"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="stm run hide_run"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="stm run hide_run"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="stm par run hide_run"><a href="#n41">41</a></p>
+<p id="n42" class="stm mis"><a href="#n42">42</a></p>
+<p id="n43" class="stm mis"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="pln"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="stm run hide_run"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="pln"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="stm run hide_run"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="pln"><a href="#n57">57</a></p>
+<p id="n58" class="pln"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="stm run hide_run"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="stm run hide_run"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="stm run hide_run"><a href="#n64">64</a></p>
+<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p>
+<p id="n69" class="stm run hide_run"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="pln"><a href="#n71">71</a></p>
+<p id="n72" class="stm run hide_run"><a href="#n72">72</a></p>
+<p id="n73" class="pln"><a href="#n73">73</a></p>
+<p id="n74" class="stm run hide_run"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="pln"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="stm run hide_run"><a href="#n79">79</a></p>
+<p id="n80" class="stm run hide_run"><a href="#n80">80</a></p>
+<p id="n81" class="pln"><a href="#n81">81</a></p>
+<p id="n82" class="pln"><a href="#n82">82</a></p>
+<p id="n83" class="pln"><a href="#n83">83</a></p>
+<p id="n84" class="stm run hide_run"><a href="#n84">84</a></p>
+<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p>
+<p id="n87" class="pln"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="pln"><a href="#n89">89</a></p>
+<p id="n90" class="stm run hide_run"><a href="#n90">90</a></p>
+<p id="n91" class="pln"><a href="#n91">91</a></p>
+<p id="n92" class="stm run hide_run"><a href="#n92">92</a></p>
+<p id="n93" class="pln"><a href="#n93">93</a></p>
+<p id="n94" class="stm run hide_run"><a href="#n94">94</a></p>
+<p id="n95" class="stm run hide_run"><a href="#n95">95</a></p>
+<p id="n96" class="stm run hide_run"><a href="#n96">96</a></p>
+<p id="n97" class="stm run hide_run"><a href="#n97">97</a></p>
+<p id="n98" class="stm run hide_run"><a href="#n98">98</a></p>
+<p id="n99" class="stm run hide_run"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="stm run hide_run"><a href="#n101">101</a></p>
+<p id="n102" class="pln"><a href="#n102">102</a></p>
+<p id="n103" class="stm run hide_run"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="pln"><a href="#n105">105</a></p>
+<p id="n106" class="pln"><a href="#n106">106</a></p>
+<p id="n107" class="stm par run hide_run"><a href="#n107">107</a></p>
+<p id="n108" class="stm mis"><a href="#n108">108</a></p>
+<p id="n109" class="pln"><a href="#n109">109</a></p>
+<p id="n110" class="pln"><a href="#n110">110</a></p>
+<p id="n111" class="stm run hide_run"><a href="#n111">111</a></p>
+<p id="n112" class="stm run hide_run"><a href="#n112">112</a></p>
+<p id="n113" class="stm run hide_run"><a href="#n113">113</a></p>
+<p id="n114" class="pln"><a href="#n114">114</a></p>
+<p id="n115" class="pln"><a href="#n115">115</a></p>
+<p id="n116" class="pln"><a href="#n116">116</a></p>
+<p id="n117" class="stm run hide_run"><a href="#n117">117</a></p>
+<p id="n118" class="stm run hide_run"><a href="#n118">118</a></p>
+<p id="n119" class="stm run hide_run"><a href="#n119">119</a></p>
+<p id="n120" class="pln"><a href="#n120">120</a></p>
+<p id="n121" class="pln"><a href="#n121">121</a></p>
+<p id="n122" class="pln"><a href="#n122">122</a></p>
+<p id="n123" class="stm run hide_run"><a href="#n123">123</a></p>
+<p id="n124" class="pln"><a href="#n124">124</a></p>
+<p id="n125" class="stm run hide_run"><a href="#n125">125</a></p>
+<p id="n126" class="stm run hide_run"><a href="#n126">126</a></p>
+<p id="n127" class="pln"><a href="#n127">127</a></p>
+<p id="n128" class="pln"><a href="#n128">128</a></p>
+<p id="n129" class="stm run hide_run"><a href="#n129">129</a></p>
+<p id="n130" class="stm run hide_run"><a href="#n130">130</a></p>
+<p id="n131" class="stm run hide_run"><a href="#n131">131</a></p>
+<p id="n132" class="pln"><a href="#n132">132</a></p>
+<p id="n133" class="pln"><a href="#n133">133</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">oslo_db</span><span class="op">.</span><span class="nam">exception</span> <span class="key">import</span> <span class="nam">DBDuplicateEntry</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v1</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">customer</span><span class="op">.</span><span class="nam">users</span> <span class="key">import</span> <span class="nam">UserController</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">model</span><span class="op">.</span><span class="nam">Models</span> <span class="key">import</span> <span class="nam">Region</span><span class="op">,</span> <span class="nam">RegionResultWrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logic</span><span class="op">.</span><span class="nam">customer_logic</span> <span class="key">import</span> <span class="nam">CustomerLogic</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logic</span><span class="op">.</span><span class="nam">error_base</span> <span class="key">import</span> <span class="nam">ErrorStatus</span><span class="op">,</span> <span class="nam">DuplicateEntryError</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logger</span> <span class="key">import</span> <span class="nam">get_logger</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="nam">LOG</span> <span class="op">=</span> <span class="nam">get_logger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run"><span class="key">class</span> <span class="nam">RegionController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run">    <span class="nam">users</span> <span class="op">=</span> <span class="nam">UserController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t22" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln">    <span class="key">def</span> <span class="nam">get</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm run hide_run">        <span class="key">return</span> <span class="op">[</span><span class="str">"This is the regions controller "</span><span class="op">,</span> <span class="str">"customer id: "</span> <span class="op">+</span> <span class="nam">customer_id</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">RegionResultWrapper</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="op">[</span><span class="nam">Region</span><span class="op">]</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln">    <span class="key">def</span> <span class="nam">post</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">regions</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"RegionController - Add Regions (post) customer id {0} regions: {1}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">str</span><span class="op">(</span><span class="nam">regions</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:add_region'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">            <span class="nam">customer_logic</span> <span class="op">=</span> <span class="nam">CustomerLogic</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">customer_logic</span><span class="op">.</span><span class="nam">add_regions</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">regions</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"RegionController - Add Regions (post) finished well: "</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Customer {} regions: {} added'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln">                <span class="nam">customer_id</span><span class="op">,</span> <span class="op">[</span><span class="nam">r</span><span class="op">.</span><span class="nam">name</span> <span class="key">for</span> <span class="nam">r</span> <span class="key">in</span> <span class="nam">regions</span><span class="op">]</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'add regions'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t41" class="stm par run hide_run"><span class="annotate short">41&#x202F;&#x219B;&#x202F;42</span><span class="annotate long">line 41 didn't jump to line 42, because the exception caught by line 41 didn't happen</span>        <span class="key">except</span> <span class="nam">DBDuplicateEntry</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="stm mis">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"RegionController - Add Regions (post) - region already exists"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">409</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="str">'Region already exists'</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"CustomerController - Failed to update regions"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"RegionController - Add Regions (post) - Failed to update regions"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">str</span><span class="op">(</span><span class="nam">exception</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t60" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t62" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">RegionResultWrapper</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="op">[</span><span class="nam">Region</span><span class="op">]</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">regions</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"RegionController - Replace Regions (put) customer id {0} regions: {1}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">str</span><span class="op">(</span><span class="nam">regions</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:update_region'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">validate_put_url</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm run hide_run">            <span class="nam">customer_logic</span> <span class="op">=</span> <span class="nam">CustomerLogic</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">customer_logic</span><span class="op">.</span><span class="nam">replace_regions</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">regions</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"RegionController - Replace Regions (put) finished well: "</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t72" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Customer {} regions: {} updated'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="pln">                <span class="nam">customer_id</span><span class="op">,</span> <span class="op">[</span><span class="nam">r</span><span class="op">.</span><span class="nam">name</span> <span class="key">for</span> <span class="nam">r</span> <span class="key">in</span> <span class="nam">regions</span><span class="op">]</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'Replace regions'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"CustomerController - Failed to Replace regions"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"RegionController - Replace Regions (put) - Failed to replace regions"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">str</span><span class="op">(</span><span class="nam">exception</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t90" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t92" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">None</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">204</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="pln">    <span class="key">def</span> <span class="nam">delete</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"RegionController - Delete Region (delete) customer id {0} region_id: {1}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:delete_region'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="stm run hide_run">            <span class="nam">customer_logic</span> <span class="op">=</span> <span class="nam">CustomerLogic</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="stm run hide_run">            <span class="nam">customer_logic</span><span class="op">.</span><span class="nam">delete_region</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"RegionController - Delete Region (delete) finished well"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t101" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Customer {} region: {} deleted'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="pln">                <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'delete region'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t107" class="stm par run hide_run"><span class="annotate short">107&#x202F;&#x219B;&#x202F;108</span><span class="annotate long">line 107 didn't jump to line 108, because the exception caught by line 107 didn't happen</span>        <span class="key">except</span> <span class="nam">ValueError</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t112" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"CustomerController - Failed to delete region"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t117" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t118" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"RegionController - Failed in delete Region"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t121" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">str</span><span class="op">(</span><span class="nam">exception</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t123" class="stm run hide_run">    <span class="op">@</span><span class="nam">staticmethod</span><span class="strut">&nbsp;</span></p>
+<p id="t124" class="pln">    <span class="key">def</span> <span class="nam">validate_put_url</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="stm run hide_run">        <span class="nam">url_elements</span> <span class="op">=</span> <span class="nam">request</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">'/'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t126" class="stm run hide_run">        <span class="nam">last_index</span> <span class="op">=</span> <span class="op">-</span><span class="num">2</span> <span class="key">if</span> <span class="nam">url_elements</span><span class="op">[</span><span class="op">-</span><span class="num">1</span><span class="op">]</span> <span class="op">==</span> <span class="str">''</span> <span class="key">else</span> <span class="op">-</span><span class="num">1</span><span class="strut">&nbsp;</span></p>
+<p id="t127" class="pln">        <span class="com"># If there's an element after 'regions', it is a region ID</span><span class="strut">&nbsp;</span></p>
+<p id="t128" class="pln">        <span class="com"># which is currently unsupported</span><span class="strut">&nbsp;</span></p>
+<p id="t129" class="stm run hide_run">        <span class="key">if</span> <span class="nam">url_elements</span><span class="op">[</span><span class="nam">last_index</span> <span class="op">-</span> <span class="num">1</span><span class="op">]</span> <span class="op">==</span> <span class="str">'regions'</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">'Method not allowed for a specific region in Request: {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">path</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t131" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t132" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="str">'Method not allowed for a specific region'</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t133" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">405</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer_root_py.html b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer_root_py.html
new file mode 100644
index 00000000..ed5e7db5
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer_root_py.html
@@ -0,0 +1,459 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/controllers/v1/orm/customer/root.py: 97%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/controllers/v1/orm/customer/root.py</b> :
+            <span class="pc_cov">97%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            111 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">108 run</span>
+            <span class="mis shortkey_m button_toggle_mis">3 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">1 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="stm run hide_run"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="stm run hide_run"><a href="#n22">22</a></p>
+<p id="n23" class="stm run hide_run"><a href="#n23">23</a></p>
+<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p>
+<p id="n25" class="stm run hide_run"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="stm run hide_run"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="stm run hide_run"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="stm run hide_run"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p>
+<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="pln"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="stm run hide_run"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="stm run hide_run"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="stm run hide_run"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="stm par run hide_run"><a href="#n60">60</a></p>
+<p id="n61" class="stm mis"><a href="#n61">61</a></p>
+<p id="n62" class="stm mis"><a href="#n62">62</a></p>
+<p id="n63" class="stm run hide_run"><a href="#n63">63</a></p>
+<p id="n64" class="stm run hide_run"><a href="#n64">64</a></p>
+<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="pln"><a href="#n67">67</a></p>
+<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p>
+<p id="n69" class="stm run hide_run"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="stm run hide_run"><a href="#n71">71</a></p>
+<p id="n72" class="stm mis"><a href="#n72">72</a></p>
+<p id="n73" class="pln"><a href="#n73">73</a></p>
+<p id="n74" class="stm run hide_run"><a href="#n74">74</a></p>
+<p id="n75" class="stm run hide_run"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="pln"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="pln"><a href="#n79">79</a></p>
+<p id="n80" class="pln"><a href="#n80">80</a></p>
+<p id="n81" class="stm run hide_run"><a href="#n81">81</a></p>
+<p id="n82" class="pln"><a href="#n82">82</a></p>
+<p id="n83" class="stm run hide_run"><a href="#n83">83</a></p>
+<p id="n84" class="stm run hide_run"><a href="#n84">84</a></p>
+<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="pln"><a href="#n86">86</a></p>
+<p id="n87" class="pln"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="stm run hide_run"><a href="#n89">89</a></p>
+<p id="n90" class="stm run hide_run"><a href="#n90">90</a></p>
+<p id="n91" class="stm run hide_run"><a href="#n91">91</a></p>
+<p id="n92" class="pln"><a href="#n92">92</a></p>
+<p id="n93" class="pln"><a href="#n93">93</a></p>
+<p id="n94" class="pln"><a href="#n94">94</a></p>
+<p id="n95" class="stm run hide_run"><a href="#n95">95</a></p>
+<p id="n96" class="pln"><a href="#n96">96</a></p>
+<p id="n97" class="stm run hide_run"><a href="#n97">97</a></p>
+<p id="n98" class="stm run hide_run"><a href="#n98">98</a></p>
+<p id="n99" class="stm run hide_run"><a href="#n99">99</a></p>
+<p id="n100" class="stm run hide_run"><a href="#n100">100</a></p>
+<p id="n101" class="stm run hide_run"><a href="#n101">101</a></p>
+<p id="n102" class="stm run hide_run"><a href="#n102">102</a></p>
+<p id="n103" class="stm run hide_run"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="stm run hide_run"><a href="#n105">105</a></p>
+<p id="n106" class="pln"><a href="#n106">106</a></p>
+<p id="n107" class="pln"><a href="#n107">107</a></p>
+<p id="n108" class="stm run hide_run"><a href="#n108">108</a></p>
+<p id="n109" class="pln"><a href="#n109">109</a></p>
+<p id="n110" class="pln"><a href="#n110">110</a></p>
+<p id="n111" class="pln"><a href="#n111">111</a></p>
+<p id="n112" class="stm run hide_run"><a href="#n112">112</a></p>
+<p id="n113" class="stm run hide_run"><a href="#n113">113</a></p>
+<p id="n114" class="stm run hide_run"><a href="#n114">114</a></p>
+<p id="n115" class="pln"><a href="#n115">115</a></p>
+<p id="n116" class="pln"><a href="#n116">116</a></p>
+<p id="n117" class="pln"><a href="#n117">117</a></p>
+<p id="n118" class="stm run hide_run"><a href="#n118">118</a></p>
+<p id="n119" class="stm run hide_run"><a href="#n119">119</a></p>
+<p id="n120" class="stm run hide_run"><a href="#n120">120</a></p>
+<p id="n121" class="pln"><a href="#n121">121</a></p>
+<p id="n122" class="pln"><a href="#n122">122</a></p>
+<p id="n123" class="pln"><a href="#n123">123</a></p>
+<p id="n124" class="stm run hide_run"><a href="#n124">124</a></p>
+<p id="n125" class="pln"><a href="#n125">125</a></p>
+<p id="n126" class="stm run hide_run"><a href="#n126">126</a></p>
+<p id="n127" class="pln"><a href="#n127">127</a></p>
+<p id="n128" class="stm run hide_run"><a href="#n128">128</a></p>
+<p id="n129" class="pln"><a href="#n129">129</a></p>
+<p id="n130" class="stm run hide_run"><a href="#n130">130</a></p>
+<p id="n131" class="stm run hide_run"><a href="#n131">131</a></p>
+<p id="n132" class="stm run hide_run"><a href="#n132">132</a></p>
+<p id="n133" class="stm run hide_run"><a href="#n133">133</a></p>
+<p id="n134" class="stm run hide_run"><a href="#n134">134</a></p>
+<p id="n135" class="pln"><a href="#n135">135</a></p>
+<p id="n136" class="pln"><a href="#n136">136</a></p>
+<p id="n137" class="pln"><a href="#n137">137</a></p>
+<p id="n138" class="pln"><a href="#n138">138</a></p>
+<p id="n139" class="stm run hide_run"><a href="#n139">139</a></p>
+<p id="n140" class="stm run hide_run"><a href="#n140">140</a></p>
+<p id="n141" class="stm run hide_run"><a href="#n141">141</a></p>
+<p id="n142" class="stm run hide_run"><a href="#n142">142</a></p>
+<p id="n143" class="pln"><a href="#n143">143</a></p>
+<p id="n144" class="pln"><a href="#n144">144</a></p>
+<p id="n145" class="stm run hide_run"><a href="#n145">145</a></p>
+<p id="n146" class="stm run hide_run"><a href="#n146">146</a></p>
+<p id="n147" class="stm run hide_run"><a href="#n147">147</a></p>
+<p id="n148" class="pln"><a href="#n148">148</a></p>
+<p id="n149" class="pln"><a href="#n149">149</a></p>
+<p id="n150" class="pln"><a href="#n150">150</a></p>
+<p id="n151" class="stm run hide_run"><a href="#n151">151</a></p>
+<p id="n152" class="pln"><a href="#n152">152</a></p>
+<p id="n153" class="stm run hide_run"><a href="#n153">153</a></p>
+<p id="n154" class="stm run hide_run"><a href="#n154">154</a></p>
+<p id="n155" class="pln"><a href="#n155">155</a></p>
+<p id="n156" class="stm run hide_run"><a href="#n156">156</a></p>
+<p id="n157" class="stm run hide_run"><a href="#n157">157</a></p>
+<p id="n158" class="stm run hide_run"><a href="#n158">158</a></p>
+<p id="n159" class="stm run hide_run"><a href="#n159">159</a></p>
+<p id="n160" class="pln"><a href="#n160">160</a></p>
+<p id="n161" class="stm run hide_run"><a href="#n161">161</a></p>
+<p id="n162" class="stm run hide_run"><a href="#n162">162</a></p>
+<p id="n163" class="pln"><a href="#n163">163</a></p>
+<p id="n164" class="pln"><a href="#n164">164</a></p>
+<p id="n165" class="pln"><a href="#n165">165</a></p>
+<p id="n166" class="stm run hide_run"><a href="#n166">166</a></p>
+<p id="n167" class="stm run hide_run"><a href="#n167">167</a></p>
+<p id="n168" class="pln"><a href="#n168">168</a></p>
+<p id="n169" class="stm run hide_run"><a href="#n169">169</a></p>
+<p id="n170" class="pln"><a href="#n170">170</a></p>
+<p id="n171" class="pln"><a href="#n171">171</a></p>
+<p id="n172" class="pln"><a href="#n172">172</a></p>
+<p id="n173" class="stm run hide_run"><a href="#n173">173</a></p>
+<p id="n174" class="stm run hide_run"><a href="#n174">174</a></p>
+<p id="n175" class="pln"><a href="#n175">175</a></p>
+<p id="n176" class="stm run hide_run"><a href="#n176">176</a></p>
+<p id="n177" class="pln"><a href="#n177">177</a></p>
+<p id="n178" class="pln"><a href="#n178">178</a></p>
+<p id="n179" class="pln"><a href="#n179">179</a></p>
+<p id="n180" class="stm run hide_run"><a href="#n180">180</a></p>
+<p id="n181" class="pln"><a href="#n181">181</a></p>
+<p id="n182" class="pln"><a href="#n182">182</a></p>
+<p id="n183" class="pln"><a href="#n183">183</a></p>
+<p id="n184" class="stm run hide_run"><a href="#n184">184</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="op">,</span> <span class="nam">response</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">import</span> <span class="nam">oslo_db</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">model</span><span class="op">.</span><span class="nam">Models</span> <span class="key">import</span> <span class="nam">Customer</span><span class="op">,</span> <span class="nam">CustomerResultWrapper</span><span class="op">,</span> <span class="nam">CustomerSummaryResponse</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v1</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">customer</span><span class="op">.</span><span class="nam">users</span> <span class="key">import</span> <span class="nam">DefaultUserController</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v1</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">customer</span><span class="op">.</span><span class="nam">regions</span> <span class="key">import</span> <span class="nam">RegionController</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v1</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">customer</span><span class="op">.</span><span class="nam">metadata</span> <span class="key">import</span> <span class="nam">MetadataController</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v1</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">customer</span><span class="op">.</span><span class="nam">enabled</span> <span class="key">import</span> <span class="nam">EnabledController</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logic</span><span class="op">.</span><span class="nam">customer_logic</span> <span class="key">import</span> <span class="nam">CustomerLogic</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logic</span><span class="op">.</span><span class="nam">error_base</span> <span class="key">import</span> <span class="nam">ErrorStatus</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logger</span> <span class="key">import</span> <span class="nam">get_logger</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run"><span class="nam">LOG</span> <span class="op">=</span> <span class="nam">get_logger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t22" class="stm run hide_run"><span class="key">class</span> <span class="nam">CustomerController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm run hide_run">    <span class="nam">regions</span> <span class="op">=</span> <span class="nam">RegionController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm run hide_run">    <span class="nam">users</span> <span class="op">=</span> <span class="nam">DefaultUserController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="stm run hide_run">    <span class="nam">metadata</span> <span class="op">=</span> <span class="nam">MetadataController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">    <span class="nam">enabled</span> <span class="op">=</span> <span class="nam">EnabledController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">Customer</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln">    <span class="key">def</span> <span class="nam">get</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"CustomerController - GetCustomerDetails: uuid is "</span> <span class="op">+</span> <span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:get_one'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">            <span class="nam">customer_logic</span> <span class="op">=</span> <span class="nam">CustomerLogic</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">customer_logic</span><span class="op">.</span><span class="nam">get_customer</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"CustomerController - GetCustomerDetails finished well: "</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"CustomerController - Failed to GetCustomerDetails"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"CustomerController - Failed to GetCustomerDetails"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">CustomerResultWrapper</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">Customer</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln">    <span class="key">def</span> <span class="nam">post</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"CustomerController - CreateCustomer: "</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span><span class="nam">customer</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:create'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">            <span class="nam">uuid</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">            <span class="key">if</span> <span class="key">not</span> <span class="nam">customer</span><span class="op">.</span><span class="nam">custId</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm run hide_run">                <span class="nam">uuid</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">make_uuid</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln">            <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="stm par run hide_run"><span class="annotate short">60&#x202F;&#x219B;&#x202F;61</span><span class="annotate long">line 60 didn't jump to line 61, because the condition on line 60 was never true</span>                <span class="key">if</span> <span class="key">not</span> <span class="nam">CustomerController</span><span class="op">.</span><span class="nam">validate_cust_id</span><span class="op">(</span><span class="nam">customer</span><span class="op">.</span><span class="nam">custId</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="stm mis">                    <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'create customer'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">customer</span><span class="op">.</span><span class="nam">custId</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="stm mis">                    <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="str">'400'</span><span class="op">,</span> <span class="nam">None</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="stm run hide_run">                <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="stm run hide_run">                    <span class="nam">uuid</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">create_existing_uuid</span><span class="op">(</span><span class="nam">customer</span><span class="op">.</span><span class="nam">custId</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="stm run hide_run">                <span class="key">except</span> <span class="nam">TypeError</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">                    <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">409.1</span><span class="op">,</span> <span class="str">'Customer ID {0} already exists'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer</span><span class="op">.</span><span class="nam">custId</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm run hide_run">            <span class="nam">customer_logic</span> <span class="op">=</span> <span class="nam">CustomerLogic</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="stm run hide_run">            <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">                <span class="nam">result</span> <span class="op">=</span> <span class="nam">customer_logic</span><span class="op">.</span><span class="nam">create_customer</span><span class="op">(</span><span class="nam">customer</span><span class="op">,</span> <span class="nam">uuid</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="stm run hide_run">            <span class="key">except</span> <span class="nam">oslo_db</span><span class="op">.</span><span class="nam">exception</span><span class="op">.</span><span class="nam">DBDuplicateEntry</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">409.2</span><span class="op">,</span> <span class="str">'Customer field {0} already exists'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">columns</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t74" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"CustomerController - Customer Created: "</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Customer {} {} created in regions: {}, with users: {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln">                <span class="nam">uuid</span><span class="op">,</span> <span class="nam">customer</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span> <span class="op">[</span><span class="nam">r</span><span class="op">.</span><span class="nam">name</span> <span class="key">for</span> <span class="nam">r</span> <span class="key">in</span> <span class="nam">customer</span><span class="op">.</span><span class="nam">regions</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="pln">                <span class="op">[</span><span class="nam">u</span><span class="op">.</span><span class="nam">id</span> <span class="key">for</span> <span class="nam">u</span> <span class="key">in</span> <span class="nam">customer</span><span class="op">.</span><span class="nam">users</span><span class="op">]</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'create customer'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">uuid</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="stm run hide_run">            <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t83" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"CustomerController - Failed to CreateCustomer"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t89" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"CustomerController - Failed to CreateCustomer"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t95" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">CustomerResultWrapper</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">Customer</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">customer</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"CustomerController - UpdateCustomer: "</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span><span class="nam">customer</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:update'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="stm run hide_run">            <span class="nam">customer_logic</span> <span class="op">=</span> <span class="nam">CustomerLogic</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">customer_logic</span><span class="op">.</span><span class="nam">update_customer</span><span class="op">(</span><span class="nam">customer</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="stm run hide_run">            <span class="nam">response</span><span class="op">.</span><span class="nam">status</span> <span class="op">=</span> <span class="num">200</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"CustomerController - UpdateCustomer finished well: "</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span><span class="nam">customer</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t105" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Customer {} {} updated in regions: {}, with users: {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="pln">                <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">customer</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span> <span class="op">[</span><span class="nam">r</span><span class="op">.</span><span class="nam">name</span> <span class="key">for</span> <span class="nam">r</span> <span class="key">in</span> <span class="nam">customer</span><span class="op">.</span><span class="nam">regions</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="pln">                <span class="op">[</span><span class="nam">u</span><span class="op">.</span><span class="nam">id</span> <span class="key">for</span> <span class="nam">u</span> <span class="key">in</span> <span class="nam">customer</span><span class="op">.</span><span class="nam">users</span><span class="op">]</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'update customer'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t112" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"Failed in UpdateCustomer"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t118" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"CustomerController - Failed to UpdateCustomer"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t121" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t123" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t124" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t126" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">CustomerSummaryResponse</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t127" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t128" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_all</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">user</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">starts_with</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t129" class="pln">                <span class="nam">contains</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"CustomerController - GetCustomerlist"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t131" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:get_all'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t132" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t133" class="stm run hide_run">            <span class="nam">customer_logic</span> <span class="op">=</span> <span class="nam">CustomerLogic</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t134" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">customer_logic</span><span class="op">.</span><span class="nam">get_customer_list_by_criteria</span><span class="op">(</span><span class="nam">region</span><span class="op">,</span> <span class="nam">user</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t135" class="pln">                                                                  <span class="nam">starts_with</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t136" class="pln">                                                                  <span class="nam">contains</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t137" class="pln">                                                                  <span class="nam">metadata</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t138" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t139" class="stm run hide_run">            <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t140" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t141" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"CustomerController - Failed to GetCustomerlist"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t142" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t143" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t144" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t145" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t146" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"CustomerController - Failed to GetCustomerlist"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t147" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t148" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t149" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t150" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t151" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">None</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">204</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t152" class="pln">    <span class="key">def</span> <span class="nam">delete</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t153" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:delete'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t154" class="stm run hide_run">        <span class="nam">customer_logic</span> <span class="op">=</span> <span class="nam">CustomerLogic</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t155" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t156" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t157" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"CustomerController - DeleteCustomer: uuid is "</span> <span class="op">+</span> <span class="nam">customer_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t158" class="stm run hide_run">            <span class="nam">customer_logic</span><span class="op">.</span><span class="nam">delete_customer_by_uuid</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t159" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"CustomerController - DeleteCustomer finished well"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t160" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t161" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Customer {} deleted'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t162" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'delete customer'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t163" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t164" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t165" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t166" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t167" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"CustomerController - Failed to DeleteCustomer"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t168" class="pln">                              <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t169" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t170" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t171" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t172" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t173" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t174" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"CustomerController - Failed to DeleteCustomer"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t175" class="pln">                              <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t176" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t177" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t178" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t179" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t180" class="stm run hide_run">    <span class="op">@</span><span class="nam">staticmethod</span><span class="strut">&nbsp;</span></p>
+<p id="t181" class="pln">    <span class="key">def</span> <span class="nam">validate_cust_id</span><span class="op">(</span><span class="nam">cust_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t182" class="pln">        <span class="com"># regex = re.compile('[a-zA-Z]')</span><span class="strut">&nbsp;</span></p>
+<p id="t183" class="pln">        <span class="com"># return regex.match(cust_id[0])</span><span class="strut">&nbsp;</span></p>
+<p id="t184" class="stm run hide_run">        <span class="key">return</span> <span class="nam">True</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer_users_py.html b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer_users_py.html
new file mode 100644
index 00000000..1da00572
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_customer_users_py.html
@@ -0,0 +1,583 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/controllers/v1/orm/customer/users.py: 86%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/controllers/v1/orm/customer/users.py</b> :
+            <span class="pc_cov">86%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            138 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">123 run</span>
+            <span class="mis shortkey_m button_toggle_mis">15 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">9 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="stm run hide_run"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="stm run hide_run"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="stm par run hide_run"><a href="#n39">39</a></p>
+<p id="n40" class="stm mis"><a href="#n40">40</a></p>
+<p id="n41" class="stm mis"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="pln"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="stm run hide_run"><a href="#n46">46</a></p>
+<p id="n47" class="stm run hide_run"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="pln"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="stm run hide_run"><a href="#n52">52</a></p>
+<p id="n53" class="pln"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="stm run hide_run"><a href="#n58">58</a></p>
+<p id="n59" class="stm run hide_run"><a href="#n59">59</a></p>
+<p id="n60" class="stm run hide_run"><a href="#n60">60</a></p>
+<p id="n61" class="stm run hide_run"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="stm run hide_run"><a href="#n64">64</a></p>
+<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="pln"><a href="#n67">67</a></p>
+<p id="n68" class="pln"><a href="#n68">68</a></p>
+<p id="n69" class="pln"><a href="#n69">69</a></p>
+<p id="n70" class="stm par run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="stm mis"><a href="#n71">71</a></p>
+<p id="n72" class="stm mis"><a href="#n72">72</a></p>
+<p id="n73" class="pln"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="stm run hide_run"><a href="#n76">76</a></p>
+<p id="n77" class="stm run hide_run"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="stm run hide_run"><a href="#n79">79</a></p>
+<p id="n80" class="pln"><a href="#n80">80</a></p>
+<p id="n81" class="pln"><a href="#n81">81</a></p>
+<p id="n82" class="pln"><a href="#n82">82</a></p>
+<p id="n83" class="stm run hide_run"><a href="#n83">83</a></p>
+<p id="n84" class="pln"><a href="#n84">84</a></p>
+<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="pln"><a href="#n86">86</a></p>
+<p id="n87" class="stm run hide_run"><a href="#n87">87</a></p>
+<p id="n88" class="stm run hide_run"><a href="#n88">88</a></p>
+<p id="n89" class="stm run hide_run"><a href="#n89">89</a></p>
+<p id="n90" class="stm run hide_run"><a href="#n90">90</a></p>
+<p id="n91" class="stm run hide_run"><a href="#n91">91</a></p>
+<p id="n92" class="stm run hide_run"><a href="#n92">92</a></p>
+<p id="n93" class="stm run hide_run"><a href="#n93">93</a></p>
+<p id="n94" class="pln"><a href="#n94">94</a></p>
+<p id="n95" class="stm run hide_run"><a href="#n95">95</a></p>
+<p id="n96" class="stm run hide_run"><a href="#n96">96</a></p>
+<p id="n97" class="stm run hide_run"><a href="#n97">97</a></p>
+<p id="n98" class="pln"><a href="#n98">98</a></p>
+<p id="n99" class="pln"><a href="#n99">99</a></p>
+<p id="n100" class="stm par run hide_run"><a href="#n100">100</a></p>
+<p id="n101" class="stm mis"><a href="#n101">101</a></p>
+<p id="n102" class="stm mis"><a href="#n102">102</a></p>
+<p id="n103" class="pln"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="pln"><a href="#n105">105</a></p>
+<p id="n106" class="stm par run hide_run"><a href="#n106">106</a></p>
+<p id="n107" class="stm mis"><a href="#n107">107</a></p>
+<p id="n108" class="pln"><a href="#n108">108</a></p>
+<p id="n109" class="pln"><a href="#n109">109</a></p>
+<p id="n110" class="pln"><a href="#n110">110</a></p>
+<p id="n111" class="stm run hide_run"><a href="#n111">111</a></p>
+<p id="n112" class="stm run hide_run"><a href="#n112">112</a></p>
+<p id="n113" class="stm run hide_run"><a href="#n113">113</a></p>
+<p id="n114" class="pln"><a href="#n114">114</a></p>
+<p id="n115" class="pln"><a href="#n115">115</a></p>
+<p id="n116" class="pln"><a href="#n116">116</a></p>
+<p id="n117" class="pln"><a href="#n117">117</a></p>
+<p id="n118" class="stm run hide_run"><a href="#n118">118</a></p>
+<p id="n119" class="pln"><a href="#n119">119</a></p>
+<p id="n120" class="stm run hide_run"><a href="#n120">120</a></p>
+<p id="n121" class="pln"><a href="#n121">121</a></p>
+<p id="n122" class="pln"><a href="#n122">122</a></p>
+<p id="n123" class="pln"><a href="#n123">123</a></p>
+<p id="n124" class="stm par run hide_run"><a href="#n124">124</a></p>
+<p id="n125" class="stm mis"><a href="#n125">125</a></p>
+<p id="n126" class="pln"><a href="#n126">126</a></p>
+<p id="n127" class="pln"><a href="#n127">127</a></p>
+<p id="n128" class="pln"><a href="#n128">128</a></p>
+<p id="n129" class="stm run hide_run"><a href="#n129">129</a></p>
+<p id="n130" class="pln"><a href="#n130">130</a></p>
+<p id="n131" class="stm run hide_run"><a href="#n131">131</a></p>
+<p id="n132" class="pln"><a href="#n132">132</a></p>
+<p id="n133" class="pln"><a href="#n133">133</a></p>
+<p id="n134" class="pln"><a href="#n134">134</a></p>
+<p id="n135" class="stm run hide_run"><a href="#n135">135</a></p>
+<p id="n136" class="pln"><a href="#n136">136</a></p>
+<p id="n137" class="stm run hide_run"><a href="#n137">137</a></p>
+<p id="n138" class="stm run hide_run"><a href="#n138">138</a></p>
+<p id="n139" class="stm run hide_run"><a href="#n139">139</a></p>
+<p id="n140" class="stm run hide_run"><a href="#n140">140</a></p>
+<p id="n141" class="stm run hide_run"><a href="#n141">141</a></p>
+<p id="n142" class="stm run hide_run"><a href="#n142">142</a></p>
+<p id="n143" class="stm run hide_run"><a href="#n143">143</a></p>
+<p id="n144" class="stm run hide_run"><a href="#n144">144</a></p>
+<p id="n145" class="pln"><a href="#n145">145</a></p>
+<p id="n146" class="stm run hide_run"><a href="#n146">146</a></p>
+<p id="n147" class="pln"><a href="#n147">147</a></p>
+<p id="n148" class="stm run hide_run"><a href="#n148">148</a></p>
+<p id="n149" class="pln"><a href="#n149">149</a></p>
+<p id="n150" class="pln"><a href="#n150">150</a></p>
+<p id="n151" class="pln"><a href="#n151">151</a></p>
+<p id="n152" class="stm run hide_run"><a href="#n152">152</a></p>
+<p id="n153" class="stm run hide_run"><a href="#n153">153</a></p>
+<p id="n154" class="stm run hide_run"><a href="#n154">154</a></p>
+<p id="n155" class="pln"><a href="#n155">155</a></p>
+<p id="n156" class="pln"><a href="#n156">156</a></p>
+<p id="n157" class="pln"><a href="#n157">157</a></p>
+<p id="n158" class="stm par run hide_run"><a href="#n158">158</a></p>
+<p id="n159" class="stm mis"><a href="#n159">159</a></p>
+<p id="n160" class="stm mis"><a href="#n160">160</a></p>
+<p id="n161" class="pln"><a href="#n161">161</a></p>
+<p id="n162" class="pln"><a href="#n162">162</a></p>
+<p id="n163" class="pln"><a href="#n163">163</a></p>
+<p id="n164" class="stm run hide_run"><a href="#n164">164</a></p>
+<p id="n165" class="stm run hide_run"><a href="#n165">165</a></p>
+<p id="n166" class="stm run hide_run"><a href="#n166">166</a></p>
+<p id="n167" class="stm run hide_run"><a href="#n167">167</a></p>
+<p id="n168" class="pln"><a href="#n168">168</a></p>
+<p id="n169" class="pln"><a href="#n169">169</a></p>
+<p id="n170" class="pln"><a href="#n170">170</a></p>
+<p id="n171" class="stm run hide_run"><a href="#n171">171</a></p>
+<p id="n172" class="pln"><a href="#n172">172</a></p>
+<p id="n173" class="stm run hide_run"><a href="#n173">173</a></p>
+<p id="n174" class="pln"><a href="#n174">174</a></p>
+<p id="n175" class="stm run hide_run"><a href="#n175">175</a></p>
+<p id="n176" class="stm run hide_run"><a href="#n176">176</a></p>
+<p id="n177" class="stm run hide_run"><a href="#n177">177</a></p>
+<p id="n178" class="stm run hide_run"><a href="#n178">178</a></p>
+<p id="n179" class="stm run hide_run"><a href="#n179">179</a></p>
+<p id="n180" class="stm run hide_run"><a href="#n180">180</a></p>
+<p id="n181" class="stm run hide_run"><a href="#n181">181</a></p>
+<p id="n182" class="stm run hide_run"><a href="#n182">182</a></p>
+<p id="n183" class="pln"><a href="#n183">183</a></p>
+<p id="n184" class="stm run hide_run"><a href="#n184">184</a></p>
+<p id="n185" class="pln"><a href="#n185">185</a></p>
+<p id="n186" class="stm run hide_run"><a href="#n186">186</a></p>
+<p id="n187" class="pln"><a href="#n187">187</a></p>
+<p id="n188" class="pln"><a href="#n188">188</a></p>
+<p id="n189" class="pln"><a href="#n189">189</a></p>
+<p id="n190" class="stm run hide_run"><a href="#n190">190</a></p>
+<p id="n191" class="stm run hide_run"><a href="#n191">191</a></p>
+<p id="n192" class="stm run hide_run"><a href="#n192">192</a></p>
+<p id="n193" class="pln"><a href="#n193">193</a></p>
+<p id="n194" class="pln"><a href="#n194">194</a></p>
+<p id="n195" class="pln"><a href="#n195">195</a></p>
+<p id="n196" class="stm par run hide_run"><a href="#n196">196</a></p>
+<p id="n197" class="stm mis"><a href="#n197">197</a></p>
+<p id="n198" class="stm mis"><a href="#n198">198</a></p>
+<p id="n199" class="pln"><a href="#n199">199</a></p>
+<p id="n200" class="pln"><a href="#n200">200</a></p>
+<p id="n201" class="pln"><a href="#n201">201</a></p>
+<p id="n202" class="stm run hide_run"><a href="#n202">202</a></p>
+<p id="n203" class="stm run hide_run"><a href="#n203">203</a></p>
+<p id="n204" class="stm run hide_run"><a href="#n204">204</a></p>
+<p id="n205" class="stm run hide_run"><a href="#n205">205</a></p>
+<p id="n206" class="pln"><a href="#n206">206</a></p>
+<p id="n207" class="pln"><a href="#n207">207</a></p>
+<p id="n208" class="pln"><a href="#n208">208</a></p>
+<p id="n209" class="stm run hide_run"><a href="#n209">209</a></p>
+<p id="n210" class="pln"><a href="#n210">210</a></p>
+<p id="n211" class="stm run hide_run"><a href="#n211">211</a></p>
+<p id="n212" class="pln"><a href="#n212">212</a></p>
+<p id="n213" class="stm run hide_run"><a href="#n213">213</a></p>
+<p id="n214" class="stm run hide_run"><a href="#n214">214</a></p>
+<p id="n215" class="stm run hide_run"><a href="#n215">215</a></p>
+<p id="n216" class="stm run hide_run"><a href="#n216">216</a></p>
+<p id="n217" class="stm run hide_run"><a href="#n217">217</a></p>
+<p id="n218" class="stm run hide_run"><a href="#n218">218</a></p>
+<p id="n219" class="pln"><a href="#n219">219</a></p>
+<p id="n220" class="stm run hide_run"><a href="#n220">220</a></p>
+<p id="n221" class="pln"><a href="#n221">221</a></p>
+<p id="n222" class="stm run hide_run"><a href="#n222">222</a></p>
+<p id="n223" class="pln"><a href="#n223">223</a></p>
+<p id="n224" class="pln"><a href="#n224">224</a></p>
+<p id="n225" class="pln"><a href="#n225">225</a></p>
+<p id="n226" class="stm run hide_run"><a href="#n226">226</a></p>
+<p id="n227" class="stm run hide_run"><a href="#n227">227</a></p>
+<p id="n228" class="stm run hide_run"><a href="#n228">228</a></p>
+<p id="n229" class="pln"><a href="#n229">229</a></p>
+<p id="n230" class="pln"><a href="#n230">230</a></p>
+<p id="n231" class="stm par run hide_run"><a href="#n231">231</a></p>
+<p id="n232" class="stm mis"><a href="#n232">232</a></p>
+<p id="n233" class="stm mis"><a href="#n233">233</a></p>
+<p id="n234" class="pln"><a href="#n234">234</a></p>
+<p id="n235" class="pln"><a href="#n235">235</a></p>
+<p id="n236" class="pln"><a href="#n236">236</a></p>
+<p id="n237" class="stm par run hide_run"><a href="#n237">237</a></p>
+<p id="n238" class="stm mis"><a href="#n238">238</a></p>
+<p id="n239" class="pln"><a href="#n239">239</a></p>
+<p id="n240" class="pln"><a href="#n240">240</a></p>
+<p id="n241" class="pln"><a href="#n241">241</a></p>
+<p id="n242" class="stm run hide_run"><a href="#n242">242</a></p>
+<p id="n243" class="stm run hide_run"><a href="#n243">243</a></p>
+<p id="n244" class="stm run hide_run"><a href="#n244">244</a></p>
+<p id="n245" class="pln"><a href="#n245">245</a></p>
+<p id="n246" class="pln"><a href="#n246">246</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">model</span><span class="op">.</span><span class="nam">Models</span> <span class="key">import</span> <span class="nam">User</span><span class="op">,</span> <span class="nam">UserResultWrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logic</span><span class="op">.</span><span class="nam">customer_logic</span> <span class="key">import</span> <span class="nam">CustomerLogic</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logic</span><span class="op">.</span><span class="nam">error_base</span> <span class="key">import</span> <span class="nam">ErrorStatus</span><span class="op">,</span> <span class="nam">NotFound</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logger</span> <span class="key">import</span> <span class="nam">get_logger</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="nam">LOG</span> <span class="op">=</span> <span class="nam">get_logger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm run hide_run"><span class="key">class</span> <span class="nam">DefaultUserController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln">    <span class="key">def</span> <span class="nam">get</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run">        <span class="key">return</span> <span class="op">[</span><span class="str">"This is the users controller "</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln">                <span class="str">"customer id: "</span> <span class="op">+</span> <span class="nam">customer_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">                <span class="str">"user "</span> <span class="op">+</span> <span class="str">"default user"</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">UserResultWrapper</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="op">[</span><span class="nam">User</span><span class="op">]</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">users</span><span class="op">)</span><span class="op">:</span>  <span class="com"># replace default users to customer</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"DefaultUserController - Replace DefaultUsers (put) customer id {0} users: {1}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">str</span><span class="op">(</span><span class="nam">users</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:update_default_user'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">            <span class="nam">customer_logic</span> <span class="op">=</span> <span class="nam">CustomerLogic</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">customer_logic</span><span class="op">.</span><span class="nam">replace_default_users</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">users</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"DefaultUserController - Replace DefaultUsers (put) Finished well customer id {0} users: {1}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">str</span><span class="op">(</span><span class="nam">users</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"DefaultUserController - Failed to replace default users"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t39" class="stm par run hide_run"><span class="annotate short">39&#x202F;&#x219B;&#x202F;40</span><span class="annotate long">line 39 didn't jump to line 40, because the exception caught by line 39 didn't happen</span>        <span class="key">except</span> <span class="nam">LookupError</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm mis">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"DefaultUserController - {0}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">UserResultWrapper</span><span class="op">(</span><span class="nam">transaction_id</span><span class="op">=</span><span class="str">"Users Not Added"</span><span class="op">,</span> <span class="nam">users</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"DefaultUserController - Failed to replace default users"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">str</span><span class="op">(</span><span class="nam">exception</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t52" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">UserResultWrapper</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="op">[</span><span class="nam">User</span><span class="op">]</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln">    <span class="key">def</span> <span class="nam">post</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">users</span><span class="op">)</span><span class="op">:</span>  <span class="com"># add default users to customer</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"DefaultUserController - Add DefaultUsers (put) customer id {0} users: {1}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">str</span><span class="op">(</span><span class="nam">users</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:add_default_user'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="stm run hide_run">            <span class="nam">customer_logic</span> <span class="op">=</span> <span class="nam">CustomerLogic</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">customer_logic</span><span class="op">.</span><span class="nam">add_default_users</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">users</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"DefaultUserController - Add DefaultUsers (post) Finished well customer id {0} users: {1}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln">                <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">str</span><span class="op">(</span><span class="nam">users</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t64" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"DefaultUserController - Failed to add default users"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm par run hide_run"><span class="annotate short">70&#x202F;&#x219B;&#x202F;71</span><span class="annotate long">line 70 didn't jump to line 71, because the exception caught by line 70 didn't happen</span>        <span class="key">except</span> <span class="nam">LookupError</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="stm mis">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"DefaultUserController - {0}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t76" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">UserResultWrapper</span><span class="op">(</span><span class="nam">transaction_id</span><span class="op">=</span><span class="str">"Users Not Added"</span><span class="op">,</span> <span class="nam">users</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"DefaultUserController - Failed to add default users"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">str</span><span class="op">(</span><span class="nam">exception</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t83" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">None</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">204</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="pln">    <span class="key">def</span> <span class="nam">delete</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">user_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"DefaultUserController - Delete DefaultUsers (delete) customer id {0} user_id: {1}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">user_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:delete_default_user'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="stm run hide_run">            <span class="nam">customer_logic</span> <span class="op">=</span> <span class="nam">CustomerLogic</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm run hide_run">            <span class="nam">customer_logic</span><span class="op">.</span><span class="nam">delete_default_users</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">user_id</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"DefaultUserController - Delete DefaultUsers (delete) Finished well customer id {0} user_id: {1}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">user_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'delete default users'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t95" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"DefaultUserController - Failed to delete default users"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t100" class="stm par run hide_run"><span class="annotate short">100&#x202F;&#x219B;&#x202F;101</span><span class="annotate long">line 100 didn't jump to line 101, because the exception caught by line 100 didn't happen</span>        <span class="key">except</span> <span class="nam">LookupError</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="stm mis">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"DefaultUserController - {0}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t106" class="stm par run hide_run"><span class="annotate short">106&#x202F;&#x219B;&#x202F;107</span><span class="annotate long">line 106 didn't jump to line 107, because the exception caught by line 106 didn't happen</span>        <span class="key">except</span> <span class="nam">NotFound</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t111" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t112" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"DefaultUserController - Failed in Delete default User"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">str</span><span class="op">(</span><span class="nam">exception</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t117" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t118" class="stm run hide_run"><span class="key">class</span> <span class="nam">UserController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t120" class="stm run hide_run">    <span class="op">@</span><span class="nam">staticmethod</span><span class="strut">&nbsp;</span></p>
+<p id="t121" class="pln">    <span class="key">def</span> <span class="nam">_validate</span><span class="op">(</span><span class="nam">args</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="pln">        <span class="com"># validate if user didnt provide input json for users</span><span class="strut">&nbsp;</span></p>
+<p id="t123" class="pln">        <span class="com"># to prevent wsme to take the input from url params</span><span class="strut">&nbsp;</span></p>
+<p id="t124" class="stm par run hide_run"><span class="annotate short">124&#x202F;&#x219B;&#x202F;125</span><span class="annotate long">line 124 didn't jump to line 125, because the condition on line 124 was never true</span>        <span class="key">if</span> <span class="str">'users'</span> <span class="key">in</span> <span class="nam">args</span> <span class="key">and</span> <span class="nam">args</span><span class="op">[</span><span class="str">'users'</span><span class="op">]</span> <span class="key">and</span> <span class="key">not</span> <span class="nam">request</span><span class="op">.</span><span class="nam">body</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t126" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="str">"bad request, no json body"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t127" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">400</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t128" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t129" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="pln">    <span class="key">def</span> <span class="nam">get</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t131" class="stm run hide_run">        <span class="key">return</span> <span class="op">[</span><span class="str">"This is the users controller "</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t132" class="pln">                <span class="str">"customer id: "</span> <span class="op">+</span> <span class="nam">customer_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t133" class="pln">                <span class="str">"region id: "</span> <span class="op">+</span> <span class="nam">region_id</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t134" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t135" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">UserResultWrapper</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="op">[</span><span class="nam">User</span><span class="op">]</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t136" class="pln">    <span class="key">def</span> <span class="nam">post</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">users</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t137" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">_validate</span><span class="op">(</span><span class="nam">locals</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>  <span class="com"># more validations for input</span><span class="strut">&nbsp;</span></p>
+<p id="t138" class="stm run hide_run">        <span class="nam">title</span> <span class="op">=</span> <span class="str">"Add users to Region '{}' for customer: '{}', users: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">str</span><span class="op">(</span><span class="nam">users</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t139" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"UserController - {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">title</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t140" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:add_region_user'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t141" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t142" class="stm run hide_run">            <span class="nam">customer_logic</span> <span class="op">=</span> <span class="nam">CustomerLogic</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t143" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">customer_logic</span><span class="op">.</span><span class="nam">add_users</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">users</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t144" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"UserController - {} Finished well"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">title</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t145" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t146" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Customer {} users: {} added in region {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t147" class="pln">                <span class="nam">customer_id</span><span class="op">,</span> <span class="op">[</span><span class="nam">u</span><span class="op">.</span><span class="nam">id</span> <span class="key">for</span> <span class="nam">u</span> <span class="key">in</span> <span class="nam">users</span><span class="op">]</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t148" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'add users'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t149" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t150" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t151" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t152" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t153" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"DefaultUserController - Failed to {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">title</span><span class="op">)</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t154" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t155" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t156" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t157" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t158" class="stm par run hide_run"><span class="annotate short">158&#x202F;&#x219B;&#x202F;159</span><span class="annotate long">line 158 didn't jump to line 159, because the exception caught by line 158 didn't happen</span>        <span class="key">except</span> <span class="nam">LookupError</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t159" class="stm mis">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"DefaultUserController - {0}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t160" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t161" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t162" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t163" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t164" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t165" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">UserResultWrapper</span><span class="op">(</span><span class="nam">transaction_id</span><span class="op">=</span><span class="str">"Users Not Added"</span><span class="op">,</span> <span class="nam">users</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t166" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"UserController - Failed to Add Users (post)"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t167" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t168" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t169" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">str</span><span class="op">(</span><span class="nam">exception</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t170" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t171" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t172" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t173" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">UserResultWrapper</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="op">[</span><span class="nam">User</span><span class="op">]</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t174" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">users</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t175" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">_validate</span><span class="op">(</span><span class="nam">locals</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>  <span class="com"># more validations for input</span><span class="strut">&nbsp;</span></p>
+<p id="t176" class="stm run hide_run">        <span class="nam">title</span> <span class="op">=</span> <span class="str">"Replace users to Region '{}' for customer: '{}', users: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">str</span><span class="op">(</span><span class="nam">users</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t177" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"UserController - {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">title</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t178" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:update_region_user'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t179" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t180" class="stm run hide_run">            <span class="nam">customer_logic</span> <span class="op">=</span> <span class="nam">CustomerLogic</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t181" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">customer_logic</span><span class="op">.</span><span class="nam">replace_users</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">users</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t182" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"UserController - {} Finished well"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">title</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t183" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t184" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Customer {} users: {} updated in region {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t185" class="pln">                <span class="nam">customer_id</span><span class="op">,</span> <span class="op">[</span><span class="nam">u</span><span class="op">.</span><span class="nam">id</span> <span class="key">for</span> <span class="nam">u</span> <span class="key">in</span> <span class="nam">users</span><span class="op">]</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t186" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'replace users'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t187" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t188" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t189" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t190" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t191" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"DefaultUserController - Failed to {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">title</span><span class="op">)</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t192" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t193" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t194" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t195" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t196" class="stm par run hide_run"><span class="annotate short">196&#x202F;&#x219B;&#x202F;197</span><span class="annotate long">line 196 didn't jump to line 197, because the exception caught by line 196 didn't happen</span>        <span class="key">except</span> <span class="nam">LookupError</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t197" class="stm mis">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"DefaultUserController - {0}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t198" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t199" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t200" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t201" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t202" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t203" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">UserResultWrapper</span><span class="op">(</span><span class="nam">transaction_id</span><span class="op">=</span><span class="str">"Users Not Replaced"</span><span class="op">,</span> <span class="nam">users</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t204" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"UserController - Failed to Replaced Users (put)"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t205" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t206" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t207" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">str</span><span class="op">(</span><span class="nam">exception</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t208" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t209" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t210" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t211" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">None</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">204</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t212" class="pln">    <span class="key">def</span> <span class="nam">delete</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">user_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t213" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"UserController - Delete User (delete) customer id {0} region_id: {1} user_id: {2}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">user_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t214" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'customers:delete_region_user'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t215" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t216" class="stm run hide_run">            <span class="nam">customer_logic</span> <span class="op">=</span> <span class="nam">CustomerLogic</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t217" class="stm run hide_run">            <span class="nam">customer_logic</span><span class="op">.</span><span class="nam">delete_users</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">user_id</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t218" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"UserController - Delete User (delete) Finished well customer id {0} region_id: {1} user_id: {2}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">user_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t219" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t220" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Customer {} user: {} deleted in region {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t221" class="pln">                <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">user_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t222" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'delete users'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t223" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t224" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t225" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t226" class="stm run hide_run">        <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t227" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"DefaultUserController - Failed to delete users"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t228" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t229" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t230" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t231" class="stm par run hide_run"><span class="annotate short">231&#x202F;&#x219B;&#x202F;232</span><span class="annotate long">line 231 didn't jump to line 232, because the exception caught by line 231 didn't happen</span>        <span class="key">except</span> <span class="nam">LookupError</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t232" class="stm mis">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"DefaultUserController - {0}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t233" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t234" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t235" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t236" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t237" class="stm par run hide_run"><span class="annotate short">237&#x202F;&#x219B;&#x202F;238</span><span class="annotate long">line 237 didn't jump to line 238, because the exception caught by line 237 didn't happen</span>        <span class="key">except</span> <span class="nam">NotFound</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t238" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t239" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t240" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t241" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t242" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t243" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"UserController - Failed to Delete User (delete) "</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t244" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t245" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t246" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">str</span><span class="op">(</span><span class="nam">exception</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_logs_py.html b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_logs_py.html
new file mode 100644
index 00000000..fe17dd7e
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_logs_py.html
@@ -0,0 +1,221 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/controllers/v1/orm/logs.py: 35%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/controllers/v1/orm/logs.py</b> :
+            <span class="pc_cov">35%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            33 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">13 run</span>
+            <span class="mis shortkey_m button_toggle_mis">20 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="stm mis"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="stm run hide_run"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="stm mis"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="stm run hide_run"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="stm mis"><a href="#n40">40</a></p>
+<p id="n41" class="stm mis"><a href="#n41">41</a></p>
+<p id="n42" class="stm mis"><a href="#n42">42</a></p>
+<p id="n43" class="stm mis"><a href="#n43">43</a></p>
+<p id="n44" class="stm mis"><a href="#n44">44</a></p>
+<p id="n45" class="stm mis"><a href="#n45">45</a></p>
+<p id="n46" class="stm mis"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="stm mis"><a href="#n48">48</a></p>
+<p id="n49" class="pln"><a href="#n49">49</a></p>
+<p id="n50" class="stm mis"><a href="#n50">50</a></p>
+<p id="n51" class="stm mis"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="stm mis"><a href="#n53">53</a></p>
+<p id="n54" class="stm mis"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="pln"><a href="#n57">57</a></p>
+<p id="n58" class="stm mis"><a href="#n58">58</a></p>
+<p id="n59" class="stm mis"><a href="#n59">59</a></p>
+<p id="n60" class="stm mis"><a href="#n60">60</a></p>
+<p id="n61" class="stm mis"><a href="#n61">61</a></p>
+<p id="n62" class="stm mis"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="stm mis"><a href="#n64">64</a></p>
+<p id="n65" class="pln"><a href="#n65">65</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">import</span> <span class="nam">wsme</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">class</span> <span class="nam">LogChangeResultWSME</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln">    <span class="str">"""log change result wsme type."""</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run">    <span class="nam">result</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">str</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">default</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln">        <span class="str">""""init method."""</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm mis">        <span class="nam">super</span><span class="op">(</span><span class="nam">LogChangeResult</span><span class="op">,</span> <span class="nam">self</span><span class="op">)</span><span class="op">.</span><span class="nam">__init__</span><span class="op">(</span><span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run"><span class="key">class</span> <span class="nam">LogChangeResult</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln">    <span class="str">"""log change result type."""</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">result</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln">        <span class="str">""""init method."""</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="stm mis">        <span class="nam">self</span><span class="op">.</span><span class="nam">result</span> <span class="op">=</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm run hide_run"><span class="key">class</span> <span class="nam">LogsController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln">    <span class="str">"""Logs Audit controller."""</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">LogChangeResultWSME</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">level</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln">        <span class="str">"""update log level.</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln"><span class="str">        :param level: the log level text name</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm mis">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Changing log level to [{}]"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">level</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="stm mis">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="stm mis">            <span class="nam">log_level</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">_levelNames</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">level</span><span class="op">.</span><span class="nam">upper</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm mis">            <span class="key">if</span> <span class="nam">log_level</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm mis">                <span class="nam">self</span><span class="op">.</span><span class="nam">_change_log_level</span><span class="op">(</span><span class="nam">log_level</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm mis">                <span class="nam">result</span> <span class="op">=</span> <span class="str">"Log level changed to {}."</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">level</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="stm mis">                <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln">            <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm mis">                <span class="key">raise</span> <span class="nam">Exception</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="pln">                    <span class="str">"The given log level [{}] doesn't exist."</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">level</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="stm mis">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm mis">            <span class="nam">result</span> <span class="op">=</span> <span class="str">"Fail to change log_level. Reason: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln">                <span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm mis">        <span class="key">return</span> <span class="nam">LogChangeResult</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">    <span class="op">@</span><span class="nam">staticmethod</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="pln">    <span class="key">def</span> <span class="nam">_change_log_level</span><span class="op">(</span><span class="nam">log_level</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm mis">        <span class="nam">path</span> <span class="op">=</span> <span class="nam">__name__</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">'.'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="stm mis">        <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">path</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="stm mis">            <span class="nam">root</span> <span class="op">=</span> <span class="nam">path</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="stm mis">            <span class="nam">root_logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">root</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="stm mis">            <span class="nam">root_logger</span><span class="op">.</span><span class="nam">setLevel</span><span class="op">(</span><span class="nam">log_level</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Fail to change log_level to [{}]. "</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="pln">                        <span class="str">"the given log level doesn't exist."</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">log_level</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_root_py.html b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_root_py.html
new file mode 100644
index 00000000..ac73c82f
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_orm_root_py.html
@@ -0,0 +1,111 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/controllers/v1/orm/root.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/controllers/v1/orm/root.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            8 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">8 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v1</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">customer</span><span class="op">.</span><span class="nam">root</span> <span class="key">import</span> <span class="nam">CustomerController</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v1</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">logs</span> <span class="key">import</span> <span class="nam">LogsController</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v1</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">configuration</span> <span class="key">import</span> <span class="nam">ConfigurationController</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span><span class="op">.</span><span class="nam">rest</span> <span class="key">import</span> <span class="nam">RestController</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">class</span> <span class="nam">OrmController</span><span class="op">(</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run">    <span class="nam">configuration</span> <span class="op">=</span> <span class="nam">ConfigurationController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run">    <span class="nam">customers</span> <span class="op">=</span> <span class="nam">CustomerController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run">    <span class="nam">logs</span> <span class="op">=</span> <span class="nam">LogsController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_root_py.html b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_root_py.html
new file mode 100644
index 00000000..1e15fccd
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_controllers_v1_root_py.html
@@ -0,0 +1,103 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/controllers/v1/root.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/controllers/v1/root.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            4 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">4 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v1</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">root</span> <span class="key">import</span> <span class="nam">OrmController</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span><span class="op">.</span><span class="nam">rest</span> <span class="key">import</span> <span class="nam">RestController</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">class</span> <span class="nam">V1Controller</span><span class="op">(</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run">    <span class="nam">orm</span> <span class="op">=</span> <span class="nam">OrmController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_logger___init___py.html b/orm/services/customer_manager/htmlcov/cms_rest_logger___init___py.html
new file mode 100644
index 00000000..15956208
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_logger___init___py.html
@@ -0,0 +1,111 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/logger/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/logger/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            6 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">6 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_logger</span><span class="op">(</span><span class="nam">name</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run">    <span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">name</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run">    <span class="nam">logger</span><span class="op">.</span><span class="nam">log_exception</span> <span class="op">=</span> <span class="key">lambda</span> <span class="nam">msg</span><span class="op">,</span> <span class="nam">exception</span><span class="op">:</span> <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">msg</span> <span class="op">+</span> <span class="str">" Exception: "</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span><span class="nam">exception</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run">    <span class="key">return</span> <span class="nam">logger</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="nam">__all__</span> <span class="op">=</span> <span class="op">[</span><span class="str">'get_logger'</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_logic___init___py.html b/orm/services/customer_manager/htmlcov/cms_rest_logic___init___py.html
new file mode 100644
index 00000000..2666bf1c
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_logic___init___py.html
@@ -0,0 +1,91 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/logic/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/logic/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_logic_customer_logic_py.html b/orm/services/customer_manager/htmlcov/cms_rest_logic_customer_logic_py.html
new file mode 100644
index 00000000..ad4ebeba
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_logic_customer_logic_py.html
@@ -0,0 +1,1535 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/logic/customer_logic.py: 81%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/logic/customer_logic.py</b> :
+            <span class="pc_cov">81%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            466 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">402 run</span>
+            <span class="mis shortkey_m button_toggle_mis">64 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">34 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="stm run hide_run"><a href="#n23">23</a></p>
+<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p>
+<p id="n25" class="stm run hide_run"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="stm par run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="stm mis"><a href="#n28">28</a></p>
+<p id="n29" class="stm mis"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="stm run hide_run"><a href="#n39">39</a></p>
+<p id="n40" class="stm run hide_run"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="stm run hide_run"><a href="#n42">42</a></p>
+<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p>
+<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="stm run hide_run"><a href="#n47">47</a></p>
+<p id="n48" class="stm par run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="stm mis"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="stm run hide_run"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="pln"><a href="#n54">54</a></p>
+<p id="n55" class="stm run hide_run"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="pln"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="pln"><a href="#n65">65</a></p>
+<p id="n66" class="pln"><a href="#n66">66</a></p>
+<p id="n67" class="pln"><a href="#n67">67</a></p>
+<p id="n68" class="pln"><a href="#n68">68</a></p>
+<p id="n69" class="stm run hide_run"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="stm run hide_run"><a href="#n71">71</a></p>
+<p id="n72" class="stm mis"><a href="#n72">72</a></p>
+<p id="n73" class="stm mis"><a href="#n73">73</a></p>
+<p id="n74" class="stm mis"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="stm mis"><a href="#n76">76</a></p>
+<p id="n77" class="pln"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="stm run hide_run"><a href="#n79">79</a></p>
+<p id="n80" class="pln"><a href="#n80">80</a></p>
+<p id="n81" class="pln"><a href="#n81">81</a></p>
+<p id="n82" class="stm par run hide_run"><a href="#n82">82</a></p>
+<p id="n83" class="stm mis"><a href="#n83">83</a></p>
+<p id="n84" class="pln"><a href="#n84">84</a></p>
+<p id="n85" class="pln"><a href="#n85">85</a></p>
+<p id="n86" class="pln"><a href="#n86">86</a></p>
+<p id="n87" class="pln"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="pln"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="pln"><a href="#n91">91</a></p>
+<p id="n92" class="pln"><a href="#n92">92</a></p>
+<p id="n93" class="pln"><a href="#n93">93</a></p>
+<p id="n94" class="pln"><a href="#n94">94</a></p>
+<p id="n95" class="pln"><a href="#n95">95</a></p>
+<p id="n96" class="stm run hide_run"><a href="#n96">96</a></p>
+<p id="n97" class="stm run hide_run"><a href="#n97">97</a></p>
+<p id="n98" class="stm run hide_run"><a href="#n98">98</a></p>
+<p id="n99" class="stm run hide_run"><a href="#n99">99</a></p>
+<p id="n100" class="stm run hide_run"><a href="#n100">100</a></p>
+<p id="n101" class="stm run hide_run"><a href="#n101">101</a></p>
+<p id="n102" class="stm run hide_run"><a href="#n102">102</a></p>
+<p id="n103" class="stm run hide_run"><a href="#n103">103</a></p>
+<p id="n104" class="stm run hide_run"><a href="#n104">104</a></p>
+<p id="n105" class="stm run hide_run"><a href="#n105">105</a></p>
+<p id="n106" class="stm run hide_run"><a href="#n106">106</a></p>
+<p id="n107" class="stm run hide_run"><a href="#n107">107</a></p>
+<p id="n108" class="pln"><a href="#n108">108</a></p>
+<p id="n109" class="stm run hide_run"><a href="#n109">109</a></p>
+<p id="n110" class="pln"><a href="#n110">110</a></p>
+<p id="n111" class="stm run hide_run"><a href="#n111">111</a></p>
+<p id="n112" class="stm run hide_run"><a href="#n112">112</a></p>
+<p id="n113" class="stm run hide_run"><a href="#n113">113</a></p>
+<p id="n114" class="stm run hide_run"><a href="#n114">114</a></p>
+<p id="n115" class="stm run hide_run"><a href="#n115">115</a></p>
+<p id="n116" class="stm run hide_run"><a href="#n116">116</a></p>
+<p id="n117" class="pln"><a href="#n117">117</a></p>
+<p id="n118" class="stm run hide_run"><a href="#n118">118</a></p>
+<p id="n119" class="stm par run hide_run"><a href="#n119">119</a></p>
+<p id="n120" class="stm mis"><a href="#n120">120</a></p>
+<p id="n121" class="stm mis"><a href="#n121">121</a></p>
+<p id="n122" class="stm mis"><a href="#n122">122</a></p>
+<p id="n123" class="pln"><a href="#n123">123</a></p>
+<p id="n124" class="stm mis"><a href="#n124">124</a></p>
+<p id="n125" class="stm mis"><a href="#n125">125</a></p>
+<p id="n126" class="pln"><a href="#n126">126</a></p>
+<p id="n127" class="stm run hide_run"><a href="#n127">127</a></p>
+<p id="n128" class="pln"><a href="#n128">128</a></p>
+<p id="n129" class="stm run hide_run"><a href="#n129">129</a></p>
+<p id="n130" class="pln"><a href="#n130">130</a></p>
+<p id="n131" class="stm run hide_run"><a href="#n131">131</a></p>
+<p id="n132" class="stm run hide_run"><a href="#n132">132</a></p>
+<p id="n133" class="stm run hide_run"><a href="#n133">133</a></p>
+<p id="n134" class="stm run hide_run"><a href="#n134">134</a></p>
+<p id="n135" class="pln"><a href="#n135">135</a></p>
+<p id="n136" class="stm run hide_run"><a href="#n136">136</a></p>
+<p id="n137" class="pln"><a href="#n137">137</a></p>
+<p id="n138" class="stm run hide_run"><a href="#n138">138</a></p>
+<p id="n139" class="stm run hide_run"><a href="#n139">139</a></p>
+<p id="n140" class="stm run hide_run"><a href="#n140">140</a></p>
+<p id="n141" class="stm run hide_run"><a href="#n141">141</a></p>
+<p id="n142" class="stm run hide_run"><a href="#n142">142</a></p>
+<p id="n143" class="stm run hide_run"><a href="#n143">143</a></p>
+<p id="n144" class="pln"><a href="#n144">144</a></p>
+<p id="n145" class="pln"><a href="#n145">145</a></p>
+<p id="n146" class="stm run hide_run"><a href="#n146">146</a></p>
+<p id="n147" class="stm par run hide_run"><a href="#n147">147</a></p>
+<p id="n148" class="stm mis"><a href="#n148">148</a></p>
+<p id="n149" class="stm run hide_run"><a href="#n149">149</a></p>
+<p id="n150" class="stm run hide_run"><a href="#n150">150</a></p>
+<p id="n151" class="stm run hide_run"><a href="#n151">151</a></p>
+<p id="n152" class="pln"><a href="#n152">152</a></p>
+<p id="n153" class="stm run hide_run"><a href="#n153">153</a></p>
+<p id="n154" class="pln"><a href="#n154">154</a></p>
+<p id="n155" class="stm run hide_run"><a href="#n155">155</a></p>
+<p id="n156" class="stm run hide_run"><a href="#n156">156</a></p>
+<p id="n157" class="stm run hide_run"><a href="#n157">157</a></p>
+<p id="n158" class="pln"><a href="#n158">158</a></p>
+<p id="n159" class="pln"><a href="#n159">159</a></p>
+<p id="n160" class="stm run hide_run"><a href="#n160">160</a></p>
+<p id="n161" class="stm run hide_run"><a href="#n161">161</a></p>
+<p id="n162" class="stm par run hide_run"><a href="#n162">162</a></p>
+<p id="n163" class="stm mis"><a href="#n163">163</a></p>
+<p id="n164" class="stm run hide_run"><a href="#n164">164</a></p>
+<p id="n165" class="pln"><a href="#n165">165</a></p>
+<p id="n166" class="stm run hide_run"><a href="#n166">166</a></p>
+<p id="n167" class="pln"><a href="#n167">167</a></p>
+<p id="n168" class="stm run hide_run"><a href="#n168">168</a></p>
+<p id="n169" class="stm run hide_run"><a href="#n169">169</a></p>
+<p id="n170" class="stm run hide_run"><a href="#n170">170</a></p>
+<p id="n171" class="stm run hide_run"><a href="#n171">171</a></p>
+<p id="n172" class="pln"><a href="#n172">172</a></p>
+<p id="n173" class="stm run hide_run"><a href="#n173">173</a></p>
+<p id="n174" class="stm par run hide_run"><a href="#n174">174</a></p>
+<p id="n175" class="stm mis"><a href="#n175">175</a></p>
+<p id="n176" class="stm mis"><a href="#n176">176</a></p>
+<p id="n177" class="stm mis"><a href="#n177">177</a></p>
+<p id="n178" class="pln"><a href="#n178">178</a></p>
+<p id="n179" class="stm mis"><a href="#n179">179</a></p>
+<p id="n180" class="pln"><a href="#n180">180</a></p>
+<p id="n181" class="stm par run hide_run"><a href="#n181">181</a></p>
+<p id="n182" class="stm mis"><a href="#n182">182</a></p>
+<p id="n183" class="stm mis"><a href="#n183">183</a></p>
+<p id="n184" class="stm mis"><a href="#n184">184</a></p>
+<p id="n185" class="stm mis"><a href="#n185">185</a></p>
+<p id="n186" class="pln"><a href="#n186">186</a></p>
+<p id="n187" class="stm run hide_run"><a href="#n187">187</a></p>
+<p id="n188" class="pln"><a href="#n188">188</a></p>
+<p id="n189" class="stm run hide_run"><a href="#n189">189</a></p>
+<p id="n190" class="stm run hide_run"><a href="#n190">190</a></p>
+<p id="n191" class="stm run hide_run"><a href="#n191">191</a></p>
+<p id="n192" class="stm run hide_run"><a href="#n192">192</a></p>
+<p id="n193" class="stm run hide_run"><a href="#n193">193</a></p>
+<p id="n194" class="stm run hide_run"><a href="#n194">194</a></p>
+<p id="n195" class="pln"><a href="#n195">195</a></p>
+<p id="n196" class="stm run hide_run"><a href="#n196">196</a></p>
+<p id="n197" class="pln"><a href="#n197">197</a></p>
+<p id="n198" class="stm run hide_run"><a href="#n198">198</a></p>
+<p id="n199" class="stm run hide_run"><a href="#n199">199</a></p>
+<p id="n200" class="pln"><a href="#n200">200</a></p>
+<p id="n201" class="stm par run hide_run"><a href="#n201">201</a></p>
+<p id="n202" class="stm mis"><a href="#n202">202</a></p>
+<p id="n203" class="pln"><a href="#n203">203</a></p>
+<p id="n204" class="stm par run hide_run"><a href="#n204">204</a></p>
+<p id="n205" class="stm mis"><a href="#n205">205</a></p>
+<p id="n206" class="pln"><a href="#n206">206</a></p>
+<p id="n207" class="stm run hide_run"><a href="#n207">207</a></p>
+<p id="n208" class="pln"><a href="#n208">208</a></p>
+<p id="n209" class="stm run hide_run"><a href="#n209">209</a></p>
+<p id="n210" class="stm run hide_run"><a href="#n210">210</a></p>
+<p id="n211" class="pln"><a href="#n211">211</a></p>
+<p id="n212" class="stm run hide_run"><a href="#n212">212</a></p>
+<p id="n213" class="stm run hide_run"><a href="#n213">213</a></p>
+<p id="n214" class="stm run hide_run"><a href="#n214">214</a></p>
+<p id="n215" class="stm run hide_run"><a href="#n215">215</a></p>
+<p id="n216" class="stm run hide_run"><a href="#n216">216</a></p>
+<p id="n217" class="pln"><a href="#n217">217</a></p>
+<p id="n218" class="stm run hide_run"><a href="#n218">218</a></p>
+<p id="n219" class="pln"><a href="#n219">219</a></p>
+<p id="n220" class="pln"><a href="#n220">220</a></p>
+<p id="n221" class="stm run hide_run"><a href="#n221">221</a></p>
+<p id="n222" class="pln"><a href="#n222">222</a></p>
+<p id="n223" class="pln"><a href="#n223">223</a></p>
+<p id="n224" class="stm run hide_run"><a href="#n224">224</a></p>
+<p id="n225" class="pln"><a href="#n225">225</a></p>
+<p id="n226" class="pln"><a href="#n226">226</a></p>
+<p id="n227" class="stm run hide_run"><a href="#n227">227</a></p>
+<p id="n228" class="stm run hide_run"><a href="#n228">228</a></p>
+<p id="n229" class="stm par run hide_run"><a href="#n229">229</a></p>
+<p id="n230" class="stm mis"><a href="#n230">230</a></p>
+<p id="n231" class="stm run hide_run"><a href="#n231">231</a></p>
+<p id="n232" class="stm run hide_run"><a href="#n232">232</a></p>
+<p id="n233" class="stm run hide_run"><a href="#n233">233</a></p>
+<p id="n234" class="pln"><a href="#n234">234</a></p>
+<p id="n235" class="stm run hide_run"><a href="#n235">235</a></p>
+<p id="n236" class="stm run hide_run"><a href="#n236">236</a></p>
+<p id="n237" class="stm run hide_run"><a href="#n237">237</a></p>
+<p id="n238" class="stm run hide_run"><a href="#n238">238</a></p>
+<p id="n239" class="stm run hide_run"><a href="#n239">239</a></p>
+<p id="n240" class="pln"><a href="#n240">240</a></p>
+<p id="n241" class="stm run hide_run"><a href="#n241">241</a></p>
+<p id="n242" class="stm par run hide_run"><a href="#n242">242</a></p>
+<p id="n243" class="stm mis"><a href="#n243">243</a></p>
+<p id="n244" class="pln"><a href="#n244">244</a></p>
+<p id="n245" class="stm run hide_run"><a href="#n245">245</a></p>
+<p id="n246" class="stm par run hide_run"><a href="#n246">246</a></p>
+<p id="n247" class="stm mis"><a href="#n247">247</a></p>
+<p id="n248" class="pln"><a href="#n248">248</a></p>
+<p id="n249" class="pln"><a href="#n249">249</a></p>
+<p id="n250" class="stm run hide_run"><a href="#n250">250</a></p>
+<p id="n251" class="stm run hide_run"><a href="#n251">251</a></p>
+<p id="n252" class="stm run hide_run"><a href="#n252">252</a></p>
+<p id="n253" class="stm run hide_run"><a href="#n253">253</a></p>
+<p id="n254" class="stm run hide_run"><a href="#n254">254</a></p>
+<p id="n255" class="pln"><a href="#n255">255</a></p>
+<p id="n256" class="stm run hide_run"><a href="#n256">256</a></p>
+<p id="n257" class="stm run hide_run"><a href="#n257">257</a></p>
+<p id="n258" class="stm run hide_run"><a href="#n258">258</a></p>
+<p id="n259" class="stm run hide_run"><a href="#n259">259</a></p>
+<p id="n260" class="pln"><a href="#n260">260</a></p>
+<p id="n261" class="stm run hide_run"><a href="#n261">261</a></p>
+<p id="n262" class="stm run hide_run"><a href="#n262">262</a></p>
+<p id="n263" class="stm run hide_run"><a href="#n263">263</a></p>
+<p id="n264" class="stm run hide_run"><a href="#n264">264</a></p>
+<p id="n265" class="stm run hide_run"><a href="#n265">265</a></p>
+<p id="n266" class="stm run hide_run"><a href="#n266">266</a></p>
+<p id="n267" class="stm run hide_run"><a href="#n267">267</a></p>
+<p id="n268" class="stm run hide_run"><a href="#n268">268</a></p>
+<p id="n269" class="stm run hide_run"><a href="#n269">269</a></p>
+<p id="n270" class="pln"><a href="#n270">270</a></p>
+<p id="n271" class="stm run hide_run"><a href="#n271">271</a></p>
+<p id="n272" class="pln"><a href="#n272">272</a></p>
+<p id="n273" class="stm run hide_run"><a href="#n273">273</a></p>
+<p id="n274" class="stm run hide_run"><a href="#n274">274</a></p>
+<p id="n275" class="stm run hide_run"><a href="#n275">275</a></p>
+<p id="n276" class="stm run hide_run"><a href="#n276">276</a></p>
+<p id="n277" class="pln"><a href="#n277">277</a></p>
+<p id="n278" class="stm run hide_run"><a href="#n278">278</a></p>
+<p id="n279" class="stm run hide_run"><a href="#n279">279</a></p>
+<p id="n280" class="stm run hide_run"><a href="#n280">280</a></p>
+<p id="n281" class="stm run hide_run"><a href="#n281">281</a></p>
+<p id="n282" class="pln"><a href="#n282">282</a></p>
+<p id="n283" class="stm run hide_run"><a href="#n283">283</a></p>
+<p id="n284" class="stm par run hide_run"><a href="#n284">284</a></p>
+<p id="n285" class="stm mis"><a href="#n285">285</a></p>
+<p id="n286" class="pln"><a href="#n286">286</a></p>
+<p id="n287" class="stm run hide_run"><a href="#n287">287</a></p>
+<p id="n288" class="pln"><a href="#n288">288</a></p>
+<p id="n289" class="pln"><a href="#n289">289</a></p>
+<p id="n290" class="stm run hide_run"><a href="#n290">290</a></p>
+<p id="n291" class="stm run hide_run"><a href="#n291">291</a></p>
+<p id="n292" class="pln"><a href="#n292">292</a></p>
+<p id="n293" class="stm run hide_run"><a href="#n293">293</a></p>
+<p id="n294" class="stm run hide_run"><a href="#n294">294</a></p>
+<p id="n295" class="pln"><a href="#n295">295</a></p>
+<p id="n296" class="stm run hide_run"><a href="#n296">296</a></p>
+<p id="n297" class="pln"><a href="#n297">297</a></p>
+<p id="n298" class="stm run hide_run"><a href="#n298">298</a></p>
+<p id="n299" class="stm run hide_run"><a href="#n299">299</a></p>
+<p id="n300" class="stm run hide_run"><a href="#n300">300</a></p>
+<p id="n301" class="pln"><a href="#n301">301</a></p>
+<p id="n302" class="stm run hide_run"><a href="#n302">302</a></p>
+<p id="n303" class="pln"><a href="#n303">303</a></p>
+<p id="n304" class="stm run hide_run"><a href="#n304">304</a></p>
+<p id="n305" class="stm run hide_run"><a href="#n305">305</a></p>
+<p id="n306" class="stm run hide_run"><a href="#n306">306</a></p>
+<p id="n307" class="stm run hide_run"><a href="#n307">307</a></p>
+<p id="n308" class="pln"><a href="#n308">308</a></p>
+<p id="n309" class="stm run hide_run"><a href="#n309">309</a></p>
+<p id="n310" class="stm run hide_run"><a href="#n310">310</a></p>
+<p id="n311" class="stm run hide_run"><a href="#n311">311</a></p>
+<p id="n312" class="stm run hide_run"><a href="#n312">312</a></p>
+<p id="n313" class="stm run hide_run"><a href="#n313">313</a></p>
+<p id="n314" class="stm run hide_run"><a href="#n314">314</a></p>
+<p id="n315" class="pln"><a href="#n315">315</a></p>
+<p id="n316" class="stm run hide_run"><a href="#n316">316</a></p>
+<p id="n317" class="pln"><a href="#n317">317</a></p>
+<p id="n318" class="stm run hide_run"><a href="#n318">318</a></p>
+<p id="n319" class="pln"><a href="#n319">319</a></p>
+<p id="n320" class="stm par run hide_run"><a href="#n320">320</a></p>
+<p id="n321" class="stm mis"><a href="#n321">321</a></p>
+<p id="n322" class="pln"><a href="#n322">322</a></p>
+<p id="n323" class="stm run hide_run"><a href="#n323">323</a></p>
+<p id="n324" class="pln"><a href="#n324">324</a></p>
+<p id="n325" class="stm run hide_run"><a href="#n325">325</a></p>
+<p id="n326" class="stm run hide_run"><a href="#n326">326</a></p>
+<p id="n327" class="pln"><a href="#n327">327</a></p>
+<p id="n328" class="stm run hide_run"><a href="#n328">328</a></p>
+<p id="n329" class="stm run hide_run"><a href="#n329">329</a></p>
+<p id="n330" class="stm par run hide_run"><a href="#n330">330</a></p>
+<p id="n331" class="stm mis"><a href="#n331">331</a></p>
+<p id="n332" class="pln"><a href="#n332">332</a></p>
+<p id="n333" class="stm run hide_run"><a href="#n333">333</a></p>
+<p id="n334" class="stm run hide_run"><a href="#n334">334</a></p>
+<p id="n335" class="pln"><a href="#n335">335</a></p>
+<p id="n336" class="stm run hide_run"><a href="#n336">336</a></p>
+<p id="n337" class="pln"><a href="#n337">337</a></p>
+<p id="n338" class="pln"><a href="#n338">338</a></p>
+<p id="n339" class="stm run hide_run"><a href="#n339">339</a></p>
+<p id="n340" class="pln"><a href="#n340">340</a></p>
+<p id="n341" class="pln"><a href="#n341">341</a></p>
+<p id="n342" class="stm run hide_run"><a href="#n342">342</a></p>
+<p id="n343" class="pln"><a href="#n343">343</a></p>
+<p id="n344" class="pln"><a href="#n344">344</a></p>
+<p id="n345" class="stm run hide_run"><a href="#n345">345</a></p>
+<p id="n346" class="pln"><a href="#n346">346</a></p>
+<p id="n347" class="stm run hide_run"><a href="#n347">347</a></p>
+<p id="n348" class="stm run hide_run"><a href="#n348">348</a></p>
+<p id="n349" class="stm par run hide_run"><a href="#n349">349</a></p>
+<p id="n350" class="stm mis"><a href="#n350">350</a></p>
+<p id="n351" class="stm run hide_run"><a href="#n351">351</a></p>
+<p id="n352" class="stm run hide_run"><a href="#n352">352</a></p>
+<p id="n353" class="pln"><a href="#n353">353</a></p>
+<p id="n354" class="stm run hide_run"><a href="#n354">354</a></p>
+<p id="n355" class="stm run hide_run"><a href="#n355">355</a></p>
+<p id="n356" class="stm run hide_run"><a href="#n356">356</a></p>
+<p id="n357" class="stm run hide_run"><a href="#n357">357</a></p>
+<p id="n358" class="stm run hide_run"><a href="#n358">358</a></p>
+<p id="n359" class="pln"><a href="#n359">359</a></p>
+<p id="n360" class="stm run hide_run"><a href="#n360">360</a></p>
+<p id="n361" class="stm par run hide_run"><a href="#n361">361</a></p>
+<p id="n362" class="stm mis"><a href="#n362">362</a></p>
+<p id="n363" class="pln"><a href="#n363">363</a></p>
+<p id="n364" class="pln"><a href="#n364">364</a></p>
+<p id="n365" class="stm run hide_run"><a href="#n365">365</a></p>
+<p id="n366" class="stm run hide_run"><a href="#n366">366</a></p>
+<p id="n367" class="stm run hide_run"><a href="#n367">367</a></p>
+<p id="n368" class="stm run hide_run"><a href="#n368">368</a></p>
+<p id="n369" class="stm run hide_run"><a href="#n369">369</a></p>
+<p id="n370" class="pln"><a href="#n370">370</a></p>
+<p id="n371" class="stm run hide_run"><a href="#n371">371</a></p>
+<p id="n372" class="stm run hide_run"><a href="#n372">372</a></p>
+<p id="n373" class="stm run hide_run"><a href="#n373">373</a></p>
+<p id="n374" class="stm run hide_run"><a href="#n374">374</a></p>
+<p id="n375" class="pln"><a href="#n375">375</a></p>
+<p id="n376" class="stm run hide_run"><a href="#n376">376</a></p>
+<p id="n377" class="stm run hide_run"><a href="#n377">377</a></p>
+<p id="n378" class="stm run hide_run"><a href="#n378">378</a></p>
+<p id="n379" class="stm run hide_run"><a href="#n379">379</a></p>
+<p id="n380" class="stm par run hide_run"><a href="#n380">380</a></p>
+<p id="n381" class="stm mis"><a href="#n381">381</a></p>
+<p id="n382" class="pln"><a href="#n382">382</a></p>
+<p id="n383" class="stm run hide_run"><a href="#n383">383</a></p>
+<p id="n384" class="stm run hide_run"><a href="#n384">384</a></p>
+<p id="n385" class="pln"><a href="#n385">385</a></p>
+<p id="n386" class="pln"><a href="#n386">386</a></p>
+<p id="n387" class="pln"><a href="#n387">387</a></p>
+<p id="n388" class="stm run hide_run"><a href="#n388">388</a></p>
+<p id="n389" class="stm run hide_run"><a href="#n389">389</a></p>
+<p id="n390" class="pln"><a href="#n390">390</a></p>
+<p id="n391" class="stm run hide_run"><a href="#n391">391</a></p>
+<p id="n392" class="pln"><a href="#n392">392</a></p>
+<p id="n393" class="stm run hide_run"><a href="#n393">393</a></p>
+<p id="n394" class="pln"><a href="#n394">394</a></p>
+<p id="n395" class="pln"><a href="#n395">395</a></p>
+<p id="n396" class="stm run hide_run"><a href="#n396">396</a></p>
+<p id="n397" class="stm run hide_run"><a href="#n397">397</a></p>
+<p id="n398" class="stm run hide_run"><a href="#n398">398</a></p>
+<p id="n399" class="pln"><a href="#n399">399</a></p>
+<p id="n400" class="stm run hide_run"><a href="#n400">400</a></p>
+<p id="n401" class="pln"><a href="#n401">401</a></p>
+<p id="n402" class="pln"><a href="#n402">402</a></p>
+<p id="n403" class="stm run hide_run"><a href="#n403">403</a></p>
+<p id="n404" class="stm run hide_run"><a href="#n404">404</a></p>
+<p id="n405" class="stm run hide_run"><a href="#n405">405</a></p>
+<p id="n406" class="pln"><a href="#n406">406</a></p>
+<p id="n407" class="stm run hide_run"><a href="#n407">407</a></p>
+<p id="n408" class="stm run hide_run"><a href="#n408">408</a></p>
+<p id="n409" class="stm run hide_run"><a href="#n409">409</a></p>
+<p id="n410" class="stm run hide_run"><a href="#n410">410</a></p>
+<p id="n411" class="pln"><a href="#n411">411</a></p>
+<p id="n412" class="stm run hide_run"><a href="#n412">412</a></p>
+<p id="n413" class="stm par run hide_run"><a href="#n413">413</a></p>
+<p id="n414" class="stm mis"><a href="#n414">414</a></p>
+<p id="n415" class="pln"><a href="#n415">415</a></p>
+<p id="n416" class="pln"><a href="#n416">416</a></p>
+<p id="n417" class="stm run hide_run"><a href="#n417">417</a></p>
+<p id="n418" class="pln"><a href="#n418">418</a></p>
+<p id="n419" class="stm run hide_run"><a href="#n419">419</a></p>
+<p id="n420" class="pln"><a href="#n420">420</a></p>
+<p id="n421" class="stm run hide_run"><a href="#n421">421</a></p>
+<p id="n422" class="stm run hide_run"><a href="#n422">422</a></p>
+<p id="n423" class="pln"><a href="#n423">423</a></p>
+<p id="n424" class="stm par run hide_run"><a href="#n424">424</a></p>
+<p id="n425" class="stm mis"><a href="#n425">425</a></p>
+<p id="n426" class="stm mis"><a href="#n426">426</a></p>
+<p id="n427" class="stm mis"><a href="#n427">427</a></p>
+<p id="n428" class="pln"><a href="#n428">428</a></p>
+<p id="n429" class="stm mis"><a href="#n429">429</a></p>
+<p id="n430" class="pln"><a href="#n430">430</a></p>
+<p id="n431" class="stm run hide_run"><a href="#n431">431</a></p>
+<p id="n432" class="stm run hide_run"><a href="#n432">432</a></p>
+<p id="n433" class="stm run hide_run"><a href="#n433">433</a></p>
+<p id="n434" class="stm run hide_run"><a href="#n434">434</a></p>
+<p id="n435" class="pln"><a href="#n435">435</a></p>
+<p id="n436" class="stm run hide_run"><a href="#n436">436</a></p>
+<p id="n437" class="pln"><a href="#n437">437</a></p>
+<p id="n438" class="pln"><a href="#n438">438</a></p>
+<p id="n439" class="stm run hide_run"><a href="#n439">439</a></p>
+<p id="n440" class="pln"><a href="#n440">440</a></p>
+<p id="n441" class="pln"><a href="#n441">441</a></p>
+<p id="n442" class="stm run hide_run"><a href="#n442">442</a></p>
+<p id="n443" class="pln"><a href="#n443">443</a></p>
+<p id="n444" class="pln"><a href="#n444">444</a></p>
+<p id="n445" class="stm run hide_run"><a href="#n445">445</a></p>
+<p id="n446" class="stm run hide_run"><a href="#n446">446</a></p>
+<p id="n447" class="stm run hide_run"><a href="#n447">447</a></p>
+<p id="n448" class="stm run hide_run"><a href="#n448">448</a></p>
+<p id="n449" class="pln"><a href="#n449">449</a></p>
+<p id="n450" class="stm run hide_run"><a href="#n450">450</a></p>
+<p id="n451" class="stm run hide_run"><a href="#n451">451</a></p>
+<p id="n452" class="stm run hide_run"><a href="#n452">452</a></p>
+<p id="n453" class="stm run hide_run"><a href="#n453">453</a></p>
+<p id="n454" class="stm run hide_run"><a href="#n454">454</a></p>
+<p id="n455" class="stm run hide_run"><a href="#n455">455</a></p>
+<p id="n456" class="stm par run hide_run"><a href="#n456">456</a></p>
+<p id="n457" class="stm mis"><a href="#n457">457</a></p>
+<p id="n458" class="pln"><a href="#n458">458</a></p>
+<p id="n459" class="pln"><a href="#n459">459</a></p>
+<p id="n460" class="pln"><a href="#n460">460</a></p>
+<p id="n461" class="stm run hide_run"><a href="#n461">461</a></p>
+<p id="n462" class="stm par run hide_run"><a href="#n462">462</a></p>
+<p id="n463" class="stm mis"><a href="#n463">463</a></p>
+<p id="n464" class="pln"><a href="#n464">464</a></p>
+<p id="n465" class="pln"><a href="#n465">465</a></p>
+<p id="n466" class="stm run hide_run"><a href="#n466">466</a></p>
+<p id="n467" class="stm run hide_run"><a href="#n467">467</a></p>
+<p id="n468" class="pln"><a href="#n468">468</a></p>
+<p id="n469" class="stm run hide_run"><a href="#n469">469</a></p>
+<p id="n470" class="pln"><a href="#n470">470</a></p>
+<p id="n471" class="stm run hide_run"><a href="#n471">471</a></p>
+<p id="n472" class="stm run hide_run"><a href="#n472">472</a></p>
+<p id="n473" class="pln"><a href="#n473">473</a></p>
+<p id="n474" class="stm run hide_run"><a href="#n474">474</a></p>
+<p id="n475" class="pln"><a href="#n475">475</a></p>
+<p id="n476" class="stm run hide_run"><a href="#n476">476</a></p>
+<p id="n477" class="stm run hide_run"><a href="#n477">477</a></p>
+<p id="n478" class="pln"><a href="#n478">478</a></p>
+<p id="n479" class="stm run hide_run"><a href="#n479">479</a></p>
+<p id="n480" class="pln"><a href="#n480">480</a></p>
+<p id="n481" class="stm run hide_run"><a href="#n481">481</a></p>
+<p id="n482" class="pln"><a href="#n482">482</a></p>
+<p id="n483" class="pln"><a href="#n483">483</a></p>
+<p id="n484" class="stm run hide_run"><a href="#n484">484</a></p>
+<p id="n485" class="stm run hide_run"><a href="#n485">485</a></p>
+<p id="n486" class="pln"><a href="#n486">486</a></p>
+<p id="n487" class="stm run hide_run"><a href="#n487">487</a></p>
+<p id="n488" class="pln"><a href="#n488">488</a></p>
+<p id="n489" class="pln"><a href="#n489">489</a></p>
+<p id="n490" class="stm run hide_run"><a href="#n490">490</a></p>
+<p id="n491" class="pln"><a href="#n491">491</a></p>
+<p id="n492" class="pln"><a href="#n492">492</a></p>
+<p id="n493" class="stm run hide_run"><a href="#n493">493</a></p>
+<p id="n494" class="pln"><a href="#n494">494</a></p>
+<p id="n495" class="pln"><a href="#n495">495</a></p>
+<p id="n496" class="stm run hide_run"><a href="#n496">496</a></p>
+<p id="n497" class="stm run hide_run"><a href="#n497">497</a></p>
+<p id="n498" class="stm run hide_run"><a href="#n498">498</a></p>
+<p id="n499" class="stm run hide_run"><a href="#n499">499</a></p>
+<p id="n500" class="pln"><a href="#n500">500</a></p>
+<p id="n501" class="stm run hide_run"><a href="#n501">501</a></p>
+<p id="n502" class="stm run hide_run"><a href="#n502">502</a></p>
+<p id="n503" class="stm run hide_run"><a href="#n503">503</a></p>
+<p id="n504" class="stm run hide_run"><a href="#n504">504</a></p>
+<p id="n505" class="pln"><a href="#n505">505</a></p>
+<p id="n506" class="stm run hide_run"><a href="#n506">506</a></p>
+<p id="n507" class="stm par run hide_run"><a href="#n507">507</a></p>
+<p id="n508" class="stm mis"><a href="#n508">508</a></p>
+<p id="n509" class="pln"><a href="#n509">509</a></p>
+<p id="n510" class="pln"><a href="#n510">510</a></p>
+<p id="n511" class="stm run hide_run"><a href="#n511">511</a></p>
+<p id="n512" class="pln"><a href="#n512">512</a></p>
+<p id="n513" class="stm run hide_run"><a href="#n513">513</a></p>
+<p id="n514" class="stm run hide_run"><a href="#n514">514</a></p>
+<p id="n515" class="pln"><a href="#n515">515</a></p>
+<p id="n516" class="pln"><a href="#n516">516</a></p>
+<p id="n517" class="stm run hide_run"><a href="#n517">517</a></p>
+<p id="n518" class="pln"><a href="#n518">518</a></p>
+<p id="n519" class="stm run hide_run"><a href="#n519">519</a></p>
+<p id="n520" class="stm par run hide_run"><a href="#n520">520</a></p>
+<p id="n521" class="stm mis"><a href="#n521">521</a></p>
+<p id="n522" class="stm mis"><a href="#n522">522</a></p>
+<p id="n523" class="stm mis"><a href="#n523">523</a></p>
+<p id="n524" class="pln"><a href="#n524">524</a></p>
+<p id="n525" class="stm mis"><a href="#n525">525</a></p>
+<p id="n526" class="stm par run hide_run"><a href="#n526">526</a></p>
+<p id="n527" class="stm mis"><a href="#n527">527</a></p>
+<p id="n528" class="stm mis"><a href="#n528">528</a></p>
+<p id="n529" class="pln"><a href="#n529">529</a></p>
+<p id="n530" class="stm run hide_run"><a href="#n530">530</a></p>
+<p id="n531" class="stm run hide_run"><a href="#n531">531</a></p>
+<p id="n532" class="pln"><a href="#n532">532</a></p>
+<p id="n533" class="stm run hide_run"><a href="#n533">533</a></p>
+<p id="n534" class="pln"><a href="#n534">534</a></p>
+<p id="n535" class="stm run hide_run"><a href="#n535">535</a></p>
+<p id="n536" class="stm run hide_run"><a href="#n536">536</a></p>
+<p id="n537" class="stm run hide_run"><a href="#n537">537</a></p>
+<p id="n538" class="pln"><a href="#n538">538</a></p>
+<p id="n539" class="stm run hide_run"><a href="#n539">539</a></p>
+<p id="n540" class="pln"><a href="#n540">540</a></p>
+<p id="n541" class="stm run hide_run"><a href="#n541">541</a></p>
+<p id="n542" class="pln"><a href="#n542">542</a></p>
+<p id="n543" class="stm run hide_run"><a href="#n543">543</a></p>
+<p id="n544" class="pln"><a href="#n544">544</a></p>
+<p id="n545" class="stm run hide_run"><a href="#n545">545</a></p>
+<p id="n546" class="stm run hide_run"><a href="#n546">546</a></p>
+<p id="n547" class="pln"><a href="#n547">547</a></p>
+<p id="n548" class="stm run hide_run"><a href="#n548">548</a></p>
+<p id="n549" class="stm par run hide_run"><a href="#n549">549</a></p>
+<p id="n550" class="pln"><a href="#n550">550</a></p>
+<p id="n551" class="pln"><a href="#n551">551</a></p>
+<p id="n552" class="stm run hide_run"><a href="#n552">552</a></p>
+<p id="n553" class="pln"><a href="#n553">553</a></p>
+<p id="n554" class="pln"><a href="#n554">554</a></p>
+<p id="n555" class="pln"><a href="#n555">555</a></p>
+<p id="n556" class="stm run hide_run"><a href="#n556">556</a></p>
+<p id="n557" class="stm run hide_run"><a href="#n557">557</a></p>
+<p id="n558" class="stm par run hide_run"><a href="#n558">558</a></p>
+<p id="n559" class="stm run hide_run"><a href="#n559">559</a></p>
+<p id="n560" class="stm par run hide_run"><a href="#n560">560</a></p>
+<p id="n561" class="stm mis"><a href="#n561">561</a></p>
+<p id="n562" class="stm run hide_run"><a href="#n562">562</a></p>
+<p id="n563" class="pln"><a href="#n563">563</a></p>
+<p id="n564" class="stm mis"><a href="#n564">564</a></p>
+<p id="n565" class="pln"><a href="#n565">565</a></p>
+<p id="n566" class="stm run hide_run"><a href="#n566">566</a></p>
+<p id="n567" class="pln"><a href="#n567">567</a></p>
+<p id="n568" class="stm run hide_run"><a href="#n568">568</a></p>
+<p id="n569" class="pln"><a href="#n569">569</a></p>
+<p id="n570" class="stm run hide_run"><a href="#n570">570</a></p>
+<p id="n571" class="stm run hide_run"><a href="#n571">571</a></p>
+<p id="n572" class="stm run hide_run"><a href="#n572">572</a></p>
+<p id="n573" class="pln"><a href="#n573">573</a></p>
+<p id="n574" class="pln"><a href="#n574">574</a></p>
+<p id="n575" class="pln"><a href="#n575">575</a></p>
+<p id="n576" class="pln"><a href="#n576">576</a></p>
+<p id="n577" class="pln"><a href="#n577">577</a></p>
+<p id="n578" class="stm run hide_run"><a href="#n578">578</a></p>
+<p id="n579" class="stm run hide_run"><a href="#n579">579</a></p>
+<p id="n580" class="pln"><a href="#n580">580</a></p>
+<p id="n581" class="stm run hide_run"><a href="#n581">581</a></p>
+<p id="n582" class="stm run hide_run"><a href="#n582">582</a></p>
+<p id="n583" class="stm par run hide_run"><a href="#n583">583</a></p>
+<p id="n584" class="stm run hide_run"><a href="#n584">584</a></p>
+<p id="n585" class="stm run hide_run"><a href="#n585">585</a></p>
+<p id="n586" class="pln"><a href="#n586">586</a></p>
+<p id="n587" class="stm run hide_run"><a href="#n587">587</a></p>
+<p id="n588" class="pln"><a href="#n588">588</a></p>
+<p id="n589" class="stm run hide_run"><a href="#n589">589</a></p>
+<p id="n590" class="stm run hide_run"><a href="#n590">590</a></p>
+<p id="n591" class="stm run hide_run"><a href="#n591">591</a></p>
+<p id="n592" class="pln"><a href="#n592">592</a></p>
+<p id="n593" class="stm run hide_run"><a href="#n593">593</a></p>
+<p id="n594" class="stm run hide_run"><a href="#n594">594</a></p>
+<p id="n595" class="pln"><a href="#n595">595</a></p>
+<p id="n596" class="stm par run hide_run"><a href="#n596">596</a></p>
+<p id="n597" class="stm mis"><a href="#n597">597</a></p>
+<p id="n598" class="pln"><a href="#n598">598</a></p>
+<p id="n599" class="stm run hide_run"><a href="#n599">599</a></p>
+<p id="n600" class="pln"><a href="#n600">600</a></p>
+<p id="n601" class="stm run hide_run"><a href="#n601">601</a></p>
+<p id="n602" class="pln"><a href="#n602">602</a></p>
+<p id="n603" class="stm run hide_run"><a href="#n603">603</a></p>
+<p id="n604" class="stm run hide_run"><a href="#n604">604</a></p>
+<p id="n605" class="pln"><a href="#n605">605</a></p>
+<p id="n606" class="stm run hide_run"><a href="#n606">606</a></p>
+<p id="n607" class="stm run hide_run"><a href="#n607">607</a></p>
+<p id="n608" class="stm run hide_run"><a href="#n608">608</a></p>
+<p id="n609" class="pln"><a href="#n609">609</a></p>
+<p id="n610" class="stm run hide_run"><a href="#n610">610</a></p>
+<p id="n611" class="stm run hide_run"><a href="#n611">611</a></p>
+<p id="n612" class="stm run hide_run"><a href="#n612">612</a></p>
+<p id="n613" class="stm par run hide_run"><a href="#n613">613</a></p>
+<p id="n614" class="stm run hide_run"><a href="#n614">614</a></p>
+<p id="n615" class="pln"><a href="#n615">615</a></p>
+<p id="n616" class="stm run hide_run"><a href="#n616">616</a></p>
+<p id="n617" class="stm par run hide_run"><a href="#n617">617</a></p>
+<p id="n618" class="stm run hide_run"><a href="#n618">618</a></p>
+<p id="n619" class="stm par run hide_run"><a href="#n619">619</a></p>
+<p id="n620" class="stm mis"><a href="#n620">620</a></p>
+<p id="n621" class="stm mis"><a href="#n621">621</a></p>
+<p id="n622" class="stm mis"><a href="#n622">622</a></p>
+<p id="n623" class="stm mis"><a href="#n623">623</a></p>
+<p id="n624" class="stm mis"><a href="#n624">624</a></p>
+<p id="n625" class="stm mis"><a href="#n625">625</a></p>
+<p id="n626" class="stm run hide_run"><a href="#n626">626</a></p>
+<p id="n627" class="pln"><a href="#n627">627</a></p>
+<p id="n628" class="stm run hide_run"><a href="#n628">628</a></p>
+<p id="n629" class="pln"><a href="#n629">629</a></p>
+<p id="n630" class="stm run hide_run"><a href="#n630">630</a></p>
+<p id="n631" class="stm run hide_run"><a href="#n631">631</a></p>
+<p id="n632" class="pln"><a href="#n632">632</a></p>
+<p id="n633" class="stm run hide_run"><a href="#n633">633</a></p>
+<p id="n634" class="stm run hide_run"><a href="#n634">634</a></p>
+<p id="n635" class="stm run hide_run"><a href="#n635">635</a></p>
+<p id="n636" class="pln"><a href="#n636">636</a></p>
+<p id="n637" class="stm run hide_run"><a href="#n637">637</a></p>
+<p id="n638" class="stm run hide_run"><a href="#n638">638</a></p>
+<p id="n639" class="pln"><a href="#n639">639</a></p>
+<p id="n640" class="pln"><a href="#n640">640</a></p>
+<p id="n641" class="stm run hide_run"><a href="#n641">641</a></p>
+<p id="n642" class="pln"><a href="#n642">642</a></p>
+<p id="n643" class="stm run hide_run"><a href="#n643">643</a></p>
+<p id="n644" class="stm run hide_run"><a href="#n644">644</a></p>
+<p id="n645" class="pln"><a href="#n645">645</a></p>
+<p id="n646" class="stm run hide_run"><a href="#n646">646</a></p>
+<p id="n647" class="pln"><a href="#n647">647</a></p>
+<p id="n648" class="pln"><a href="#n648">648</a></p>
+<p id="n649" class="pln"><a href="#n649">649</a></p>
+<p id="n650" class="pln"><a href="#n650">650</a></p>
+<p id="n651" class="stm run hide_run"><a href="#n651">651</a></p>
+<p id="n652" class="stm run hide_run"><a href="#n652">652</a></p>
+<p id="n653" class="pln"><a href="#n653">653</a></p>
+<p id="n654" class="stm run hide_run"><a href="#n654">654</a></p>
+<p id="n655" class="stm run hide_run"><a href="#n655">655</a></p>
+<p id="n656" class="stm run hide_run"><a href="#n656">656</a></p>
+<p id="n657" class="stm run hide_run"><a href="#n657">657</a></p>
+<p id="n658" class="stm run hide_run"><a href="#n658">658</a></p>
+<p id="n659" class="pln"><a href="#n659">659</a></p>
+<p id="n660" class="pln"><a href="#n660">660</a></p>
+<p id="n661" class="stm run hide_run"><a href="#n661">661</a></p>
+<p id="n662" class="pln"><a href="#n662">662</a></p>
+<p id="n663" class="pln"><a href="#n663">663</a></p>
+<p id="n664" class="stm run hide_run"><a href="#n664">664</a></p>
+<p id="n665" class="stm run hide_run"><a href="#n665">665</a></p>
+<p id="n666" class="stm run hide_run"><a href="#n666">666</a></p>
+<p id="n667" class="pln"><a href="#n667">667</a></p>
+<p id="n668" class="pln"><a href="#n668">668</a></p>
+<p id="n669" class="stm run hide_run"><a href="#n669">669</a></p>
+<p id="n670" class="pln"><a href="#n670">670</a></p>
+<p id="n671" class="stm run hide_run"><a href="#n671">671</a></p>
+<p id="n672" class="pln"><a href="#n672">672</a></p>
+<p id="n673" class="pln"><a href="#n673">673</a></p>
+<p id="n674" class="stm run hide_run"><a href="#n674">674</a></p>
+<p id="n675" class="pln"><a href="#n675">675</a></p>
+<p id="n676" class="stm run hide_run"><a href="#n676">676</a></p>
+<p id="n677" class="pln"><a href="#n677">677</a></p>
+<p id="n678" class="stm run hide_run"><a href="#n678">678</a></p>
+<p id="n679" class="stm run hide_run"><a href="#n679">679</a></p>
+<p id="n680" class="pln"><a href="#n680">680</a></p>
+<p id="n681" class="stm run hide_run"><a href="#n681">681</a></p>
+<p id="n682" class="stm run hide_run"><a href="#n682">682</a></p>
+<p id="n683" class="stm run hide_run"><a href="#n683">683</a></p>
+<p id="n684" class="stm run hide_run"><a href="#n684">684</a></p>
+<p id="n685" class="pln"><a href="#n685">685</a></p>
+<p id="n686" class="pln"><a href="#n686">686</a></p>
+<p id="n687" class="pln"><a href="#n687">687</a></p>
+<p id="n688" class="pln"><a href="#n688">688</a></p>
+<p id="n689" class="pln"><a href="#n689">689</a></p>
+<p id="n690" class="pln"><a href="#n690">690</a></p>
+<p id="n691" class="stm run hide_run"><a href="#n691">691</a></p>
+<p id="n692" class="pln"><a href="#n692">692</a></p>
+<p id="n693" class="stm run hide_run"><a href="#n693">693</a></p>
+<p id="n694" class="stm run hide_run"><a href="#n694">694</a></p>
+<p id="n695" class="stm run hide_run"><a href="#n695">695</a></p>
+<p id="n696" class="stm run hide_run"><a href="#n696">696</a></p>
+<p id="n697" class="stm run hide_run"><a href="#n697">697</a></p>
+<p id="n698" class="stm run hide_run"><a href="#n698">698</a></p>
+<p id="n699" class="pln"><a href="#n699">699</a></p>
+<p id="n700" class="pln"><a href="#n700">700</a></p>
+<p id="n701" class="stm run hide_run"><a href="#n701">701</a></p>
+<p id="n702" class="pln"><a href="#n702">702</a></p>
+<p id="n703" class="pln"><a href="#n703">703</a></p>
+<p id="n704" class="pln"><a href="#n704">704</a></p>
+<p id="n705" class="pln"><a href="#n705">705</a></p>
+<p id="n706" class="pln"><a href="#n706">706</a></p>
+<p id="n707" class="pln"><a href="#n707">707</a></p>
+<p id="n708" class="pln"><a href="#n708">708</a></p>
+<p id="n709" class="pln"><a href="#n709">709</a></p>
+<p id="n710" class="stm mis"><a href="#n710">710</a></p>
+<p id="n711" class="stm mis"><a href="#n711">711</a></p>
+<p id="n712" class="stm mis"><a href="#n712">712</a></p>
+<p id="n713" class="stm mis"><a href="#n713">713</a></p>
+<p id="n714" class="pln"><a href="#n714">714</a></p>
+<p id="n715" class="stm mis"><a href="#n715">715</a></p>
+<p id="n716" class="stm mis"><a href="#n716">716</a></p>
+<p id="n717" class="pln"><a href="#n717">717</a></p>
+<p id="n718" class="pln"><a href="#n718">718</a></p>
+<p id="n719" class="pln"><a href="#n719">719</a></p>
+<p id="n720" class="pln"><a href="#n720">720</a></p>
+<p id="n721" class="pln"><a href="#n721">721</a></p>
+<p id="n722" class="stm mis"><a href="#n722">722</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">model</span><span class="op">.</span><span class="nam">Models</span> <span class="key">import</span> <span class="nam">CustomerResultWrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">model</span><span class="op">.</span><span class="nam">Models</span> <span class="key">import</span> <span class="nam">RegionResultWrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">model</span><span class="op">.</span><span class="nam">Models</span> <span class="key">import</span> <span class="nam">UserResultWrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">model</span><span class="op">.</span><span class="nam">Models</span> <span class="key">import</span> <span class="nam">CustomerSummaryResponse</span><span class="op">,</span> <span class="nam">CustomerSummary</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">rds_proxy</span> <span class="key">import</span> <span class="nam">RdsProxy</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">data</span><span class="op">.</span><span class="nam">data_manager</span> <span class="key">import</span> <span class="nam">DataManager</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">data</span><span class="op">.</span><span class="nam">sql_alchemy</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">UserRole</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logic</span><span class="op">.</span><span class="nam">error_base</span> <span class="key">import</span> <span class="nam">ErrorStatus</span><span class="op">,</span> <span class="nam">NotFound</span><span class="op">,</span> <span class="nam">DuplicateEntryError</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">data</span><span class="op">.</span><span class="nam">sql_alchemy</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">CustomerMetadata</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span><span class="op">.</span><span class="nam">cross_api_utils</span> <span class="key">import</span> <span class="nam">get_regions_of_group</span><span class="op">,</span> <span class="nam">set_utils_conf</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="op">,</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="key">import</span> <span class="nam">pecan</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm run hide_run"><span class="key">import</span> <span class="nam">requests</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logger</span> <span class="key">import</span> <span class="nam">get_logger</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run"><span class="nam">LOG</span> <span class="op">=</span> <span class="nam">get_logger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm run hide_run"><span class="key">class</span> <span class="nam">CustomerLogic</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm run hide_run">    <span class="key">def</span> <span class="nam">build_full_customer</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer</span><span class="op">,</span> <span class="nam">uuid</span><span class="op">,</span> <span class="nam">datamanager</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="stm run hide_run">        <span class="nam">sql_customer</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_customer</span><span class="op">(</span><span class="nam">customer</span><span class="op">,</span> <span class="nam">uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm par run hide_run"><span class="annotate short">27&#x202F;&#x219B;&#x202F;28</span><span class="annotate long">line 27 didn't jump to line 28, because the loop on line 27 never started</span>        <span class="key">for</span> <span class="nam">key</span><span class="op">,</span> <span class="nam">value</span> <span class="key">in</span> <span class="nam">customer</span><span class="op">.</span><span class="nam">metadata</span><span class="op">.</span><span class="nam">iteritems</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm mis">            <span class="nam">metadata</span> <span class="op">=</span> <span class="nam">CustomerMetadata</span><span class="op">(</span><span class="nam">field_key</span><span class="op">=</span><span class="nam">key</span><span class="op">,</span> <span class="nam">field_value</span><span class="op">=</span><span class="nam">value</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm mis">            <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_metadata</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">metadata</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">        <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_customer_region</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span> <span class="op">-</span><span class="num">1</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">        <span class="nam">default_region_users</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm run hide_run">        <span class="key">for</span> <span class="nam">user</span> <span class="key">in</span> <span class="nam">customer</span><span class="op">.</span><span class="nam">users</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">            <span class="nam">sql_user</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_user</span><span class="op">(</span><span class="nam">user</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm run hide_run">            <span class="nam">default_region_users</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">sql_user</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">            <span class="nam">sql_user</span><span class="op">.</span><span class="nam">sql_roles</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">            <span class="key">for</span> <span class="nam">role</span> <span class="key">in</span> <span class="nam">user</span><span class="op">.</span><span class="nam">role</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="stm run hide_run">                <span class="nam">sql_role</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_role</span><span class="op">(</span><span class="nam">role</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm run hide_run">                <span class="nam">sql_user</span><span class="op">.</span><span class="nam">sql_roles</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">sql_role</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t42" class="stm run hide_run">        <span class="nam">default_quotas</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm run hide_run">        <span class="key">for</span> <span class="nam">quota</span> <span class="key">in</span> <span class="nam">customer</span><span class="op">.</span><span class="nam">defaultQuotas</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm run hide_run">            <span class="nam">sql_quota</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_quota</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span> <span class="op">-</span><span class="num">1</span><span class="op">,</span> <span class="nam">quota</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">            <span class="nam">default_quotas</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">sql_quota</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t47" class="stm run hide_run">        <span class="key">for</span> <span class="nam">sql_user</span> <span class="key">in</span> <span class="nam">default_region_users</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm par run hide_run"><span class="annotate short">48&#x202F;&#x219B;&#x202F;49</span><span class="annotate long">line 48 didn't jump to line 49, because the loop on line 48 never started</span>            <span class="key">for</span> <span class="nam">sql_role</span> <span class="key">in</span> <span class="nam">sql_user</span><span class="op">.</span><span class="nam">sql_roles</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm mis">                <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_user_role</span><span class="op">(</span><span class="nam">sql_user</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span> <span class="nam">sql_role</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln">                                          <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span> <span class="op">-</span><span class="num">1</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t52" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">add_regions_to_db</span><span class="op">(</span><span class="nam">customer</span><span class="op">.</span><span class="nam">regions</span><span class="op">,</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span> <span class="nam">datamanager</span><span class="op">,</span> <span class="nam">customer</span><span class="op">.</span><span class="nam">users</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">        <span class="key">return</span> <span class="nam">sql_customer</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t55" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_regions_to_db</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">regions</span><span class="op">,</span> <span class="nam">sql_customer_id</span><span class="op">,</span> <span class="nam">datamanager</span><span class="op">,</span> <span class="nam">default_users</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">        <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span> <span class="nam">regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">            <span class="nam">users_roles</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">add_user_and_roles_to_db</span><span class="op">(</span><span class="nam">region</span><span class="op">.</span><span class="nam">users</span><span class="op">,</span> <span class="nam">default_users</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="pln">                                                        <span class="nam">datamanager</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln">            <span class="com"># NOTE: if region has no users there is no need to update the</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln">            <span class="com"># default users in that region</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln">            <span class="com"># if len(region.users) == 0:</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln">            <span class="com">#     users_roles.extend(self.add_user_and_roles_to_db(</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln">            <span class="com"># customer.users, datamanager))</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="pln">            <span class="com"># else:</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="pln">            <span class="com">#     users_roles.extend(self.add_user_and_roles_to_db(</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="pln">            <span class="com"># region.users, datamanager))</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t69" class="stm run hide_run">            <span class="nam">sql_region</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_region</span><span class="op">(</span><span class="nam">region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">            <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="stm run hide_run">                <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_customer_region</span><span class="op">(</span><span class="nam">sql_customer_id</span><span class="op">,</span> <span class="nam">sql_region</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="stm mis">            <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">ex</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="stm mis">                <span class="key">if</span> <span class="nam">hasattr</span><span class="op">(</span><span class="nam">ex</span><span class="op">,</span> <span class="str">'orig'</span><span class="op">)</span> <span class="key">and</span> <span class="nam">ex</span><span class="op">.</span><span class="nam">orig</span><span class="op">[</span><span class="num">0</span><span class="op">]</span> <span class="op">==</span> <span class="num">1062</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="stm mis">                    <span class="key">raise</span> <span class="nam">DuplicateEntryError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln">                        <span class="str">'Error, duplicate entry, region '</span> <span class="op">+</span> <span class="nam">region</span><span class="op">.</span><span class="nam">name</span> <span class="op">+</span> <span class="str">' already associated with customer'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="stm mis">                <span class="key">raise</span> <span class="nam">ex</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">            <span class="key">for</span> <span class="nam">user_role</span> <span class="key">in</span> <span class="nam">users_roles</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm run hide_run">                <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_user_role</span><span class="op">(</span><span class="nam">user_role</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span> <span class="nam">user_role</span><span class="op">[</span><span class="num">1</span><span class="op">]</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="pln">                                          <span class="nam">sql_customer_id</span><span class="op">,</span> <span class="nam">sql_region</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t82" class="stm par run hide_run"><span class="annotate short">82&#x202F;&#x219B;&#x202F;83</span><span class="annotate long">line 82 didn't jump to line 83, because the loop on line 82 never started</span>            <span class="key">for</span> <span class="nam">quota</span> <span class="key">in</span> <span class="nam">region</span><span class="op">.</span><span class="nam">quotas</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="stm mis">                <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_quota</span><span class="op">(</span><span class="nam">sql_customer_id</span><span class="op">,</span> <span class="nam">sql_region</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span> <span class="nam">quota</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t85" class="pln">                <span class="com"># NOTE: if region has no quotas there is no need to update</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="pln">                <span class="com"># the default quotas in that region</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="pln">                <span class="com"># if len(region.quotas) == 0:</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln">                <span class="com">#     for quota in customer.defaultQuotas:</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="pln">                <span class="com">#         datamanager.add_quota(sql_customer_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln">                <span class="com"># sql_region.id, quota)</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="pln">                <span class="com"># else:</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="pln">                <span class="com">#     for quota in region.quotas:</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="pln">                <span class="com">#         datamanager.add_quota(sql_customer_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="pln">                <span class="com"># sql_region.id, quota)</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t96" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_user_and_roles_to_db</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">users</span><span class="op">,</span> <span class="nam">default_users</span><span class="op">,</span> <span class="nam">datamanager</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="stm run hide_run">        <span class="nam">users_roles</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="stm run hide_run">        <span class="key">for</span> <span class="nam">user</span> <span class="key">in</span> <span class="nam">users</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="stm run hide_run">            <span class="nam">sql_user</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_user</span><span class="op">(</span><span class="nam">user</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="stm run hide_run">            <span class="key">for</span> <span class="nam">role</span> <span class="key">in</span> <span class="nam">user</span><span class="op">.</span><span class="nam">role</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="stm run hide_run">                <span class="nam">sql_role</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_role</span><span class="op">(</span><span class="nam">role</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="stm run hide_run">                <span class="nam">users_roles</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">(</span><span class="nam">sql_user</span><span class="op">,</span> <span class="nam">sql_role</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="stm run hide_run">        <span class="key">for</span> <span class="nam">de_user</span> <span class="key">in</span> <span class="nam">default_users</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="stm run hide_run">            <span class="nam">sql_user</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_user</span><span class="op">(</span><span class="nam">de_user</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="stm run hide_run">            <span class="key">for</span> <span class="nam">role</span> <span class="key">in</span> <span class="nam">de_user</span><span class="op">.</span><span class="nam">role</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="stm run hide_run">                <span class="nam">sql_role</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_role</span><span class="op">(</span><span class="nam">role</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="stm run hide_run">                <span class="nam">users_roles</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">(</span><span class="nam">sql_user</span><span class="op">,</span> <span class="nam">sql_role</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t109" class="stm run hide_run">        <span class="key">return</span> <span class="nam">users_roles</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t111" class="stm run hide_run">    <span class="key">def</span> <span class="nam">create_customer</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer</span><span class="op">,</span> <span class="nam">uuid</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t112" class="stm run hide_run">        <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="stm run hide_run">            <span class="nam">customer</span><span class="op">.</span><span class="nam">handle_region_group</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="stm run hide_run">            <span class="nam">sql_customer</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">build_full_customer</span><span class="op">(</span><span class="nam">customer</span><span class="op">,</span> <span class="nam">uuid</span><span class="op">,</span> <span class="nam">datamanager</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="stm run hide_run">            <span class="nam">customer_result_wrapper</span> <span class="op">=</span> <span class="nam">build_response</span><span class="op">(</span><span class="nam">uuid</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="str">'create'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t118" class="stm run hide_run">            <span class="nam">sql_customer</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">add_default_users_to_empty_regions</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="stm par run hide_run"><span class="annotate short">119&#x202F;&#x219B;&#x202F;120</span><span class="annotate long">line 119 didn't jump to line 120, because the condition on line 119 was never true</span>            <span class="key">if</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_customer_regions</span> <span class="key">and</span> <span class="nam">len</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_customer_regions</span><span class="op">)</span> <span class="op">></span> <span class="num">1</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="stm mis">                <span class="nam">customer_dict</span> <span class="op">=</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">get_proxy_dict</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t121" class="stm mis">                <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span> <span class="nam">customer_dict</span><span class="op">[</span><span class="str">"regions"</span><span class="op">]</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="stm mis">                    <span class="nam">region</span><span class="op">[</span><span class="str">"action"</span><span class="op">]</span> <span class="op">=</span> <span class="str">"create"</span><span class="strut">&nbsp;</span></p>
+<p id="t123" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t124" class="stm mis">                <span class="nam">datamanager</span><span class="op">.</span><span class="nam">flush</span><span class="op">(</span><span class="op">)</span>  <span class="com"># i want to get any exception created by this insert</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="stm mis">                <span class="nam">RdsProxy</span><span class="op">.</span><span class="nam">send_customer_dict</span><span class="op">(</span><span class="nam">customer_dict</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="str">"POST"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t126" class="pln">            <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t127" class="stm run hide_run">                <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Customer with no regions - wasn't send to RDS Proxy "</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span><span class="nam">customer</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t128" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t129" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t131" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t132" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"CustomerLogic - Failed to CreateCustomer"</span><span class="op">,</span> <span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t133" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t134" class="stm run hide_run">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t135" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t136" class="stm run hide_run">        <span class="key">return</span> <span class="nam">customer_result_wrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t137" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t138" class="stm run hide_run">    <span class="key">def</span> <span class="nam">update_customer</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t139" class="stm run hide_run">        <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t140" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t141" class="stm run hide_run">            <span class="nam">customer</span><span class="op">.</span><span class="nam">validate_model</span><span class="op">(</span><span class="str">'update'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t142" class="stm run hide_run">            <span class="nam">customer_record</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_record</span><span class="op">(</span><span class="str">'customer'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t143" class="stm run hide_run">            <span class="nam">cutomer_id</span> <span class="op">=</span> <span class="nam">customer_record</span><span class="op">.</span><span class="nam">get_customer_id_from_uuid</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t144" class="pln">                <span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t145" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t146" class="stm run hide_run">            <span class="nam">sql_customer</span> <span class="op">=</span> <span class="nam">customer_record</span><span class="op">.</span><span class="nam">read_customer_by_uuid</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t147" class="stm par run hide_run"><span class="annotate short">147&#x202F;&#x219B;&#x202F;148</span><span class="annotate long">line 147 didn't jump to line 148, because the condition on line 147 was never true</span>            <span class="key">if</span> <span class="key">not</span> <span class="nam">sql_customer</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t148" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">404</span><span class="op">,</span> <span class="str">'customer {0} was not found'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t149" class="stm run hide_run">            <span class="nam">old_customer_dict</span> <span class="op">=</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">get_proxy_dict</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t150" class="stm run hide_run">            <span class="nam">customer_record</span><span class="op">.</span><span class="nam">delete_by_primary_key</span><span class="op">(</span><span class="nam">cutomer_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t151" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">flush</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t152" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t153" class="stm run hide_run">            <span class="nam">sql_customer</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">build_full_customer</span><span class="op">(</span><span class="nam">customer</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t154" class="pln">                                                    <span class="nam">datamanager</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t155" class="stm run hide_run">            <span class="nam">sql_customer</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">add_default_users_to_empty_regions</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t156" class="stm run hide_run">            <span class="nam">new_customer_dict</span> <span class="op">=</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">get_proxy_dict</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t157" class="stm run hide_run">            <span class="nam">new_customer_dict</span><span class="op">[</span><span class="str">"regions"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">resolve_regions_actions</span><span class="op">(</span><span class="nam">old_customer_dict</span><span class="op">[</span><span class="str">"regions"</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t158" class="pln">                                                                        <span class="nam">new_customer_dict</span><span class="op">[</span><span class="str">"regions"</span><span class="op">]</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t159" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t160" class="stm run hide_run">            <span class="nam">customer_result_wrapper</span> <span class="op">=</span> <span class="nam">build_response</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="str">'update'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t161" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">flush</span><span class="op">(</span><span class="op">)</span>  <span class="com"># i want to get any exception created by this insert</span><span class="strut">&nbsp;</span></p>
+<p id="t162" class="stm par run hide_run"><span class="annotate short">162&#x202F;&#x219B;&#x202F;163</span><span class="annotate long">line 162 didn't jump to line 163, because the condition on line 162 was never true</span>            <span class="key">if</span> <span class="key">not</span> <span class="nam">len</span><span class="op">(</span><span class="nam">new_customer_dict</span><span class="op">[</span><span class="str">'regions'</span><span class="op">]</span><span class="op">)</span> <span class="op">==</span> <span class="num">0</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t163" class="stm mis">                <span class="nam">RdsProxy</span><span class="op">.</span><span class="nam">send_customer_dict</span><span class="op">(</span><span class="nam">new_customer_dict</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="str">"PUT"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t164" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t165" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t166" class="stm run hide_run">            <span class="key">return</span> <span class="nam">customer_result_wrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t167" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t168" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t169" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"CustomerLogic - Failed to CreateCustomer"</span><span class="op">,</span> <span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t170" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t171" class="stm run hide_run">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t172" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t173" class="stm run hide_run">    <span class="key">def</span> <span class="nam">resolve_regions_actions</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">old_regions_dict</span><span class="op">,</span> <span class="nam">new_regions_dict</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t174" class="stm par run hide_run"><span class="annotate short">174&#x202F;&#x219B;&#x202F;175</span><span class="annotate long">line 174 didn't jump to line 175, because the loop on line 174 never started</span>        <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span> <span class="nam">new_regions_dict</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t175" class="stm mis">            <span class="nam">old_region</span> <span class="op">=</span> <span class="nam">next</span><span class="op">(</span><span class="op">(</span><span class="nam">r</span> <span class="key">for</span> <span class="nam">r</span> <span class="key">in</span> <span class="nam">old_regions_dict</span> <span class="key">if</span> <span class="nam">r</span><span class="op">[</span><span class="str">"name"</span><span class="op">]</span> <span class="op">==</span> <span class="nam">region</span><span class="op">[</span><span class="str">"name"</span><span class="op">]</span><span class="op">)</span><span class="op">,</span> <span class="nam">None</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t176" class="stm mis">            <span class="key">if</span> <span class="nam">old_region</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t177" class="stm mis">                <span class="nam">region</span><span class="op">[</span><span class="str">"action"</span><span class="op">]</span> <span class="op">=</span> <span class="str">"modify"</span><span class="strut">&nbsp;</span></p>
+<p id="t178" class="pln">            <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t179" class="stm mis">                <span class="nam">region</span><span class="op">[</span><span class="str">"action"</span><span class="op">]</span> <span class="op">=</span> <span class="str">"create"</span><span class="strut">&nbsp;</span></p>
+<p id="t180" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t181" class="stm par run hide_run"><span class="annotate short">181&#x202F;&#x219B;&#x202F;182</span><span class="annotate long">line 181 didn't jump to line 182, because the loop on line 181 never started</span>        <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span> <span class="nam">old_regions_dict</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t182" class="stm mis">            <span class="nam">new_region</span> <span class="op">=</span> <span class="nam">next</span><span class="op">(</span><span class="op">(</span><span class="nam">r</span> <span class="key">for</span> <span class="nam">r</span> <span class="key">in</span> <span class="nam">new_regions_dict</span> <span class="key">if</span> <span class="nam">r</span><span class="op">[</span><span class="str">"name"</span><span class="op">]</span> <span class="op">==</span> <span class="nam">region</span><span class="op">[</span><span class="str">"name"</span><span class="op">]</span><span class="op">)</span><span class="op">,</span> <span class="nam">None</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t183" class="stm mis">            <span class="key">if</span> <span class="key">not</span> <span class="nam">new_region</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t184" class="stm mis">                <span class="nam">region</span><span class="op">[</span><span class="str">"action"</span><span class="op">]</span> <span class="op">=</span> <span class="str">"delete"</span><span class="strut">&nbsp;</span></p>
+<p id="t185" class="stm mis">                <span class="nam">new_regions_dict</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t186" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t187" class="stm run hide_run">        <span class="key">return</span> <span class="nam">new_regions_dict</span><span class="strut">&nbsp;</span></p>
+<p id="t188" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t189" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_users</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">region_name</span><span class="op">,</span> <span class="nam">users</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">p_datamanager</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t190" class="stm run hide_run">        <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t191" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t192" class="stm run hide_run">            <span class="key">if</span> <span class="nam">p_datamanager</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t193" class="stm run hide_run">                <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t194" class="stm run hide_run">                <span class="nam">datamanager</span><span class="op">.</span><span class="nam">begin_transaction</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t195" class="pln">            <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t196" class="stm run hide_run">                <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">p_datamanager</span><span class="strut">&nbsp;</span></p>
+<p id="t197" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t198" class="stm run hide_run">            <span class="nam">region_id</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_region_id_by_name</span><span class="op">(</span><span class="nam">region_name</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t199" class="stm run hide_run">            <span class="nam">customer_id</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_customer_id_by_uuid</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t200" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t201" class="stm par run hide_run"><span class="annotate short">201&#x202F;&#x219B;&#x202F;202</span><span class="annotate long">line 201 didn't jump to line 202, because the condition on line 201 was never true</span>            <span class="key">if</span> <span class="nam">customer_id</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t202" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">404</span><span class="op">,</span> <span class="str">"customer {} does not exist"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t203" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t204" class="stm par run hide_run"><span class="annotate short">204&#x202F;&#x219B;&#x202F;205</span><span class="annotate long">line 204 didn't jump to line 205, because the condition on line 204 was never true</span>            <span class="key">if</span> <span class="nam">region_id</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t205" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">404</span><span class="op">,</span> <span class="str">"region {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_name</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t206" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t207" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">add_users_to_db</span><span class="op">(</span><span class="nam">datamanager</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">users</span><span class="op">,</span> <span class="nam">adding</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t208" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t209" class="stm run hide_run">            <span class="nam">customer_record</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_record</span><span class="op">(</span><span class="str">'customer'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t210" class="stm run hide_run">            <span class="nam">customer</span> <span class="op">=</span> <span class="nam">customer_record</span><span class="op">.</span><span class="nam">read_customer</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t211" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t212" class="stm run hide_run">            <span class="nam">timestamp</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">get_time_human</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t213" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">flush</span><span class="op">(</span><span class="op">)</span>  <span class="com"># i want to get any exception created by this insert</span><span class="strut">&nbsp;</span></p>
+<p id="t214" class="stm run hide_run">            <span class="nam">RdsProxy</span><span class="op">.</span><span class="nam">send_customer</span><span class="op">(</span><span class="nam">customer</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="str">"PUT"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t215" class="stm run hide_run">            <span class="key">if</span> <span class="nam">p_datamanager</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t216" class="stm run hide_run">                <span class="nam">datamanager</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t217" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t218" class="stm run hide_run">            <span class="nam">base_link</span> <span class="op">=</span> <span class="str">'{0}{1}/'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">conf</span><span class="op">.</span><span class="nam">server</span><span class="op">.</span><span class="nam">host_ip</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t219" class="pln">                                         <span class="nam">pecan</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">path</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t220" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t221" class="stm run hide_run">            <span class="nam">result_users</span> <span class="op">=</span> <span class="op">[</span><span class="op">{</span><span class="str">'id'</span><span class="op">:</span> <span class="nam">user</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span> <span class="str">'added'</span><span class="op">:</span> <span class="nam">timestamp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t222" class="pln">                             <span class="str">'links'</span><span class="op">:</span> <span class="op">{</span><span class="str">'self'</span><span class="op">:</span> <span class="nam">base_link</span> <span class="op">+</span> <span class="nam">user</span><span class="op">.</span><span class="nam">id</span><span class="op">}</span><span class="op">}</span> <span class="key">for</span> <span class="nam">user</span> <span class="key">in</span><span class="strut">&nbsp;</span></p>
+<p id="t223" class="pln">                            <span class="nam">users</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t224" class="stm run hide_run">            <span class="nam">user_result_wrapper</span> <span class="op">=</span> <span class="nam">UserResultWrapper</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t225" class="pln">                <span class="nam">transaction_id</span><span class="op">=</span><span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">users</span><span class="op">=</span><span class="nam">result_users</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t226" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t227" class="stm run hide_run">            <span class="key">return</span> <span class="nam">user_result_wrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t228" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t229" class="stm par run hide_run"><span class="annotate short">229&#x202F;&#x219B;&#x202F;230</span><span class="annotate long">line 229 didn't jump to line 230, because the condition on line 229 was never true</span>            <span class="key">if</span> <span class="str">'Duplicate'</span> <span class="key">in</span> <span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t230" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">409</span><span class="op">,</span> <span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t231" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t232" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"Failed to add_users"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t233" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">exception</span><span class="strut">&nbsp;</span></p>
+<p id="t234" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t235" class="stm run hide_run">    <span class="key">def</span> <span class="nam">replace_users</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">region_name</span><span class="op">,</span> <span class="nam">users</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t236" class="stm run hide_run">        <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t237" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t238" class="stm run hide_run">            <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t239" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">begin_transaction</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t240" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t241" class="stm run hide_run">            <span class="nam">customer_id</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_customer_id_by_uuid</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t242" class="stm par run hide_run"><span class="annotate short">242&#x202F;&#x219B;&#x202F;243</span><span class="annotate long">line 242 didn't jump to line 243, because the condition on line 242 was never true</span>            <span class="key">if</span> <span class="nam">customer_id</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t243" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">404</span><span class="op">,</span> <span class="str">"customer {} does not exist"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t244" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t245" class="stm run hide_run">            <span class="nam">region_id</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_region_id_by_name</span><span class="op">(</span><span class="nam">region_name</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t246" class="stm par run hide_run"><span class="annotate short">246&#x202F;&#x219B;&#x202F;247</span><span class="annotate long">line 246 didn't jump to line 247, because the condition on line 246 was never true</span>            <span class="key">if</span> <span class="nam">region_id</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t247" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">404</span><span class="op">,</span> <span class="str">"region {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_name</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t248" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t249" class="pln">            <span class="com"># delete older default user</span><span class="strut">&nbsp;</span></p>
+<p id="t250" class="stm run hide_run">            <span class="nam">user_role_record</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_record</span><span class="op">(</span><span class="str">'user_role'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t251" class="stm run hide_run">            <span class="nam">user_role_record</span><span class="op">.</span><span class="nam">delete_all_users_from_region</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">region_name</span><span class="op">)</span>  <span class="com"># -1 is default region</span><span class="strut">&nbsp;</span></p>
+<p id="t252" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">add_users</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">region_name</span><span class="op">,</span> <span class="nam">users</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">datamanager</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t253" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t254" class="stm run hide_run">            <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t255" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t256" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t257" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t258" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"Failed to replace_default_users"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t259" class="stm run hide_run">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t260" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t261" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_users_to_db</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">datamanager</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">users</span><span class="op">,</span> <span class="nam">adding</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t262" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t263" class="stm run hide_run">            <span class="nam">users_roles</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t264" class="stm run hide_run">            <span class="key">for</span> <span class="nam">user</span> <span class="key">in</span> <span class="nam">users</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t265" class="stm run hide_run">                <span class="nam">sql_user</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_user</span><span class="op">(</span><span class="nam">user</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t266" class="stm run hide_run">                <span class="key">for</span> <span class="nam">role</span> <span class="key">in</span> <span class="nam">user</span><span class="op">.</span><span class="nam">role</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t267" class="stm run hide_run">                    <span class="nam">sql_role</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_role</span><span class="op">(</span><span class="nam">role</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t268" class="stm run hide_run">                    <span class="nam">users_roles</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">(</span><span class="nam">sql_user</span><span class="op">,</span> <span class="nam">sql_role</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t269" class="stm run hide_run">            <span class="key">for</span> <span class="nam">user_role</span> <span class="key">in</span> <span class="nam">users_roles</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t270" class="pln">                <span class="com"># TODO: change add_use_role to receive sqlalchemy model (UserRole)</span><span class="strut">&nbsp;</span></p>
+<p id="t271" class="stm run hide_run">                <span class="nam">datamanager</span><span class="op">.</span><span class="nam">add_user_role</span><span class="op">(</span><span class="nam">user_role</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span> <span class="nam">user_role</span><span class="op">[</span><span class="num">1</span><span class="op">]</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t272" class="pln">                                          <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">adding</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t273" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">flush</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t274" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t275" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"Failed to add users"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t276" class="stm run hide_run">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t277" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t278" class="stm run hide_run">    <span class="key">def</span> <span class="nam">delete_users</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">user_id</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t279" class="stm run hide_run">        <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t280" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t281" class="stm run hide_run">            <span class="nam">user_role_record</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_record</span><span class="op">(</span><span class="str">'user_role'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t282" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t283" class="stm run hide_run">            <span class="nam">customer</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_cusomer_by_uuid</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t284" class="stm par run hide_run"><span class="annotate short">284&#x202F;&#x219B;&#x202F;285</span><span class="annotate long">line 284 didn't jump to line 285, because the condition on line 284 was never true</span>            <span class="key">if</span> <span class="nam">customer</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t285" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">404</span><span class="op">,</span> <span class="str">"customer {} does not exist"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t286" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t287" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">user_role_record</span><span class="op">.</span><span class="nam">delete_user_from_region</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t288" class="pln">                                                              <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t289" class="pln">                                                              <span class="nam">user_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t290" class="stm run hide_run">            <span class="key">if</span> <span class="nam">result</span><span class="op">.</span><span class="nam">rowcount</span> <span class="op">==</span> <span class="num">0</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t291" class="stm run hide_run">                <span class="key">raise</span> <span class="nam">NotFound</span><span class="op">(</span><span class="str">"user {} is not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">user_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t292" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t293" class="stm run hide_run">            <span class="nam">RdsProxy</span><span class="op">.</span><span class="nam">send_customer</span><span class="op">(</span><span class="nam">customer</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="str">"PUT"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t294" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t295" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t296" class="stm run hide_run">            <span class="key">print</span> <span class="str">"User {0} from region {1} in customer {2} deleted"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t297" class="pln">                <span class="nam">user_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t298" class="stm run hide_run">        <span class="key">except</span> <span class="nam">NotFound</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t299" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t300" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"Failed to delete_users, user not found"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t301" class="pln">                              <span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t302" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">NotFound</span><span class="op">(</span><span class="str">"Failed to delete users,  %s not found"</span> <span class="op">%</span><span class="strut">&nbsp;</span></p>
+<p id="t303" class="pln">                           <span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t304" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t305" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t306" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"Failed to delete_users"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t307" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">exception</span><span class="strut">&nbsp;</span></p>
+<p id="t308" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t309" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_default_users</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">users</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">p_datamanager</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t310" class="stm run hide_run">        <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t311" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t312" class="stm run hide_run">            <span class="key">if</span> <span class="nam">p_datamanager</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t313" class="stm run hide_run">                <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t314" class="stm run hide_run">                <span class="nam">datamanager</span><span class="op">.</span><span class="nam">begin_transaction</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t315" class="pln">            <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t316" class="stm run hide_run">                <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">p_datamanager</span><span class="strut">&nbsp;</span></p>
+<p id="t317" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t318" class="stm run hide_run">            <span class="nam">customer_id</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_customer_id_by_uuid</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t319" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t320" class="stm par run hide_run"><span class="annotate short">320&#x202F;&#x219B;&#x202F;321</span><span class="annotate long">line 320 didn't jump to line 321, because the condition on line 320 was never true</span>            <span class="key">if</span> <span class="nam">customer_id</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t321" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">404</span><span class="op">,</span> <span class="str">"customer {} does not exist"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t322" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t323" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">add_users_to_db</span><span class="op">(</span><span class="nam">datamanager</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="op">-</span><span class="num">1</span><span class="op">,</span> <span class="nam">users</span><span class="op">,</span> <span class="nam">adding</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t324" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t325" class="stm run hide_run">            <span class="nam">customer_record</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_record</span><span class="op">(</span><span class="str">'customer'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t326" class="stm run hide_run">            <span class="nam">customer</span> <span class="op">=</span> <span class="nam">customer_record</span><span class="op">.</span><span class="nam">read_customer</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t327" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t328" class="stm run hide_run">            <span class="nam">timestamp</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">get_time_human</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t329" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">flush</span><span class="op">(</span><span class="op">)</span>  <span class="com"># i want to get any exception created by this insert</span><span class="strut">&nbsp;</span></p>
+<p id="t330" class="stm par run hide_run"><span class="annotate short">330&#x202F;&#x219B;&#x202F;331</span><span class="annotate long">line 330 didn't jump to line 331, because the condition on line 330 was never true</span>            <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">customer</span><span class="op">.</span><span class="nam">customer_customer_regions</span><span class="op">)</span> <span class="op">></span> <span class="num">1</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t331" class="stm mis">                <span class="nam">RdsProxy</span><span class="op">.</span><span class="nam">send_customer</span><span class="op">(</span><span class="nam">customer</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="str">"PUT"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t332" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t333" class="stm run hide_run">            <span class="key">if</span> <span class="nam">p_datamanager</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t334" class="stm run hide_run">                <span class="nam">datamanager</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t335" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t336" class="stm run hide_run">            <span class="nam">base_link</span> <span class="op">=</span> <span class="str">'{0}{1}/'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">conf</span><span class="op">.</span><span class="nam">server</span><span class="op">.</span><span class="nam">host_ip</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t337" class="pln">                                         <span class="nam">pecan</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">path</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t338" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t339" class="stm run hide_run">            <span class="nam">result_users</span> <span class="op">=</span> <span class="op">[</span><span class="op">{</span><span class="str">'id'</span><span class="op">:</span> <span class="nam">user</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span> <span class="str">'added'</span><span class="op">:</span> <span class="nam">timestamp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t340" class="pln">                             <span class="str">'links'</span><span class="op">:</span> <span class="op">{</span><span class="str">'self'</span><span class="op">:</span> <span class="nam">base_link</span> <span class="op">+</span> <span class="nam">user</span><span class="op">.</span><span class="nam">id</span><span class="op">}</span><span class="op">}</span> <span class="key">for</span> <span class="nam">user</span> <span class="key">in</span><span class="strut">&nbsp;</span></p>
+<p id="t341" class="pln">                            <span class="nam">users</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t342" class="stm run hide_run">            <span class="nam">user_result_wrapper</span> <span class="op">=</span> <span class="nam">UserResultWrapper</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t343" class="pln">                <span class="nam">transaction_id</span><span class="op">=</span><span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">users</span><span class="op">=</span><span class="nam">result_users</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t344" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t345" class="stm run hide_run">            <span class="key">return</span> <span class="nam">user_result_wrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t346" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t347" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t348" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t349" class="stm par run hide_run"><span class="annotate short">349&#x202F;&#x219B;&#x202F;350</span><span class="annotate long">line 349 didn't jump to line 350, because the condition on line 349 was never true</span>            <span class="key">if</span> <span class="str">'Duplicate'</span> <span class="key">in</span> <span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t350" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">409</span><span class="op">,</span> <span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t351" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"Failed to add_default_users"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t352" class="stm run hide_run">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t353" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t354" class="stm run hide_run">    <span class="key">def</span> <span class="nam">replace_default_users</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">users</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t355" class="stm run hide_run">        <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t356" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t357" class="stm run hide_run">            <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t358" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">begin_transaction</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t359" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t360" class="stm run hide_run">            <span class="nam">customer_id</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_customer_id_by_uuid</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t361" class="stm par run hide_run"><span class="annotate short">361&#x202F;&#x219B;&#x202F;362</span><span class="annotate long">line 361 didn't jump to line 362, because the condition on line 361 was never true</span>            <span class="key">if</span> <span class="nam">customer_id</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t362" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">404</span><span class="op">,</span> <span class="str">"customer {} does not exist"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t363" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t364" class="pln">            <span class="com"># delete older default user</span><span class="strut">&nbsp;</span></p>
+<p id="t365" class="stm run hide_run">            <span class="nam">user_role_record</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_record</span><span class="op">(</span><span class="str">'user_role'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t366" class="stm run hide_run">            <span class="nam">user_role_record</span><span class="op">.</span><span class="nam">delete_all_users_from_region</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="op">-</span><span class="num">1</span><span class="op">)</span>  <span class="com"># -1 is default region</span><span class="strut">&nbsp;</span></p>
+<p id="t367" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">add_default_users</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">users</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">datamanager</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t368" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t369" class="stm run hide_run">            <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t370" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t371" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t372" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t373" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"Failed to replace_default_users"</span><span class="op">,</span> <span class="nam">exception</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t374" class="stm run hide_run">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t375" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t376" class="stm run hide_run">    <span class="key">def</span> <span class="nam">delete_default_users</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">user_id</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t377" class="stm run hide_run">        <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t378" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t379" class="stm run hide_run">            <span class="nam">customer</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_cusomer_by_uuid</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t380" class="stm par run hide_run"><span class="annotate short">380&#x202F;&#x219B;&#x202F;381</span><span class="annotate long">line 380 didn't jump to line 381, because the condition on line 380 was never true</span>            <span class="key">if</span> <span class="nam">customer</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t381" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">404</span><span class="op">,</span> <span class="str">"customer {} does not exist"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t382" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t383" class="stm run hide_run">            <span class="nam">user_role_record</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_record</span><span class="op">(</span><span class="str">'user_role'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t384" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">user_role_record</span><span class="op">.</span><span class="nam">delete_user_from_region</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t385" class="pln">                                                              <span class="str">'DEFAULT'</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t386" class="pln">                                                              <span class="nam">user_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t387" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t388" class="stm run hide_run">            <span class="key">if</span> <span class="nam">result</span><span class="op">.</span><span class="nam">rowcount</span> <span class="op">==</span> <span class="num">0</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t389" class="stm run hide_run">                <span class="key">raise</span> <span class="nam">NotFound</span><span class="op">(</span><span class="str">"user {} is not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">user_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t390" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t391" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t392" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t393" class="stm run hide_run">            <span class="key">print</span> <span class="str">"User {0} from region {1} in customer {2} deleted"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t394" class="pln">                <span class="nam">user_id</span><span class="op">,</span> <span class="str">'DEFAULT'</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t395" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t396" class="stm run hide_run">        <span class="key">except</span> <span class="nam">NotFound</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t397" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t398" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"Failed to delete_users, user not found"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t399" class="pln">                              <span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t400" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">NotFound</span><span class="op">(</span><span class="str">"Failed to delete users,  %s not found"</span> <span class="op">%</span><span class="strut">&nbsp;</span></p>
+<p id="t401" class="pln">                           <span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t402" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t403" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t404" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t405" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">exp</span><span class="strut">&nbsp;</span></p>
+<p id="t406" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t407" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_regions</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">regions</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t408" class="stm run hide_run">        <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t409" class="stm run hide_run">        <span class="nam">customer_record</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_record</span><span class="op">(</span><span class="str">'customer'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t410" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t411" class="pln">            <span class="com"># TODO DataBase action</span><span class="strut">&nbsp;</span></p>
+<p id="t412" class="stm run hide_run">            <span class="nam">customer_id</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_customer_id_by_uuid</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t413" class="stm par run hide_run"><span class="annotate short">413&#x202F;&#x219B;&#x202F;414</span><span class="annotate long">line 413 didn't jump to line 414, because the condition on line 413 was never true</span>            <span class="key">if</span> <span class="nam">customer_id</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t414" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">404</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t415" class="pln">                                  <span class="str">"customer with id {} does not exist"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t416" class="pln">                                      <span class="nam">customer_uuid</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t417" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">add_regions_to_db</span><span class="op">(</span><span class="nam">regions</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">datamanager</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t418" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t419" class="stm run hide_run">            <span class="nam">sql_customer</span> <span class="op">=</span> <span class="nam">customer_record</span><span class="op">.</span><span class="nam">read_customer_by_uuid</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t420" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t421" class="stm run hide_run">            <span class="nam">sql_customer</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">add_default_users_to_empty_regions</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t422" class="stm run hide_run">            <span class="nam">new_customer_dict</span> <span class="op">=</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">get_proxy_dict</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t423" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t424" class="stm par run hide_run"><span class="annotate short">424&#x202F;&#x219B;&#x202F;425</span><span class="annotate long">line 424 didn't jump to line 425, because the loop on line 424 never started</span>            <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span> <span class="nam">new_customer_dict</span><span class="op">[</span><span class="str">"regions"</span><span class="op">]</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t425" class="stm mis">                <span class="nam">new_region</span> <span class="op">=</span> <span class="nam">next</span><span class="op">(</span><span class="op">(</span><span class="nam">r</span> <span class="key">for</span> <span class="nam">r</span> <span class="key">in</span> <span class="nam">regions</span> <span class="key">if</span> <span class="nam">r</span><span class="op">.</span><span class="nam">name</span> <span class="op">==</span> <span class="nam">region</span><span class="op">[</span><span class="str">"name"</span><span class="op">]</span><span class="op">)</span><span class="op">,</span> <span class="nam">None</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t426" class="stm mis">                <span class="key">if</span> <span class="nam">new_region</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t427" class="stm mis">                    <span class="nam">region</span><span class="op">[</span><span class="str">"action"</span><span class="op">]</span> <span class="op">=</span> <span class="str">"create"</span><span class="strut">&nbsp;</span></p>
+<p id="t428" class="pln">                <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t429" class="stm mis">                    <span class="nam">region</span><span class="op">[</span><span class="str">"action"</span><span class="op">]</span> <span class="op">=</span> <span class="str">"modify"</span><span class="strut">&nbsp;</span></p>
+<p id="t430" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t431" class="stm run hide_run">            <span class="nam">timestamp</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">get_time_human</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t432" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">flush</span><span class="op">(</span><span class="op">)</span>  <span class="com"># i want to get any exception created by this insert</span><span class="strut">&nbsp;</span></p>
+<p id="t433" class="stm run hide_run">            <span class="nam">RdsProxy</span><span class="op">.</span><span class="nam">send_customer_dict</span><span class="op">(</span><span class="nam">new_customer_dict</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="str">"POST"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t434" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t435" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t436" class="stm run hide_run">            <span class="nam">base_link</span> <span class="op">=</span> <span class="str">'{0}{1}/'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">conf</span><span class="op">.</span><span class="nam">server</span><span class="op">.</span><span class="nam">host_ip</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t437" class="pln">                                         <span class="nam">pecan</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">path</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t438" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t439" class="stm run hide_run">            <span class="nam">result_regions</span> <span class="op">=</span> <span class="op">[</span><span class="op">{</span><span class="str">'id'</span><span class="op">:</span> <span class="nam">region</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span> <span class="str">'added'</span><span class="op">:</span> <span class="nam">timestamp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t440" class="pln">                               <span class="str">'links'</span><span class="op">:</span> <span class="op">{</span><span class="str">'self'</span><span class="op">:</span> <span class="nam">base_link</span> <span class="op">+</span> <span class="nam">region</span><span class="op">.</span><span class="nam">name</span><span class="op">}</span><span class="op">}</span> <span class="key">for</span><span class="strut">&nbsp;</span></p>
+<p id="t441" class="pln">                              <span class="nam">region</span> <span class="key">in</span> <span class="nam">regions</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t442" class="stm run hide_run">            <span class="nam">region_result_wrapper</span> <span class="op">=</span> <span class="nam">RegionResultWrapper</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t443" class="pln">                <span class="nam">transaction_id</span><span class="op">=</span><span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">regions</span><span class="op">=</span><span class="nam">result_regions</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t444" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t445" class="stm run hide_run">            <span class="key">return</span> <span class="nam">region_result_wrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t446" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t447" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t448" class="stm run hide_run">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t449" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t450" class="stm run hide_run">    <span class="key">def</span> <span class="nam">replace_regions</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">regions</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t451" class="stm run hide_run">        <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t452" class="stm run hide_run">        <span class="nam">customer_record</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_record</span><span class="op">(</span><span class="str">'customer'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t453" class="stm run hide_run">        <span class="nam">customer_region</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_record</span><span class="op">(</span><span class="str">'customer_region'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t454" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t455" class="stm run hide_run">            <span class="nam">customer_id</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_customer_id_by_uuid</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t456" class="stm par run hide_run"><span class="annotate short">456&#x202F;&#x219B;&#x202F;457</span><span class="annotate long">line 456 didn't jump to line 457, because the condition on line 456 was never true</span>            <span class="key">if</span> <span class="nam">customer_id</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t457" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">404</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t458" class="pln">                                  <span class="str">"customer with id {} does not exist"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t459" class="pln">                                      <span class="nam">customer_uuid</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t460" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t461" class="stm run hide_run">            <span class="nam">old_sql_customer</span> <span class="op">=</span> <span class="nam">customer_record</span><span class="op">.</span><span class="nam">read_customer_by_uuid</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t462" class="stm par run hide_run"><span class="annotate short">462&#x202F;&#x219B;&#x202F;463</span><span class="annotate long">line 462 didn't jump to line 463, because the condition on line 462 was never true</span>            <span class="key">if</span> <span class="nam">old_sql_customer</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t463" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">404</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t464" class="pln">                                  <span class="str">"customer with id {} does not exist"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t465" class="pln">                                      <span class="nam">customer_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t466" class="stm run hide_run">            <span class="nam">old_customer_dict</span> <span class="op">=</span> <span class="nam">old_sql_customer</span><span class="op">.</span><span class="nam">get_proxy_dict</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t467" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">session</span><span class="op">.</span><span class="nam">expire</span><span class="op">(</span><span class="nam">old_sql_customer</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t468" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t469" class="stm run hide_run">            <span class="nam">customer_region</span><span class="op">.</span><span class="nam">delete_all_regions_for_customer</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t470" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t471" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">add_regions_to_db</span><span class="op">(</span><span class="nam">regions</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">datamanager</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t472" class="stm run hide_run">            <span class="nam">timestamp</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">get_time_human</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t473" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t474" class="stm run hide_run">            <span class="nam">new_sql_customer</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_cusomer_by_id</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t475" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t476" class="stm run hide_run">            <span class="nam">new_sql_customer</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">add_default_users_to_empty_regions</span><span class="op">(</span><span class="nam">new_sql_customer</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t477" class="stm run hide_run">            <span class="nam">new_customer_dict</span> <span class="op">=</span> <span class="nam">new_sql_customer</span><span class="op">.</span><span class="nam">get_proxy_dict</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t478" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t479" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">flush</span><span class="op">(</span><span class="op">)</span>  <span class="com"># i want to get any exception created by this insert</span><span class="strut">&nbsp;</span></p>
+<p id="t480" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t481" class="stm run hide_run">            <span class="nam">new_customer_dict</span><span class="op">[</span><span class="str">"regions"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">resolve_regions_actions</span><span class="op">(</span><span class="nam">old_customer_dict</span><span class="op">[</span><span class="str">"regions"</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t482" class="pln">                                                                        <span class="nam">new_customer_dict</span><span class="op">[</span><span class="str">"regions"</span><span class="op">]</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t483" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t484" class="stm run hide_run">            <span class="nam">RdsProxy</span><span class="op">.</span><span class="nam">send_customer_dict</span><span class="op">(</span><span class="nam">new_customer_dict</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="str">"PUT"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t485" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t486" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t487" class="stm run hide_run">            <span class="nam">base_link</span> <span class="op">=</span> <span class="str">'{0}{1}/'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">conf</span><span class="op">.</span><span class="nam">server</span><span class="op">.</span><span class="nam">host_ip</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t488" class="pln">                                         <span class="nam">pecan</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">path</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t489" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t490" class="stm run hide_run">            <span class="nam">result_regions</span> <span class="op">=</span> <span class="op">[</span><span class="op">{</span><span class="str">'id'</span><span class="op">:</span> <span class="nam">region</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span> <span class="str">'added'</span><span class="op">:</span> <span class="nam">timestamp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t491" class="pln">                               <span class="str">'links'</span><span class="op">:</span> <span class="op">{</span><span class="str">'self'</span><span class="op">:</span> <span class="nam">base_link</span> <span class="op">+</span> <span class="nam">region</span><span class="op">.</span><span class="nam">name</span><span class="op">}</span><span class="op">}</span> <span class="key">for</span><span class="strut">&nbsp;</span></p>
+<p id="t492" class="pln">                              <span class="nam">region</span> <span class="key">in</span> <span class="nam">regions</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t493" class="stm run hide_run">            <span class="nam">region_result_wrapper</span> <span class="op">=</span> <span class="nam">RegionResultWrapper</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t494" class="pln">                <span class="nam">transaction_id</span><span class="op">=</span><span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">regions</span><span class="op">=</span><span class="nam">result_regions</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t495" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t496" class="stm run hide_run">            <span class="key">return</span> <span class="nam">region_result_wrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t497" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t498" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t499" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">exp</span><span class="strut">&nbsp;</span></p>
+<p id="t500" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t501" class="stm run hide_run">    <span class="key">def</span> <span class="nam">delete_region</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t502" class="stm run hide_run">        <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t503" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t504" class="stm run hide_run">            <span class="nam">customer_region</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_record</span><span class="op">(</span><span class="str">'customer_region'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t505" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t506" class="stm run hide_run">            <span class="nam">sql_customer</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_cusomer_by_uuid</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t507" class="stm par run hide_run"><span class="annotate short">507&#x202F;&#x219B;&#x202F;508</span><span class="annotate long">line 507 didn't jump to line 508, because the condition on line 507 was never true</span>            <span class="key">if</span> <span class="nam">sql_customer</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t508" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">404</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t509" class="pln">                                  <span class="str">"customer with id {} does not exist"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t510" class="pln">                                      <span class="nam">customer_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t511" class="stm run hide_run">            <span class="nam">customer_dict</span> <span class="op">=</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">get_proxy_dict</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t512" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t513" class="stm run hide_run">            <span class="nam">customer_region</span><span class="op">.</span><span class="nam">delete_region_for_customer</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t514" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">flush</span><span class="op">(</span><span class="op">)</span>  <span class="com"># i want to get any exception created by this insert</span><span class="strut">&nbsp;</span></p>
+<p id="t515" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t516" class="pln">            <span class="com"># i want to get any exception created by this insert</span><span class="strut">&nbsp;</span></p>
+<p id="t517" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">flush</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t518" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t519" class="stm run hide_run">            <span class="nam">region</span> <span class="op">=</span> <span class="nam">next</span><span class="op">(</span><span class="op">(</span><span class="nam">r</span><span class="op">.</span><span class="nam">region</span> <span class="key">for</span> <span class="nam">r</span> <span class="key">in</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_customer_regions</span> <span class="key">if</span> <span class="nam">r</span><span class="op">.</span><span class="nam">region</span><span class="op">.</span><span class="nam">name</span> <span class="op">==</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">,</span> <span class="nam">None</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t520" class="stm par run hide_run"><span class="annotate short">520&#x202F;&#x219B;&#x202F;521</span><span class="annotate long">line 520 didn't jump to line 521, because the condition on line 520 was never true</span>            <span class="key">if</span> <span class="nam">region</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t521" class="stm mis">                <span class="key">if</span> <span class="nam">region</span><span class="op">.</span><span class="nam">type</span> <span class="op">==</span> <span class="str">'group'</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t522" class="stm mis">                    <span class="nam">set_utils_conf</span><span class="op">(</span><span class="nam">conf</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t523" class="stm mis">                    <span class="nam">regions</span> <span class="op">=</span> <span class="nam">get_regions_of_group</span><span class="op">(</span><span class="nam">region</span><span class="op">.</span><span class="nam">name</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t524" class="pln">                <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t525" class="stm mis">                    <span class="nam">regions</span> <span class="op">=</span> <span class="op">[</span><span class="nam">region_id</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t526" class="stm par run hide_run"><span class="annotate short">526&#x202F;&#x219B;&#x202F;527</span><span class="annotate long">line 526 didn't jump to line 527, because the loop on line 526 never started</span>            <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span> <span class="nam">customer_dict</span><span class="op">[</span><span class="str">'regions'</span><span class="op">]</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t527" class="stm mis">                <span class="key">if</span> <span class="nam">region</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span> <span class="key">in</span> <span class="nam">regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t528" class="stm mis">                    <span class="nam">region</span><span class="op">[</span><span class="str">'action'</span><span class="op">]</span> <span class="op">=</span> <span class="str">'delete'</span><span class="strut">&nbsp;</span></p>
+<p id="t529" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t530" class="stm run hide_run">            <span class="nam">RdsProxy</span><span class="op">.</span><span class="nam">send_customer_dict</span><span class="op">(</span><span class="nam">customer_dict</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="str">"PUT"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t531" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t532" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t533" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Region {0} in customer {1} deleted"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t534" class="pln">                                                                  <span class="nam">customer_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t535" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t536" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t537" class="stm run hide_run">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t538" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t539" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_customer</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t540" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t541" class="stm run hide_run">        <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t542" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t543" class="stm run hide_run">        <span class="nam">sql_customer</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_cusomer_by_uuid_or_name</span><span class="op">(</span><span class="nam">customer</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t544" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t545" class="stm run hide_run">        <span class="key">if</span> <span class="key">not</span> <span class="nam">sql_customer</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t546" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">404</span><span class="op">,</span> <span class="str">'customer: {0} not found'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t547" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t548" class="stm run hide_run">        <span class="nam">ret_customer</span> <span class="op">=</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">to_wsme</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t549" class="stm par run hide_run"><span class="annotate short">549&#x202F;&#x219B;&#x202F;564</span><span class="annotate long">line 549 didn't jump to line 564, because the condition on line 549 was never false</span>        <span class="key">if</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">get_real_customer_regions</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t550" class="pln">            <span class="com"># if we have regions in sql_customer</span><span class="strut">&nbsp;</span></p>
+<p id="t551" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t552" class="stm run hide_run">            <span class="nam">resp</span> <span class="op">=</span> <span class="nam">requests</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">conf</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">rds_server</span><span class="op">.</span><span class="nam">base</span> <span class="op">+</span><span class="strut">&nbsp;</span></p>
+<p id="t553" class="pln">                                <span class="nam">conf</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">rds_server</span><span class="op">.</span><span class="nam">status</span> <span class="op">+</span><span class="strut">&nbsp;</span></p>
+<p id="t554" class="pln">                                <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">uuid</span><span class="op">,</span> <span class="nam">verify</span><span class="op">=</span><span class="nam">conf</span><span class="op">.</span><span class="nam">verify</span><span class="op">)</span><span class="op">.</span><span class="nam">json</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t555" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t556" class="stm run hide_run">            <span class="key">for</span> <span class="nam">item</span> <span class="key">in</span> <span class="nam">ret_customer</span><span class="op">.</span><span class="nam">regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t557" class="stm run hide_run">                <span class="key">for</span> <span class="nam">status</span> <span class="key">in</span> <span class="nam">resp</span><span class="op">[</span><span class="str">'regions'</span><span class="op">]</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t558" class="stm par run hide_run"><span class="annotate short">558&#x202F;&#x219B;&#x202F;557</span><span class="annotate long">line 558 didn't jump to line 557, because the condition on line 558 was never false</span>                    <span class="key">if</span> <span class="nam">status</span><span class="op">[</span><span class="str">'region'</span><span class="op">]</span> <span class="op">==</span> <span class="nam">item</span><span class="op">.</span><span class="nam">name</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t559" class="stm run hide_run">                        <span class="nam">item</span><span class="op">.</span><span class="nam">status</span> <span class="op">=</span> <span class="nam">status</span><span class="op">[</span><span class="str">'status'</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t560" class="stm par run hide_run"><span class="annotate short">560&#x202F;&#x219B;&#x202F;561</span><span class="annotate long">line 560 didn't jump to line 561, because the condition on line 560 was never true</span>                        <span class="key">if</span> <span class="nam">status</span><span class="op">[</span><span class="str">'error_msg'</span><span class="op">]</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t561" class="stm mis">                            <span class="nam">item</span><span class="op">.</span><span class="nam">error_message</span> <span class="op">=</span> <span class="nam">status</span><span class="op">[</span><span class="str">'error_msg'</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t562" class="stm run hide_run">            <span class="nam">ret_customer</span><span class="op">.</span><span class="nam">status</span> <span class="op">=</span> <span class="nam">resp</span><span class="op">[</span><span class="str">'status'</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t563" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t564" class="stm mis">            <span class="nam">ret_customer</span><span class="op">.</span><span class="nam">status</span> <span class="op">=</span> <span class="str">'no regions'</span><span class="strut">&nbsp;</span></p>
+<p id="t565" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t566" class="stm run hide_run">        <span class="key">return</span> <span class="nam">ret_customer</span><span class="strut">&nbsp;</span></p>
+<p id="t567" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t568" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_customer_list_by_criteria</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region</span><span class="op">,</span> <span class="nam">user</span><span class="op">,</span> <span class="nam">starts_with</span><span class="op">,</span> <span class="nam">contains</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t569" class="pln">                                      <span class="nam">metadata</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t570" class="stm run hide_run">        <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t571" class="stm run hide_run">        <span class="nam">customer_record</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_record</span><span class="op">(</span><span class="str">'customer'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t572" class="stm run hide_run">        <span class="nam">sql_customers</span> <span class="op">=</span> <span class="nam">customer_record</span><span class="op">.</span><span class="nam">get_customers_by_criteria</span><span class="op">(</span><span class="nam">region</span><span class="op">=</span><span class="nam">region</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t573" class="pln">                                                                  <span class="nam">user</span><span class="op">=</span><span class="nam">user</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t574" class="pln">                                                                  <span class="nam">starts_with</span><span class="op">=</span><span class="nam">starts_with</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t575" class="pln">                                                                  <span class="nam">contains</span><span class="op">=</span><span class="nam">contains</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t576" class="pln">                                                                  <span class="nam">metadata</span><span class="op">=</span><span class="nam">metadata</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t577" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t578" class="stm run hide_run">        <span class="nam">response</span> <span class="op">=</span> <span class="nam">CustomerSummaryResponse</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t579" class="stm run hide_run">        <span class="key">for</span> <span class="nam">sql_customer</span> <span class="key">in</span> <span class="nam">sql_customers</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t580" class="pln">            <span class="com"># get aggregate status for each customer</span><span class="strut">&nbsp;</span></p>
+<p id="t581" class="stm run hide_run">            <span class="nam">customer_status</span> <span class="op">=</span> <span class="nam">RdsProxy</span><span class="op">.</span><span class="nam">get_status</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">.</span><span class="nam">uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t582" class="stm run hide_run">            <span class="nam">customer</span> <span class="op">=</span> <span class="nam">CustomerSummary</span><span class="op">.</span><span class="nam">from_db_model</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t583" class="stm par run hide_run"><span class="annotate short">583&#x202F;&#x219B;&#x202F;585</span><span class="annotate long">line 583 didn't jump to line 585, because the condition on line 583 was never false</span>            <span class="key">if</span> <span class="nam">customer_status</span><span class="op">.</span><span class="nam">status_code</span> <span class="op">==</span> <span class="num">200</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t584" class="stm run hide_run">                <span class="nam">customer</span><span class="op">.</span><span class="nam">status</span> <span class="op">=</span> <span class="nam">customer_status</span><span class="op">.</span><span class="nam">json</span><span class="op">(</span><span class="op">)</span><span class="op">[</span><span class="str">'status'</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t585" class="stm run hide_run">            <span class="nam">response</span><span class="op">.</span><span class="nam">customers</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">customer</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t586" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t587" class="stm run hide_run">        <span class="key">return</span> <span class="nam">response</span><span class="strut">&nbsp;</span></p>
+<p id="t588" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t589" class="stm run hide_run">    <span class="key">def</span> <span class="nam">enable</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">enabled</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t590" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t591" class="stm run hide_run">            <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t592" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t593" class="stm run hide_run">            <span class="nam">customer_record</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_record</span><span class="op">(</span><span class="str">'customer'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t594" class="stm run hide_run">            <span class="nam">sql_customer</span> <span class="op">=</span> <span class="nam">customer_record</span><span class="op">.</span><span class="nam">read_customer_by_uuid</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t595" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t596" class="stm par run hide_run"><span class="annotate short">596&#x202F;&#x219B;&#x202F;597</span><span class="annotate long">line 596 didn't jump to line 597, because the condition on line 596 was never true</span>            <span class="key">if</span> <span class="key">not</span> <span class="nam">sql_customer</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t597" class="stm mis">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">404</span><span class="op">,</span> <span class="str">'customer: {0} not found'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t598" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t599" class="stm run hide_run">            <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">enabled</span> <span class="op">=</span> <span class="num">1</span> <span class="key">if</span> <span class="nam">enabled</span><span class="op">.</span><span class="nam">enabled</span> <span class="key">else</span> <span class="num">0</span><span class="strut">&nbsp;</span></p>
+<p id="t600" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t601" class="stm run hide_run">            <span class="nam">RdsProxy</span><span class="op">.</span><span class="nam">send_customer</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="str">"PUT"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t602" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t603" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">flush</span><span class="op">(</span><span class="op">)</span>  <span class="com"># get any exception created by this action</span><span class="strut">&nbsp;</span></p>
+<p id="t604" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t605" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t606" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t607" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t608" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">exp</span><span class="strut">&nbsp;</span></p>
+<p id="t609" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t610" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_default_users_to_empty_regions</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">sql_customer</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t611" class="stm run hide_run">        <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_customer_regions</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t612" class="stm run hide_run">            <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_customer_regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t613" class="stm par run hide_run"><span class="annotate short">613&#x202F;&#x219B;&#x202F;612</span><span class="annotate long">line 613 didn't jump to line 612, because the condition on line 613 was never false</span>                <span class="key">if</span> <span class="nam">region</span><span class="op">.</span><span class="nam">region_id</span> <span class="op">==</span> <span class="op">-</span><span class="num">1</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t614" class="stm run hide_run">                    <span class="nam">users</span> <span class="op">=</span> <span class="nam">region</span><span class="op">.</span><span class="nam">customer_region_user_roles</span><span class="strut">&nbsp;</span></p>
+<p id="t615" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t616" class="stm run hide_run">            <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_customer_regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t617" class="stm par run hide_run"><span class="annotate short">617&#x202F;&#x219B;&#x202F;616</span><span class="annotate long">line 617 didn't jump to line 616, because the condition on line 617 was never false</span>                <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">region</span><span class="op">.</span><span class="nam">customer_region_user_roles</span><span class="op">)</span> <span class="op">==</span> <span class="num">0</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t618" class="stm run hide_run">                    <span class="nam">new_users</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t619" class="stm par run hide_run"><span class="annotate short">619&#x202F;&#x219B;&#x202F;620</span><span class="annotate long">line 619 didn't jump to line 620, because the loop on line 619 never started</span>                    <span class="key">for</span> <span class="nam">user</span> <span class="key">in</span> <span class="nam">users</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t620" class="stm mis">                        <span class="nam">u</span> <span class="op">=</span> <span class="nam">UserRole</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t621" class="stm mis">                        <span class="nam">u</span><span class="op">.</span><span class="nam">customer_id</span> <span class="op">=</span> <span class="nam">region</span><span class="op">.</span><span class="nam">customer_id</span><span class="strut">&nbsp;</span></p>
+<p id="t622" class="stm mis">                        <span class="nam">u</span><span class="op">.</span><span class="nam">region_id</span> <span class="op">=</span> <span class="nam">region</span><span class="op">.</span><span class="nam">region_id</span><span class="strut">&nbsp;</span></p>
+<p id="t623" class="stm mis">                        <span class="nam">u</span><span class="op">.</span><span class="nam">user_id</span> <span class="op">=</span> <span class="nam">user</span><span class="op">.</span><span class="nam">user_id</span><span class="strut">&nbsp;</span></p>
+<p id="t624" class="stm mis">                        <span class="nam">u</span><span class="op">.</span><span class="nam">role_id</span> <span class="op">=</span> <span class="nam">user</span><span class="op">.</span><span class="nam">role_id</span><span class="strut">&nbsp;</span></p>
+<p id="t625" class="stm mis">                        <span class="nam">new_users</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">u</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t626" class="stm run hide_run">                    <span class="nam">region</span><span class="op">.</span><span class="nam">customer_region_user_roles</span> <span class="op">=</span> <span class="nam">new_users</span><span class="strut">&nbsp;</span></p>
+<p id="t627" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t628" class="stm run hide_run">        <span class="key">return</span> <span class="nam">sql_customer</span><span class="strut">&nbsp;</span></p>
+<p id="t629" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t630" class="stm run hide_run">    <span class="key">def</span> <span class="nam">delete_customer_by_uuid</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">customer_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t631" class="stm run hide_run">        <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t632" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t633" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t634" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">begin_transaction</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t635" class="stm run hide_run">            <span class="nam">customer_record</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_record</span><span class="op">(</span><span class="str">'customer'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t636" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t637" class="stm run hide_run">            <span class="nam">sql_customer</span> <span class="op">=</span> <span class="nam">customer_record</span><span class="op">.</span><span class="nam">read_customer_by_uuid</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t638" class="stm run hide_run">            <span class="key">if</span> <span class="nam">sql_customer</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t639" class="pln">                <span class="com"># The customer does not exist, so the delete operation is</span><span class="strut">&nbsp;</span></p>
+<p id="t640" class="pln">                <span class="com"># considered successful</span><span class="strut">&nbsp;</span></p>
+<p id="t641" class="stm run hide_run">                <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t642" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t643" class="stm run hide_run">            <span class="nam">real_regions</span> <span class="op">=</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">get_real_customer_regions</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t644" class="stm run hide_run">            <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">real_regions</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t645" class="pln">                <span class="com"># Do not delete a customer that still has some regions</span><span class="strut">&nbsp;</span></p>
+<p id="t646" class="stm run hide_run">                <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">405</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t647" class="pln">                                  <span class="str">"Cannot delete a customer that has regions. "</span><span class="strut">&nbsp;</span></p>
+<p id="t648" class="pln">                                  <span class="str">"Please delete the regions first and then "</span><span class="strut">&nbsp;</span></p>
+<p id="t649" class="pln">                                  <span class="str">"delete the customer."</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t650" class="pln">            <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t651" class="stm run hide_run">                <span class="nam">expected_status</span> <span class="op">=</span> <span class="str">'Success'</span><span class="strut">&nbsp;</span></p>
+<p id="t652" class="stm run hide_run">                <span class="nam">invalid_status</span> <span class="op">=</span> <span class="str">'N/A'</span><span class="strut">&nbsp;</span></p>
+<p id="t653" class="pln">                <span class="com"># Get status from RDS</span><span class="strut">&nbsp;</span></p>
+<p id="t654" class="stm run hide_run">                <span class="nam">resp</span> <span class="op">=</span> <span class="nam">RdsProxy</span><span class="op">.</span><span class="nam">get_status</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">.</span><span class="nam">uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t655" class="stm run hide_run">                <span class="key">if</span> <span class="nam">resp</span><span class="op">.</span><span class="nam">status_code</span> <span class="op">==</span> <span class="num">200</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t656" class="stm run hide_run">                    <span class="nam">status_resp</span> <span class="op">=</span> <span class="nam">resp</span><span class="op">.</span><span class="nam">json</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t657" class="stm run hide_run">                    <span class="key">if</span> <span class="str">'status'</span> <span class="key">in</span> <span class="nam">status_resp</span><span class="op">.</span><span class="nam">keys</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t658" class="stm run hide_run">                        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t659" class="pln">                            <span class="str">'RDS returned status: {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t660" class="pln">                                <span class="nam">status_resp</span><span class="op">[</span><span class="str">'status'</span><span class="op">]</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t661" class="stm run hide_run">                        <span class="nam">status</span> <span class="op">=</span> <span class="nam">status_resp</span><span class="op">[</span><span class="str">'status'</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t662" class="pln">                    <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t663" class="pln">                        <span class="com"># Invalid response from RDS</span><span class="strut">&nbsp;</span></p>
+<p id="t664" class="stm run hide_run">                        <span class="nam">LOG</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">'Response from RDS did not contain status'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t665" class="stm run hide_run">                        <span class="nam">status</span> <span class="op">=</span> <span class="nam">invalid_status</span><span class="strut">&nbsp;</span></p>
+<p id="t666" class="stm run hide_run">                <span class="key">elif</span> <span class="nam">resp</span><span class="op">.</span><span class="nam">status_code</span> <span class="op">==</span> <span class="num">404</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t667" class="pln">                    <span class="com"># Customer not found in RDS, that means it never had any regions</span><span class="strut">&nbsp;</span></p>
+<p id="t668" class="pln">                    <span class="com"># So it is OK to delete it</span><span class="strut">&nbsp;</span></p>
+<p id="t669" class="stm run hide_run">                    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t670" class="pln">                        <span class="str">'Resource not found in RDS, so it is OK to delete'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t671" class="stm run hide_run">                    <span class="nam">status</span> <span class="op">=</span> <span class="nam">expected_status</span><span class="strut">&nbsp;</span></p>
+<p id="t672" class="pln">                <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t673" class="pln">                    <span class="com"># Invalid status code from RDS</span><span class="strut">&nbsp;</span></p>
+<p id="t674" class="stm run hide_run">                    <span class="nam">log_message</span> <span class="op">=</span> <span class="str">'Invalid response code from RDS: {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t675" class="pln">                        <span class="nam">resp</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t676" class="stm run hide_run">                    <span class="nam">log_message</span> <span class="op">=</span> <span class="nam">log_message</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'\n'</span><span class="op">,</span> <span class="str">'_'</span><span class="op">)</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'\r'</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t677" class="pln">                                                                         <span class="str">'_'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t678" class="stm run hide_run">                    <span class="nam">LOG</span><span class="op">.</span><span class="nam">warning</span><span class="op">(</span><span class="nam">log_message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t679" class="stm run hide_run">                    <span class="nam">status</span> <span class="op">=</span> <span class="nam">invalid_status</span><span class="strut">&nbsp;</span></p>
+<p id="t680" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t681" class="stm run hide_run">                <span class="key">if</span> <span class="nam">status</span> <span class="op">==</span> <span class="nam">invalid_status</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t682" class="stm run hide_run">                    <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">500</span><span class="op">,</span> <span class="str">"Could not get customer status"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t683" class="stm run hide_run">                <span class="key">elif</span> <span class="nam">status</span> <span class="op">!=</span> <span class="nam">expected_status</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t684" class="stm run hide_run">                    <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">409</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t685" class="pln">                                      <span class="str">"The customer has not been deleted "</span><span class="strut">&nbsp;</span></p>
+<p id="t686" class="pln">                                      <span class="str">"successfully from all of its regions "</span><span class="strut">&nbsp;</span></p>
+<p id="t687" class="pln">                                      <span class="str">"(either the deletion failed on one of the "</span><span class="strut">&nbsp;</span></p>
+<p id="t688" class="pln">                                      <span class="str">"regions or it is still in progress)"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t689" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t690" class="pln">            <span class="com"># OK to delete</span><span class="strut">&nbsp;</span></p>
+<p id="t691" class="stm run hide_run">            <span class="nam">customer_record</span><span class="op">.</span><span class="nam">delete_customer_by_uuid</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t692" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t693" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">flush</span><span class="op">(</span><span class="op">)</span>  <span class="com"># i want to get any exception created by this delete</span><span class="strut">&nbsp;</span></p>
+<p id="t694" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t695" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t696" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="str">"CustomerLogic - Failed to delete customer"</span><span class="op">,</span> <span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t697" class="stm run hide_run">            <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t698" class="stm run hide_run">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t699" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t700" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t701" class="stm run hide_run"><span class="key">def</span> <span class="nam">build_response</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">context</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t702" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t703" class="pln"><span class="str">        this function generate th customer action response JSON</span><span class="strut">&nbsp;</span></p>
+<p id="t704" class="pln"><span class="str">    :param customer_uuid:</span><span class="strut">&nbsp;</span></p>
+<p id="t705" class="pln"><span class="str">    :param transaction_id:</span><span class="strut">&nbsp;</span></p>
+<p id="t706" class="pln"><span class="str">    :param context: create or update</span><span class="strut">&nbsp;</span></p>
+<p id="t707" class="pln"><span class="str">    :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t708" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t709" class="pln">    <span class="com"># The link should point to the customer itself (/v1/orm/customers/{id})</span><span class="strut">&nbsp;</span></p>
+<p id="t710" class="stm mis">    <span class="nam">link_elements</span> <span class="op">=</span> <span class="nam">request</span><span class="op">.</span><span class="nam">url</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">'/'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t711" class="stm mis">    <span class="nam">base_link</span> <span class="op">=</span> <span class="str">'/'</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">link_elements</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t712" class="stm mis">    <span class="key">if</span> <span class="nam">context</span> <span class="op">==</span> <span class="str">'create'</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t713" class="stm mis">        <span class="nam">base_link</span> <span class="op">+=</span> <span class="nam">customer_uuid</span><span class="strut">&nbsp;</span></p>
+<p id="t714" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t715" class="stm mis">    <span class="nam">timestamp</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">get_time_human</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t716" class="stm mis">    <span class="nam">customer_result_wrapper</span> <span class="op">=</span> <span class="nam">CustomerResultWrapper</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t717" class="pln">        <span class="nam">transaction_id</span><span class="op">=</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t718" class="pln">        <span class="nam">id</span><span class="op">=</span><span class="nam">customer_uuid</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t719" class="pln">        <span class="nam">updated</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t720" class="pln">        <span class="nam">created</span><span class="op">=</span><span class="nam">timestamp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t721" class="pln">        <span class="nam">links</span><span class="op">=</span><span class="op">{</span><span class="str">'self'</span><span class="op">:</span> <span class="nam">base_link</span><span class="op">}</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t722" class="stm mis">    <span class="key">return</span> <span class="nam">customer_result_wrapper</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:19
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_logic_error_base_py.html b/orm/services/customer_manager/htmlcov/cms_rest_logic_error_base_py.html
new file mode 100644
index 00000000..e89498cc
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_logic_error_base_py.html
@@ -0,0 +1,131 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/logic/error_base.py: 86%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/logic/error_base.py</b> :
+            <span class="pc_cov">86%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            14 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">12 run</span>
+            <span class="mis shortkey_m button_toggle_mis">2 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="stm run hide_run"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="stm mis"><a href="#n19">19</a></p>
+<p id="n20" class="stm mis"><a href="#n20">20</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">class</span> <span class="nam">Error</span><span class="op">(</span><span class="nam">Exception</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">class</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="nam">Error</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status_code</span> <span class="op">=</span> <span class="nam">status_code</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">message</span> <span class="op">=</span> <span class="nam">message</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="key">class</span> <span class="nam">NotFound</span><span class="op">(</span><span class="nam">Error</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status_code</span> <span class="op">=</span> <span class="nam">status_code</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">message</span> <span class="op">=</span> <span class="nam">message</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm run hide_run"><span class="key">class</span> <span class="nam">DuplicateEntryError</span><span class="op">(</span><span class="nam">Error</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">409</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm mis">        <span class="nam">self</span><span class="op">.</span><span class="nam">status_code</span> <span class="op">=</span> <span class="nam">status_code</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm mis">        <span class="nam">self</span><span class="op">.</span><span class="nam">message</span> <span class="op">=</span> <span class="nam">message</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_logic_metadata_logic_py.html b/orm/services/customer_manager/htmlcov/cms_rest_logic_metadata_logic_py.html
new file mode 100644
index 00000000..881481a3
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_logic_metadata_logic_py.html
@@ -0,0 +1,309 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/logic/metadata_logic.py: 15%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/logic/metadata_logic.py</b> :
+            <span class="pc_cov">15%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            74 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">14 run</span>
+            <span class="mis shortkey_m button_toggle_mis">60 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="stm mis"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="stm mis"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="stm mis"><a href="#n19">19</a></p>
+<p id="n20" class="stm mis"><a href="#n20">20</a></p>
+<p id="n21" class="stm mis"><a href="#n21">21</a></p>
+<p id="n22" class="stm mis"><a href="#n22">22</a></p>
+<p id="n23" class="stm mis"><a href="#n23">23</a></p>
+<p id="n24" class="stm mis"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="stm mis"><a href="#n26">26</a></p>
+<p id="n27" class="stm mis"><a href="#n27">27</a></p>
+<p id="n28" class="stm mis"><a href="#n28">28</a></p>
+<p id="n29" class="stm mis"><a href="#n29">29</a></p>
+<p id="n30" class="stm mis"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="stm mis"><a href="#n32">32</a></p>
+<p id="n33" class="stm mis"><a href="#n33">33</a></p>
+<p id="n34" class="stm mis"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+<p id="n36" class="stm mis"><a href="#n36">36</a></p>
+<p id="n37" class="stm mis"><a href="#n37">37</a></p>
+<p id="n38" class="stm mis"><a href="#n38">38</a></p>
+<p id="n39" class="stm mis"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="stm mis"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="stm mis"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="stm mis"><a href="#n45">45</a></p>
+<p id="n46" class="stm mis"><a href="#n46">46</a></p>
+<p id="n47" class="stm mis"><a href="#n47">47</a></p>
+<p id="n48" class="pln"><a href="#n48">48</a></p>
+<p id="n49" class="pln"><a href="#n49">49</a></p>
+<p id="n50" class="stm run hide_run"><a href="#n50">50</a></p>
+<p id="n51" class="stm mis"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="stm mis"><a href="#n53">53</a></p>
+<p id="n54" class="pln"><a href="#n54">54</a></p>
+<p id="n55" class="stm mis"><a href="#n55">55</a></p>
+<p id="n56" class="stm mis"><a href="#n56">56</a></p>
+<p id="n57" class="stm mis"><a href="#n57">57</a></p>
+<p id="n58" class="pln"><a href="#n58">58</a></p>
+<p id="n59" class="stm mis"><a href="#n59">59</a></p>
+<p id="n60" class="stm mis"><a href="#n60">60</a></p>
+<p id="n61" class="stm mis"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="stm mis"><a href="#n63">63</a></p>
+<p id="n64" class="stm mis"><a href="#n64">64</a></p>
+<p id="n65" class="pln"><a href="#n65">65</a></p>
+<p id="n66" class="stm mis"><a href="#n66">66</a></p>
+<p id="n67" class="stm mis"><a href="#n67">67</a></p>
+<p id="n68" class="stm mis"><a href="#n68">68</a></p>
+<p id="n69" class="pln"><a href="#n69">69</a></p>
+<p id="n70" class="stm mis"><a href="#n70">70</a></p>
+<p id="n71" class="stm mis"><a href="#n71">71</a></p>
+<p id="n72" class="stm mis"><a href="#n72">72</a></p>
+<p id="n73" class="pln"><a href="#n73">73</a></p>
+<p id="n74" class="stm mis"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="stm mis"><a href="#n76">76</a></p>
+<p id="n77" class="pln"><a href="#n77">77</a></p>
+<p id="n78" class="stm mis"><a href="#n78">78</a></p>
+<p id="n79" class="stm mis"><a href="#n79">79</a></p>
+<p id="n80" class="stm mis"><a href="#n80">80</a></p>
+<p id="n81" class="pln"><a href="#n81">81</a></p>
+<p id="n82" class="pln"><a href="#n82">82</a></p>
+<p id="n83" class="stm run hide_run"><a href="#n83">83</a></p>
+<p id="n84" class="stm mis"><a href="#n84">84</a></p>
+<p id="n85" class="stm mis"><a href="#n85">85</a></p>
+<p id="n86" class="stm mis"><a href="#n86">86</a></p>
+<p id="n87" class="stm mis"><a href="#n87">87</a></p>
+<p id="n88" class="stm mis"><a href="#n88">88</a></p>
+<p id="n89" class="stm mis"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="stm mis"><a href="#n91">91</a></p>
+<p id="n92" class="stm mis"><a href="#n92">92</a></p>
+<p id="n93" class="pln"><a href="#n93">93</a></p>
+<p id="n94" class="pln"><a href="#n94">94</a></p>
+<p id="n95" class="stm run hide_run"><a href="#n95">95</a></p>
+<p id="n96" class="pln"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="stm mis"><a href="#n98">98</a></p>
+<p id="n99" class="stm mis"><a href="#n99">99</a></p>
+<p id="n100" class="stm mis"><a href="#n100">100</a></p>
+<p id="n101" class="pln"><a href="#n101">101</a></p>
+<p id="n102" class="stm mis"><a href="#n102">102</a></p>
+<p id="n103" class="stm mis"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="pln"><a href="#n105">105</a></p>
+<p id="n106" class="pln"><a href="#n106">106</a></p>
+<p id="n107" class="pln"><a href="#n107">107</a></p>
+<p id="n108" class="pln"><a href="#n108">108</a></p>
+<p id="n109" class="stm mis"><a href="#n109">109</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">data</span><span class="op">.</span><span class="nam">sql_alchemy</span><span class="op">.</span><span class="nam">models</span> <span class="key">import</span> <span class="nam">CustomerMetadata</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">data</span><span class="op">.</span><span class="nam">data_manager</span> <span class="key">import</span> <span class="nam">DataManager</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">rds_proxy</span> <span class="key">import</span> <span class="nam">RdsProxy</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">model</span><span class="op">.</span><span class="nam">Models</span> <span class="key">import</span> <span class="nam">CustomerResultWrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">import</span> <span class="nam">json</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logger</span> <span class="key">import</span> <span class="nam">get_logger</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">get_logger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run"><span class="key">def</span> <span class="nam">add_customer_metadata</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">metadata_wrapper</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm mis">    <span class="nam">sql_metadata_collection</span> <span class="op">=</span> <span class="nam">map_metadata</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">metadata_wrapper</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm mis">    <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm mis">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm mis">        <span class="nam">customer_record</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_record</span><span class="op">(</span><span class="str">'customer'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm mis">        <span class="nam">sql_customer</span> <span class="op">=</span> <span class="nam">customer_record</span><span class="op">.</span><span class="nam">read_customer_by_uuid</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="stm mis">        <span class="key">if</span> <span class="key">not</span> <span class="nam">sql_customer</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">'customer not found, customer uuid: {0}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm mis">            <span class="key">raise</span> <span class="nam">ValueError</span><span class="op">(</span><span class="str">'customer not found, customer uuid: {0}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm mis">        <span class="key">for</span> <span class="nam">metadata</span> <span class="key">in</span> <span class="nam">sql_metadata_collection</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm mis">            <span class="nam">metadata_match</span> <span class="op">=</span> <span class="op">[</span><span class="nam">m</span> <span class="key">for</span> <span class="nam">m</span> <span class="key">in</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_metadata</span> <span class="key">if</span> <span class="nam">m</span><span class="op">.</span><span class="nam">field_key</span> <span class="op">==</span> <span class="nam">metadata</span><span class="op">.</span><span class="nam">field_key</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm mis">            <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">metadata_match</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm mis">                <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">'Duplicate metadata key, key already exits: {0}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">metadata</span><span class="op">.</span><span class="nam">field_key</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="stm mis">                <span class="key">raise</span> <span class="nam">AttributeError</span><span class="op">(</span><span class="str">'Duplicate metadata key, key already exits: {0}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">metadata</span><span class="op">.</span><span class="nam">field_key</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm mis">        <span class="key">for</span> <span class="nam">metadata</span> <span class="key">in</span> <span class="nam">sql_metadata_collection</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm mis">            <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_metadata</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">metadata</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">'updating metadata {0}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">json</span><span class="op">.</span><span class="nam">dumps</span><span class="op">(</span><span class="nam">metadata</span><span class="op">.</span><span class="nam">get_proxy_dict</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm mis">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">'finished appending metadata to customer'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm mis">        <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_customer_regions</span><span class="op">)</span> <span class="op">></span> <span class="num">1</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm mis">            <span class="nam">RdsProxy</span><span class="op">.</span><span class="nam">send_customer</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="str">"PUT"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="stm mis">        <span class="nam">datamanager</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t41" class="stm mis">        <span class="nam">customer_result_wrapper</span> <span class="op">=</span> <span class="nam">build_response</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm mis">        <span class="key">return</span> <span class="nam">customer_result_wrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm mis">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="stm mis">        <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="stm mis">        <span class="key">raise</span> <span class="nam">exp</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t49" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t50" class="stm run hide_run"><span class="key">def</span> <span class="nam">update_customer_metadata</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">metadata_wrapper</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm mis">    <span class="nam">sql_metadata_collection</span> <span class="op">=</span> <span class="nam">map_metadata</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">metadata_wrapper</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm mis">    <span class="nam">datamanager</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t55" class="stm mis">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm mis">        <span class="nam">customer_record</span> <span class="op">=</span> <span class="nam">datamanager</span><span class="op">.</span><span class="nam">get_record</span><span class="op">(</span><span class="str">'customer'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm mis">        <span class="nam">sql_customer</span> <span class="op">=</span> <span class="nam">customer_record</span><span class="op">.</span><span class="nam">read_customer_by_uuid</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t59" class="stm mis">        <span class="key">if</span> <span class="key">not</span> <span class="nam">sql_customer</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">'customer not found, customer uuid: {0}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="stm mis">            <span class="key">raise</span> <span class="nam">ValueError</span><span class="op">(</span><span class="str">'customer not found, customer uuid: {0}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t63" class="stm mis">        <span class="key">while</span> <span class="nam">len</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_metadata</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="stm mis">            <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_metadata</span><span class="op">.</span><span class="nam">remove</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_metadata</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm mis">        <span class="key">for</span> <span class="nam">metadata</span> <span class="key">in</span> <span class="nam">sql_metadata_collection</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm mis">            <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_metadata</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">metadata</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">'updating metadata {0}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">json</span><span class="op">.</span><span class="nam">dumps</span><span class="op">(</span><span class="nam">metadata</span><span class="op">.</span><span class="nam">get_proxy_dict</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm mis">        <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_customer_regions</span><span class="op">)</span> <span class="op">></span> <span class="num">1</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="stm mis">            <span class="nam">RdsProxy</span><span class="op">.</span><span class="nam">send_customer</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="str">"PUT"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="stm mis">        <span class="nam">datamanager</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t74" class="stm mis">        <span class="nam">customer_result_wrapper</span> <span class="op">=</span> <span class="nam">build_response</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t76" class="stm mis">        <span class="key">return</span> <span class="nam">customer_result_wrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm mis">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm mis">        <span class="nam">datamanager</span><span class="op">.</span><span class="nam">rollback</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="stm mis">        <span class="key">raise</span> <span class="nam">exp</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t82" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t83" class="stm run hide_run"><span class="key">def</span> <span class="nam">map_metadata</span><span class="op">(</span><span class="nam">customer_id</span><span class="op">,</span> <span class="nam">metadata_wrapper</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm mis">    <span class="nam">sql_metadata_collection</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm mis">    <span class="key">for</span> <span class="nam">key</span><span class="op">,</span> <span class="nam">value</span> <span class="key">in</span> <span class="nam">metadata_wrapper</span><span class="op">.</span><span class="nam">metadata</span><span class="op">.</span><span class="nam">iteritems</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm mis">        <span class="nam">sql_metadata</span> <span class="op">=</span> <span class="nam">CustomerMetadata</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="stm mis">        <span class="nam">sql_metadata</span><span class="op">.</span><span class="nam">customer_id</span> <span class="op">=</span> <span class="nam">customer_id</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="stm mis">        <span class="nam">sql_metadata</span><span class="op">.</span><span class="nam">field_key</span> <span class="op">=</span> <span class="nam">key</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="stm mis">        <span class="nam">sql_metadata</span><span class="op">.</span><span class="nam">field_value</span> <span class="op">=</span> <span class="nam">value</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm mis">        <span class="nam">sql_metadata_collection</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">sql_metadata</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="stm mis">    <span class="key">return</span> <span class="nam">sql_metadata_collection</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t94" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t95" class="stm run hide_run"><span class="key">def</span> <span class="nam">build_response</span><span class="op">(</span><span class="nam">customer_uuid</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="pln">    <span class="com"># The link should point to the customer itself (/v1/orm/customers/{id}),</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln">    <span class="com"># so the 'metadata' element should be removed.</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="stm mis">    <span class="nam">link_elements</span> <span class="op">=</span> <span class="nam">request</span><span class="op">.</span><span class="nam">url</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">'/'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="stm mis">    <span class="nam">link_elements</span><span class="op">.</span><span class="nam">remove</span><span class="op">(</span><span class="str">'metadata'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="stm mis">    <span class="nam">base_link</span> <span class="op">=</span> <span class="str">'/'</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">link_elements</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t102" class="stm mis">    <span class="nam">timestamp</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">get_time_human</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="stm mis">    <span class="nam">customer_result_wrapper</span> <span class="op">=</span> <span class="nam">CustomerResultWrapper</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln">        <span class="nam">transaction_id</span><span class="op">=</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="pln">        <span class="nam">id</span><span class="op">=</span><span class="nam">customer_uuid</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="pln">        <span class="nam">updated</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="pln">        <span class="nam">created</span><span class="op">=</span><span class="nam">timestamp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="pln">        <span class="nam">links</span><span class="op">=</span><span class="op">{</span><span class="str">'self'</span><span class="op">:</span> <span class="nam">base_link</span><span class="op">}</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="stm mis">    <span class="key">return</span> <span class="nam">customer_result_wrapper</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_model_Model_py.html b/orm/services/customer_manager/htmlcov/cms_rest_model_Model_py.html
new file mode 100644
index 00000000..e3a7e21d
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_model_Model_py.html
@@ -0,0 +1,167 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/model/Model.py: 86%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/model/Model.py</b> :
+            <span class="pc_cov">86%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            7 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">6 run</span>
+            <span class="mis shortkey_m button_toggle_mis">1 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm mis"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">inspect</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsme</span> <span class="key">import</span> <span class="nam">types</span> <span class="key">as</span> <span class="nam">wtypes</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">rest</span><span class="op">.</span><span class="nam">json</span> <span class="key">import</span> <span class="nam">tojson</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">class</span> <span class="nam">Model</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln">    <span class="str">"""Base class for CMS models.</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run">    <span class="key">def</span> <span class="nam">tojson</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm mis">        <span class="key">return</span> <span class="nam">tojson</span><span class="op">(</span><span class="nam">type</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">,</span> <span class="nam">self</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="str">    def __init__(self, **kwds):</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln"><span class="str">        self.fields = list(kwds)</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="str">        for k, v in kwds.iteritems():</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="str">            setattr(self, k, v)</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="str">    def as_dict(self):</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="str">        d = {}</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln"><span class="str">        for f in self.fields:</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln"><span class="str">            v = getattr(self, f)</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="str">            if isinstance(v, Model):</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln"><span class="str">                v = v.as_dict()</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="str">            elif isinstance(v, list) and v and isinstance(v[0], Model):</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln"><span class="str">                v = [sub.as_dict() for sub in v]</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln"><span class="str">            d[f] = v</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln"><span class="str">        return d</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="str">    def __eq__(self, other):</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln"><span class="str">        return self.as_dict() == other.as_dict()</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln"><span class="str">    @classmethod</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="str">    def get_field_names(cls):</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln"><span class="str">        fields = inspect.getargspec(cls.__init__)[0]</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln"><span class="str">        return set(fields) - set(["self"])</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_model_Models_py.html b/orm/services/customer_manager/htmlcov/cms_rest_model_Models_py.html
new file mode 100644
index 00000000..1f97e481
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_model_Models_py.html
@@ -0,0 +1,979 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/model/Models.py: 95%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/model/Models.py</b> :
+            <span class="pc_cov">95%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            241 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">236 run</span>
+            <span class="mis shortkey_m button_toggle_mis">5 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">6 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="stm run hide_run"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="stm run hide_run"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="stm run hide_run"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="stm run hide_run"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="pln"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="pln"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="pln"><a href="#n48">48</a></p>
+<p id="n49" class="pln"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="pln"><a href="#n53">53</a></p>
+<p id="n54" class="pln"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="pln"><a href="#n56">56</a></p>
+<p id="n57" class="pln"><a href="#n57">57</a></p>
+<p id="n58" class="pln"><a href="#n58">58</a></p>
+<p id="n59" class="stm run hide_run"><a href="#n59">59</a></p>
+<p id="n60" class="stm run hide_run"><a href="#n60">60</a></p>
+<p id="n61" class="stm run hide_run"><a href="#n61">61</a></p>
+<p id="n62" class="stm run hide_run"><a href="#n62">62</a></p>
+<p id="n63" class="stm run hide_run"><a href="#n63">63</a></p>
+<p id="n64" class="stm run hide_run"><a href="#n64">64</a></p>
+<p id="n65" class="pln"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p>
+<p id="n69" class="pln"><a href="#n69">69</a></p>
+<p id="n70" class="pln"><a href="#n70">70</a></p>
+<p id="n71" class="stm run hide_run"><a href="#n71">71</a></p>
+<p id="n72" class="stm run hide_run"><a href="#n72">72</a></p>
+<p id="n73" class="stm run hide_run"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="stm run hide_run"><a href="#n76">76</a></p>
+<p id="n77" class="pln"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="stm run hide_run"><a href="#n79">79</a></p>
+<p id="n80" class="stm run hide_run"><a href="#n80">80</a></p>
+<p id="n81" class="stm run hide_run"><a href="#n81">81</a></p>
+<p id="n82" class="stm run hide_run"><a href="#n82">82</a></p>
+<p id="n83" class="pln"><a href="#n83">83</a></p>
+<p id="n84" class="pln"><a href="#n84">84</a></p>
+<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="pln"><a href="#n86">86</a></p>
+<p id="n87" class="pln"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="stm run hide_run"><a href="#n89">89</a></p>
+<p id="n90" class="stm run hide_run"><a href="#n90">90</a></p>
+<p id="n91" class="stm run hide_run"><a href="#n91">91</a></p>
+<p id="n92" class="pln"><a href="#n92">92</a></p>
+<p id="n93" class="stm run hide_run"><a href="#n93">93</a></p>
+<p id="n94" class="pln"><a href="#n94">94</a></p>
+<p id="n95" class="pln"><a href="#n95">95</a></p>
+<p id="n96" class="pln"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="pln"><a href="#n98">98</a></p>
+<p id="n99" class="pln"><a href="#n99">99</a></p>
+<p id="n100" class="stm run hide_run"><a href="#n100">100</a></p>
+<p id="n101" class="stm run hide_run"><a href="#n101">101</a></p>
+<p id="n102" class="stm run hide_run"><a href="#n102">102</a></p>
+<p id="n103" class="pln"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="stm run hide_run"><a href="#n105">105</a></p>
+<p id="n106" class="pln"><a href="#n106">106</a></p>
+<p id="n107" class="pln"><a href="#n107">107</a></p>
+<p id="n108" class="pln"><a href="#n108">108</a></p>
+<p id="n109" class="stm run hide_run"><a href="#n109">109</a></p>
+<p id="n110" class="stm run hide_run"><a href="#n110">110</a></p>
+<p id="n111" class="stm run hide_run"><a href="#n111">111</a></p>
+<p id="n112" class="stm run hide_run"><a href="#n112">112</a></p>
+<p id="n113" class="stm run hide_run"><a href="#n113">113</a></p>
+<p id="n114" class="stm run hide_run"><a href="#n114">114</a></p>
+<p id="n115" class="stm run hide_run"><a href="#n115">115</a></p>
+<p id="n116" class="stm run hide_run"><a href="#n116">116</a></p>
+<p id="n117" class="stm run hide_run"><a href="#n117">117</a></p>
+<p id="n118" class="stm run hide_run"><a href="#n118">118</a></p>
+<p id="n119" class="stm run hide_run"><a href="#n119">119</a></p>
+<p id="n120" class="stm run hide_run"><a href="#n120">120</a></p>
+<p id="n121" class="stm run hide_run"><a href="#n121">121</a></p>
+<p id="n122" class="pln"><a href="#n122">122</a></p>
+<p id="n123" class="stm run hide_run"><a href="#n123">123</a></p>
+<p id="n124" class="pln"><a href="#n124">124</a></p>
+<p id="n125" class="pln"><a href="#n125">125</a></p>
+<p id="n126" class="pln"><a href="#n126">126</a></p>
+<p id="n127" class="pln"><a href="#n127">127</a></p>
+<p id="n128" class="pln"><a href="#n128">128</a></p>
+<p id="n129" class="pln"><a href="#n129">129</a></p>
+<p id="n130" class="pln"><a href="#n130">130</a></p>
+<p id="n131" class="pln"><a href="#n131">131</a></p>
+<p id="n132" class="pln"><a href="#n132">132</a></p>
+<p id="n133" class="pln"><a href="#n133">133</a></p>
+<p id="n134" class="pln"><a href="#n134">134</a></p>
+<p id="n135" class="pln"><a href="#n135">135</a></p>
+<p id="n136" class="pln"><a href="#n136">136</a></p>
+<p id="n137" class="pln"><a href="#n137">137</a></p>
+<p id="n138" class="pln"><a href="#n138">138</a></p>
+<p id="n139" class="pln"><a href="#n139">139</a></p>
+<p id="n140" class="pln"><a href="#n140">140</a></p>
+<p id="n141" class="pln"><a href="#n141">141</a></p>
+<p id="n142" class="pln"><a href="#n142">142</a></p>
+<p id="n143" class="pln"><a href="#n143">143</a></p>
+<p id="n144" class="stm run hide_run"><a href="#n144">144</a></p>
+<p id="n145" class="stm run hide_run"><a href="#n145">145</a></p>
+<p id="n146" class="stm run hide_run"><a href="#n146">146</a></p>
+<p id="n147" class="stm run hide_run"><a href="#n147">147</a></p>
+<p id="n148" class="stm run hide_run"><a href="#n148">148</a></p>
+<p id="n149" class="stm run hide_run"><a href="#n149">149</a></p>
+<p id="n150" class="stm run hide_run"><a href="#n150">150</a></p>
+<p id="n151" class="pln"><a href="#n151">151</a></p>
+<p id="n152" class="stm run hide_run"><a href="#n152">152</a></p>
+<p id="n153" class="stm run hide_run"><a href="#n153">153</a></p>
+<p id="n154" class="stm run hide_run"><a href="#n154">154</a></p>
+<p id="n155" class="pln"><a href="#n155">155</a></p>
+<p id="n156" class="stm run hide_run"><a href="#n156">156</a></p>
+<p id="n157" class="pln"><a href="#n157">157</a></p>
+<p id="n158" class="stm run hide_run"><a href="#n158">158</a></p>
+<p id="n159" class="stm run hide_run"><a href="#n159">159</a></p>
+<p id="n160" class="stm run hide_run"><a href="#n160">160</a></p>
+<p id="n161" class="stm run hide_run"><a href="#n161">161</a></p>
+<p id="n162" class="stm run hide_run"><a href="#n162">162</a></p>
+<p id="n163" class="stm run hide_run"><a href="#n163">163</a></p>
+<p id="n164" class="pln"><a href="#n164">164</a></p>
+<p id="n165" class="pln"><a href="#n165">165</a></p>
+<p id="n166" class="stm run hide_run"><a href="#n166">166</a></p>
+<p id="n167" class="pln"><a href="#n167">167</a></p>
+<p id="n168" class="pln"><a href="#n168">168</a></p>
+<p id="n169" class="pln"><a href="#n169">169</a></p>
+<p id="n170" class="stm run hide_run"><a href="#n170">170</a></p>
+<p id="n171" class="stm run hide_run"><a href="#n171">171</a></p>
+<p id="n172" class="stm run hide_run"><a href="#n172">172</a></p>
+<p id="n173" class="pln"><a href="#n173">173</a></p>
+<p id="n174" class="stm run hide_run"><a href="#n174">174</a></p>
+<p id="n175" class="pln"><a href="#n175">175</a></p>
+<p id="n176" class="pln"><a href="#n176">176</a></p>
+<p id="n177" class="pln"><a href="#n177">177</a></p>
+<p id="n178" class="pln"><a href="#n178">178</a></p>
+<p id="n179" class="pln"><a href="#n179">179</a></p>
+<p id="n180" class="pln"><a href="#n180">180</a></p>
+<p id="n181" class="stm run hide_run"><a href="#n181">181</a></p>
+<p id="n182" class="stm run hide_run"><a href="#n182">182</a></p>
+<p id="n183" class="stm run hide_run"><a href="#n183">183</a></p>
+<p id="n184" class="pln"><a href="#n184">184</a></p>
+<p id="n185" class="pln"><a href="#n185">185</a></p>
+<p id="n186" class="stm run hide_run"><a href="#n186">186</a></p>
+<p id="n187" class="pln"><a href="#n187">187</a></p>
+<p id="n188" class="pln"><a href="#n188">188</a></p>
+<p id="n189" class="pln"><a href="#n189">189</a></p>
+<p id="n190" class="stm run hide_run"><a href="#n190">190</a></p>
+<p id="n191" class="stm run hide_run"><a href="#n191">191</a></p>
+<p id="n192" class="pln"><a href="#n192">192</a></p>
+<p id="n193" class="stm run hide_run"><a href="#n193">193</a></p>
+<p id="n194" class="pln"><a href="#n194">194</a></p>
+<p id="n195" class="pln"><a href="#n195">195</a></p>
+<p id="n196" class="pln"><a href="#n196">196</a></p>
+<p id="n197" class="pln"><a href="#n197">197</a></p>
+<p id="n198" class="pln"><a href="#n198">198</a></p>
+<p id="n199" class="stm run hide_run"><a href="#n199">199</a></p>
+<p id="n200" class="stm run hide_run"><a href="#n200">200</a></p>
+<p id="n201" class="pln"><a href="#n201">201</a></p>
+<p id="n202" class="pln"><a href="#n202">202</a></p>
+<p id="n203" class="stm run hide_run"><a href="#n203">203</a></p>
+<p id="n204" class="pln"><a href="#n204">204</a></p>
+<p id="n205" class="pln"><a href="#n205">205</a></p>
+<p id="n206" class="pln"><a href="#n206">206</a></p>
+<p id="n207" class="stm run hide_run"><a href="#n207">207</a></p>
+<p id="n208" class="stm run hide_run"><a href="#n208">208</a></p>
+<p id="n209" class="stm run hide_run"><a href="#n209">209</a></p>
+<p id="n210" class="stm run hide_run"><a href="#n210">210</a></p>
+<p id="n211" class="stm run hide_run"><a href="#n211">211</a></p>
+<p id="n212" class="stm run hide_run"><a href="#n212">212</a></p>
+<p id="n213" class="pln"><a href="#n213">213</a></p>
+<p id="n214" class="stm run hide_run"><a href="#n214">214</a></p>
+<p id="n215" class="pln"><a href="#n215">215</a></p>
+<p id="n216" class="pln"><a href="#n216">216</a></p>
+<p id="n217" class="pln"><a href="#n217">217</a></p>
+<p id="n218" class="pln"><a href="#n218">218</a></p>
+<p id="n219" class="pln"><a href="#n219">219</a></p>
+<p id="n220" class="pln"><a href="#n220">220</a></p>
+<p id="n221" class="pln"><a href="#n221">221</a></p>
+<p id="n222" class="pln"><a href="#n222">222</a></p>
+<p id="n223" class="pln"><a href="#n223">223</a></p>
+<p id="n224" class="pln"><a href="#n224">224</a></p>
+<p id="n225" class="pln"><a href="#n225">225</a></p>
+<p id="n226" class="stm run hide_run"><a href="#n226">226</a></p>
+<p id="n227" class="stm run hide_run"><a href="#n227">227</a></p>
+<p id="n228" class="stm run hide_run"><a href="#n228">228</a></p>
+<p id="n229" class="stm run hide_run"><a href="#n229">229</a></p>
+<p id="n230" class="stm run hide_run"><a href="#n230">230</a></p>
+<p id="n231" class="stm par run hide_run"><a href="#n231">231</a></p>
+<p id="n232" class="stm mis"><a href="#n232">232</a></p>
+<p id="n233" class="pln"><a href="#n233">233</a></p>
+<p id="n234" class="pln"><a href="#n234">234</a></p>
+<p id="n235" class="stm run hide_run"><a href="#n235">235</a></p>
+<p id="n236" class="pln"><a href="#n236">236</a></p>
+<p id="n237" class="pln"><a href="#n237">237</a></p>
+<p id="n238" class="pln"><a href="#n238">238</a></p>
+<p id="n239" class="stm run hide_run"><a href="#n239">239</a></p>
+<p id="n240" class="stm run hide_run"><a href="#n240">240</a></p>
+<p id="n241" class="stm run hide_run"><a href="#n241">241</a></p>
+<p id="n242" class="stm run hide_run"><a href="#n242">242</a></p>
+<p id="n243" class="stm run hide_run"><a href="#n243">243</a></p>
+<p id="n244" class="stm run hide_run"><a href="#n244">244</a></p>
+<p id="n245" class="stm run hide_run"><a href="#n245">245</a></p>
+<p id="n246" class="stm run hide_run"><a href="#n246">246</a></p>
+<p id="n247" class="stm run hide_run"><a href="#n247">247</a></p>
+<p id="n248" class="stm run hide_run"><a href="#n248">248</a></p>
+<p id="n249" class="pln"><a href="#n249">249</a></p>
+<p id="n250" class="stm run hide_run"><a href="#n250">250</a></p>
+<p id="n251" class="pln"><a href="#n251">251</a></p>
+<p id="n252" class="pln"><a href="#n252">252</a></p>
+<p id="n253" class="pln"><a href="#n253">253</a></p>
+<p id="n254" class="pln"><a href="#n254">254</a></p>
+<p id="n255" class="pln"><a href="#n255">255</a></p>
+<p id="n256" class="pln"><a href="#n256">256</a></p>
+<p id="n257" class="pln"><a href="#n257">257</a></p>
+<p id="n258" class="stm run hide_run"><a href="#n258">258</a></p>
+<p id="n259" class="stm run hide_run"><a href="#n259">259</a></p>
+<p id="n260" class="stm run hide_run"><a href="#n260">260</a></p>
+<p id="n261" class="stm run hide_run"><a href="#n261">261</a></p>
+<p id="n262" class="stm run hide_run"><a href="#n262">262</a></p>
+<p id="n263" class="stm run hide_run"><a href="#n263">263</a></p>
+<p id="n264" class="stm run hide_run"><a href="#n264">264</a></p>
+<p id="n265" class="stm run hide_run"><a href="#n265">265</a></p>
+<p id="n266" class="stm run hide_run"><a href="#n266">266</a></p>
+<p id="n267" class="stm par run hide_run"><a href="#n267">267</a></p>
+<p id="n268" class="stm mis"><a href="#n268">268</a></p>
+<p id="n269" class="pln"><a href="#n269">269</a></p>
+<p id="n270" class="stm run hide_run"><a href="#n270">270</a></p>
+<p id="n271" class="pln"><a href="#n271">271</a></p>
+<p id="n272" class="pln"><a href="#n272">272</a></p>
+<p id="n273" class="pln"><a href="#n273">273</a></p>
+<p id="n274" class="pln"><a href="#n274">274</a></p>
+<p id="n275" class="pln"><a href="#n275">275</a></p>
+<p id="n276" class="stm par run hide_run"><a href="#n276">276</a></p>
+<p id="n277" class="stm par run hide_run"><a href="#n277">277</a></p>
+<p id="n278" class="stm mis"><a href="#n278">278</a></p>
+<p id="n279" class="stm mis"><a href="#n279">279</a></p>
+<p id="n280" class="pln"><a href="#n280">280</a></p>
+<p id="n281" class="stm run hide_run"><a href="#n281">281</a></p>
+<p id="n282" class="stm run hide_run"><a href="#n282">282</a></p>
+<p id="n283" class="stm run hide_run"><a href="#n283">283</a></p>
+<p id="n284" class="stm run hide_run"><a href="#n284">284</a></p>
+<p id="n285" class="stm run hide_run"><a href="#n285">285</a></p>
+<p id="n286" class="stm run hide_run"><a href="#n286">286</a></p>
+<p id="n287" class="stm run hide_run"><a href="#n287">287</a></p>
+<p id="n288" class="stm run hide_run"><a href="#n288">288</a></p>
+<p id="n289" class="stm run hide_run"><a href="#n289">289</a></p>
+<p id="n290" class="pln"><a href="#n290">290</a></p>
+<p id="n291" class="pln"><a href="#n291">291</a></p>
+<p id="n292" class="pln"><a href="#n292">292</a></p>
+<p id="n293" class="stm run hide_run"><a href="#n293">293</a></p>
+<p id="n294" class="pln"><a href="#n294">294</a></p>
+<p id="n295" class="stm run hide_run"><a href="#n295">295</a></p>
+<p id="n296" class="pln"><a href="#n296">296</a></p>
+<p id="n297" class="stm run hide_run"><a href="#n297">297</a></p>
+<p id="n298" class="stm run hide_run"><a href="#n298">298</a></p>
+<p id="n299" class="stm run hide_run"><a href="#n299">299</a></p>
+<p id="n300" class="stm run hide_run"><a href="#n300">300</a></p>
+<p id="n301" class="pln"><a href="#n301">301</a></p>
+<p id="n302" class="pln"><a href="#n302">302</a></p>
+<p id="n303" class="pln"><a href="#n303">303</a></p>
+<p id="n304" class="pln"><a href="#n304">304</a></p>
+<p id="n305" class="pln"><a href="#n305">305</a></p>
+<p id="n306" class="stm run hide_run"><a href="#n306">306</a></p>
+<p id="n307" class="stm run hide_run"><a href="#n307">307</a></p>
+<p id="n308" class="stm run hide_run"><a href="#n308">308</a></p>
+<p id="n309" class="stm run hide_run"><a href="#n309">309</a></p>
+<p id="n310" class="stm run hide_run"><a href="#n310">310</a></p>
+<p id="n311" class="pln"><a href="#n311">311</a></p>
+<p id="n312" class="stm run hide_run"><a href="#n312">312</a></p>
+<p id="n313" class="stm run hide_run"><a href="#n313">313</a></p>
+<p id="n314" class="stm par run hide_run"><a href="#n314">314</a></p>
+<p id="n315" class="stm mis"><a href="#n315">315</a></p>
+<p id="n316" class="stm par run hide_run"><a href="#n316">316</a></p>
+<p id="n317" class="stm run hide_run"><a href="#n317">317</a></p>
+<p id="n318" class="stm run hide_run"><a href="#n318">318</a></p>
+<p id="n319" class="pln"><a href="#n319">319</a></p>
+<p id="n320" class="pln"><a href="#n320">320</a></p>
+<p id="n321" class="stm run hide_run"><a href="#n321">321</a></p>
+<p id="n322" class="stm run hide_run"><a href="#n322">322</a></p>
+<p id="n323" class="stm run hide_run"><a href="#n323">323</a></p>
+<p id="n324" class="pln"><a href="#n324">324</a></p>
+<p id="n325" class="stm run hide_run"><a href="#n325">325</a></p>
+<p id="n326" class="stm run hide_run"><a href="#n326">326</a></p>
+<p id="n327" class="stm run hide_run"><a href="#n327">327</a></p>
+<p id="n328" class="stm run hide_run"><a href="#n328">328</a></p>
+<p id="n329" class="pln"><a href="#n329">329</a></p>
+<p id="n330" class="pln"><a href="#n330">330</a></p>
+<p id="n331" class="pln"><a href="#n331">331</a></p>
+<p id="n332" class="pln"><a href="#n332">332</a></p>
+<p id="n333" class="pln"><a href="#n333">333</a></p>
+<p id="n334" class="pln"><a href="#n334">334</a></p>
+<p id="n335" class="pln"><a href="#n335">335</a></p>
+<p id="n336" class="stm run hide_run"><a href="#n336">336</a></p>
+<p id="n337" class="stm run hide_run"><a href="#n337">337</a></p>
+<p id="n338" class="stm run hide_run"><a href="#n338">338</a></p>
+<p id="n339" class="stm run hide_run"><a href="#n339">339</a></p>
+<p id="n340" class="pln"><a href="#n340">340</a></p>
+<p id="n341" class="stm run hide_run"><a href="#n341">341</a></p>
+<p id="n342" class="stm run hide_run"><a href="#n342">342</a></p>
+<p id="n343" class="stm run hide_run"><a href="#n343">343</a></p>
+<p id="n344" class="stm run hide_run"><a href="#n344">344</a></p>
+<p id="n345" class="pln"><a href="#n345">345</a></p>
+<p id="n346" class="pln"><a href="#n346">346</a></p>
+<p id="n347" class="stm run hide_run"><a href="#n347">347</a></p>
+<p id="n348" class="stm run hide_run"><a href="#n348">348</a></p>
+<p id="n349" class="stm run hide_run"><a href="#n349">349</a></p>
+<p id="n350" class="pln"><a href="#n350">350</a></p>
+<p id="n351" class="stm run hide_run"><a href="#n351">351</a></p>
+<p id="n352" class="stm run hide_run"><a href="#n352">352</a></p>
+<p id="n353" class="pln"><a href="#n353">353</a></p>
+<p id="n354" class="stm run hide_run"><a href="#n354">354</a></p>
+<p id="n355" class="stm run hide_run"><a href="#n355">355</a></p>
+<p id="n356" class="pln"><a href="#n356">356</a></p>
+<p id="n357" class="pln"><a href="#n357">357</a></p>
+<p id="n358" class="stm run hide_run"><a href="#n358">358</a></p>
+<p id="n359" class="stm run hide_run"><a href="#n359">359</a></p>
+<p id="n360" class="pln"><a href="#n360">360</a></p>
+<p id="n361" class="stm run hide_run"><a href="#n361">361</a></p>
+<p id="n362" class="stm run hide_run"><a href="#n362">362</a></p>
+<p id="n363" class="pln"><a href="#n363">363</a></p>
+<p id="n364" class="pln"><a href="#n364">364</a></p>
+<p id="n365" class="pln"><a href="#n365">365</a></p>
+<p id="n366" class="pln"><a href="#n366">366</a></p>
+<p id="n367" class="pln"><a href="#n367">367</a></p>
+<p id="n368" class="pln"><a href="#n368">368</a></p>
+<p id="n369" class="pln"><a href="#n369">369</a></p>
+<p id="n370" class="stm run hide_run"><a href="#n370">370</a></p>
+<p id="n371" class="stm run hide_run"><a href="#n371">371</a></p>
+<p id="n372" class="stm run hide_run"><a href="#n372">372</a></p>
+<p id="n373" class="stm run hide_run"><a href="#n373">373</a></p>
+<p id="n374" class="pln"><a href="#n374">374</a></p>
+<p id="n375" class="stm run hide_run"><a href="#n375">375</a></p>
+<p id="n376" class="stm run hide_run"><a href="#n376">376</a></p>
+<p id="n377" class="stm run hide_run"><a href="#n377">377</a></p>
+<p id="n378" class="stm run hide_run"><a href="#n378">378</a></p>
+<p id="n379" class="pln"><a href="#n379">379</a></p>
+<p id="n380" class="pln"><a href="#n380">380</a></p>
+<p id="n381" class="stm run hide_run"><a href="#n381">381</a></p>
+<p id="n382" class="stm run hide_run"><a href="#n382">382</a></p>
+<p id="n383" class="stm run hide_run"><a href="#n383">383</a></p>
+<p id="n384" class="pln"><a href="#n384">384</a></p>
+<p id="n385" class="stm run hide_run"><a href="#n385">385</a></p>
+<p id="n386" class="stm run hide_run"><a href="#n386">386</a></p>
+<p id="n387" class="pln"><a href="#n387">387</a></p>
+<p id="n388" class="stm run hide_run"><a href="#n388">388</a></p>
+<p id="n389" class="stm run hide_run"><a href="#n389">389</a></p>
+<p id="n390" class="pln"><a href="#n390">390</a></p>
+<p id="n391" class="pln"><a href="#n391">391</a></p>
+<p id="n392" class="pln"><a href="#n392">392</a></p>
+<p id="n393" class="pln"><a href="#n393">393</a></p>
+<p id="n394" class="pln"><a href="#n394">394</a></p>
+<p id="n395" class="pln"><a href="#n395">395</a></p>
+<p id="n396" class="pln"><a href="#n396">396</a></p>
+<p id="n397" class="stm run hide_run"><a href="#n397">397</a></p>
+<p id="n398" class="stm run hide_run"><a href="#n398">398</a></p>
+<p id="n399" class="stm run hide_run"><a href="#n399">399</a></p>
+<p id="n400" class="stm run hide_run"><a href="#n400">400</a></p>
+<p id="n401" class="stm run hide_run"><a href="#n401">401</a></p>
+<p id="n402" class="stm run hide_run"><a href="#n402">402</a></p>
+<p id="n403" class="stm run hide_run"><a href="#n403">403</a></p>
+<p id="n404" class="stm run hide_run"><a href="#n404">404</a></p>
+<p id="n405" class="pln"><a href="#n405">405</a></p>
+<p id="n406" class="stm run hide_run"><a href="#n406">406</a></p>
+<p id="n407" class="pln"><a href="#n407">407</a></p>
+<p id="n408" class="stm run hide_run"><a href="#n408">408</a></p>
+<p id="n409" class="pln"><a href="#n409">409</a></p>
+<p id="n410" class="stm run hide_run"><a href="#n410">410</a></p>
+<p id="n411" class="stm run hide_run"><a href="#n411">411</a></p>
+<p id="n412" class="stm run hide_run"><a href="#n412">412</a></p>
+<p id="n413" class="stm run hide_run"><a href="#n413">413</a></p>
+<p id="n414" class="stm run hide_run"><a href="#n414">414</a></p>
+<p id="n415" class="stm run hide_run"><a href="#n415">415</a></p>
+<p id="n416" class="stm run hide_run"><a href="#n416">416</a></p>
+<p id="n417" class="pln"><a href="#n417">417</a></p>
+<p id="n418" class="stm run hide_run"><a href="#n418">418</a></p>
+<p id="n419" class="pln"><a href="#n419">419</a></p>
+<p id="n420" class="stm run hide_run"><a href="#n420">420</a></p>
+<p id="n421" class="pln"><a href="#n421">421</a></p>
+<p id="n422" class="pln"><a href="#n422">422</a></p>
+<p id="n423" class="pln"><a href="#n423">423</a></p>
+<p id="n424" class="stm run hide_run"><a href="#n424">424</a></p>
+<p id="n425" class="stm run hide_run"><a href="#n425">425</a></p>
+<p id="n426" class="stm run hide_run"><a href="#n426">426</a></p>
+<p id="n427" class="stm run hide_run"><a href="#n427">427</a></p>
+<p id="n428" class="stm run hide_run"><a href="#n428">428</a></p>
+<p id="n429" class="stm run hide_run"><a href="#n429">429</a></p>
+<p id="n430" class="stm run hide_run"><a href="#n430">430</a></p>
+<p id="n431" class="stm run hide_run"><a href="#n431">431</a></p>
+<p id="n432" class="pln"><a href="#n432">432</a></p>
+<p id="n433" class="stm run hide_run"><a href="#n433">433</a></p>
+<p id="n434" class="pln"><a href="#n434">434</a></p>
+<p id="n435" class="pln"><a href="#n435">435</a></p>
+<p id="n436" class="stm run hide_run"><a href="#n436">436</a></p>
+<p id="n437" class="stm run hide_run"><a href="#n437">437</a></p>
+<p id="n438" class="pln"><a href="#n438">438</a></p>
+<p id="n439" class="stm run hide_run"><a href="#n439">439</a></p>
+<p id="n440" class="stm run hide_run"><a href="#n440">440</a></p>
+<p id="n441" class="stm run hide_run"><a href="#n441">441</a></p>
+<p id="n442" class="pln"><a href="#n442">442</a></p>
+<p id="n443" class="pln"><a href="#n443">443</a></p>
+<p id="n444" class="stm run hide_run"><a href="#n444">444</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">wsme</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsme</span> <span class="key">import</span> <span class="nam">types</span> <span class="key">as</span> <span class="nam">wtypes</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">model</span><span class="op">.</span><span class="nam">Model</span> <span class="key">import</span> <span class="nam">Model</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logic</span><span class="op">.</span><span class="nam">error_base</span> <span class="key">import</span> <span class="nam">ErrorStatus</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span><span class="op">.</span><span class="nam">cross_api_utils</span> <span class="key">import</span> <span class="nam">set_utils_conf</span><span class="op">,</span> <span class="nam">get_regions_of_group</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">class</span> <span class="nam">Enabled</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln">    <span class="str">"""enable model the customer</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run">    <span class="nam">enabled</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">bool</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">enabled</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln">        <span class="str">"""Create a new enables class.</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="str">        :param enabled: customer status</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">enabled</span> <span class="op">=</span> <span class="nam">enabled</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm run hide_run"><span class="key">class</span> <span class="nam">Compute</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln">    <span class="str">"""compute model the customer</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run">    <span class="nam">instances</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm run hide_run">    <span class="nam">injected_files</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"injected-files"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">    <span class="nam">key_pairs</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"key-pairs"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="stm run hide_run">    <span class="nam">ram</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">    <span class="nam">vcpus</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">    <span class="nam">metadata_items</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"metadata-items"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">    <span class="nam">injected_file_content_bytes</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"injected-file-content-bytes"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm run hide_run">    <span class="nam">floating_ips</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"floating-ips"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">    <span class="nam">fixed_ips</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"fixed-ips"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm run hide_run">    <span class="nam">injected_file_path_bytes</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"injected-file-path-bytes"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">    <span class="nam">server_groups</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"server-groups"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">    <span class="nam">server_group_members</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"server-group-members"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">instances</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">injected_files</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">key_pairs</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">ram</span><span class="op">=</span><span class="str">''</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln">                 <span class="nam">vcpus</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">metadata_items</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">injected_file_content_bytes</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln">                 <span class="nam">floating_ips</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">fixed_ips</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">injected_file_path_bytes</span><span class="op">=</span><span class="str">''</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="pln">                 <span class="nam">server_groups</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">server_group_members</span><span class="op">=</span><span class="str">''</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="pln"><span class="str">        Create a new compute instance.</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln"><span class="str">        :param instances:</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln"><span class="str">        :param injected_files:</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="pln"><span class="str">        :param key_pairs:</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="pln"><span class="str">        :param ram:</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln"><span class="str">        :param vcpus:</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln"><span class="str">        :param metadata_items:</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln"><span class="str">        :param injected_file_content_bytes:</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="pln"><span class="str">        :param floating_ips:</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="pln"><span class="str">        :param fixed_ips:</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln"><span class="str">        :param injected_file_path_bytes:</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="pln"><span class="str">        :param server_groups:</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="pln"><span class="str">        :param server_group_members:</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">instances</span> <span class="op">=</span> <span class="nam">instances</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">injected_files</span> <span class="op">=</span> <span class="nam">injected_files</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">key_pairs</span> <span class="op">=</span> <span class="nam">key_pairs</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">ram</span> <span class="op">=</span> <span class="nam">ram</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="stm run hide_run">        <span class="key">if</span> <span class="nam">vcpus</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">vcpus</span> <span class="op">=</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">quotas_default_values</span><span class="op">.</span><span class="nam">compute</span><span class="op">.</span><span class="nam">vcpus</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">vcpus</span> <span class="op">=</span> <span class="nam">vcpus</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">        <span class="key">if</span> <span class="nam">metadata_items</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">metadata_items</span> <span class="op">=</span> <span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="pln">                <span class="nam">conf</span><span class="op">.</span><span class="nam">quotas_default_values</span><span class="op">.</span><span class="nam">compute</span><span class="op">.</span><span class="nam">metadata_items</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">metadata_items</span> <span class="op">=</span> <span class="nam">metadata_items</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="stm run hide_run">        <span class="key">if</span> <span class="nam">injected_file_content_bytes</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">injected_file_content_bytes</span> <span class="op">=</span> <span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln">                <span class="nam">conf</span><span class="op">.</span><span class="nam">quotas_default_values</span><span class="op">.</span><span class="nam">compute</span><span class="op">.</span><span class="nam">injected_file_content_bytes</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">injected_file_content_bytes</span> <span class="op">=</span> <span class="nam">injected_file_content_bytes</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">floating_ips</span> <span class="op">=</span> <span class="nam">floating_ips</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">fixed_ips</span> <span class="op">=</span> <span class="nam">fixed_ips</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">injected_file_path_bytes</span> <span class="op">=</span> <span class="nam">injected_file_path_bytes</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">server_groups</span> <span class="op">=</span> <span class="nam">server_groups</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">server_group_members</span> <span class="op">=</span> <span class="nam">server_group_members</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t84" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm run hide_run"><span class="key">class</span> <span class="nam">Storage</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="pln">    <span class="str">"""storage info model for customer</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="stm run hide_run">    <span class="nam">gigabytes</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="stm run hide_run">    <span class="nam">snapshots</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm run hide_run">    <span class="nam">volumes</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t93" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">gigabytes</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">snapshots</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">volumes</span><span class="op">=</span><span class="str">''</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="pln"><span class="str">        create a new Storage instance.</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="pln"><span class="str">        :param gigabytes:</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln"><span class="str">        :param snapshots:</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="pln"><span class="str">        :param volumes:</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">gigabytes</span> <span class="op">=</span> <span class="nam">gigabytes</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">snapshots</span> <span class="op">=</span> <span class="nam">snapshots</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">volumes</span> <span class="op">=</span> <span class="nam">volumes</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t105" class="stm run hide_run"><span class="key">class</span> <span class="nam">Network</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="pln">    <span class="str">"""network model the customer</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t108" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="stm run hide_run">    <span class="nam">floating_ips</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"floating-ips"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="stm run hide_run">    <span class="nam">networks</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="stm run hide_run">    <span class="nam">ports</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t112" class="stm run hide_run">    <span class="nam">routers</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="stm run hide_run">    <span class="nam">subnets</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="stm run hide_run">    <span class="nam">security_groups</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"security-groups"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="stm run hide_run">    <span class="nam">security_group_rules</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"security-group-rules"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="stm run hide_run">    <span class="nam">health_monitor</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"health-monitor"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="stm run hide_run">    <span class="nam">member</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t118" class="stm run hide_run">    <span class="nam">nat_instance</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"nat-instance"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="stm run hide_run">    <span class="nam">pool</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="stm run hide_run">    <span class="nam">route_table</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"route-table"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t121" class="stm run hide_run">    <span class="nam">vip</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t123" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">floating_ips</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">networks</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">ports</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">routers</span><span class="op">=</span><span class="str">''</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t124" class="pln">                 <span class="nam">subnets</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">security_groups</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">security_group_rules</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="pln">                 <span class="nam">health_monitor</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">member</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">nat_instance</span><span class="op">=</span><span class="str">''</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t126" class="pln">                 <span class="nam">pool</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">route_table</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">vip</span><span class="op">=</span><span class="str">''</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t127" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t128" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t129" class="pln"><span class="str">        Create a new Network instance.</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="pln"><span class="str">        :param floating_ips:  num of floating_ips</span><span class="strut">&nbsp;</span></p>
+<p id="t131" class="pln"><span class="str">        :param networks:  num of networks</span><span class="strut">&nbsp;</span></p>
+<p id="t132" class="pln"><span class="str">        :param ports:  num of ports</span><span class="strut">&nbsp;</span></p>
+<p id="t133" class="pln"><span class="str">        :param routers:  num of routers</span><span class="strut">&nbsp;</span></p>
+<p id="t134" class="pln"><span class="str">        :param subnets:  num of subnets</span><span class="strut">&nbsp;</span></p>
+<p id="t135" class="pln"><span class="str">        :param security_groups: security groups</span><span class="strut">&nbsp;</span></p>
+<p id="t136" class="pln"><span class="str">        :param security_group_rules: security group rules</span><span class="strut">&nbsp;</span></p>
+<p id="t137" class="pln"><span class="str">        :param health_monitor:</span><span class="strut">&nbsp;</span></p>
+<p id="t138" class="pln"><span class="str">        :param member:</span><span class="strut">&nbsp;</span></p>
+<p id="t139" class="pln"><span class="str">        :param nat_instance:</span><span class="strut">&nbsp;</span></p>
+<p id="t140" class="pln"><span class="str">        :param pool:</span><span class="strut">&nbsp;</span></p>
+<p id="t141" class="pln"><span class="str">        :param route_table:</span><span class="strut">&nbsp;</span></p>
+<p id="t142" class="pln"><span class="str">        :param vip:</span><span class="strut">&nbsp;</span></p>
+<p id="t143" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t144" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">floating_ips</span> <span class="op">=</span> <span class="nam">floating_ips</span><span class="strut">&nbsp;</span></p>
+<p id="t145" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">networks</span> <span class="op">=</span> <span class="nam">networks</span><span class="strut">&nbsp;</span></p>
+<p id="t146" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">ports</span> <span class="op">=</span> <span class="nam">ports</span><span class="strut">&nbsp;</span></p>
+<p id="t147" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">routers</span> <span class="op">=</span> <span class="nam">routers</span><span class="strut">&nbsp;</span></p>
+<p id="t148" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">subnets</span> <span class="op">=</span> <span class="nam">subnets</span><span class="strut">&nbsp;</span></p>
+<p id="t149" class="stm run hide_run">        <span class="key">if</span> <span class="nam">security_groups</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t150" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">security_groups</span> <span class="op">=</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">quotas_default_values</span><span class="op">.</span><span class="nam">network</span><span class="op">.</span><span class="nam">security_groups</span><span class="strut">&nbsp;</span></p>
+<p id="t151" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t152" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">security_groups</span> <span class="op">=</span> <span class="nam">security_groups</span><span class="strut">&nbsp;</span></p>
+<p id="t153" class="stm run hide_run">        <span class="key">if</span> <span class="nam">security_group_rules</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t154" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">security_group_rules</span> <span class="op">=</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">quotas_default_values</span><span class="op">.</span><span class="nam">network</span><span class="op">.</span><span class="nam">security_group_rules</span><span class="strut">&nbsp;</span></p>
+<p id="t155" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t156" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">security_group_rules</span> <span class="op">=</span> <span class="nam">security_group_rules</span><span class="strut">&nbsp;</span></p>
+<p id="t157" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t158" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">health_monitor</span> <span class="op">=</span> <span class="nam">health_monitor</span><span class="strut">&nbsp;</span></p>
+<p id="t159" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">member</span> <span class="op">=</span> <span class="nam">member</span><span class="strut">&nbsp;</span></p>
+<p id="t160" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">nat_instance</span> <span class="op">=</span> <span class="nam">nat_instance</span><span class="strut">&nbsp;</span></p>
+<p id="t161" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">pool</span> <span class="op">=</span> <span class="nam">pool</span><span class="strut">&nbsp;</span></p>
+<p id="t162" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">route_table</span> <span class="op">=</span> <span class="nam">route_table</span><span class="strut">&nbsp;</span></p>
+<p id="t163" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">vip</span> <span class="op">=</span> <span class="nam">vip</span><span class="strut">&nbsp;</span></p>
+<p id="t164" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t165" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t166" class="stm run hide_run"><span class="key">class</span> <span class="nam">Quota</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t167" class="pln">    <span class="str">"""network model the customer</span><span class="strut">&nbsp;</span></p>
+<p id="t168" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t169" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t170" class="stm run hide_run">    <span class="nam">compute</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">Compute</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t171" class="stm run hide_run">    <span class="nam">storage</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">Storage</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t172" class="stm run hide_run">    <span class="nam">network</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">Network</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t173" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t174" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">compute</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">storage</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">network</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t175" class="pln">        <span class="str">"""Create a new compute.</span><span class="strut">&nbsp;</span></p>
+<p id="t176" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t177" class="pln"><span class="str">        :param compute:  compute quota</span><span class="strut">&nbsp;</span></p>
+<p id="t178" class="pln"><span class="str">        :param storage:  storage quota</span><span class="strut">&nbsp;</span></p>
+<p id="t179" class="pln"><span class="str">        :param network:  network quota</span><span class="strut">&nbsp;</span></p>
+<p id="t180" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t181" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">compute</span> <span class="op">=</span> <span class="nam">compute</span><span class="strut">&nbsp;</span></p>
+<p id="t182" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">storage</span> <span class="op">=</span> <span class="nam">storage</span><span class="strut">&nbsp;</span></p>
+<p id="t183" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">network</span> <span class="op">=</span> <span class="nam">network</span><span class="strut">&nbsp;</span></p>
+<p id="t184" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t185" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t186" class="stm run hide_run"><span class="key">class</span> <span class="nam">User</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t187" class="pln">    <span class="str">"""user model the customer</span><span class="strut">&nbsp;</span></p>
+<p id="t188" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t189" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t190" class="stm run hide_run">    <span class="nam">id</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t191" class="stm run hide_run">    <span class="nam">role</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t192" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t193" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="str">""</span><span class="op">,</span> <span class="nam">role</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t194" class="pln">        <span class="str">"""Create a new compute.</span><span class="strut">&nbsp;</span></p>
+<p id="t195" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t196" class="pln"><span class="str">        :param id:  user id</span><span class="strut">&nbsp;</span></p>
+<p id="t197" class="pln"><span class="str">        :param role:  roles this use belong to</span><span class="strut">&nbsp;</span></p>
+<p id="t198" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t199" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t200" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">role</span> <span class="op">=</span> <span class="nam">role</span><span class="strut">&nbsp;</span></p>
+<p id="t201" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t202" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t203" class="stm run hide_run"><span class="key">class</span> <span class="nam">Region</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t204" class="pln">    <span class="str">"""network model the customer</span><span class="strut">&nbsp;</span></p>
+<p id="t205" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t206" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t207" class="stm run hide_run">    <span class="nam">name</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t208" class="stm run hide_run">    <span class="nam">type</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">default</span><span class="op">=</span><span class="str">"single"</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t209" class="stm run hide_run">    <span class="nam">quotas</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">Quota</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t210" class="stm run hide_run">    <span class="nam">users</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">User</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t211" class="stm run hide_run">    <span class="nam">status</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t212" class="stm run hide_run">    <span class="nam">error_message</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t213" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t214" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">""</span><span class="op">,</span> <span class="nam">type</span><span class="op">=</span><span class="str">"single"</span><span class="op">,</span> <span class="nam">quotas</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">,</span> <span class="nam">users</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">,</span> <span class="nam">status</span><span class="op">=</span><span class="str">""</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t215" class="pln">                 <span class="nam">error_message</span><span class="op">=</span><span class="str">""</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t216" class="pln">        <span class="str">"""Create a new compute.</span><span class="strut">&nbsp;</span></p>
+<p id="t217" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t218" class="pln"><span class="str">        :param name:  region name</span><span class="strut">&nbsp;</span></p>
+<p id="t219" class="pln"><span class="str">        :param type:  region type</span><span class="strut">&nbsp;</span></p>
+<p id="t220" class="pln"><span class="str">        :param quotas:  quotas ( array of Quota)</span><span class="strut">&nbsp;</span></p>
+<p id="t221" class="pln"><span class="str">        :param users:   array of users of specific region</span><span class="strut">&nbsp;</span></p>
+<p id="t222" class="pln"><span class="str">        :param status: status of creation</span><span class="strut">&nbsp;</span></p>
+<p id="t223" class="pln"><span class="str">        :param error_message: error message if status is error</span><span class="strut">&nbsp;</span></p>
+<p id="t224" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t225" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t226" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t227" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">type</span> <span class="op">=</span> <span class="nam">type</span><span class="strut">&nbsp;</span></p>
+<p id="t228" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">quotas</span> <span class="op">=</span> <span class="nam">quotas</span><span class="strut">&nbsp;</span></p>
+<p id="t229" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">users</span> <span class="op">=</span> <span class="nam">users</span><span class="strut">&nbsp;</span></p>
+<p id="t230" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status</span> <span class="op">=</span> <span class="nam">status</span><span class="strut">&nbsp;</span></p>
+<p id="t231" class="stm par run hide_run"><span class="annotate short">231&#x202F;&#x219B;&#x202F;232</span><span class="annotate long">line 231 didn't jump to line 232, because the condition on line 231 was never true</span>        <span class="key">if</span> <span class="nam">error_message</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t232" class="stm mis">            <span class="nam">self</span><span class="op">.</span><span class="nam">error_message</span> <span class="op">=</span> <span class="nam">error_message</span><span class="strut">&nbsp;</span></p>
+<p id="t233" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t234" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t235" class="stm run hide_run"><span class="key">class</span> <span class="nam">Customer</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t236" class="pln">    <span class="str">"""customer entity with all it's related data</span><span class="strut">&nbsp;</span></p>
+<p id="t237" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t238" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t239" class="stm run hide_run">    <span class="nam">description</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t240" class="stm run hide_run">    <span class="nam">enabled</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">bool</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t241" class="stm run hide_run">    <span class="nam">name</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t242" class="stm run hide_run">    <span class="nam">metadata</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">DictType</span><span class="op">(</span><span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">)</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t243" class="stm run hide_run">    <span class="nam">regions</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">Region</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t244" class="stm run hide_run">    <span class="nam">users</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">User</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t245" class="stm run hide_run">    <span class="nam">defaultQuotas</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">Quota</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t246" class="stm run hide_run">    <span class="nam">status</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t247" class="stm run hide_run">    <span class="nam">custId</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t248" class="stm run hide_run">    <span class="nam">uuid</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t249" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t250" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">description</span><span class="op">=</span><span class="str">""</span><span class="op">,</span> <span class="nam">enabled</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">""</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">=</span><span class="op">{</span><span class="op">}</span><span class="op">,</span> <span class="nam">regions</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">,</span> <span class="nam">users</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t251" class="pln">                 <span class="nam">defaultQuotas</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">,</span> <span class="nam">status</span><span class="op">=</span><span class="str">""</span><span class="op">,</span> <span class="nam">custId</span><span class="op">=</span><span class="str">""</span><span class="op">,</span> <span class="nam">uuid</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t252" class="pln">        <span class="str">"""Create a new Customer.</span><span class="strut">&nbsp;</span></p>
+<p id="t253" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t254" class="pln"><span class="str">        :param description:  Server name</span><span class="strut">&nbsp;</span></p>
+<p id="t255" class="pln"><span class="str">        :param enabled:  I don't know</span><span class="strut">&nbsp;</span></p>
+<p id="t256" class="pln"><span class="str">        :param status: status of creation</span><span class="strut">&nbsp;</span></p>
+<p id="t257" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t258" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">description</span><span class="strut">&nbsp;</span></p>
+<p id="t259" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">enabled</span> <span class="op">=</span> <span class="nam">enabled</span><span class="strut">&nbsp;</span></p>
+<p id="t260" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t261" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">metadata</span> <span class="op">=</span> <span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t262" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span> <span class="op">=</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t263" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">users</span> <span class="op">=</span> <span class="nam">users</span><span class="strut">&nbsp;</span></p>
+<p id="t264" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">defaultQuotas</span> <span class="op">=</span> <span class="nam">defaultQuotas</span><span class="strut">&nbsp;</span></p>
+<p id="t265" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status</span> <span class="op">=</span> <span class="nam">status</span><span class="strut">&nbsp;</span></p>
+<p id="t266" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">custId</span> <span class="op">=</span> <span class="nam">custId</span><span class="strut">&nbsp;</span></p>
+<p id="t267" class="stm par run hide_run"><span class="annotate short">267&#x202F;&#x219B;&#x202F;268</span><span class="annotate long">line 267 didn't jump to line 268, because the condition on line 267 was never true</span>        <span class="key">if</span> <span class="nam">uuid</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t268" class="stm mis">            <span class="nam">self</span><span class="op">.</span><span class="nam">uuid</span> <span class="op">=</span> <span class="nam">uuid</span><span class="strut">&nbsp;</span></p>
+<p id="t269" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t270" class="stm run hide_run">    <span class="key">def</span> <span class="nam">validate_model</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">context</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t271" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t272" class="pln"><span class="str">        this function check if the customer model meet the demands</span><span class="strut">&nbsp;</span></p>
+<p id="t273" class="pln"><span class="str">        :param context: i.e. 'create 'update'</span><span class="strut">&nbsp;</span></p>
+<p id="t274" class="pln"><span class="str">        :return: none</span><span class="strut">&nbsp;</span></p>
+<p id="t275" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t276" class="stm par run hide_run"><span class="annotate short">276&#x202F;&#x219B;&#x202F;exit</span><span class="annotate long">line 276 didn't return from function 'validate_model', because the condition on line 276 was never false</span>        <span class="key">if</span> <span class="nam">context</span> <span class="op">==</span> <span class="str">"update"</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t277" class="stm par run hide_run"><span class="annotate short">277&#x202F;&#x219B;&#x202F;278</span><span class="annotate long">line 277 didn't jump to line 278, because the loop on line 277 never started</span>            <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t278" class="stm mis">                <span class="key">if</span> <span class="nam">region</span><span class="op">.</span><span class="nam">type</span> <span class="op">==</span> <span class="str">"group"</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t279" class="stm mis">                    <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">400</span><span class="op">,</span> <span class="str">"region type is invalid for update, \'group\' can be only in create"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t280" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t281" class="stm run hide_run">    <span class="key">def</span> <span class="nam">handle_region_group</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t282" class="stm run hide_run">        <span class="nam">regions_to_add</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t283" class="stm run hide_run">        <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span><span class="op">[</span><span class="op">:</span><span class="op">]</span><span class="op">:</span>  <span class="com"># get copy of it to be able to delete from the origin</span><span class="strut">&nbsp;</span></p>
+<p id="t284" class="stm run hide_run">            <span class="key">if</span> <span class="nam">region</span><span class="op">.</span><span class="nam">type</span> <span class="op">==</span> <span class="str">"group"</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t285" class="stm run hide_run">                <span class="nam">group_regions</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_regions_for_group</span><span class="op">(</span><span class="nam">region</span><span class="op">.</span><span class="nam">name</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t286" class="stm run hide_run">                <span class="key">if</span> <span class="key">not</span> <span class="nam">group_regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t287" class="stm run hide_run">                    <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">404</span><span class="op">,</span> <span class="str">'Group {} Not found'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region</span><span class="op">.</span><span class="nam">name</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t288" class="stm run hide_run">                <span class="key">for</span> <span class="nam">group_region</span> <span class="key">in</span> <span class="nam">group_regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t289" class="stm run hide_run">                    <span class="nam">regions_to_add</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">Region</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="nam">group_region</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t290" class="pln">                                                 <span class="nam">type</span><span class="op">=</span><span class="str">'single'</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t291" class="pln">                                                 <span class="nam">quotas</span><span class="op">=</span><span class="nam">region</span><span class="op">.</span><span class="nam">quotas</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t292" class="pln">                                                 <span class="nam">users</span><span class="op">=</span><span class="nam">region</span><span class="op">.</span><span class="nam">users</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t293" class="stm run hide_run">                <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span><span class="op">.</span><span class="nam">remove</span><span class="op">(</span><span class="nam">region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t294" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t295" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span><span class="op">.</span><span class="nam">extend</span><span class="op">(</span><span class="nam">set</span><span class="op">(</span><span class="nam">regions_to_add</span><span class="op">)</span><span class="op">)</span>  <span class="com"># remove duplicates if exist</span><span class="strut">&nbsp;</span></p>
+<p id="t296" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t297" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_regions_for_group</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group_name</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t298" class="stm run hide_run">        <span class="nam">set_utils_conf</span><span class="op">(</span><span class="nam">conf</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t299" class="stm run hide_run">        <span class="nam">regions</span> <span class="op">=</span> <span class="nam">get_regions_of_group</span><span class="op">(</span><span class="nam">group_name</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t300" class="stm run hide_run">        <span class="key">return</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t301" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t302" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t303" class="pln"><span class="str">""" Customer Result Handler """</span><span class="strut">&nbsp;</span></p>
+<p id="t304" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t305" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t306" class="stm run hide_run"><span class="key">class</span> <span class="nam">CustomerResult</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t307" class="stm run hide_run">    <span class="nam">id</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t308" class="stm run hide_run">    <span class="nam">updated</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t309" class="stm run hide_run">    <span class="nam">created</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t310" class="stm run hide_run">    <span class="nam">links</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">{</span><span class="nam">str</span><span class="op">:</span> <span class="nam">str</span><span class="op">}</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t311" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t312" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">id</span><span class="op">,</span> <span class="nam">links</span><span class="op">=</span><span class="op">{</span><span class="op">}</span><span class="op">,</span> <span class="nam">updated</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">created</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t313" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t314" class="stm par run hide_run"><span class="annotate short">314&#x202F;&#x219B;&#x202F;315</span><span class="annotate long">line 314 didn't jump to line 315, because the condition on line 314 was never true</span>        <span class="key">if</span> <span class="nam">updated</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t315" class="stm mis">            <span class="nam">self</span><span class="op">.</span><span class="nam">updated</span> <span class="op">=</span> <span class="nam">updated</span><span class="strut">&nbsp;</span></p>
+<p id="t316" class="stm par run hide_run"><span class="annotate short">316&#x202F;&#x219B;&#x202F;318</span><span class="annotate long">line 316 didn't jump to line 318, because the condition on line 316 was never false</span>        <span class="key">elif</span> <span class="nam">created</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t317" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">created</span> <span class="op">=</span> <span class="nam">created</span><span class="strut">&nbsp;</span></p>
+<p id="t318" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">links</span> <span class="op">=</span> <span class="nam">links</span><span class="strut">&nbsp;</span></p>
+<p id="t319" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t320" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t321" class="stm run hide_run"><span class="key">class</span> <span class="nam">CustomerResultWrapper</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t322" class="stm run hide_run">    <span class="nam">transaction_id</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t323" class="stm run hide_run">    <span class="nam">customer</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">CustomerResult</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t324" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t325" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">id</span><span class="op">,</span> <span class="nam">links</span><span class="op">,</span> <span class="nam">updated</span><span class="op">,</span> <span class="nam">created</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t326" class="stm run hide_run">        <span class="nam">customer_result</span> <span class="op">=</span> <span class="nam">CustomerResult</span><span class="op">(</span><span class="nam">id</span><span class="op">,</span> <span class="nam">links</span><span class="op">,</span> <span class="nam">updated</span><span class="op">,</span> <span class="nam">created</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t327" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">transaction_id</span> <span class="op">=</span> <span class="nam">transaction_id</span><span class="strut">&nbsp;</span></p>
+<p id="t328" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">customer</span> <span class="op">=</span> <span class="nam">customer_result</span><span class="strut">&nbsp;</span></p>
+<p id="t329" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t330" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t331" class="pln"><span class="str">""" ****************************************************************** """</span><span class="strut">&nbsp;</span></p>
+<p id="t332" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t333" class="pln"><span class="str">""" User Result Handler """</span><span class="strut">&nbsp;</span></p>
+<p id="t334" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t335" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t336" class="stm run hide_run"><span class="key">class</span> <span class="nam">UserResult</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t337" class="stm run hide_run">    <span class="nam">id</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t338" class="stm run hide_run">    <span class="nam">added</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t339" class="stm run hide_run">    <span class="nam">links</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">{</span><span class="nam">str</span><span class="op">:</span> <span class="nam">str</span><span class="op">}</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t340" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t341" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">added</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">links</span><span class="op">=</span><span class="op">{</span><span class="op">}</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t342" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t343" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">added</span> <span class="op">=</span> <span class="nam">added</span><span class="strut">&nbsp;</span></p>
+<p id="t344" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">links</span> <span class="op">=</span> <span class="nam">links</span><span class="strut">&nbsp;</span></p>
+<p id="t345" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t346" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t347" class="stm run hide_run"><span class="key">class</span> <span class="nam">UserResultWrapper</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t348" class="stm run hide_run">    <span class="nam">transaction_id</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t349" class="stm run hide_run">    <span class="nam">users</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">UserResult</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t350" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t351" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">users</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t352" class="stm run hide_run">        <span class="nam">users_result</span> <span class="op">=</span> <span class="op">[</span><span class="nam">UserResult</span><span class="op">(</span><span class="nam">user</span><span class="op">[</span><span class="str">'id'</span><span class="op">]</span><span class="op">,</span> <span class="nam">user</span><span class="op">[</span><span class="str">'added'</span><span class="op">]</span><span class="op">,</span> <span class="nam">user</span><span class="op">[</span><span class="str">'links'</span><span class="op">]</span><span class="op">)</span> <span class="key">for</span> <span class="nam">user</span> <span class="key">in</span> <span class="nam">users</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t353" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t354" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">transaction_id</span> <span class="op">=</span> <span class="nam">transaction_id</span><span class="strut">&nbsp;</span></p>
+<p id="t355" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">users</span> <span class="op">=</span> <span class="nam">users_result</span><span class="strut">&nbsp;</span></p>
+<p id="t356" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t357" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t358" class="stm run hide_run"><span class="key">class</span> <span class="nam">MetadataWrapper</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t359" class="stm run hide_run">    <span class="nam">metadata</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">DictType</span><span class="op">(</span><span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">)</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t360" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t361" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">=</span><span class="op">{</span><span class="op">}</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t362" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">metadata</span> <span class="op">=</span> <span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t363" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t364" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t365" class="pln"><span class="str">""" ****************************************************************** """</span><span class="strut">&nbsp;</span></p>
+<p id="t366" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t367" class="pln"><span class="str">""" Region Result Handler """</span><span class="strut">&nbsp;</span></p>
+<p id="t368" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t369" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t370" class="stm run hide_run"><span class="key">class</span> <span class="nam">RegionResult</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t371" class="stm run hide_run">    <span class="nam">id</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t372" class="stm run hide_run">    <span class="nam">added</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t373" class="stm run hide_run">    <span class="nam">links</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">{</span><span class="nam">str</span><span class="op">:</span> <span class="nam">str</span><span class="op">}</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t374" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t375" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">id</span><span class="op">,</span> <span class="nam">added</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">links</span><span class="op">=</span><span class="op">{</span><span class="op">}</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t376" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t377" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">added</span> <span class="op">=</span> <span class="nam">added</span><span class="strut">&nbsp;</span></p>
+<p id="t378" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">links</span> <span class="op">=</span> <span class="nam">links</span><span class="strut">&nbsp;</span></p>
+<p id="t379" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t380" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t381" class="stm run hide_run"><span class="key">class</span> <span class="nam">RegionResultWrapper</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t382" class="stm run hide_run">    <span class="nam">transaction_id</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t383" class="stm run hide_run">    <span class="nam">regions</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">RegionResult</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t384" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t385" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">regions</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t386" class="stm run hide_run">        <span class="nam">regions_result</span> <span class="op">=</span> <span class="op">[</span><span class="nam">RegionResult</span><span class="op">(</span><span class="nam">region</span><span class="op">[</span><span class="str">'id'</span><span class="op">]</span><span class="op">,</span> <span class="nam">region</span><span class="op">[</span><span class="str">'added'</span><span class="op">]</span><span class="op">,</span> <span class="nam">region</span><span class="op">[</span><span class="str">'links'</span><span class="op">]</span><span class="op">)</span> <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span> <span class="nam">regions</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t387" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t388" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">transaction_id</span> <span class="op">=</span> <span class="nam">transaction_id</span><span class="strut">&nbsp;</span></p>
+<p id="t389" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span> <span class="op">=</span> <span class="nam">regions_result</span><span class="strut">&nbsp;</span></p>
+<p id="t390" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t391" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t392" class="pln"><span class="str">""" ****************************************************************** """</span><span class="strut">&nbsp;</span></p>
+<p id="t393" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t394" class="pln"><span class="str">""" CustomerSummary is a DataObject and contains all the fields defined in CustomerSummary structure. """</span><span class="strut">&nbsp;</span></p>
+<p id="t395" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t396" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t397" class="stm run hide_run"><span class="key">class</span> <span class="nam">CustomerSummary</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t398" class="stm run hide_run">    <span class="nam">name</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t399" class="stm run hide_run">    <span class="nam">id</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t400" class="stm run hide_run">    <span class="nam">description</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">text</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t401" class="stm run hide_run">    <span class="nam">enabled</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">bool</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t402" class="stm run hide_run">    <span class="nam">num_regions</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">int</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t403" class="stm run hide_run">    <span class="nam">status</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t404" class="stm run hide_run">    <span class="nam">regions</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t405" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t406" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="str">''</span><span class="op">,</span> <span class="nam">description</span><span class="op">=</span><span class="str">''</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t407" class="pln">                 <span class="nam">enabled</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">status</span><span class="op">=</span><span class="str">""</span><span class="op">,</span> <span class="nam">regions</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">,</span> <span class="nam">num_regions</span><span class="op">=</span><span class="num">0</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t408" class="stm run hide_run">        <span class="nam">Model</span><span class="op">.</span><span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t409" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t410" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t411" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t412" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">description</span><span class="strut">&nbsp;</span></p>
+<p id="t413" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">enabled</span> <span class="op">=</span> <span class="nam">enabled</span><span class="strut">&nbsp;</span></p>
+<p id="t414" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">num_regions</span> <span class="op">=</span> <span class="nam">num_regions</span><span class="strut">&nbsp;</span></p>
+<p id="t415" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status</span> <span class="op">=</span> <span class="nam">status</span><span class="strut">&nbsp;</span></p>
+<p id="t416" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span> <span class="op">=</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t417" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t418" class="stm run hide_run">    <span class="op">@</span><span class="nam">staticmethod</span><span class="strut">&nbsp;</span></p>
+<p id="t419" class="pln">    <span class="key">def</span> <span class="nam">from_db_model</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t420" class="stm run hide_run">        <span class="nam">regions</span> <span class="op">=</span> <span class="op">[</span><span class="nam">region</span><span class="op">.</span><span class="nam">region</span><span class="op">.</span><span class="nam">name</span> <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span><span class="strut">&nbsp;</span></p>
+<p id="t421" class="pln">                   <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_customer_regions</span> <span class="key">if</span><span class="strut">&nbsp;</span></p>
+<p id="t422" class="pln">                   <span class="nam">region</span><span class="op">.</span><span class="nam">region_id</span> <span class="op">!=</span> <span class="op">-</span><span class="num">1</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t423" class="pln">        <span class="com"># default region is -1 , check if -1 in customer list if yes it will return (true, flase) equal to (0, 1)</span><span class="strut">&nbsp;</span></p>
+<p id="t424" class="stm run hide_run">        <span class="nam">num_regions</span> <span class="op">=</span> <span class="nam">len</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_customer_regions</span><span class="op">)</span> <span class="op">-</span> <span class="op">(</span><span class="op">-</span><span class="num">1</span> <span class="key">in</span> <span class="op">[</span><span class="nam">region</span><span class="op">.</span><span class="nam">region_id</span> <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">customer_customer_regions</span><span class="op">]</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t425" class="stm run hide_run">        <span class="nam">customer</span> <span class="op">=</span> <span class="nam">CustomerSummary</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t426" class="stm run hide_run">        <span class="nam">customer</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">uuid</span><span class="strut">&nbsp;</span></p>
+<p id="t427" class="stm run hide_run">        <span class="nam">customer</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t428" class="stm run hide_run">        <span class="nam">customer</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">sql_customer</span><span class="op">.</span><span class="nam">description</span><span class="strut">&nbsp;</span></p>
+<p id="t429" class="stm run hide_run">        <span class="nam">customer</span><span class="op">.</span><span class="nam">enabled</span> <span class="op">=</span> <span class="nam">bool</span><span class="op">(</span><span class="nam">sql_customer</span><span class="op">.</span><span class="nam">enabled</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t430" class="stm run hide_run">        <span class="nam">customer</span><span class="op">.</span><span class="nam">num_regions</span> <span class="op">=</span> <span class="nam">num_regions</span><span class="strut">&nbsp;</span></p>
+<p id="t431" class="stm run hide_run">        <span class="nam">customer</span><span class="op">.</span><span class="nam">regions</span> <span class="op">=</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t432" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t433" class="stm run hide_run">        <span class="key">return</span> <span class="nam">customer</span><span class="strut">&nbsp;</span></p>
+<p id="t434" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t435" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t436" class="stm run hide_run"><span class="key">class</span> <span class="nam">CustomerSummaryResponse</span><span class="op">(</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t437" class="stm run hide_run">    <span class="nam">customers</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">CustomerSummary</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t438" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t439" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t440" class="stm run hide_run">        <span class="nam">Model</span><span class="op">.</span><span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t441" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">customers</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t442" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t443" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t444" class="stm run hide_run"><span class="str">""" ****************************************************************** """</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_model___init___py.html b/orm/services/customer_manager/htmlcov/cms_rest_model___init___py.html
new file mode 100644
index 00000000..eeaf9eca
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_model___init___py.html
@@ -0,0 +1,121 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/model/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/model/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            3 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">3 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span>  <span class="com"># noqa</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">def</span> <span class="nam">init_model</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="str">    This is a stub method which is called at application startup time.</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="str">    If you need to bind to a parsed database configuration, set up tables or</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="str">    ORM classes, or perform any database initialization, this is the</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln"><span class="str">    recommended place to do it.</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="str">    For more information working with databases, and some common recipes,</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="str">    see http://pecan.readthedocs.org/en/latest/databases.html</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_rds_proxy_py.html b/orm/services/customer_manager/htmlcov/cms_rest_rds_proxy_py.html
new file mode 100644
index 00000000..524ca8ec
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_rds_proxy_py.html
@@ -0,0 +1,303 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/rds_proxy.py: 76%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/rds_proxy.py</b> :
+            <span class="pc_cov">76%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            47 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">35 run</span>
+            <span class="mis shortkey_m button_toggle_mis">12 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">1 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="stm mis"><a href="#n17">17</a></p>
+<p id="n18" class="stm mis"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="stm mis"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="stm mis"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="stm mis"><a href="#n25">25</a></p>
+<p id="n26" class="stm mis"><a href="#n26">26</a></p>
+<p id="n27" class="stm mis"><a href="#n27">27</a></p>
+<p id="n28" class="stm mis"><a href="#n28">28</a></p>
+<p id="n29" class="stm mis"><a href="#n29">29</a></p>
+<p id="n30" class="stm mis"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="stm mis"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="stm run hide_run"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="stm run hide_run"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="pln"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="pln"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="pln"><a href="#n48">48</a></p>
+<p id="n49" class="pln"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="pln"><a href="#n53">53</a></p>
+<p id="n54" class="pln"><a href="#n54">54</a></p>
+<p id="n55" class="stm run hide_run"><a href="#n55">55</a></p>
+<p id="n56" class="pln"><a href="#n56">56</a></p>
+<p id="n57" class="pln"><a href="#n57">57</a></p>
+<p id="n58" class="pln"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="pln"><a href="#n65">65</a></p>
+<p id="n66" class="pln"><a href="#n66">66</a></p>
+<p id="n67" class="pln"><a href="#n67">67</a></p>
+<p id="n68" class="pln"><a href="#n68">68</a></p>
+<p id="n69" class="stm run hide_run"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="stm run hide_run"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="stm run hide_run"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="stm run hide_run"><a href="#n76">76</a></p>
+<p id="n77" class="pln"><a href="#n77">77</a></p>
+<p id="n78" class="pln"><a href="#n78">78</a></p>
+<p id="n79" class="pln"><a href="#n79">79</a></p>
+<p id="n80" class="stm run hide_run"><a href="#n80">80</a></p>
+<p id="n81" class="stm run hide_run"><a href="#n81">81</a></p>
+<p id="n82" class="pln"><a href="#n82">82</a></p>
+<p id="n83" class="stm run hide_run"><a href="#n83">83</a></p>
+<p id="n84" class="pln"><a href="#n84">84</a></p>
+<p id="n85" class="stm par run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p>
+<p id="n87" class="pln"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="pln"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="stm mis"><a href="#n91">91</a></p>
+<p id="n92" class="pln"><a href="#n92">92</a></p>
+<p id="n93" class="pln"><a href="#n93">93</a></p>
+<p id="n94" class="pln"><a href="#n94">94</a></p>
+<p id="n95" class="stm run hide_run"><a href="#n95">95</a></p>
+<p id="n96" class="stm run hide_run"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="stm run hide_run"><a href="#n98">98</a></p>
+<p id="n99" class="stm run hide_run"><a href="#n99">99</a></p>
+<p id="n100" class="stm run hide_run"><a href="#n100">100</a></p>
+<p id="n101" class="pln"><a href="#n101">101</a></p>
+<p id="n102" class="stm run hide_run"><a href="#n102">102</a></p>
+<p id="n103" class="stm run hide_run"><a href="#n103">103</a></p>
+<p id="n104" class="stm run hide_run"><a href="#n104">104</a></p>
+<p id="n105" class="pln"><a href="#n105">105</a></p>
+<p id="n106" class="stm run hide_run"><a href="#n106">106</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">pprint</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">import</span> <span class="nam">requests</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">import</span> <span class="nam">json</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logic</span><span class="op">.</span><span class="nam">error_base</span> <span class="key">import</span> <span class="nam">ErrorStatus</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">cms_rest</span><span class="op">.</span><span class="nam">logger</span> <span class="key">import</span> <span class="nam">get_logger</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="nam">LOG</span> <span class="op">=</span> <span class="nam">get_logger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="nam">headers</span> <span class="op">=</span> <span class="op">{</span><span class="str">'content-type'</span><span class="op">:</span> <span class="str">'application/json'</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">class</span> <span class="nam">RdsProxy</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run">    <span class="op">@</span><span class="nam">staticmethod</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln">    <span class="key">def</span> <span class="nam">get_status</span><span class="op">(</span><span class="nam">resource_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm mis">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm mis">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln">                <span class="str">"Sending to RDS Server to get status: "</span> <span class="op">+</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">rds_server</span><span class="op">.</span><span class="nam">base</span> <span class="op">+</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">rds_server</span><span class="op">.</span><span class="nam">status</span> <span class="op">+</span> <span class="nam">resource_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm mis">            <span class="nam">resp</span> <span class="op">=</span> <span class="nam">requests</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln">                <span class="nam">conf</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">rds_server</span><span class="op">.</span><span class="nam">base</span> <span class="op">+</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">rds_server</span><span class="op">.</span><span class="nam">status</span> <span class="op">+</span> <span class="nam">resource_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">                <span class="nam">verify</span><span class="op">=</span><span class="nam">conf</span><span class="op">.</span><span class="nam">verify</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm mis">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln">                <span class="str">"Sending to RDS Server to get status: "</span> <span class="op">+</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">rds_server</span><span class="op">.</span><span class="nam">base</span> <span class="op">+</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">rds_server</span><span class="op">.</span><span class="nam">status</span> <span class="op">+</span> <span class="nam">resource_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="stm mis">            <span class="nam">pp</span> <span class="op">=</span> <span class="nam">pprint</span><span class="op">.</span><span class="nam">PrettyPrinter</span><span class="op">(</span><span class="nam">width</span><span class="op">=</span><span class="num">30</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm mis">            <span class="nam">pretty_text</span> <span class="op">=</span> <span class="nam">pp</span><span class="op">.</span><span class="nam">pformat</span><span class="op">(</span><span class="nam">resp</span><span class="op">.</span><span class="nam">json</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm mis">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Response from RDS Server:\n"</span> <span class="op">+</span> <span class="nam">pretty_text</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm mis">            <span class="key">return</span> <span class="nam">resp</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm mis">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="stm mis">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">log_exception</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln">                <span class="str">"CustomerLogic - Failed to Get status for customer : "</span> <span class="op">+</span> <span class="nam">resource_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln">                <span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm mis">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">    <span class="op">@</span><span class="nam">staticmethod</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln">    <span class="key">def</span> <span class="nam">send_customer</span><span class="op">(</span><span class="nam">customer</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">method</span><span class="op">)</span><span class="op">:</span>  <span class="com"># method is "POST" or "PUT"</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">        <span class="key">return</span> <span class="nam">RdsProxy</span><span class="op">.</span><span class="nam">send_customer_dict</span><span class="op">(</span><span class="nam">customer</span><span class="op">.</span><span class="nam">get_proxy_dict</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">method</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t39" class="stm run hide_run">    <span class="op">@</span><span class="nam">staticmethod</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln">    <span class="key">def</span> <span class="nam">send_customer_dict</span><span class="op">(</span><span class="nam">customer_dict</span><span class="op">,</span> <span class="nam">transaction_id</span><span class="op">,</span> <span class="nam">method</span><span class="op">)</span><span class="op">:</span>  <span class="com"># method is "POST" or "PUT"</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="stm run hide_run">        <span class="nam">data</span> <span class="op">=</span> <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln">            <span class="str">"service_template"</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="pln">                <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln">                    <span class="str">"resource"</span><span class="op">:</span> <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="pln">                        <span class="str">"resource_type"</span><span class="op">:</span> <span class="str">"customer"</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln">                    <span class="op">}</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln">                    <span class="str">"model"</span><span class="op">:</span> <span class="nam">str</span><span class="op">(</span><span class="nam">json</span><span class="op">.</span><span class="nam">dumps</span><span class="op">(</span><span class="nam">customer_dict</span><span class="op">)</span><span class="op">)</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="pln">                    <span class="str">"tracking"</span><span class="op">:</span> <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="pln">                        <span class="str">"external_id"</span><span class="op">:</span> <span class="str">""</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln">                        <span class="str">"tracking_id"</span><span class="op">:</span> <span class="nam">transaction_id</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln">                    <span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln">                <span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="pln">        <span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t55" class="stm run hide_run">        <span class="nam">data_to_display</span> <span class="op">=</span> <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="pln">            <span class="str">"service_template"</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="pln">                <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="pln">                    <span class="str">"resource"</span><span class="op">:</span> <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln">                        <span class="str">"resource_type"</span><span class="op">:</span> <span class="str">"customer"</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln">                    <span class="op">}</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln">                    <span class="str">"model"</span><span class="op">:</span> <span class="nam">customer_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln">                    <span class="str">"tracking"</span><span class="op">:</span> <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln">                        <span class="str">"external_id"</span><span class="op">:</span> <span class="str">""</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln">                        <span class="str">"tracking_id"</span><span class="op">:</span> <span class="nam">transaction_id</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="pln">                    <span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="pln">                <span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="pln">        <span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t69" class="stm run hide_run">        <span class="nam">pp</span> <span class="op">=</span> <span class="nam">pprint</span><span class="op">.</span><span class="nam">PrettyPrinter</span><span class="op">(</span><span class="nam">width</span><span class="op">=</span><span class="num">30</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">        <span class="nam">pretty_text</span> <span class="op">=</span> <span class="nam">pp</span><span class="op">.</span><span class="nam">pformat</span><span class="op">(</span><span class="nam">data_to_display</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="stm run hide_run">        <span class="nam">wrapper_json</span> <span class="op">=</span> <span class="nam">json</span><span class="op">.</span><span class="nam">dumps</span><span class="op">(</span><span class="nam">data</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t73" class="stm run hide_run">        <span class="nam">headers</span><span class="op">[</span><span class="str">'X-RANGER-Client'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">[</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln">            <span class="str">'X-RANGER-Client'</span><span class="op">]</span> <span class="key">if</span> <span class="str">'X-RANGER-Client'</span> <span class="key">in</span> <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span> <span class="key">else</span> <span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln">            <span class="str">'NA'</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="stm run hide_run">        <span class="nam">headers</span><span class="op">[</span><span class="str">'X-RANGER-Requester'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">[</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="pln">            <span class="str">'X-RANGER-Requester'</span><span class="op">]</span> <span class="key">if</span> <span class="str">'X-RANGER-Requester'</span> <span class="key">in</span> <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span> <span class="key">else</span> <span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="pln">            <span class="str">''</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t80" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Wrapper JSON before sending action: {0} to Rds Proxy\n{1}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">method</span><span class="op">,</span> <span class="nam">pretty_text</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Sending to RDS Server: "</span> <span class="op">+</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">rds_server</span><span class="op">.</span><span class="nam">base</span> <span class="op">+</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">rds_server</span><span class="op">.</span><span class="nam">resources</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t83" class="stm run hide_run">        <span class="nam">wrapper_json</span> <span class="op">=</span> <span class="nam">json</span><span class="op">.</span><span class="nam">dumps</span><span class="op">(</span><span class="nam">data</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm par run hide_run"><span class="annotate short">85&#x202F;&#x219B;&#x202F;91</span><span class="annotate long">line 85 didn't jump to line 91, because the condition on line 85 was never false</span>        <span class="key">if</span> <span class="nam">method</span> <span class="op">==</span> <span class="str">"POST"</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm run hide_run">            <span class="nam">resp</span> <span class="op">=</span> <span class="nam">requests</span><span class="op">.</span><span class="nam">post</span><span class="op">(</span><span class="nam">conf</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">rds_server</span><span class="op">.</span><span class="nam">base</span> <span class="op">+</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">rds_server</span><span class="op">.</span><span class="nam">resources</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="pln">                                 <span class="nam">data</span><span class="op">=</span><span class="nam">wrapper_json</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln">                                 <span class="nam">headers</span><span class="op">=</span><span class="nam">headers</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="pln">                                 <span class="nam">verify</span><span class="op">=</span><span class="nam">conf</span><span class="op">.</span><span class="nam">verify</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm mis">            <span class="nam">resp</span> <span class="op">=</span> <span class="nam">requests</span><span class="op">.</span><span class="nam">put</span><span class="op">(</span><span class="nam">conf</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">rds_server</span><span class="op">.</span><span class="nam">base</span> <span class="op">+</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">rds_server</span><span class="op">.</span><span class="nam">resources</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="pln">                                <span class="nam">data</span><span class="op">=</span><span class="nam">wrapper_json</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="pln">                                <span class="nam">headers</span><span class="op">=</span><span class="nam">headers</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="pln">                                <span class="nam">verify</span><span class="op">=</span><span class="nam">conf</span><span class="op">.</span><span class="nam">verify</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="stm run hide_run">        <span class="key">if</span> <span class="nam">resp</span><span class="op">.</span><span class="nam">content</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="stm run hide_run">            <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Response Content from rds server: {0}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">resp</span><span class="op">.</span><span class="nam">content</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t98" class="stm run hide_run">        <span class="nam">content</span> <span class="op">=</span> <span class="nam">resp</span><span class="op">.</span><span class="nam">content</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="stm run hide_run">        <span class="key">if</span> <span class="nam">resp</span><span class="op">.</span><span class="nam">content</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="stm run hide_run">            <span class="nam">content</span> <span class="op">=</span> <span class="nam">resp</span><span class="op">.</span><span class="nam">json</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t102" class="stm run hide_run">        <span class="key">if</span> <span class="nam">resp</span><span class="op">.</span><span class="nam">content</span> <span class="key">and</span> <span class="num">200</span> <span class="op">&lt;=</span> <span class="nam">resp</span><span class="op">.</span><span class="nam">status_code</span> <span class="op">&lt;</span> <span class="num">300</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="stm run hide_run">            <span class="nam">content</span> <span class="op">=</span> <span class="nam">resp</span><span class="op">.</span><span class="nam">json</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="stm run hide_run">            <span class="key">return</span> <span class="nam">content</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t106" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="nam">resp</span><span class="op">.</span><span class="nam">status_code</span><span class="op">,</span> <span class="nam">content</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_utils___init___py.html b/orm/services/customer_manager/htmlcov/cms_rest_utils___init___py.html
new file mode 100644
index 00000000..448d1ece
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_utils___init___py.html
@@ -0,0 +1,91 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/utils/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/utils/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/cms_rest_utils_authentication_py.html b/orm/services/customer_manager/htmlcov/cms_rest_utils_authentication_py.html
new file mode 100644
index 00000000..be78d7b5
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/cms_rest_utils_authentication_py.html
@@ -0,0 +1,207 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for cms_rest/utils/authentication.py: 76%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>cms_rest/utils/authentication.py</b> :
+            <span class="pc_cov">76%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            43 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">36 run</span>
+            <span class="mis shortkey_m button_toggle_mis">7 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+                <span class="par run hide_run shortkey_p button_toggle_par">1 partial</span>
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm mis"><a href="#n11">11</a></p>
+<p id="n12" class="stm mis"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="stm mis"><a href="#n14">14</a></p>
+<p id="n15" class="stm mis"><a href="#n15">15</a></p>
+<p id="n16" class="stm mis"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="stm mis"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="stm run hide_run"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="stm run hide_run"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="stm run hide_run"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="stm run hide_run"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="stm run hide_run"><a href="#n39">39</a></p>
+<p id="n40" class="stm run hide_run"><a href="#n40">40</a></p>
+<p id="n41" class="stm par run hide_run"><a href="#n41">41</a></p>
+<p id="n42" class="stm run hide_run"><a href="#n42">42</a></p>
+<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p>
+<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="stm mis"><a href="#n48">48</a></p>
+<p id="n49" class="pln"><a href="#n49">49</a></p>
+<p id="n50" class="stm run hide_run"><a href="#n50">50</a></p>
+<p id="n51" class="stm run hide_run"><a href="#n51">51</a></p>
+<p id="n52" class="stm run hide_run"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="stm run hide_run"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="stm run hide_run"><a href="#n58">58</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">keystone_utils</span> <span class="key">import</span> <span class="nam">tokens</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">policy</span> <span class="key">import</span> <span class="nam">policy</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">def</span> <span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="nam">action</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm mis">    <span class="key">if</span> <span class="key">not</span> <span class="nam">_is_authorization_enabled</span><span class="op">(</span><span class="nam">conf</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm mis">        <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm mis">    <span class="nam">auth_region</span> <span class="op">=</span> <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'X-Auth-Region'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm mis">    <span class="key">if</span> <span class="key">not</span> <span class="nam">auth_region</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm mis">        <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="str">'N/A'</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="str">'X-Auth-Region is missing'</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln">                                  <span class="nam">status_code</span><span class="op">=</span><span class="num">401</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm mis">    <span class="nam">policy</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">action</span><span class="op">,</span> <span class="nam">request</span><span class="op">,</span> <span class="nam">conf</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run"><span class="key">def</span> <span class="nam">_is_authorization_enabled</span><span class="op">(</span><span class="nam">app_conf</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="stm run hide_run">    <span class="key">return</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">enabled</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t25" class="stm run hide_run"><span class="key">def</span> <span class="nam">_get_token_conf</span><span class="op">(</span><span class="nam">app_conf</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">    <span class="nam">mech_id</span> <span class="op">=</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">mech_id</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run">    <span class="nam">mech_password</span> <span class="op">=</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">mech_pass</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm run hide_run">    <span class="nam">rms_url</span> <span class="op">=</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">rms_url</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">    <span class="nam">tenant_name</span> <span class="op">=</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">tenant_name</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="stm run hide_run">    <span class="nam">keystone_version</span> <span class="op">=</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">keystone_version</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">    <span class="nam">conf</span> <span class="op">=</span> <span class="nam">tokens</span><span class="op">.</span><span class="nam">TokenConf</span><span class="op">(</span><span class="nam">mech_id</span><span class="op">,</span> <span class="nam">mech_password</span><span class="op">,</span> <span class="nam">rms_url</span><span class="op">,</span> <span class="nam">tenant_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln">                            <span class="nam">keystone_version</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">    <span class="key">return</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm run hide_run"><span class="key">def</span> <span class="nam">check_permissions</span><span class="op">(</span><span class="nam">app_conf</span><span class="op">,</span> <span class="nam">token_to_validate</span><span class="op">,</span> <span class="nam">lcp_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">    <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Check permissions...start"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">    <span class="nam">token_role</span> <span class="op">=</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">token_role</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm run hide_run">        <span class="key">if</span> <span class="nam">_is_authorization_enabled</span><span class="op">(</span><span class="nam">app_conf</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="stm par run hide_run"><span class="annotate short">41&#x202F;&#x219B;&#x202F;48</span><span class="annotate long">line 41 didn't jump to line 48, because the condition on line 41 was never false</span>            <span class="key">if</span> <span class="nam">token_to_validate</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span> <span class="key">and</span> <span class="nam">lcp_id</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span> <span class="key">and</span> <span class="nam">str</span><span class="op">(</span><span class="nam">token_to_validate</span><span class="op">)</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span> <span class="op">!=</span> <span class="str">''</span> <span class="key">and</span> <span class="nam">str</span><span class="op">(</span><span class="nam">lcp_id</span><span class="op">)</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span> <span class="op">!=</span> <span class="str">''</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="stm run hide_run">                <span class="nam">token_conf</span> <span class="op">=</span> <span class="nam">_get_token_conf</span><span class="op">(</span><span class="nam">app_conf</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm run hide_run">                <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Authorization: validating token=[{}] on lcp_id=[{}]"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">token_to_validate</span><span class="op">,</span> <span class="nam">lcp_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm run hide_run">                <span class="nam">is_permitted</span> <span class="op">=</span> <span class="nam">tokens</span><span class="op">.</span><span class="nam">is_token_valid</span><span class="op">(</span><span class="nam">token_to_validate</span><span class="op">,</span> <span class="nam">lcp_id</span><span class="op">,</span> <span class="nam">token_conf</span><span class="op">,</span> <span class="nam">token_role</span><span class="op">,</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">role_location</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">                <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Authorization: The token=[{}] on lcp_id=[{}] is [{}]"</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln">                             <span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">token_to_validate</span><span class="op">,</span> <span class="nam">lcp_id</span><span class="op">,</span> <span class="str">"valid"</span> <span class="key">if</span> <span class="nam">is_permitted</span> <span class="key">else</span> <span class="str">"invalid"</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln">            <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm mis">                <span class="key">raise</span> <span class="nam">Exception</span><span class="op">(</span><span class="str">"Token=[{}] and/or Region=[{}] are empty/none."</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">token_to_validate</span><span class="op">,</span> <span class="nam">lcp_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"The authentication service is disabled. No authentication is needed."</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm run hide_run">            <span class="nam">is_permitted</span> <span class="op">=</span> <span class="nam">True</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">        <span class="nam">msg</span> <span class="op">=</span> <span class="str">"Fail to validate request. due to {}."</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">msg</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">e</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">        <span class="nam">is_permitted</span> <span class="op">=</span> <span class="nam">False</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">    <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Check permissions...end"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm run hide_run">    <span class="key">return</span> <span class="nam">is_permitted</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-11 03:14
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/coverage_html.js b/orm/services/customer_manager/htmlcov/coverage_html.js
new file mode 100644
index 00000000..f6f5de20
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/coverage_html.js
@@ -0,0 +1,584 @@
+// Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
+// For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt
+
+// Coverage.py HTML report browser code.
+/*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */
+/*global coverage: true, document, window, $ */
+
+coverage = {};
+
+// Find all the elements with shortkey_* class, and use them to assign a shortcut key.
+coverage.assign_shortkeys = function () {
+    $("*[class*='shortkey_']").each(function (i, e) {
+        $.each($(e).attr("class").split(" "), function (i, c) {
+            if (/^shortkey_/.test(c)) {
+                $(document).bind('keydown', c.substr(9), function () {
+                    $(e).click();
+                });
+            }
+        });
+    });
+};
+
+// Create the events for the help panel.
+coverage.wire_up_help_panel = function () {
+    $("#keyboard_icon").click(function () {
+        // Show the help panel, and position it so the keyboard icon in the
+        // panel is in the same place as the keyboard icon in the header.
+        $(".help_panel").show();
+        var koff = $("#keyboard_icon").offset();
+        var poff = $("#panel_icon").position();
+        $(".help_panel").offset({
+            top: koff.top-poff.top,
+            left: koff.left-poff.left
+        });
+    });
+    $("#panel_icon").click(function () {
+        $(".help_panel").hide();
+    });
+};
+
+// Create the events for the filter box.
+coverage.wire_up_filter = function () {
+    // Cache elements.
+    var table = $("table.index");
+    var table_rows = table.find("tbody tr");
+    var table_row_names = table_rows.find("td.name a");
+    var no_rows = $("#no_rows");
+
+    // Create a duplicate table footer that we can modify with dynamic summed values.
+    var table_footer = $("table.index tfoot tr");
+    var table_dynamic_footer = table_footer.clone();
+    table_dynamic_footer.attr('class', 'total_dynamic hidden');
+    table_footer.after(table_dynamic_footer);
+
+    // Observe filter keyevents.
+    $("#filter").on("keyup change", $.debounce(150, function (event) {
+        var filter_value = $(this).val();
+
+        if (filter_value === "") {
+            // Filter box is empty, remove all filtering.
+            table_rows.removeClass("hidden");
+
+            // Show standard footer, hide dynamic footer.
+            table_footer.removeClass("hidden");
+            table_dynamic_footer.addClass("hidden");
+
+            // Hide placeholder, show table.
+            if (no_rows.length > 0) {
+                no_rows.hide();
+            }
+            table.show();
+
+        }
+        else {
+            // Filter table items by value.
+            var hidden = 0;
+            var shown = 0;
+
+            // Hide / show elements.
+            $.each(table_row_names, function () {
+                var element = $(this).parents("tr");
+
+                if ($(this).text().indexOf(filter_value) === -1) {
+                    // hide
+                    element.addClass("hidden");
+                    hidden++;
+                }
+                else {
+                    // show
+                    element.removeClass("hidden");
+                    shown++;
+                }
+            });
+
+            // Show placeholder if no rows will be displayed.
+            if (no_rows.length > 0) {
+                if (shown === 0) {
+                    // Show placeholder, hide table.
+                    no_rows.show();
+                    table.hide();
+                }
+                else {
+                    // Hide placeholder, show table.
+                    no_rows.hide();
+                    table.show();
+                }
+            }
+
+            // Manage dynamic header:
+            if (hidden > 0) {
+                // Calculate new dynamic sum values based on visible rows.
+                for (var column = 2; column < 20; column++) {
+                    // Calculate summed value.
+                    var cells = table_rows.find('td:nth-child(' + column + ')');
+                    if (!cells.length) {
+                        // No more columns...!
+                        break;
+                    }
+
+                    var sum = 0, numer = 0, denom = 0;
+                    $.each(cells.filter(':visible'), function () {
+                        var ratio = $(this).data("ratio");
+                        if (ratio) {
+                            var splitted = ratio.split(" ");
+                            numer += parseInt(splitted[0], 10);
+                            denom += parseInt(splitted[1], 10);
+                        }
+                        else {
+                            sum += parseInt(this.innerHTML, 10);
+                        }
+                    });
+
+                    // Get footer cell element.
+                    var footer_cell = table_dynamic_footer.find('td:nth-child(' + column + ')');
+
+                    // Set value into dynamic footer cell element.
+                    if (cells[0].innerHTML.indexOf('%') > -1) {
+                        // Percentage columns use the numerator and denominator,
+                        // and adapt to the number of decimal places.
+                        var match = /\.([0-9]+)/.exec(cells[0].innerHTML);
+                        var places = 0;
+                        if (match) {
+                            places = match[1].length;
+                        }
+                        var pct = numer * 100 / denom;
+                        footer_cell.text(pct.toFixed(places) + '%');
+                    }
+                    else {
+                        footer_cell.text(sum);
+                    }
+                }
+
+                // Hide standard footer, show dynamic footer.
+                table_footer.addClass("hidden");
+                table_dynamic_footer.removeClass("hidden");
+            }
+            else {
+                // Show standard footer, hide dynamic footer.
+                table_footer.removeClass("hidden");
+                table_dynamic_footer.addClass("hidden");
+            }
+        }
+    }));
+
+    // Trigger change event on setup, to force filter on page refresh
+    // (filter value may still be present).
+    $("#filter").trigger("change");
+};
+
+// Loaded on index.html
+coverage.index_ready = function ($) {
+    // Look for a cookie containing previous sort settings:
+    var sort_list = [];
+    var cookie_name = "COVERAGE_INDEX_SORT";
+    var i;
+
+    // This almost makes it worth installing the jQuery cookie plugin:
+    if (document.cookie.indexOf(cookie_name) > -1) {
+        var cookies = document.cookie.split(";");
+        for (i = 0; i < cookies.length; i++) {
+            var parts = cookies[i].split("=");
+
+            if ($.trim(parts[0]) === cookie_name && parts[1]) {
+                sort_list = eval("[[" + parts[1] + "]]");
+                break;
+            }
+        }
+    }
+
+    // Create a new widget which exists only to save and restore
+    // the sort order:
+    $.tablesorter.addWidget({
+        id: "persistentSort",
+
+        // Format is called by the widget before displaying:
+        format: function (table) {
+            if (table.config.sortList.length === 0 && sort_list.length > 0) {
+                // This table hasn't been sorted before - we'll use
+                // our stored settings:
+                $(table).trigger('sorton', [sort_list]);
+            }
+            else {
+                // This is not the first load - something has
+                // already defined sorting so we'll just update
+                // our stored value to match:
+                sort_list = table.config.sortList;
+            }
+        }
+    });
+
+    // Configure our tablesorter to handle the variable number of
+    // columns produced depending on report options:
+    var headers = [];
+    var col_count = $("table.index > thead > tr > th").length;
+
+    headers[0] = { sorter: 'text' };
+    for (i = 1; i < col_count-1; i++) {
+        headers[i] = { sorter: 'digit' };
+    }
+    headers[col_count-1] = { sorter: 'percent' };
+
+    // Enable the table sorter:
+    $("table.index").tablesorter({
+        widgets: ['persistentSort'],
+        headers: headers
+    });
+
+    coverage.assign_shortkeys();
+    coverage.wire_up_help_panel();
+    coverage.wire_up_filter();
+
+    // Watch for page unload events so we can save the final sort settings:
+    $(window).unload(function () {
+        document.cookie = cookie_name + "=" + sort_list.toString() + "; path=/";
+    });
+};
+
+// -- pyfile stuff --
+
+coverage.pyfile_ready = function ($) {
+    // If we're directed to a particular line number, highlight the line.
+    var frag = location.hash;
+    if (frag.length > 2 && frag[1] === 'n') {
+        $(frag).addClass('highlight');
+        coverage.set_sel(parseInt(frag.substr(2), 10));
+    }
+    else {
+        coverage.set_sel(0);
+    }
+
+    $(document)
+        .bind('keydown', 'j', coverage.to_next_chunk_nicely)
+        .bind('keydown', 'k', coverage.to_prev_chunk_nicely)
+        .bind('keydown', '0', coverage.to_top)
+        .bind('keydown', '1', coverage.to_first_chunk)
+        ;
+
+    $(".button_toggle_run").click(function (evt) {coverage.toggle_lines(evt.target, "run");});
+    $(".button_toggle_exc").click(function (evt) {coverage.toggle_lines(evt.target, "exc");});
+    $(".button_toggle_mis").click(function (evt) {coverage.toggle_lines(evt.target, "mis");});
+    $(".button_toggle_par").click(function (evt) {coverage.toggle_lines(evt.target, "par");});
+
+    coverage.assign_shortkeys();
+    coverage.wire_up_help_panel();
+
+    coverage.init_scroll_markers();
+
+    // Rebuild scroll markers after window high changing
+    $(window).resize(coverage.resize_scroll_markers);
+};
+
+coverage.toggle_lines = function (btn, cls) {
+    btn = $(btn);
+    var hide = "hide_"+cls;
+    if (btn.hasClass(hide)) {
+        $("#source ."+cls).removeClass(hide);
+        btn.removeClass(hide);
+    }
+    else {
+        $("#source ."+cls).addClass(hide);
+        btn.addClass(hide);
+    }
+};
+
+// Return the nth line div.
+coverage.line_elt = function (n) {
+    return $("#t" + n);
+};
+
+// Return the nth line number div.
+coverage.num_elt = function (n) {
+    return $("#n" + n);
+};
+
+// Return the container of all the code.
+coverage.code_container = function () {
+    return $(".linenos");
+};
+
+// Set the selection.  b and e are line numbers.
+coverage.set_sel = function (b, e) {
+    // The first line selected.
+    coverage.sel_begin = b;
+    // The next line not selected.
+    coverage.sel_end = (e === undefined) ? b+1 : e;
+};
+
+coverage.to_top = function () {
+    coverage.set_sel(0, 1);
+    coverage.scroll_window(0);
+};
+
+coverage.to_first_chunk = function () {
+    coverage.set_sel(0, 1);
+    coverage.to_next_chunk();
+};
+
+coverage.is_transparent = function (color) {
+    // Different browsers return different colors for "none".
+    return color === "transparent" || color === "rgba(0, 0, 0, 0)";
+};
+
+coverage.to_next_chunk = function () {
+    var c = coverage;
+
+    // Find the start of the next colored chunk.
+    var probe = c.sel_end;
+    var color, probe_line;
+    while (true) {
+        probe_line = c.line_elt(probe);
+        if (probe_line.length === 0) {
+            return;
+        }
+        color = probe_line.css("background-color");
+        if (!c.is_transparent(color)) {
+            break;
+        }
+        probe++;
+    }
+
+    // There's a next chunk, `probe` points to it.
+    var begin = probe;
+
+    // Find the end of this chunk.
+    var next_color = color;
+    while (next_color === color) {
+        probe++;
+        probe_line = c.line_elt(probe);
+        next_color = probe_line.css("background-color");
+    }
+    c.set_sel(begin, probe);
+    c.show_selection();
+};
+
+coverage.to_prev_chunk = function () {
+    var c = coverage;
+
+    // Find the end of the prev colored chunk.
+    var probe = c.sel_begin-1;
+    var probe_line = c.line_elt(probe);
+    if (probe_line.length === 0) {
+        return;
+    }
+    var color = probe_line.css("background-color");
+    while (probe > 0 && c.is_transparent(color)) {
+        probe--;
+        probe_line = c.line_elt(probe);
+        if (probe_line.length === 0) {
+            return;
+        }
+        color = probe_line.css("background-color");
+    }
+
+    // There's a prev chunk, `probe` points to its last line.
+    var end = probe+1;
+
+    // Find the beginning of this chunk.
+    var prev_color = color;
+    while (prev_color === color) {
+        probe--;
+        probe_line = c.line_elt(probe);
+        prev_color = probe_line.css("background-color");
+    }
+    c.set_sel(probe+1, end);
+    c.show_selection();
+};
+
+// Return the line number of the line nearest pixel position pos
+coverage.line_at_pos = function (pos) {
+    var l1 = coverage.line_elt(1),
+        l2 = coverage.line_elt(2),
+        result;
+    if (l1.length && l2.length) {
+        var l1_top = l1.offset().top,
+            line_height = l2.offset().top - l1_top,
+            nlines = (pos - l1_top) / line_height;
+        if (nlines < 1) {
+            result = 1;
+        }
+        else {
+            result = Math.ceil(nlines);
+        }
+    }
+    else {
+        result = 1;
+    }
+    return result;
+};
+
+// Returns 0, 1, or 2: how many of the two ends of the selection are on
+// the screen right now?
+coverage.selection_ends_on_screen = function () {
+    if (coverage.sel_begin === 0) {
+        return 0;
+    }
+
+    var top = coverage.line_elt(coverage.sel_begin);
+    var next = coverage.line_elt(coverage.sel_end-1);
+
+    return (
+        (top.isOnScreen() ? 1 : 0) +
+        (next.isOnScreen() ? 1 : 0)
+    );
+};
+
+coverage.to_next_chunk_nicely = function () {
+    coverage.finish_scrolling();
+    if (coverage.selection_ends_on_screen() === 0) {
+        // The selection is entirely off the screen: select the top line on
+        // the screen.
+        var win = $(window);
+        coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop()));
+    }
+    coverage.to_next_chunk();
+};
+
+coverage.to_prev_chunk_nicely = function () {
+    coverage.finish_scrolling();
+    if (coverage.selection_ends_on_screen() === 0) {
+        var win = $(window);
+        coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop() + win.height()));
+    }
+    coverage.to_prev_chunk();
+};
+
+// Select line number lineno, or if it is in a colored chunk, select the
+// entire chunk
+coverage.select_line_or_chunk = function (lineno) {
+    var c = coverage;
+    var probe_line = c.line_elt(lineno);
+    if (probe_line.length === 0) {
+        return;
+    }
+    var the_color = probe_line.css("background-color");
+    if (!c.is_transparent(the_color)) {
+        // The line is in a highlighted chunk.
+        // Search backward for the first line.
+        var probe = lineno;
+        var color = the_color;
+        while (probe > 0 && color === the_color) {
+            probe--;
+            probe_line = c.line_elt(probe);
+            if (probe_line.length === 0) {
+                break;
+            }
+            color = probe_line.css("background-color");
+        }
+        var begin = probe + 1;
+
+        // Search forward for the last line.
+        probe = lineno;
+        color = the_color;
+        while (color === the_color) {
+            probe++;
+            probe_line = c.line_elt(probe);
+            color = probe_line.css("background-color");
+        }
+
+        coverage.set_sel(begin, probe);
+    }
+    else {
+        coverage.set_sel(lineno);
+    }
+};
+
+coverage.show_selection = function () {
+    var c = coverage;
+
+    // Highlight the lines in the chunk
+    c.code_container().find(".highlight").removeClass("highlight");
+    for (var probe = c.sel_begin; probe > 0 && probe < c.sel_end; probe++) {
+        c.num_elt(probe).addClass("highlight");
+    }
+
+    c.scroll_to_selection();
+};
+
+coverage.scroll_to_selection = function () {
+    // Scroll the page if the chunk isn't fully visible.
+    if (coverage.selection_ends_on_screen() < 2) {
+        // Need to move the page. The html,body trick makes it scroll in all
+        // browsers, got it from http://stackoverflow.com/questions/3042651
+        var top = coverage.line_elt(coverage.sel_begin);
+        var top_pos = parseInt(top.offset().top, 10);
+        coverage.scroll_window(top_pos - 30);
+    }
+};
+
+coverage.scroll_window = function (to_pos) {
+    $("html,body").animate({scrollTop: to_pos}, 200);
+};
+
+coverage.finish_scrolling = function () {
+    $("html,body").stop(true, true);
+};
+
+coverage.init_scroll_markers = function () {
+    var c = coverage;
+    // Init some variables
+    c.lines_len = $('td.text p').length;
+    c.body_h = $('body').height();
+    c.header_h = $('div#header').height();
+    c.missed_lines = $('td.text p.mis, td.text p.par');
+
+    // Build html
+    c.resize_scroll_markers();
+};
+
+coverage.resize_scroll_markers = function () {
+    var c = coverage,
+        min_line_height = 3,
+        max_line_height = 10,
+        visible_window_h = $(window).height();
+
+    $('#scroll_marker').remove();
+    // Don't build markers if the window has no scroll bar.
+    if (c.body_h <= visible_window_h) {
+        return;
+    }
+
+    $("body").append("<div id='scroll_marker'>&nbsp;</div>");
+    var scroll_marker = $('#scroll_marker'),
+        marker_scale = scroll_marker.height() / c.body_h,
+        line_height = scroll_marker.height() / c.lines_len;
+
+    // Line height must be between the extremes.
+    if (line_height > min_line_height) {
+        if (line_height > max_line_height) {
+            line_height = max_line_height;
+        }
+    }
+    else {
+        line_height = min_line_height;
+    }
+
+    var previous_line = -99,
+        last_mark,
+        last_top;
+
+    c.missed_lines.each(function () {
+        var line_top = Math.round($(this).offset().top * marker_scale),
+            id_name = $(this).attr('id'),
+            line_number = parseInt(id_name.substring(1, id_name.length));
+
+        if (line_number === previous_line + 1) {
+            // If this solid missed block just make previous mark higher.
+            last_mark.css({
+                'height': line_top + line_height - last_top
+            });
+        }
+        else {
+            // Add colored line in scroll_marker block.
+            scroll_marker.append('<div id="m' + line_number + '" class="marker"></div>');
+            last_mark = $('#m' + line_number);
+            last_mark.css({
+                'height': line_height,
+                'top': line_top
+            });
+            last_top = line_top;
+        }
+
+        previous_line = line_number;
+    });
+};
diff --git a/orm/services/customer_manager/htmlcov/index.html b/orm/services/customer_manager/htmlcov/index.html
new file mode 100644
index 00000000..db1c2411
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/index.html
@@ -0,0 +1,440 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Coverage report</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.ba-throttle-debounce.min.js"></script>
+    <script type="text/javascript" src="jquery.tablesorter.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.index_ready);
+    </script>
+</head>
+<body class="indexfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage report:
+            <span class="pc_cov">82%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <form id="filter_container">
+            <input id="filter" type="text" value="" placeholder="filter..." />
+        </form>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">n</span>
+        <span class="key">s</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        
+        <span class="key">b</span>
+        <span class="key">p</span>
+        
+        <span class="key">c</span> &nbsp; change column sorting
+    </p>
+    </div>
+</div>
+
+<div id="index">
+    <table class="index">
+        <thead>
+            
+            <tr class="tablehead" title="Click to sort">
+                <th class="name left headerSortDown shortkey_n">Module</th>
+                <th class="shortkey_s">statements</th>
+                <th class="shortkey_m">missing</th>
+                <th class="shortkey_x">excluded</th>
+                
+                <th class="shortkey_b">branches</th>
+                <th class="shortkey_p">partial</th>
+                
+                <th class="right shortkey_c">coverage</th>
+            </tr>
+        </thead>
+        
+        <tfoot>
+            <tr class="total">
+                <td class="name left">Total</td>
+                <td>1417</td>
+                <td>203</td>
+                <td>0</td>
+                
+                <td>312</td>
+                <td>55</td>
+                
+                <td class="right" data-ratio="1419 1729">82%</td>
+            </tr>
+        </tfoot>
+        <tbody>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest___init___py.html">cms_rest/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_app_py.html">cms_rest/app.py</a></td>
+                <td>22</td>
+                <td>3</td>
+                <td>0</td>
+                
+                <td>2</td>
+                <td>1</td>
+                
+                <td class="right" data-ratio="20 24">83%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_controllers___init___py.html">cms_rest/controllers/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_controllers_root_py.html">cms_rest/controllers/root.py</a></td>
+                <td>10</td>
+                <td>1</td>
+                <td>0</td>
+                
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="9 10">90%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_controllers_v1___init___py.html">cms_rest/controllers/v1/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_controllers_v1_base_py.html">cms_rest/controllers/v1/base.py</a></td>
+                <td>16</td>
+                <td>4</td>
+                <td>0</td>
+                
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="12 16">75%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_controllers_v1_orm___init___py.html">cms_rest/controllers/v1/orm/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_controllers_v1_orm_configuration_py.html">cms_rest/controllers/v1/orm/configuration.py</a></td>
+                <td>14</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="14 14">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_controllers_v1_orm_customer___init___py.html">cms_rest/controllers/v1/orm/customer/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_controllers_v1_orm_customer_enabled_py.html">cms_rest/controllers/v1/orm/customer/enabled.py</a></td>
+                <td>33</td>
+                <td>3</td>
+                <td>0</td>
+                
+                <td>2</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="32 35">91%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_controllers_v1_orm_customer_metadata_py.html">cms_rest/controllers/v1/orm/customer/metadata.py</a></td>
+                <td>52</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td>16</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="68 68">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_controllers_v1_orm_customer_regions_py.html">cms_rest/controllers/v1/orm/customer/regions.py</a></td>
+                <td>75</td>
+                <td>3</td>
+                <td>0</td>
+                
+                <td>12</td>
+                <td>2</td>
+                
+                <td class="right" data-ratio="82 87">94%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_controllers_v1_orm_customer_root_py.html">cms_rest/controllers/v1/orm/customer/root.py</a></td>
+                <td>111</td>
+                <td>3</td>
+                <td>0</td>
+                
+                <td>14</td>
+                <td>1</td>
+                
+                <td class="right" data-ratio="121 125">97%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_controllers_v1_orm_customer_users_py.html">cms_rest/controllers/v1/orm/customer/users.py</a></td>
+                <td>138</td>
+                <td>15</td>
+                <td>0</td>
+                
+                <td>30</td>
+                <td>9</td>
+                
+                <td class="right" data-ratio="144 168">86%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_controllers_v1_orm_logs_py.html">cms_rest/controllers/v1/orm/logs.py</a></td>
+                <td>33</td>
+                <td>20</td>
+                <td>0</td>
+                
+                <td>4</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="13 37">35%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_controllers_v1_orm_root_py.html">cms_rest/controllers/v1/orm/root.py</a></td>
+                <td>8</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="8 8">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_controllers_v1_root_py.html">cms_rest/controllers/v1/root.py</a></td>
+                <td>4</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="4 4">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_logger___init___py.html">cms_rest/logger/__init__.py</a></td>
+                <td>6</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td>2</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="8 8">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_logic___init___py.html">cms_rest/logic/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_logic_customer_logic_py.html">cms_rest/logic/customer_logic.py</a></td>
+                <td>466</td>
+                <td>64</td>
+                <td>0</td>
+                
+                <td>162</td>
+                <td>34</td>
+                
+                <td class="right" data-ratio="508 628">81%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_logic_error_base_py.html">cms_rest/logic/error_base.py</a></td>
+                <td>14</td>
+                <td>2</td>
+                <td>0</td>
+                
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="12 14">86%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_logic_metadata_logic_py.html">cms_rest/logic/metadata_logic.py</a></td>
+                <td>74</td>
+                <td>60</td>
+                <td>0</td>
+                
+                <td>20</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="14 94">15%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_model_Model_py.html">cms_rest/model/Model.py</a></td>
+                <td>7</td>
+                <td>1</td>
+                <td>0</td>
+                
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="6 7">86%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_model_Models_py.html">cms_rest/model/Models.py</a></td>
+                <td>241</td>
+                <td>5</td>
+                <td>0</td>
+                
+                <td>32</td>
+                <td>6</td>
+                
+                <td class="right" data-ratio="260 273">95%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_model___init___py.html">cms_rest/model/__init__.py</a></td>
+                <td>3</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="3 3">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_rds_proxy_py.html">cms_rest/rds_proxy.py</a></td>
+                <td>47</td>
+                <td>12</td>
+                <td>0</td>
+                
+                <td>8</td>
+                <td>1</td>
+                
+                <td class="right" data-ratio="42 55">76%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_utils___init___py.html">cms_rest/utils/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="cms_rest_utils_authentication_py.html">cms_rest/utils/authentication.py</a></td>
+                <td>43</td>
+                <td>7</td>
+                <td>0</td>
+                
+                <td>8</td>
+                <td>1</td>
+                
+                <td class="right" data-ratio="39 51">76%</td>
+            </tr>
+            
+        </tbody>
+    </table>
+
+    <p id="no_rows">
+        No items found using the specified filter.
+    </p>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.4</a>,
+            created at 2017-05-12 00:04
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/customer_manager/htmlcov/jquery.ba-throttle-debounce.min.js b/orm/services/customer_manager/htmlcov/jquery.ba-throttle-debounce.min.js
new file mode 100644
index 00000000..648fe5d3
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/jquery.ba-throttle-debounce.min.js
@@ -0,0 +1,9 @@
+/*
+ * jQuery throttle / debounce - v1.1 - 3/7/2010
+ * http://benalman.com/projects/jquery-throttle-debounce-plugin/
+ *
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function(b,c){var $=b.jQuery||b.Cowboy||(b.Cowboy={}),a;$.throttle=a=function(e,f,j,i){var h,d=0;if(typeof f!=="boolean"){i=j;j=f;f=c}function g(){var o=this,m=+new Date()-d,n=arguments;function l(){d=+new Date();j.apply(o,n)}function k(){h=c}if(i&&!h){l()}h&&clearTimeout(h);if(i===c&&m>e){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this);
diff --git a/orm/services/customer_manager/htmlcov/jquery.hotkeys.js b/orm/services/customer_manager/htmlcov/jquery.hotkeys.js
new file mode 100644
index 00000000..73c552fc
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/jquery.hotkeys.js
@@ -0,0 +1,100 @@
+/*
+ * jQuery Hotkeys Plugin
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ * Based upon the plugin by Tzury Bar Yochay:
+ * http://github.com/tzuryby/hotkeys
+ *
+ * Original idea by:
+ * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
+*/
+
+(function(jQuery){
+	
+	jQuery.hotkeys = {
+		version: "0.8",
+
+		specialKeys: {
+			8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause",
+			20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home",
+			37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del", 
+			96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7",
+			104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/", 
+			112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8", 
+			120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 188: ",", 190: ".",
+			191: "/", 224: "meta"
+ 		},
+	
+		shiftNums: {
+			"`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&", 
+			"8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<", 
+			".": ">",  "/": "?",  "\\": "|"
+		}
+	};
+
+	function keyHandler( handleObj ) {
+		// Only care when a possible input has been specified
+		if ( typeof handleObj.data !== "string" ) {
+			return;
+		}
+		
+		var origHandler = handleObj.handler,
+			keys = handleObj.data.toLowerCase().split(" ");
+	
+		handleObj.handler = function( event ) {
+			// Don't fire in text-accepting inputs that we didn't directly bind to
+			if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) ||
+				 event.target.type === "text" || $(event.target).prop('contenteditable') == 'true' )) {
+				return;
+			}
+			
+			// Keypress represents characters, not special keys
+			var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ],
+				character = String.fromCharCode( event.which ).toLowerCase(),
+				key, modif = "", possible = {};
+
+			// check combinations (alt|ctrl|shift+anything)
+			if ( event.altKey && special !== "alt" ) {
+				modif += "alt+";
+			}
+
+			if ( event.ctrlKey && special !== "ctrl" ) {
+				modif += "ctrl+";
+			}
+			
+			// TODO: Need to make sure this works consistently across platforms
+			if ( event.metaKey && !event.ctrlKey && special !== "meta" ) {
+				modif += "meta+";
+			}
+
+			if ( event.shiftKey && special !== "shift" ) {
+				modif += "shift+";
+			}
+
+			if ( special ) {
+				possible[ modif + special ] = true;
+
+			} else {
+				possible[ modif + character ] = true;
+				possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true;
+
+				// "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
+				if ( modif === "shift+" ) {
+					possible[ jQuery.hotkeys.shiftNums[ character ] ] = true;
+				}
+			}
+
+			for ( var i = 0, l = keys.length; i < l; i++ ) {
+				if ( possible[ keys[i] ] ) {
+					return origHandler.apply( this, arguments );
+				}
+			}
+		};
+	}
+
+	jQuery.each([ "keydown", "keyup", "keypress" ], function() {
+		jQuery.event.special[ this ] = { add: keyHandler };
+	});
+
+})( jQuery );
diff --git a/orm/services/customer_manager/htmlcov/jquery.isonscreen.js b/orm/services/customer_manager/htmlcov/jquery.isonscreen.js
new file mode 100644
index 00000000..0182ebd2
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/jquery.isonscreen.js
@@ -0,0 +1,53 @@
+/* Copyright (c) 2010
+ * @author Laurence Wheway
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
+ * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
+ *
+ * @version 1.2.0
+ */
+(function($) {
+	jQuery.extend({
+		isOnScreen: function(box, container) {
+			//ensure numbers come in as intgers (not strings) and remove 'px' is it's there
+			for(var i in box){box[i] = parseFloat(box[i])};
+			for(var i in container){container[i] = parseFloat(container[i])};
+
+			if(!container){
+				container = {
+					left: $(window).scrollLeft(),
+					top: $(window).scrollTop(),
+					width: $(window).width(),
+					height: $(window).height()
+				}
+			}
+
+			if(	box.left+box.width-container.left > 0 &&
+				box.left < container.width+container.left &&
+				box.top+box.height-container.top > 0 &&
+				box.top < container.height+container.top
+			) return true;
+			return false;
+		}
+	})
+
+
+	jQuery.fn.isOnScreen = function (container) {
+		for(var i in container){container[i] = parseFloat(container[i])};
+
+		if(!container){
+			container = {
+				left: $(window).scrollLeft(),
+				top: $(window).scrollTop(),
+				width: $(window).width(),
+				height: $(window).height()
+			}
+		}
+
+		if(	$(this).offset().left+$(this).width()-container.left > 0 &&
+			$(this).offset().left < container.width+container.left &&
+			$(this).offset().top+$(this).height()-container.top > 0 &&
+			$(this).offset().top < container.height+container.top
+		) return true;
+		return false;
+	}
+})(jQuery);
diff --git a/orm/services/customer_manager/htmlcov/jquery.min.js b/orm/services/customer_manager/htmlcov/jquery.min.js
new file mode 100644
index 00000000..e2efc335
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/jquery.min.js
@@ -0,0 +1,9404 @@
+/*!
+ * jQuery JavaScript Library v1.7.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Fri Jul  5 14:07:58 UTC 2013
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+	navigator = window.navigator,
+	location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// A simple way to check for HTML strings or ID strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Check if a string has a non-whitespace character in it
+	rnotwhite = /\S/,
+
+	// Used for trimming whitespace
+	trimLeft = /^\s+/,
+	trimRight = /\s+$/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+	// Useragent RegExp
+	rwebkit = /(webkit)[ \/]([\w.]+)/,
+	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+	rmsie = /(msie) ([\w.]+)/,
+	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+	// Matches dashed string for camelizing
+	rdashAlpha = /-([a-z]|[0-9])/ig,
+	rmsPrefix = /^-ms-/,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// Keep a UserAgent string for use with jQuery.browser
+	userAgent = navigator.userAgent,
+
+	// For matching the engine and version of the browser
+	browserMatch,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// The ready event handler
+	DOMContentLoaded,
+
+	// Save a reference to some core methods
+	toString = Object.prototype.toString,
+	hasOwn = Object.prototype.hasOwnProperty,
+	push = Array.prototype.push,
+	slice = Array.prototype.slice,
+	trim = String.prototype.trim,
+	indexOf = Array.prototype.indexOf,
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), or $(undefined)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// The body element only exists once, optimize finding it
+		if ( selector === "body" && !context && document.body ) {
+			this.context = document;
+			this[0] = document.body;
+			this.selector = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = quickExpr.exec( selector );
+			}
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = ( context ? context.ownerDocument || context : document );
+
+					// If a single string is passed in and it's a single tag
+					// just do a createElement and skip the rest
+					ret = rsingleTag.exec( selector );
+
+					if ( ret ) {
+						if ( jQuery.isPlainObject( context ) ) {
+							selector = [ document.createElement( ret[1] ) ];
+							jQuery.fn.attr.call( selector, context, true );
+
+						} else {
+							selector = [ doc.createElement( ret[1] ) ];
+						}
+
+					} else {
+						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+						selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
+					}
+
+					return jQuery.merge( this, selector );
+
+				// HANDLE: $("#id")
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || rootjQuery ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if ( selector.selector !== undefined ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.7.2",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return slice.call( this, 0 );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = this.constructor();
+
+		if ( jQuery.isArray( elems ) ) {
+			push.apply( ret, elems );
+
+		} else {
+			jQuery.merge( ret, elems );
+		}
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Attach the listeners
+		jQuery.bindReady();
+
+		// Add the callback
+		readyList.add( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		i = +i;
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ),
+			"slice", slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+		// Either a released hold or an DOMready/load event and not yet ready
+		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+			if ( !document.body ) {
+				return setTimeout( jQuery.ready, 1 );
+			}
+
+			// Remember that the DOM is ready
+			jQuery.isReady = true;
+
+			// If a normal DOM Ready event fired, decrement, and wait if need be
+			if ( wait !== true && --jQuery.readyWait > 0 ) {
+				return;
+			}
+
+			// If there are functions bound, to execute
+			readyList.fireWith( document, [ jQuery ] );
+
+			// Trigger any bound ready events
+			if ( jQuery.fn.trigger ) {
+				jQuery( document ).trigger( "ready" ).off( "ready" );
+			}
+		}
+	},
+
+	bindReady: function() {
+		if ( readyList ) {
+			return;
+		}
+
+		readyList = jQuery.Callbacks( "once memory" );
+
+		// Catch cases where $(document).ready() is called after the
+		// browser event has already occurred.
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Mozilla, Opera and webkit nightlies currently support this event
+		if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else if ( document.attachEvent ) {
+			// ensure firing before onload,
+			// maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var toplevel = false;
+
+			try {
+				toplevel = window.frameElement == null;
+			} catch(e) {}
+
+			if ( document.documentElement.doScroll && toplevel ) {
+				doScrollCheck();
+			}
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	isWindow: function( obj ) {
+		return obj != null && obj == obj.window;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!hasOwn.call(obj, "constructor") &&
+				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		for ( var name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	parseJSON: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+			.replace( rvalidtokens, "]" )
+			.replace( rvalidbraces, "")) ) {
+
+			return ( new Function( "return " + data ) )();
+
+		}
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+		var xml, tmp;
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && rnotwhite.test( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0,
+			length = object.length,
+			isObj = length === undefined || jQuery.isFunction( object );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.apply( object[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( object[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return object;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: trim ?
+		function( text ) {
+			return text == null ?
+				"" :
+				trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( array, results ) {
+		var ret = results || [];
+
+		if ( array != null ) {
+			// The window, strings (and functions) also have 'length'
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			var type = jQuery.type( array );
+
+			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+				push.call( ret, array );
+			} else {
+				jQuery.merge( ret, array );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array, i ) {
+		var len;
+
+		if ( array ) {
+			if ( indexOf ) {
+				return indexOf.call( array, elem, i );
+			}
+
+			len = array.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in array && array[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var i = first.length,
+			j = 0;
+
+		if ( typeof second.length === "number" ) {
+			for ( var l = second.length; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var ret = [], retVal;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value, key, ret = [],
+			i = 0,
+			length = elems.length,
+			// jquery objects are treated as arrays
+			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( key in elems ) {
+				value = callback( elems[ key ], key, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		if ( typeof context === "string" ) {
+			var tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		var args = slice.call( arguments, 2 ),
+			proxy = function() {
+				return fn.apply( context, args.concat( slice.call( arguments ) ) );
+			};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Mutifunctional method to get and set values to a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
+		var exec,
+			bulk = key == null,
+			i = 0,
+			length = elems.length;
+
+		// Sets many values
+		if ( key && typeof key === "object" ) {
+			for ( i in key ) {
+				jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
+			}
+			chainable = 1;
+
+		// Sets one value
+		} else if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = pass === undefined && jQuery.isFunction( value );
+
+			if ( bulk ) {
+				// Bulk operations only iterate when executing function values
+				if ( exec ) {
+					exec = fn;
+					fn = function( elem, key, value ) {
+						return exec.call( jQuery( elem ), value );
+					};
+
+				// Otherwise they run against the entire set
+				} else {
+					fn.call( elems, value );
+					fn = null;
+				}
+			}
+
+			if ( fn ) {
+				for (; i < length; i++ ) {
+					fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+				}
+			}
+
+			chainable = 1;
+		}
+
+		return chainable ?
+			elems :
+
+			// Gets
+			bulk ?
+				fn.call( elems ) :
+				length ? fn( elems[0], key ) : emptyGet;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	},
+
+	// Use of jQuery.browser is frowned upon.
+	// More details: http://docs.jquery.com/Utilities/jQuery.browser
+	uaMatch: function( ua ) {
+		ua = ua.toLowerCase();
+
+		var match = rwebkit.exec( ua ) ||
+			ropera.exec( ua ) ||
+			rmsie.exec( ua ) ||
+			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+			[];
+
+		return { browser: match[1] || "", version: match[2] || "0" };
+	},
+
+	sub: function() {
+		function jQuerySub( selector, context ) {
+			return new jQuerySub.fn.init( selector, context );
+		}
+		jQuery.extend( true, jQuerySub, this );
+		jQuerySub.superclass = this;
+		jQuerySub.fn = jQuerySub.prototype = this();
+		jQuerySub.fn.constructor = jQuerySub;
+		jQuerySub.sub = this.sub;
+		jQuerySub.fn.init = function init( selector, context ) {
+			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+				context = jQuerySub( context );
+			}
+
+			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+		};
+		jQuerySub.fn.init.prototype = jQuerySub.fn;
+		var rootjQuerySub = jQuerySub(document);
+		return jQuerySub;
+	},
+
+	browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+	jQuery.browser[ browserMatch.browser ] = true;
+	jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+	jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+	trimLeft = /^[\s\xA0]+/;
+	trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+	DOMContentLoaded = function() {
+		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+		jQuery.ready();
+	};
+
+} else if ( document.attachEvent ) {
+	DOMContentLoaded = function() {
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	};
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+	if ( jQuery.isReady ) {
+		return;
+	}
+
+	try {
+		// If IE is used, use the trick by Diego Perini
+		// http://javascript.nwbox.com/IEContentLoaded/
+		document.documentElement.doScroll("left");
+	} catch(e) {
+		setTimeout( doScrollCheck, 1 );
+		return;
+	}
+
+	// and execute any waiting functions
+	jQuery.ready();
+}
+
+return jQuery;
+
+})();
+
+
+// String to Object flags format cache
+var flagsCache = {};
+
+// Convert String-formatted flags into Object-formatted ones and store in cache
+function createFlags( flags ) {
+	var object = flagsCache[ flags ] = {},
+		i, length;
+	flags = flags.split( /\s+/ );
+	for ( i = 0, length = flags.length; i < length; i++ ) {
+		object[ flags[i] ] = true;
+	}
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	flags:	an optional list of space-separated flags that will change how
+ *			the callback list behaves
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible flags:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( flags ) {
+
+	// Convert flags from String-formatted to Object-formatted
+	// (we check in cache first)
+	flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+
+	var // Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = [],
+		// Last fire value (for non-forgettable lists)
+		memory,
+		// Flag to know if list was already fired
+		fired,
+		// Flag to know if list is currently firing
+		firing,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// Add one or several callbacks to the list
+		add = function( args ) {
+			var i,
+				length,
+				elem,
+				type,
+				actual;
+			for ( i = 0, length = args.length; i < length; i++ ) {
+				elem = args[ i ];
+				type = jQuery.type( elem );
+				if ( type === "array" ) {
+					// Inspect recursively
+					add( elem );
+				} else if ( type === "function" ) {
+					// Add if not in unique mode and callback is not in
+					if ( !flags.unique || !self.has( elem ) ) {
+						list.push( elem );
+					}
+				}
+			}
+		},
+		// Fire callbacks
+		fire = function( context, args ) {
+			args = args || [];
+			memory = !flags.memory || [ context, args ];
+			fired = true;
+			firing = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
+					memory = true; // Mark as halted
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( !flags.once ) {
+					if ( stack && stack.length ) {
+						memory = stack.shift();
+						self.fireWith( memory[ 0 ], memory[ 1 ] );
+					}
+				} else if ( memory === true ) {
+					self.disable();
+				} else {
+					list = [];
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					var length = list.length;
+					add( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away, unless previous
+					// firing was halted (stopOnFalse)
+					} else if ( memory && memory !== true ) {
+						firingStart = length;
+						fire( memory[ 0 ], memory[ 1 ] );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					var args = arguments,
+						argIndex = 0,
+						argLength = args.length;
+					for ( ; argIndex < argLength ; argIndex++ ) {
+						for ( var i = 0; i < list.length; i++ ) {
+							if ( args[ argIndex ] === list[ i ] ) {
+								// Handle firingIndex and firingLength
+								if ( firing ) {
+									if ( i <= firingLength ) {
+										firingLength--;
+										if ( i <= firingIndex ) {
+											firingIndex--;
+										}
+									}
+								}
+								// Remove the element
+								list.splice( i--, 1 );
+								// If we have some unicity property then
+								// we only need to do this once
+								if ( flags.unique ) {
+									break;
+								}
+							}
+						}
+					}
+				}
+				return this;
+			},
+			// Control if a given callback is in the list
+			has: function( fn ) {
+				if ( list ) {
+					var i = 0,
+						length = list.length;
+					for ( ; i < length; i++ ) {
+						if ( fn === list[ i ] ) {
+							return true;
+						}
+					}
+				}
+				return false;
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory || memory === true ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( stack ) {
+					if ( firing ) {
+						if ( !flags.once ) {
+							stack.push( [ context, args ] );
+						}
+					} else if ( !( flags.once && memory ) ) {
+						fire( context, args );
+					}
+				}
+				return this;
+			},
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+
+
+
+
+var // Static reference to slice
+	sliceDeferred = [].slice;
+
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var doneList = jQuery.Callbacks( "once memory" ),
+			failList = jQuery.Callbacks( "once memory" ),
+			progressList = jQuery.Callbacks( "memory" ),
+			state = "pending",
+			lists = {
+				resolve: doneList,
+				reject: failList,
+				notify: progressList
+			},
+			promise = {
+				done: doneList.add,
+				fail: failList.add,
+				progress: progressList.add,
+
+				state: function() {
+					return state;
+				},
+
+				// Deprecated
+				isResolved: doneList.fired,
+				isRejected: failList.fired,
+
+				then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
+					deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
+					return this;
+				},
+				always: function() {
+					deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+					return this;
+				},
+				pipe: function( fnDone, fnFail, fnProgress ) {
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( {
+							done: [ fnDone, "resolve" ],
+							fail: [ fnFail, "reject" ],
+							progress: [ fnProgress, "notify" ]
+						}, function( handler, data ) {
+							var fn = data[ 0 ],
+								action = data[ 1 ],
+								returned;
+							if ( jQuery.isFunction( fn ) ) {
+								deferred[ handler ](function() {
+									returned = fn.apply( this, arguments );
+									if ( returned && jQuery.isFunction( returned.promise ) ) {
+										returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
+									} else {
+										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+									}
+								});
+							} else {
+								deferred[ handler ]( newDefer[ action ] );
+							}
+						});
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					if ( obj == null ) {
+						obj = promise;
+					} else {
+						for ( var key in promise ) {
+							obj[ key ] = promise[ key ];
+						}
+					}
+					return obj;
+				}
+			},
+			deferred = promise.promise({}),
+			key;
+
+		for ( key in lists ) {
+			deferred[ key ] = lists[ key ].fire;
+			deferred[ key + "With" ] = lists[ key ].fireWith;
+		}
+
+		// Handle state
+		deferred.done( function() {
+			state = "resolved";
+		}, failList.disable, progressList.lock ).fail( function() {
+			state = "rejected";
+		}, doneList.disable, progressList.lock );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( firstParam ) {
+		var args = sliceDeferred.call( arguments, 0 ),
+			i = 0,
+			length = args.length,
+			pValues = new Array( length ),
+			count = length,
+			pCount = length,
+			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+				firstParam :
+				jQuery.Deferred(),
+			promise = deferred.promise();
+		function resolveFunc( i ) {
+			return function( value ) {
+				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				if ( !( --count ) ) {
+					deferred.resolveWith( deferred, args );
+				}
+			};
+		}
+		function progressFunc( i ) {
+			return function( value ) {
+				pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				deferred.notifyWith( promise, pValues );
+			};
+		}
+		if ( length > 1 ) {
+			for ( ; i < length; i++ ) {
+				if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
+					args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
+				} else {
+					--count;
+				}
+			}
+			if ( !count ) {
+				deferred.resolveWith( deferred, args );
+			}
+		} else if ( deferred !== firstParam ) {
+			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+		}
+		return promise;
+	}
+});
+
+
+
+
+jQuery.support = (function() {
+
+	var support,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		fragment,
+		tds,
+		events,
+		eventName,
+		i,
+		isSupported,
+		div = document.createElement( "div" ),
+		documentElement = document.documentElement;
+
+	// Preliminary tests
+	div.setAttribute("className", "t");
+	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+	all = div.getElementsByTagName( "*" );
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return {};
+	}
+
+	// First batch of supports tests
+	select = document.createElement( "select" );
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName( "input" )[ 0 ];
+
+	support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.55/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: ( input.value === "on" ),
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// Tests for enctype support on a form(#6743)
+		enctype: !!document.createElement("form").enctype,
+
+		// Makes sure cloning an html5 element does not cause problems
+		// Where outerHTML is undefined, this still works
+		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true,
+		pixelMargin: true
+	};
+
+	// jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead
+	jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");
+
+	// Make sure checked status is properly cloned
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent( "onclick", function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent( "onclick" );
+	}
+
+	// Check if a radio maintains its value
+	// after being appended to the DOM
+	input = document.createElement("input");
+	input.value = "t";
+	input.setAttribute("type", "radio");
+	support.radioValue = input.value === "t";
+
+	input.setAttribute("checked", "checked");
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.lastChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	fragment.removeChild( input );
+	fragment.appendChild( div );
+
+	// Technique from Juriy Zaytsev
+	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+	// We only care about the case where non-standard event systems
+	// are used, namely in IE. Short-circuiting here helps us to
+	// avoid an eval call (in setAttribute) which can cause CSP
+	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+	if ( div.attachEvent ) {
+		for ( i in {
+			submit: 1,
+			change: 1,
+			focusin: 1
+		}) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	fragment.removeChild( div );
+
+	// Null elements to avoid leaks in IE
+	fragment = select = opt = div = input = null;
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, outer, inner, table, td, offsetSupport,
+			marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,
+			paddingMarginBorderVisibility, paddingMarginBorder,
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		conMarginTop = 1;
+		paddingMarginBorder = "padding:0;margin:0;border:";
+		positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";
+		paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";
+		style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";
+		html = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +
+			"<table " + style + "' cellpadding='0' cellspacing='0'>" +
+			"<tr><td></td></tr></table>";
+
+		container = document.createElement("div");
+		container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
+		body.insertBefore( container, body.firstChild );
+
+		// Construct the test element
+		div = document.createElement("div");
+		container.appendChild( div );
+
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		// (only IE 8 fails this test)
+		div.innerHTML = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName( "td" );
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Check if empty table cells still have offsetWidth/Height
+		// (IE <= 8 fail this test)
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Check if div with explicit width and no margin-right incorrectly
+		// gets computed margin-right based on width of container. For more
+		// info see bug #3333
+		// Fails in WebKit before Feb 2011 nightlies
+		// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+		if ( window.getComputedStyle ) {
+			div.innerHTML = "";
+			marginDiv = document.createElement( "div" );
+			marginDiv.style.width = "0";
+			marginDiv.style.marginRight = "0";
+			div.style.width = "2px";
+			div.appendChild( marginDiv );
+			support.reliableMarginRight =
+				( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+		}
+
+		if ( typeof div.style.zoom !== "undefined" ) {
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			// (IE < 8 does this)
+			div.innerHTML = "";
+			div.style.width = div.style.padding = "1px";
+			div.style.border = 0;
+			div.style.overflow = "hidden";
+			div.style.display = "inline";
+			div.style.zoom = 1;
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "block";
+			div.style.overflow = "visible";
+			div.innerHTML = "<div style='width:5px;'></div>";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+		}
+
+		div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;
+		div.innerHTML = html;
+
+		outer = div.firstChild;
+		inner = outer.firstChild;
+		td = outer.nextSibling.firstChild.firstChild;
+
+		offsetSupport = {
+			doesNotAddBorder: ( inner.offsetTop !== 5 ),
+			doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
+		};
+
+		inner.style.position = "fixed";
+		inner.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
+		inner.style.position = inner.style.top = "";
+
+		outer.style.overflow = "hidden";
+		outer.style.position = "relative";
+
+		offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
+		offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
+
+		if ( window.getComputedStyle ) {
+			div.style.marginTop = "1%";
+			support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%";
+		}
+
+		if ( typeof container.style.zoom !== "undefined" ) {
+			container.style.zoom = 1;
+		}
+
+		body.removeChild( container );
+		marginDiv = div = container = null;
+
+		jQuery.extend( support, offsetSupport );
+	});
+
+	return support;
+})();
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	// Please use with caution
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var privateCache, thisCache, ret,
+			internalKey = jQuery.expando,
+			getByName = typeof name === "string",
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
+			isEvents = name === "events";
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ internalKey ] = id = ++jQuery.uuid;
+			} else {
+				id = internalKey;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// Avoids exposing jQuery metadata on plain JS objects when the object
+			// is serialized using JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ] = jQuery.extend( cache[ id ], name );
+			} else {
+				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+			}
+		}
+
+		privateCache = thisCache = cache[ id ];
+
+		// jQuery data() is stored in a separate object inside the object's internal data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data.
+		if ( !pvt ) {
+			if ( !thisCache.data ) {
+				thisCache.data = {};
+			}
+
+			thisCache = thisCache.data;
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// Users should not attempt to inspect the internal events object using jQuery.data,
+		// it is undocumented and subject to change. But does anyone listen? No.
+		if ( isEvents && !thisCache[ name ] ) {
+			return privateCache.events;
+		}
+
+		// Check for both converted-to-camel and non-converted data property names
+		// If a data property was specified
+		if ( getByName ) {
+
+			// First Try to find as-is property data
+			ret = thisCache[ name ];
+
+			// Test for null|undefined property data
+			if ( ret == null ) {
+
+				// Try to find the camelCased property
+				ret = thisCache[ jQuery.camelCase( name ) ];
+			}
+		} else {
+			ret = thisCache;
+		}
+
+		return ret;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, i, l,
+
+			// Reference to internal data cache key
+			internalKey = jQuery.expando,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+
+			// See jQuery.data for more information
+			id = isNode ? elem[ internalKey ] : internalKey;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+
+			thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+			if ( thisCache ) {
+
+				// Support array or space separated string names for data keys
+				if ( !jQuery.isArray( name ) ) {
+
+					// try the string as a key before any manipulation
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+
+						// split the camel cased version by spaces unless a key with the spaces exists
+						name = jQuery.camelCase( name );
+						if ( name in thisCache ) {
+							name = [ name ];
+						} else {
+							name = name.split( " " );
+						}
+					}
+				}
+
+				for ( i = 0, l = name.length; i < l; i++ ) {
+					delete thisCache[ name[i] ];
+				}
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( !pvt ) {
+			delete cache[ id ].data;
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject(cache[ id ]) ) {
+				return;
+			}
+		}
+
+		// Browsers that fail expando deletion also refuse to delete expandos on
+		// the window, but it will allow it on all other JS objects; other browsers
+		// don't care
+		// Ensure that `cache` is not a window object #10080
+		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+			delete cache[ id ];
+		} else {
+			cache[ id ] = null;
+		}
+
+		// We destroyed the cache and need to eliminate the expando on the node to avoid
+		// false lookups in the cache for entries that no longer exist
+		if ( isNode ) {
+			// IE does not allow us to delete expando properties from nodes,
+			// nor does it have a removeAttribute function on Document nodes;
+			// we must handle all of these cases
+			if ( jQuery.support.deleteExpando ) {
+				delete elem[ internalKey ];
+			} else if ( elem.removeAttribute ) {
+				elem.removeAttribute( internalKey );
+			} else {
+				elem[ internalKey ] = null;
+			}
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		if ( elem.nodeName ) {
+			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+			if ( match ) {
+				return !(match === true || elem.getAttribute("classid") !== match);
+			}
+		}
+
+		return true;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var parts, part, attr, name, l,
+			elem = this[0],
+			i = 0,
+			data = null;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = jQuery.data( elem );
+
+				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+					attr = elem.attributes;
+					for ( l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( elem, name, data[ name ] );
+						}
+					}
+					jQuery._data( elem, "parsedAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		parts = key.split( ".", 2 );
+		parts[1] = parts[1] ? "." + parts[1] : "";
+		part = parts[1] + "!";
+
+		return jQuery.access( this, function( value ) {
+
+			if ( value === undefined ) {
+				data = this.triggerHandler( "getData" + part, [ parts[0] ] );
+
+				// Try to fetch any internally stored data first
+				if ( data === undefined && elem ) {
+					data = jQuery.data( elem, key );
+					data = dataAttr( elem, key, data );
+				}
+
+				return data === undefined && parts[1] ?
+					this.data( parts[0] ) :
+					data;
+			}
+
+			parts[1] = value;
+			this.each(function() {
+				var self = jQuery( this );
+
+				self.triggerHandler( "setData" + part, parts );
+				jQuery.data( this, key, value );
+				self.triggerHandler( "changeData" + part, parts );
+			});
+		}, null, value, arguments.length > 1, null, false );
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+				data === "false" ? false :
+				data === "null" ? null :
+				jQuery.isNumeric( data ) ? +data :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	for ( var name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+	var deferDataKey = type + "defer",
+		queueDataKey = type + "queue",
+		markDataKey = type + "mark",
+		defer = jQuery._data( elem, deferDataKey );
+	if ( defer &&
+		( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
+		( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
+		// Give room for hard-coded callbacks to fire first
+		// and eventually mark/queue something else on the element
+		setTimeout( function() {
+			if ( !jQuery._data( elem, queueDataKey ) &&
+				!jQuery._data( elem, markDataKey ) ) {
+				jQuery.removeData( elem, deferDataKey, true );
+				defer.fire();
+			}
+		}, 0 );
+	}
+}
+
+jQuery.extend({
+
+	_mark: function( elem, type ) {
+		if ( elem ) {
+			type = ( type || "fx" ) + "mark";
+			jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
+		}
+	},
+
+	_unmark: function( force, elem, type ) {
+		if ( force !== true ) {
+			type = elem;
+			elem = force;
+			force = false;
+		}
+		if ( elem ) {
+			type = type || "fx";
+			var key = type + "mark",
+				count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
+			if ( count ) {
+				jQuery._data( elem, key, count );
+			} else {
+				jQuery.removeData( elem, key, true );
+				handleQueueMarkDefer( elem, type, "mark" );
+			}
+		}
+	},
+
+	queue: function( elem, type, data ) {
+		var q;
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			q = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !q || jQuery.isArray(data) ) {
+					q = jQuery._data( elem, type, jQuery.makeArray(data) );
+				} else {
+					q.push( data );
+				}
+			}
+			return q || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift(),
+			hooks = {};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+		}
+
+		if ( fn ) {
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			jQuery._data( elem, type + ".run", hooks );
+			fn.call( elem, function() {
+				jQuery.dequeue( elem, type );
+			}, hooks );
+		}
+
+		if ( !queue.length ) {
+			jQuery.removeData( elem, type + "queue " + type + ".run", true );
+			handleQueueMarkDefer( elem, type, "queue" );
+		}
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[0], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each(function() {
+				var queue = jQuery.queue( this, type, data );
+
+				if ( type === "fx" && queue[0] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function( next, hooks ) {
+			var timeout = setTimeout( next, time );
+			hooks.stop = function() {
+				clearTimeout( timeout );
+			};
+		});
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, object ) {
+		if ( typeof type !== "string" ) {
+			object = type;
+			type = undefined;
+		}
+		type = type || "fx";
+		var defer = jQuery.Deferred(),
+			elements = this,
+			i = elements.length,
+			count = 1,
+			deferDataKey = type + "defer",
+			queueDataKey = type + "queue",
+			markDataKey = type + "mark",
+			tmp;
+		function resolve() {
+			if ( !( --count ) ) {
+				defer.resolveWith( elements, [ elements ] );
+			}
+		}
+		while( i-- ) {
+			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+					jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
+				count++;
+				tmp.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( object );
+	}
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+	rspace = /\s+/,
+	rreturn = /\r/g,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea)?$/i,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute,
+	nodeHook, boolHook, fixSpecified;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classNames, i, l, elem,
+			setClass, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			classNames = value.split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className && classNames.length === 1 ) {
+						elem.className = value;
+
+					} else {
+						setClass = " " + elem.className + " ";
+
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classNames, i, l, elem, className, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( (value && typeof value === "string") || value === undefined ) {
+			classNames = ( value || "" ).split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 && elem.className ) {
+					if ( value ) {
+						className = (" " + elem.className + " ").replace( rclass, " " );
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							className = className.replace(" " + classNames[ c ] + " ", " ");
+						}
+						elem.className = jQuery.trim( className );
+
+					} else {
+						elem.className = "";
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.split( rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space seperated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ?
+					// handle most common string cases
+					ret.replace(rreturn, "") :
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var self = jQuery(this), val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map(val, function ( value ) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				// attributes.value is undefined in Blackberry 4.7 but
+				// uses .value. See #6932
+				var val = elem.attributes.value;
+				return !val || val.specified ? elem.value : elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, i, max, option,
+					index = elem.selectedIndex,
+					values = [],
+					options = elem.options,
+					one = elem.type === "select-one";
+
+				// Nothing was selected
+				if ( index < 0 ) {
+					return null;
+				}
+
+				// Loop through all the selected options
+				i = one ? index : 0;
+				max = one ? index + 1 : options.length;
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// Don't return options that are disabled or in a disabled optgroup
+					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+				if ( one && !values.length && options.length ) {
+					return jQuery( options[ index ] ).val();
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attrFn: {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true
+	},
+
+	attr: function( elem, name, value, pass ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( pass && name in jQuery.attrFn ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( notxml ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+
+			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, "" + value );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			ret = elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret === null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var propName, attrNames, name, l, isBool,
+			i = 0;
+
+		if ( value && elem.nodeType === 1 ) {
+			attrNames = value.toLowerCase().split( rspace );
+			l = attrNames.length;
+
+			for ( ; i < l; i++ ) {
+				name = attrNames[ i ];
+
+				if ( name ) {
+					propName = jQuery.propFix[ name ] || name;
+					isBool = rboolean.test( name );
+
+					// See #9699 for explanation of this approach (setting first, then removal)
+					// Do not do this for boolean attributes (see #10870)
+					if ( !isBool ) {
+						jQuery.attr( elem, name, "" );
+					}
+					elem.removeAttribute( getSetAttribute ? name : propName );
+
+					// Set corresponding property to false for boolean attributes
+					if ( isBool && propName in elem ) {
+						elem[ propName ] = false;
+					}
+				}
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				// We can't allow the type property to be changed (since it causes problems in IE)
+				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+					jQuery.error( "type property can't be changed" );
+				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to it's default in case type is set after value
+					// This is for element creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		},
+		// Use the value property for back compat
+		// Use the nodeHook for button elements in IE6/7 (#1954)
+		value: {
+			get: function( elem, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.get( elem, name );
+				}
+				return name in elem ?
+					elem.value :
+					null;
+			},
+			set: function( elem, value, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.set( elem, value, name );
+				}
+				// Does not return so that setAttribute is also used
+				elem.value = value;
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+
+	prop: function( elem, name, value ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return ( elem[ name ] = value );
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		// Align boolean attributes with corresponding properties
+		// Fall back to attribute presence where some booleans are not supported
+		var attrNode,
+			property = jQuery.prop( elem, name );
+		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		var propName;
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			// value is true since we know at this point it's type boolean and not false
+			// Set boolean attributes to the same name and set the DOM property
+			propName = jQuery.propFix[ name ] || name;
+			if ( propName in elem ) {
+				// Only set the IDL specifically if it already exists on the element
+				elem[ propName ] = true;
+			}
+
+			elem.setAttribute( name, name.toLowerCase() );
+		}
+		return name;
+	}
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	fixSpecified = {
+		name: true,
+		id: true,
+		coords: true
+	};
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret;
+			ret = elem.getAttributeNode( name );
+			return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
+				ret.nodeValue :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				ret = document.createAttribute( name );
+				elem.setAttributeNode( ret );
+			}
+			return ( ret.nodeValue = value + "" );
+		}
+	};
+
+	// Apply the nodeHook to tabindex
+	jQuery.attrHooks.tabindex.set = nodeHook.set;
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		get: nodeHook.get,
+		set: function( elem, value, name ) {
+			if ( value === "" ) {
+				value = "false";
+			}
+			nodeHook.set( elem, value, name );
+		}
+	};
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret === null ? undefined : ret;
+			}
+		});
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Normalize to lowercase since IE uppercases css property names
+			return elem.style.cssText.toLowerCase() || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = "" + value );
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	});
+});
+
+
+
+
+var rformElems = /^(?:textarea|input|select)$/i,
+	rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
+	rhoverHack = /(?:^|\s)hover(\.\S+)?\b/,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
+	quickParse = function( selector ) {
+		var quick = rquickIs.exec( selector );
+		if ( quick ) {
+			//   0  1    2   3
+			// [ _, tag, id, class ]
+			quick[1] = ( quick[1] || "" ).toLowerCase();
+			quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
+		}
+		return quick;
+	},
+	quickIs = function( elem, m ) {
+		var attrs = elem.attributes || {};
+		return (
+			(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
+			(!m[2] || (attrs.id || {}).value === m[2]) &&
+			(!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
+		);
+	},
+	hoverHack = function( events ) {
+		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+	};
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var elemData, eventHandle, events,
+			t, tns, type, namespaces, handleObj,
+			handleObjIn, quick, handlers, special;
+
+		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
+		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		events = elemData.events;
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+		eventHandle = elemData.handle;
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = function( e ) {
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = jQuery.trim( hoverHack(types) ).split( " " );
+		for ( t = 0; t < types.length; t++ ) {
+
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = tns[1];
+			namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend({
+				type: type,
+				origType: tns[1],
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				quick: selector && quickParse( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			handlers = events[ type ];
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+			t, tns, type, origType, namespaces, origCount,
+			j, events, special, handle, eventType, handleObj;
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+		for ( t = 0; t < types.length; t++ ) {
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tns[1];
+			namespaces = tns[2];
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector? special.delegateType : special.bindType ) || type;
+			eventType = events[ type ] || [];
+			origCount = eventType.length;
+			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+
+			// Remove matching events
+			for ( j = 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					 ( !handler || handler.guid === handleObj.guid ) &&
+					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					eventType.splice( j--, 1 );
+
+					if ( handleObj.selector ) {
+						eventType.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( eventType.length === 0 && origCount !== eventType.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			handle = elemData.handle;
+			if ( handle ) {
+				handle.elem = null;
+			}
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery.removeData( elem, [ "events", "handle" ], true );
+		}
+	},
+
+	// Events that are safe to short-circuit if no handlers are attached.
+	// Native DOM events should not be added, they may have inline handlers.
+	customEvent: {
+		"getData": true,
+		"setData": true,
+		"changeData": true
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		// Don't do events on text and comment nodes
+		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+			return;
+		}
+
+		// Event object or event type
+		var type = event.type || event,
+			namespaces = [],
+			cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "!" ) >= 0 ) {
+			// Exclusive events trigger only for the exact event (no namespaces)
+			type = type.slice(0, -1);
+			exclusive = true;
+		}
+
+		if ( type.indexOf( "." ) >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+
+		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+			// No jQuery handlers for this event type, and it can't have inline handlers
+			return;
+		}
+
+		// Caller can pass in an Event, Object, or just an event type string
+		event = typeof event === "object" ?
+			// jQuery.Event object
+			event[ jQuery.expando ] ? event :
+			// Object literal
+			new jQuery.Event( type, event ) :
+			// Just the event type (string)
+			new jQuery.Event( type );
+
+		event.type = type;
+		event.isTrigger = true;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join( "." );
+		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+		// Handle a global trigger
+		if ( !elem ) {
+
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			cache = jQuery.cache;
+			for ( i in cache ) {
+				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+				}
+			}
+			return;
+		}
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data != null ? jQuery.makeArray( data ) : [];
+		data.unshift( event );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		eventPath = [[ elem, special.bindType || type ]];
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+			old = null;
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push([ cur, bubbleType ]);
+				old = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( old && old === elem.ownerDocument ) {
+				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+			}
+		}
+
+		// Fire handlers on the event path
+		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+			cur = eventPath[i][0];
+			event.type = eventPath[i][1];
+
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+			// Note that this is a bare JS function and not a jQuery handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
+				event.preventDefault();
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				// IE<9 dies on focus/blur to hidden element (#1486)
+				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					old = elem[ ontype ];
+
+					if ( old ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					elem[ type ]();
+					jQuery.event.triggered = undefined;
+
+					if ( old ) {
+						elem[ ontype ] = old;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event || window.event );
+
+		var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+			delegateCount = handlers.delegateCount,
+			args = [].slice.call( arguments, 0 ),
+			run_all = !event.exclusive && !event.namespace,
+			special = jQuery.event.special[ event.type ] || {},
+			handlerQueue = [],
+			i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers that should run if there are delegated events
+		// Avoid non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && !(event.button && event.type === "click") ) {
+
+			// Pregenerate a single jQuery object for reuse with .is()
+			jqcur = jQuery(this);
+			jqcur.context = this.ownerDocument || this;
+
+			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+
+				// Don't process events on disabled elements (#6911, #8165)
+				if ( cur.disabled !== true ) {
+					selMatch = {};
+					matches = [];
+					jqcur[0] = cur;
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+						sel = handleObj.selector;
+
+						if ( selMatch[ sel ] === undefined ) {
+							selMatch[ sel ] = (
+								handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
+							);
+						}
+						if ( selMatch[ sel ] ) {
+							matches.push( handleObj );
+						}
+					}
+					if ( matches.length ) {
+						handlerQueue.push({ elem: cur, matches: matches });
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( handlers.length > delegateCount ) {
+			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+		}
+
+		// Run delegates first; they may want to stop propagation beneath us
+		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+			matched = handlerQueue[ i ];
+			event.currentTarget = matched.elem;
+
+			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+				handleObj = matched.matches[ j ];
+
+				// Triggered event must either 1) be non-exclusive and have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+	fixHooks: {},
+
+	keyHooks: {
+		props: "char charCode key keyCode".split(" "),
+		filter: function( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var eventDoc, doc, body,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop,
+			originalEvent = event,
+			fixHook = jQuery.event.fixHooks[ event.type ] || {},
+			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = jQuery.Event( originalEvent );
+
+		for ( i = copy.length; i; ) {
+			prop = copy[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Target should not be a text node (#504, Safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
+		if ( event.metaKey === undefined ) {
+			event.metaKey = event.ctrlKey;
+		}
+
+		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: jQuery.bindReady
+		},
+
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+
+		focus: {
+			delegateType: "focusin"
+		},
+		blur: {
+			delegateType: "focusout"
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// Piggyback on a donor event to simulate a different one.
+		// Fake originalEvent to avoid donor's stopPropagation, but if the
+		// simulated event prevents default then we do the same on the donor.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{ type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		if ( elem.detachEvent ) {
+			elem.detachEvent( "on" + type, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !(this instanceof jQuery.Event) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj,
+				selector = handleObj.selector,
+				ret;
+
+			// For mousenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !form._submit_attached ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submit_bubble = true;
+					});
+					form._submit_attached = true;
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+		
+		postDispatch: function( event ) {
+			// If form was submitted by the user, bubble the event up the tree
+			if ( event._submit_bubble ) {
+				delete event._submit_bubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event, true );
+				}
+			}
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+							jQuery.event.simulate( "change", this, event, true );
+						}
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					elem._change_attached = true;
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0,
+			handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var origFn, type;
+
+		// Types can be a map of types/handlers
+		if ( typeof types === "object" ) {
+			// ( types-Object, selector, data )
+			if ( typeof selector !== "string" ) { // && selector != null
+				// ( types-Object, data )
+				data = data || selector;
+				selector = undefined;
+			}
+			for ( type in types ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		if ( data == null && fn == null ) {
+			// ( types, fn )
+			fn = selector;
+			data = selector = undefined;
+		} else if ( fn == null ) {
+			if ( typeof selector === "string" ) {
+				// ( types, selector, fn )
+				fn = data;
+				data = undefined;
+			} else {
+				// ( types, data, fn )
+				fn = data;
+				data = selector;
+				selector = undefined;
+			}
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		} else if ( !fn ) {
+			return this;
+		}
+
+		if ( one === 1 ) {
+			origFn = fn;
+			fn = function( event ) {
+				// Can use an empty set, since event contains the info
+				jQuery().off( event );
+				return origFn.apply( this, arguments );
+			};
+			// Use same guid so caller can remove using origFn
+			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+		}
+		return this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on( types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			var handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( var type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each(function() {
+			jQuery.event.remove( this, types, fn, selector );
+		});
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	live: function( types, data, fn ) {
+		jQuery( this.context ).on( types, this.selector, data, fn );
+		return this;
+	},
+	die: function( types, fn ) {
+		jQuery( this.context ).off( types, this.selector || "**", fn );
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			return jQuery.event.trigger( type, data, this[0], true );
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			guid = fn.guid || jQuery.guid++,
+			i = 0,
+			toggler = function( event ) {
+				// Figure out which function to execute
+				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+				// Make sure that clicks stop
+				event.preventDefault();
+
+				// and execute the function
+				return args[ lastToggle ].apply( this, arguments ) || false;
+			};
+
+		// link all the functions, so any of them can unbind this click handler
+		toggler.guid = guid;
+		while ( i < args.length ) {
+			args[ i++ ].guid = guid;
+		}
+
+		return this.click( toggler );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( jQuery.attrFn ) {
+		jQuery.attrFn[ name ] = true;
+	}
+
+	if ( rkeyEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+	}
+
+	if ( rmouseEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+	}
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+	expando = "sizcache" + (Math.random() + '').replace('.', ''),
+	done = 0,
+	toString = Object.prototype.toString,
+	hasDuplicate = false,
+	baseHasDuplicate = true,
+	rBackslash = /\\/g,
+	rReturn = /\r\n/g,
+	rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+	baseHasDuplicate = false;
+	return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+
+	var origContext = context;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+		return [];
+	}
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var m, set, checkSet, extra, ret, cur, pop, i,
+		prune = true,
+		contextXML = Sizzle.isXML( context ),
+		parts = [],
+		soFar = selector;
+
+	// Reset the position of the chunker regexp (start from head)
+	do {
+		chunker.exec( "" );
+		m = chunker.exec( soFar );
+
+		if ( m ) {
+			soFar = m[3];
+
+			parts.push( m[1] );
+
+			if ( m[2] ) {
+				extra = m[3];
+				break;
+			}
+		}
+	} while ( m );
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context, seed );
+
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] ) {
+					selector += parts.shift();
+				}
+
+				set = posProcess( selector, set, seed );
+			}
+		}
+
+	} else {
+		// Take a shortcut and set the context if the root selector is an ID
+		// (but not if it'll be faster if the inner selector is an ID)
+		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+			ret = Sizzle.find( parts.shift(), context, contextXML );
+			context = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set )[0] :
+				ret.set[0];
+		}
+
+		if ( context ) {
+			ret = seed ?
+				{ expr: parts.pop(), set: makeArray(seed) } :
+				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+			set = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set ) :
+				ret.set;
+
+			if ( parts.length > 0 ) {
+				checkSet = makeArray( set );
+
+			} else {
+				prune = false;
+			}
+
+			while ( parts.length ) {
+				cur = parts.pop();
+				pop = cur;
+
+				if ( !Expr.relative[ cur ] ) {
+					cur = "";
+				} else {
+					pop = parts.pop();
+				}
+
+				if ( pop == null ) {
+					pop = context;
+				}
+
+				Expr.relative[ cur ]( checkSet, pop, contextXML );
+			}
+
+		} else {
+			checkSet = parts = [];
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		Sizzle.error( cur || selector );
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+
+		} else if ( context && context.nodeType === 1 ) {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+
+		} else {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, origContext, results, seed );
+		Sizzle.uniqueSort( results );
+	}
+
+	return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+	if ( sortOrder ) {
+		hasDuplicate = baseHasDuplicate;
+		results.sort( sortOrder );
+
+		if ( hasDuplicate ) {
+			for ( var i = 1; i < results.length; i++ ) {
+				if ( results[i] === results[ i - 1 ] ) {
+					results.splice( i--, 1 );
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+	return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+	return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+	var set, i, len, match, type, left;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( i = 0, len = Expr.order.length; i < len; i++ ) {
+		type = Expr.order[i];
+
+		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+			left = match[1];
+			match.splice( 1, 1 );
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace( rBackslash, "" );
+				set = Expr.find[ type ]( match, context, isXML );
+
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( "*" ) :
+			[];
+	}
+
+	return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+	var match, anyFound,
+		type, found, item, filter, left,
+		i, pass,
+		old = expr,
+		result = [],
+		curLoop = set,
+		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+	while ( expr && set.length ) {
+		for ( type in Expr.filter ) {
+			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+				filter = Expr.filter[ type ];
+				left = match[1];
+
+				anyFound = false;
+
+				match.splice(1,1);
+
+				if ( left.substr( left.length - 1 ) === "\\" ) {
+					continue;
+				}
+
+				if ( curLoop === result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							pass = not ^ found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+
+								} else {
+									curLoop[i] = false;
+								}
+
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr === old ) {
+			if ( anyFound == null ) {
+				Sizzle.error( expr );
+
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Utility function for retreiving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+var getText = Sizzle.getText = function( elem ) {
+    var i, node,
+		nodeType = elem.nodeType,
+		ret = "";
+
+	if ( nodeType ) {
+		if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+			// Use textContent || innerText for elements
+			if ( typeof elem.textContent === 'string' ) {
+				return elem.textContent;
+			} else if ( typeof elem.innerText === 'string' ) {
+				// Replace IE's carriage returns
+				return elem.innerText.replace( rReturn, '' );
+			} else {
+				// Traverse it's children
+				for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
+					ret += getText( elem );
+				}
+			}
+		} else if ( nodeType === 3 || nodeType === 4 ) {
+			return elem.nodeValue;
+		}
+	} else {
+
+		// If no nodeType, this is expected to be an array
+		for ( i = 0; (node = elem[i]); i++ ) {
+			// Do not traverse comment nodes
+			if ( node.nodeType !== 8 ) {
+				ret += getText( node );
+			}
+		}
+	}
+	return ret;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+	},
+
+	leftMatch: {},
+
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+
+	attrHandle: {
+		href: function( elem ) {
+			return elem.getAttribute( "href" );
+		},
+		type: function( elem ) {
+			return elem.getAttribute( "type" );
+		}
+	},
+
+	relative: {
+		"+": function(checkSet, part){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !rNonWord.test( part ),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag ) {
+				part = part.toLowerCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+
+		">": function( checkSet, part ) {
+			var elem,
+				isPartStr = typeof part === "string",
+				i = 0,
+				l = checkSet.length;
+
+			if ( isPartStr && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+					}
+				}
+
+			} else {
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+
+		"": function(checkSet, part, isXML){
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+		},
+
+		"~": function( checkSet, part, isXML ) {
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+		}
+	},
+
+	find: {
+		ID: function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		},
+
+		NAME: function( match, context ) {
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [],
+					results = context.getElementsByName( match[1] );
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+
+		TAG: function( match, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( match[1] );
+			}
+		}
+	},
+	preFilter: {
+		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+			match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+						if ( !inplace ) {
+							result.push( elem );
+						}
+
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+
+		ID: function( match ) {
+			return match[1].replace( rBackslash, "" );
+		},
+
+		TAG: function( match, curLoop ) {
+			return match[1].replace( rBackslash, "" ).toLowerCase();
+		},
+
+		CHILD: function( match ) {
+			if ( match[1] === "nth" ) {
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				match[2] = match[2].replace(/^\+|\s*/g, '');
+
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+			else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+
+		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+			var name = match[1] = match[1].replace( rBackslash, "" );
+
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			// Handle if an un-quoted value was used
+			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+
+		PSEUDO: function( match, curLoop, inplace, result, not ) {
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+
+					return false;
+				}
+
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+
+			return match;
+		},
+
+		POS: function( match ) {
+			match.unshift( true );
+
+			return match;
+		}
+	},
+
+	filters: {
+		enabled: function( elem ) {
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+
+		disabled: function( elem ) {
+			return elem.disabled === true;
+		},
+
+		checked: function( elem ) {
+			return elem.checked === true;
+		},
+
+		selected: function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		parent: function( elem ) {
+			return !!elem.firstChild;
+		},
+
+		empty: function( elem ) {
+			return !elem.firstChild;
+		},
+
+		has: function( elem, i, match ) {
+			return !!Sizzle( match[3], elem ).length;
+		},
+
+		header: function( elem ) {
+			return (/h\d/i).test( elem.nodeName );
+		},
+
+		text: function( elem ) {
+			var attr = elem.getAttribute( "type" ), type = elem.type;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
+		},
+
+		radio: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+		},
+
+		checkbox: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+		},
+
+		file: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+		},
+
+		password: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+		},
+
+		submit: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "submit" === elem.type;
+		},
+
+		image: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+		},
+
+		reset: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "reset" === elem.type;
+		},
+
+		button: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && "button" === elem.type || name === "button";
+		},
+
+		input: function( elem ) {
+			return (/input|select|textarea|button/i).test( elem.nodeName );
+		},
+
+		focus: function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		}
+	},
+	setFilters: {
+		first: function( elem, i ) {
+			return i === 0;
+		},
+
+		last: function( elem, i, match, array ) {
+			return i === array.length - 1;
+		},
+
+		even: function( elem, i ) {
+			return i % 2 === 0;
+		},
+
+		odd: function( elem, i ) {
+			return i % 2 === 1;
+		},
+
+		lt: function( elem, i, match ) {
+			return i < match[3] - 0;
+		},
+
+		gt: function( elem, i, match ) {
+			return i > match[3] - 0;
+		},
+
+		nth: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		},
+
+		eq: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		}
+	},
+	filter: {
+		PSEUDO: function( elem, match, i, array ) {
+			var name = match[1],
+				filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var j = 0, l = not.length; j < l; j++ ) {
+					if ( not[j] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+
+			} else {
+				Sizzle.error( name );
+			}
+		},
+
+		CHILD: function( elem, match ) {
+			var first, last,
+				doneName, parent, cache,
+				count, diff,
+				type = match[1],
+				node = elem;
+
+			switch ( type ) {
+				case "only":
+				case "first":
+					while ( (node = node.previousSibling) ) {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					if ( type === "first" ) {
+						return true;
+					}
+
+					node = elem;
+
+					/* falls through */
+				case "last":
+					while ( (node = node.nextSibling) ) {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					return true;
+
+				case "nth":
+					first = match[2];
+					last = match[3];
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+
+					doneName = match[0];
+					parent = elem.parentNode;
+
+					if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
+						count = 0;
+
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						}
+
+						parent[ expando ] = doneName;
+					}
+
+					diff = elem.nodeIndex - last;
+
+					if ( first === 0 ) {
+						return diff === 0;
+
+					} else {
+						return ( diff % first === 0 && diff / first >= 0 );
+					}
+			}
+		},
+
+		ID: function( elem, match ) {
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+
+		TAG: function( elem, match ) {
+			return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
+		},
+
+		CLASS: function( elem, match ) {
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+
+		ATTR: function( elem, match ) {
+			var name = match[1],
+				result = Sizzle.attr ?
+					Sizzle.attr( elem, name ) :
+					Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				!type && Sizzle.attr ?
+				result != null :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value !== check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+
+		POS: function( elem, match, i, array ) {
+			var name = match[2],
+				filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS,
+	fescape = function(all, num){
+		return "\\" + (num - 0 + 1);
+	};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+// Expose origPOS
+// "global" as in regardless of relation to brackets/parens
+Expr.match.globalPOS = origPOS;
+
+var makeArray = function( array, results ) {
+	array = Array.prototype.slice.call( array, 0 );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+	makeArray = function( array, results ) {
+		var i = 0,
+			ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+
+			} else {
+				for ( ; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+			return a.compareDocumentPosition ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+	};
+
+} else {
+	sortOrder = function( a, b ) {
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Fallback to using sourceIndex (in IE) if it's available on both nodes
+		} else if ( a.sourceIndex && b.sourceIndex ) {
+			return a.sourceIndex - b.sourceIndex;
+		}
+
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+	siblingCheck = function( a, b, ret ) {
+		if ( a === b ) {
+			return ret;
+		}
+
+		var cur = a.nextSibling;
+
+		while ( cur ) {
+			if ( cur === b ) {
+				return -1;
+			}
+
+			cur = cur.nextSibling;
+		}
+
+		return 1;
+	};
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("div"),
+		id = "script" + (new Date()).getTime(),
+		root = document.documentElement;
+
+	form.innerHTML = "<a name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( document.getElementById( id ) ) {
+		Expr.find.ID = function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+
+				return m ?
+					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+
+		Expr.filter.ID = function( elem, match ) {
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+
+	// release memory in IE
+	root = form = null;
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function( match, context ) {
+			var results = context.getElementsByTagName( match[1] );
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+
+		Expr.attrHandle.href = function( elem ) {
+			return elem.getAttribute( "href", 2 );
+		};
+	}
+
+	// release memory in IE
+	div = null;
+})();
+
+if ( document.querySelectorAll ) {
+	(function(){
+		var oldSizzle = Sizzle,
+			div = document.createElement("div"),
+			id = "__sizzle__";
+
+		div.innerHTML = "<p class='TEST'></p>";
+
+		// Safari can't handle uppercase or unicode characters when
+		// in quirks mode.
+		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+			return;
+		}
+
+		Sizzle = function( query, context, extra, seed ) {
+			context = context || document;
+
+			// Only use querySelectorAll on non-XML documents
+			// (ID selectors don't work in non-HTML documents)
+			if ( !seed && !Sizzle.isXML(context) ) {
+				// See if we find a selector to speed up
+				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+
+				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+					// Speed-up: Sizzle("TAG")
+					if ( match[1] ) {
+						return makeArray( context.getElementsByTagName( query ), extra );
+
+					// Speed-up: Sizzle(".CLASS")
+					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+						return makeArray( context.getElementsByClassName( match[2] ), extra );
+					}
+				}
+
+				if ( context.nodeType === 9 ) {
+					// Speed-up: Sizzle("body")
+					// The body element only exists once, optimize finding it
+					if ( query === "body" && context.body ) {
+						return makeArray( [ context.body ], extra );
+
+					// Speed-up: Sizzle("#ID")
+					} else if ( match && match[3] ) {
+						var elem = context.getElementById( match[3] );
+
+						// Check parentNode to catch when Blackberry 4.6 returns
+						// nodes that are no longer in the document #6963
+						if ( elem && elem.parentNode ) {
+							// Handle the case where IE and Opera return items
+							// by name instead of ID
+							if ( elem.id === match[3] ) {
+								return makeArray( [ elem ], extra );
+							}
+
+						} else {
+							return makeArray( [], extra );
+						}
+					}
+
+					try {
+						return makeArray( context.querySelectorAll(query), extra );
+					} catch(qsaError) {}
+
+				// qSA works strangely on Element-rooted queries
+				// We can work around this by specifying an extra ID on the root
+				// and working up from there (Thanks to Andrew Dupont for the technique)
+				// IE 8 doesn't work on object elements
+				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					var oldContext = context,
+						old = context.getAttribute( "id" ),
+						nid = old || id,
+						hasParent = context.parentNode,
+						relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+					if ( !old ) {
+						context.setAttribute( "id", nid );
+					} else {
+						nid = nid.replace( /'/g, "\\$&" );
+					}
+					if ( relativeHierarchySelector && hasParent ) {
+						context = context.parentNode;
+					}
+
+					try {
+						if ( !relativeHierarchySelector || hasParent ) {
+							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+						}
+
+					} catch(pseudoError) {
+					} finally {
+						if ( !old ) {
+							oldContext.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+
+			return oldSizzle(query, context, extra, seed);
+		};
+
+		for ( var prop in oldSizzle ) {
+			Sizzle[ prop ] = oldSizzle[ prop ];
+		}
+
+		// release memory in IE
+		div = null;
+	})();
+}
+
+(function(){
+	var html = document.documentElement,
+		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+	if ( matches ) {
+		// Check to see if it's possible to do matchesSelector
+		// on a disconnected node (IE 9 fails this)
+		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+			pseudoWorks = false;
+
+		try {
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( document.documentElement, "[test!='']:sizzle" );
+
+		} catch( pseudoError ) {
+			pseudoWorks = true;
+		}
+
+		Sizzle.matchesSelector = function( node, expr ) {
+			// Make sure that attribute selectors are quoted
+			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+			if ( !Sizzle.isXML( node ) ) {
+				try {
+					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+						var ret = matches.call( node, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || !disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9, so check for that
+								node.document && node.document.nodeType !== 11 ) {
+							return ret;
+						}
+					}
+				} catch(e) {}
+			}
+
+			return Sizzle(expr, null, null, [node]).length > 0;
+		};
+	}
+})();
+
+(function(){
+	var div = document.createElement("div");
+
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	// Also, make sure that getElementsByClassName actually exists
+	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+		return;
+	}
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 ) {
+		return;
+	}
+
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function( match, context, isXML ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+
+	// release memory in IE
+	div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem[ expando ] = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName.toLowerCase() === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem[ expando ] = doneName;
+						elem.sizset = i;
+					}
+
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+if ( document.documentElement.contains ) {
+	Sizzle.contains = function( a, b ) {
+		return a !== b && (a.contains ? a.contains(b) : true);
+	};
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+	Sizzle.contains = function( a, b ) {
+		return !!(a.compareDocumentPosition(b) & 16);
+	};
+
+} else {
+	Sizzle.contains = function() {
+		return false;
+	};
+}
+
+Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833)
+	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context, seed ) {
+	var match,
+		tmpSet = [],
+		later = "",
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet, seed );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+Sizzle.selectors.attrMap = {};
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+	// Note: This RegExp should be improved, or likely pulled from Sizzle
+	rmultiselector = /,/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	slice = Array.prototype.slice,
+	POS = jQuery.expr.match.globalPOS,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var self = this,
+			i, l;
+
+		if ( typeof selector !== "string" ) {
+			return jQuery( selector ).filter(function() {
+				for ( i = 0, l = self.length; i < l; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			});
+		}
+
+		var ret = this.pushStack( "", "find", selector ),
+			length, n, r;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( n = length; n < ret.length; n++ ) {
+					for ( r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target );
+		return this.filter(function() {
+			for ( var i = 0, l = targets.length; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && (
+			typeof selector === "string" ?
+				// If this is a positional selector, check membership in the returned set
+				// so $("p:first").is("p:last") won't return true for a doc with two "p".
+				POS.test( selector ) ?
+					jQuery( selector, this.context ).index( this[0] ) >= 0 :
+					jQuery.filter( selector, this ).length > 0 :
+				this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var ret = [], i, l, cur = this[0];
+
+		// Array (deprecated as of jQuery 1.7)
+		if ( jQuery.isArray( selectors ) ) {
+			var level = 1;
+
+			while ( cur && cur.ownerDocument && cur !== context ) {
+				for ( i = 0; i < selectors.length; i++ ) {
+
+					if ( jQuery( cur ).is( selectors[ i ] ) ) {
+						ret.push({ selector: selectors[ i ], elem: cur, level: level });
+					}
+				}
+
+				cur = cur.parentNode;
+				level++;
+			}
+
+			return ret;
+		}
+
+		// String
+		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+
+				} else {
+					cur = cur.parentNode;
+					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+						break;
+					}
+				}
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	}
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return jQuery.nth( elem, 2, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return jQuery.nth( elem, 2, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.makeArray( elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, slice.call( arguments ).join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	nth: function( cur, result, dir, elem ) {
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] ) {
+			if ( cur.nodeType === 1 && ++num === result ) {
+				break;
+			}
+		}
+
+		return cur;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return ( elem === qualifier ) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+	});
+}
+
+
+
+
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+	safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style)/i,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	},
+	safeFragment = createSafeFragment( document );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( value ) {
+		return jQuery.access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+		}, null, value, arguments.length );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each(function(i) {
+			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery.clean(arguments) );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		return jQuery.access( this, function( value ) {
+			var elem = this[0] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined ) {
+				return elem.nodeType === 1 ?
+					elem.innerHTML.replace( rinlinejQuery, "" ) :
+					null;
+			}
+
+
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+				value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+				try {
+					for (; i < l; i++ ) {
+						// Remove element nodes and prevent memory leaks
+						elem = this[i] || {};
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( elem.getElementsByTagName( "*" ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch(e) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.length ?
+				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+				this;
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || ( l > 1 && i < lastIndex ) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, function( i, elem ) {
+					if ( elem.src ) {
+						jQuery.ajax({
+							type: "GET",
+							global: false,
+							url: elem.src,
+							async: false,
+							dataType: "script"
+						});
+					} else {
+						jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+					}
+
+					if ( elem.parentNode ) {
+						elem.parentNode.removeChild( elem );
+					}
+				});
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type, events[ type ][ i ] );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+
+	// IE blanks contents when cloning scripts
+	} else if ( nodeName === "script" && dest.text !== src.text ) {
+		dest.text = src.text;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+
+	// Clear flags for bubbling special change/submit events, they must
+	// be reattached when the newly cloned events are first activated
+	dest.removeAttribute( "_submit_attached" );
+	dest.removeAttribute( "_change_attached" );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults, doc,
+	first = args[ 0 ];
+
+	// nodes may contain either an explicit document object,
+	// a jQuery collection or context object.
+	// If nodes[0] contains a valid object to assign to doc
+	if ( nodes && nodes[0] ) {
+		doc = nodes[0].ownerDocument || nodes[0];
+	}
+
+	// Ensure that an attr object doesn't incorrectly stand in as a document object
+	// Chrome and Firefox seem to allow this to occur and will throw exception
+	// Fixes #8950
+	if ( !doc.createDocumentFragment ) {
+		doc = document;
+	}
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+	if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
+		first.charAt(0) === "<" && !rnocache.test( first ) &&
+		(jQuery.support.checkClone || !rchecked.test( first )) &&
+		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+		cacheable = true;
+
+		cacheresults = jQuery.fragments[ first ];
+		if ( cacheresults && cacheresults !== 1 ) {
+			fragment = cacheresults;
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = ( i > 0 ? this.clone(true) : this ).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( typeof elem.getElementsByTagName !== "undefined" ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( elem.type === "checkbox" || elem.type === "radio" ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+	var nodeName = ( elem.nodeName || "" ).toLowerCase();
+	if ( nodeName === "input" ) {
+		fixDefaultChecked( elem );
+	// Skip scripts, get other children
+	} else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
+		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+	}
+}
+
+// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
+function shimCloneNode( elem ) {
+	var div = document.createElement( "div" );
+	safeFragment.appendChild( div );
+
+	div.innerHTML = elem.outerHTML;
+	return div.firstChild;
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var srcElements,
+			destElements,
+			i,
+			// IE<=8 does not properly clone detached, unknown element nodes
+			clone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ?
+				elem.cloneNode( true ) :
+				shimCloneNode( elem );
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					cloneFixAttributes( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var checkScriptType, script, j,
+				ret = [];
+
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Trim whitespace, otherwise indexOf won't work as expected
+					var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
+						wrap = wrapMap[ tag ] || wrapMap._default,
+						depth = wrap[0],
+						div = context.createElement("div"),
+						safeChildNodes = safeFragment.childNodes,
+						remove;
+
+					// Append wrapper element to unknown element safe doc fragment
+					if ( context === document ) {
+						// Use the fragment we've already created for this document
+						safeFragment.appendChild( div );
+					} else {
+						// Use a fragment created with the owner document
+						createSafeFragment( context ).appendChild( div );
+					}
+
+					// Go to html and back, then peel off extra wrappers
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						var hasBody = rtbody.test(elem),
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+
+					// Clear elements from DocumentFragment (safeFragment or otherwise)
+					// to avoid hoarding elements. Fixes #11356
+					if ( div ) {
+						div.parentNode.removeChild( div );
+
+						// Guard against -1 index exceptions in FF3.6
+						if ( safeChildNodes.length > 0 ) {
+							remove = safeChildNodes[ safeChildNodes.length - 1 ];
+
+							if ( remove && remove.parentNode ) {
+								remove.parentNode.removeChild( remove );
+							}
+						}
+					}
+				}
+			}
+
+			// Resets defaultChecked for any radios and checkboxes
+			// about to be appended to the DOM in IE 6/7 (#8060)
+			var len;
+			if ( !jQuery.support.appendChecked ) {
+				if ( elem[0] && typeof (len = elem.length) === "number" ) {
+					for ( j = 0; j < len; j++ ) {
+						findInputs( elem[j] );
+					}
+				} else {
+					findInputs( elem );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			checkScriptType = function( elem ) {
+				return !elem.type || rscriptType.test( elem.type );
+			};
+			for ( i = 0; ret[i]; i++ ) {
+				script = ret[i];
+				if ( scripts && jQuery.nodeName( script, "script" ) && (!script.type || rscriptType.test( script.type )) ) {
+					scripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );
+
+				} else {
+					if ( script.nodeType === 1 ) {
+						var jsTags = jQuery.grep( script.getElementsByTagName( "script" ), checkScriptType );
+
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+					}
+					fragment.appendChild( script );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id,
+			cache = jQuery.cache,
+			special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						if ( special[ type ] ) {
+							jQuery.event.remove( elem, type );
+
+						// This is a shortcut to avoid jQuery.event.remove's overhead
+						} else {
+							jQuery.removeEvent( elem, type, data.handle );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	// fixed for IE9, see #8346
+	rupper = /([A-Z]|^ms)/g,
+	rnum = /^[\-+]?(?:\d*\.)?\d+$/i,
+	rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,
+	rrelNum = /^([\-+])=([\-+.\de]+)/,
+	rmargin = /^margin/,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+
+	// order is important!
+	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+
+	curCSS,
+
+	getComputedStyle,
+	currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+	return jQuery.access( this, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	}, name, value, arguments.length > 1 );
+};
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra ) {
+		var ret, hooks;
+
+		// Make sure that we're working with the right name
+		name = jQuery.camelCase( name );
+		hooks = jQuery.cssHooks[ name ];
+		name = jQuery.cssProps[ name ] || name;
+
+		// cssFloat needs a special treatment
+		if ( name === "cssFloat" ) {
+			name = "float";
+		}
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {},
+			ret, name;
+
+		// Remember the old values, and insert the new ones
+		for ( name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		ret = callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+
+		return ret;
+	}
+});
+
+// DEPRECATED in 1.3, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, name ) {
+		var ret, defaultView, computedStyle, width,
+			style = elem.style;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( (defaultView = elem.ownerDocument.defaultView) &&
+				(computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		// A tribute to the "awesome hack by Dean Edwards"
+		// WebKit uses "computed value (percentage if specified)" instead of "used value" for margins
+		// which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+		if ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {
+			width = style.width;
+			style.width = ret;
+			ret = computedStyle.width;
+			style.width = width;
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left, rsLeft, uncomputed,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret == null && style && (uncomputed = style[ name ]) ) {
+			ret = uncomputed;
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( rnumnonpx.test( ret ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ret;
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with offset property
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		i = name === "width" ? 1 : 0,
+		len = 4;
+
+	if ( val > 0 ) {
+		if ( extra !== "border" ) {
+			for ( ; i < len; i += 2 ) {
+				if ( !extra ) {
+					val -= parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
+				}
+				if ( extra === "margin" ) {
+					val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;
+				} else {
+					val -= parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+				}
+			}
+		}
+
+		return val + "px";
+	}
+
+	// Fall back to computed then uncomputed css if necessary
+	val = curCSS( elem, name );
+	if ( val < 0 || val == null ) {
+		val = elem.style[ name ];
+	}
+
+	// Computed unit is not pixels. Stop here and return.
+	if ( rnumnonpx.test(val) ) {
+		return val;
+	}
+
+	// Normalize "", auto, and prepare for extra
+	val = parseFloat( val ) || 0;
+
+	// Add padding, border, margin
+	if ( extra ) {
+		for ( ; i < len; i += 2 ) {
+			val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
+			if ( extra !== "padding" ) {
+				val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+			}
+			if ( extra === "margin" ) {
+				val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;
+			}
+		}
+	}
+
+	return val + "px";
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					return getWidthOrHeight( elem, name, extra );
+				} else {
+					return jQuery.swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, name, extra );
+					});
+				}
+			}
+		},
+
+		set: function( elem, value ) {
+			return rnum.test( value ) ?
+				value + "px" :
+				value;
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( parseFloat( RegExp.$1 ) / 100 ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there there is no filter style applied in a css rule, we are done
+				if ( currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery(function() {
+	// This hook cannot be added until DOM ready because the support test
+	// for it is not run until after DOM ready
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				return jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						return curCSS( elem, "margin-right" );
+					} else {
+						return elem.style.marginRight;
+					}
+				});
+			}
+		};
+	}
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i,
+
+				// assumes a single number if not a string
+				parts = typeof value === "string" ? value.split(" ") : [ value ],
+				expanded = {};
+
+			for ( i = 0; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+});
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts,
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for ( ; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = undefined;
+
+			// Otherwise, build a param string
+			} else if ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.on( o, f );
+	};
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		if ( settings ) {
+			// Building a settings object
+			ajaxExtend( target, jQuery.ajaxSettings );
+		} else {
+			// Extending ajaxSettings
+			settings = target;
+			target = jQuery.ajaxSettings;
+		}
+		ajaxExtend( target, settings );
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": allTypes
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			context: true,
+			url: true
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, nativeStatusText, responses, headers ) {
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			var isSuccess,
+				success,
+				error,
+				statusText = nativeStatusText,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = "" + ( nativeStatusText || statusText );
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.add;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for ( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					throw e;
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = jQuery.ajaxSettings.traditional;
+		}
+
+		// If an array was passed in, assume that it is an array of form elements.
+		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+			// Serialize the form elements
+			jQuery.each( a, function() {
+				add( this.name, this.value );
+			});
+
+		} else {
+			// If traditional, encode the "old" way (the way 1.3.2 or older
+			// did it), otherwise encode params recursively.
+			for ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+		// Serialize object item.
+		for ( var name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for ( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for ( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for ( key in s.converters ) {
+				if ( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if ( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for ( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var inspectData = ( typeof s.data === "string" ) && /^application\/x\-www\-form\-urlencoded/.test( s.contentType );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				inspectData && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2";
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( inspectData ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Clean-up function
+		jqXHR.always(function() {
+			// Set callback back to previous value
+			window[ jsonpCallback ] = previous;
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( previous ) ) {
+				window[ jsonpCallback ]( responseContainer[ 0 ] );
+			}
+		});
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0,
+	xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+
+									// When requesting binary data, IE6-9 will throw an exception
+									// on any attempt to access responseText (#11426)
+									try {
+										responses.text = xhr.responseText;
+									} catch( _ ) {
+									}
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	iframe, iframeDoc,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	],
+	fxNow;
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback );
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					// Reset the inline display of this element to learn if it is
+					// being hidden by cascaded rules or not
+					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+						display = elem.style.display = "";
+					}
+
+					// Set elements which have been overridden with display: none
+					// in a stylesheet to whatever the default browser style is
+					// for such an element
+					if ( (display === "" && jQuery.css(elem, "display") === "none") ||
+						!jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+						jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+					}
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					if ( display === "" || display === "none" ) {
+						elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
+					}
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			var elem, display,
+				i = 0,
+				j = this.length;
+
+			for ( ; i < j; i++ ) {
+				elem = this[i];
+				if ( elem.style ) {
+					display = jQuery.css( elem, "display" );
+
+					if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
+						jQuery._data( elem, "olddisplay", display );
+					}
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				if ( this[i].style ) {
+					this[i].style.display = "none";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed( speed, easing, callback );
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete, [ false ] );
+		}
+
+		// Do not change referenced properties as per-property easing will be lost
+		prop = jQuery.extend( {}, prop );
+
+		function doAnimation() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			if ( optall.queue === false ) {
+				jQuery._mark( this );
+			}
+
+			var opt = jQuery.extend( {}, optall ),
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				name, val, p, e, hooks, replace,
+				parts, start, end, unit,
+				method;
+
+			// will store per property easing and be used to determine when an animation is complete
+			opt.animatedProperties = {};
+
+			// first pass over propertys to expand / normalize
+			for ( p in prop ) {
+				name = jQuery.camelCase( p );
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+				}
+
+				if ( ( hooks = jQuery.cssHooks[ name ] ) && "expand" in hooks ) {
+					replace = hooks.expand( prop[ name ] );
+					delete prop[ name ];
+
+					// not quite $.extend, this wont overwrite keys already present.
+					// also - reusing 'p' from above because we have the correct "name"
+					for ( p in replace ) {
+						if ( ! ( p in prop ) ) {
+							prop[ p ] = replace[ p ];
+						}
+					}
+				}
+			}
+
+			for ( name in prop ) {
+				val = prop[ name ];
+				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+				if ( jQuery.isArray( val ) ) {
+					opt.animatedProperties[ name ] = val[ 1 ];
+					val = prop[ name ] = val[ 0 ];
+				} else {
+					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+				}
+
+				if ( val === "hide" && hidden || val === "show" && !hidden ) {
+					return opt.complete.call( this );
+				}
+
+				if ( isElement && ( name === "height" || name === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+
+						// inline-level elements accept inline-block;
+						// block-level elements need to be inline with layout
+						if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
+							this.style.display = "inline-block";
+
+						} else {
+							this.style.zoom = 1;
+						}
+					}
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			for ( p in prop ) {
+				e = new jQuery.fx( this, opt, p );
+				val = prop[ p ];
+
+				if ( rfxtypes.test( val ) ) {
+
+					// Tracks whether to show or hide based on private
+					// data attached to the element
+					method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
+					if ( method ) {
+						jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
+						e[ method ]();
+					} else {
+						e[ val ]();
+					}
+
+				} else {
+					parts = rfxnum.exec( val );
+					start = e.cur();
+
+					if ( parts ) {
+						end = parseFloat( parts[2] );
+						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( this, p, (end || 1) + unit);
+							start = ( (end || 1) / e.cur() ) * start;
+							jQuery.style( this, p, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			}
+
+			// For JS strict compliance
+			return true;
+		}
+
+		return optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+
+	stop: function( type, clearQueue, gotoEnd ) {
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var index,
+				hadTimers = false,
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			// clear marker counters if we know they won't be
+			if ( !gotoEnd ) {
+				jQuery._unmark( true, this );
+			}
+
+			function stopQueue( elem, data, index ) {
+				var hooks = data[ index ];
+				jQuery.removeData( elem, index, true );
+				hooks.stop( gotoEnd );
+			}
+
+			if ( type == null ) {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
+						stopQueue( this, data, index );
+					}
+				}
+			} else if ( data[ index = type + ".run" ] && data[ index ].stop ){
+				stopQueue( this, data, index );
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					if ( gotoEnd ) {
+
+						// force the next step to be the last
+						timers[ index ]( true );
+					} else {
+						timers[ index ].saveState();
+					}
+					hadTimers = true;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// start the next in the queue if the last step wasn't forced
+			// timers currently will call their complete callbacks, which will dequeue
+			// but only if they were gotoEnd
+			if ( !( gotoEnd && hadTimers ) ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	}
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout( clearFxNow, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+	fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx( "show", 1 ),
+	slideUp: genFx( "hide", 1 ),
+	slideToggle: genFx( "toggle", 1 ),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.extend({
+	speed: function( speed, easing, fn ) {
+		var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+		};
+
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+		// normalize opt.queue - true/undefined/null -> "fx"
+		if ( opt.queue == null || opt.queue === true ) {
+			opt.queue = "fx";
+		}
+
+		// Queueing
+		opt.old = opt.complete;
+
+		opt.complete = function( noUnmark ) {
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+
+			if ( opt.queue ) {
+				jQuery.dequeue( this, opt.queue );
+			} else if ( noUnmark !== false ) {
+				jQuery._unmark( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p ) {
+			return p;
+		},
+		swing: function( p ) {
+			return ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		options.orig = options.orig || {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx;
+
+		this.startTime = fxNow || createFxNow();
+		this.end = to;
+		this.now = this.start = from;
+		this.pos = this.state = 0;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+
+		function t( gotoEnd ) {
+			return self.step( gotoEnd );
+		}
+
+		t.queue = this.options.queue;
+		t.elem = this.elem;
+		t.saveState = function() {
+			if ( jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
+				if ( self.options.hide ) {
+					jQuery._data( self.elem, "fxshow" + self.prop, self.start );
+				} else if ( self.options.show ) {
+					jQuery._data( self.elem, "fxshow" + self.prop, self.end );
+				}
+			}
+		};
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval( fx.tick, fx.interval );
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
+
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any flash of content
+		if ( dataShow !== undefined ) {
+			// This show is picking up where a previous hide or show left off
+			this.custom( this.cur(), dataShow );
+		} else {
+			this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+		}
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom( this.cur(), 0 );
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var p, n, complete,
+			t = fxNow || createFxNow(),
+			done = true,
+			elem = this.elem,
+			options = this.options;
+
+		if ( gotoEnd || t >= options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			options.animatedProperties[ this.prop ] = true;
+
+			for ( p in options.animatedProperties ) {
+				if ( options.animatedProperties[ p ] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+					jQuery.each( [ "", "X", "Y" ], function( index, value ) {
+						elem.style[ "overflow" + value ] = options.overflow[ index ];
+					});
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( options.hide ) {
+					jQuery( elem ).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( options.hide || options.show ) {
+					for ( p in options.animatedProperties ) {
+						jQuery.style( elem, p, options.orig[ p ] );
+						jQuery.removeData( elem, "fxshow" + p, true );
+						// Toggle data is no longer needed
+						jQuery.removeData( elem, "toggle" + p, true );
+					}
+				}
+
+				// Execute the complete function
+				// in the event that the complete function throws an exception
+				// we must ensure it won't be called twice. #5684
+
+				complete = options.complete;
+				if ( complete ) {
+
+					options.complete = false;
+					complete.call( elem );
+				}
+			}
+
+			return false;
+
+		} else {
+			// classical easing cannot be used with an Infinity duration
+			if ( options.duration == Infinity ) {
+				this.now = t;
+			} else {
+				n = t - this.startTime;
+				this.state = n / options.duration;
+
+				// Perform the easing function, defaults to swing
+				this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
+				this.now = this.start + ( (this.end - this.start) * this.pos );
+			}
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		var timer,
+			timers = jQuery.timers,
+			i = 0;
+
+		for ( ; i < timers.length; i++ ) {
+			timer = timers[ i ];
+			// Checks the timer has not already been removed
+			if ( !timer() && timers[ i ] === timer ) {
+				timers.splice( i--, 1 );
+			}
+		}
+
+		if ( !timers.length ) {
+			jQuery.fx.stop();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+// Ensure props that can't be negative don't go there on undershoot easing
+jQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {
+	// exclude marginTop, marginLeft, marginBottom and marginRight from this list
+	if ( prop.indexOf( "margin" ) ) {
+		jQuery.fx.step[ prop ] = function( fx ) {
+			jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
+		};
+	}
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+	if ( !elemdisplay[ nodeName ] ) {
+
+		var body = document.body,
+			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+			display = elem.css( "display" );
+		elem.remove();
+
+		// If the simple way fails,
+		// get element's real default display by attaching it to a temp iframe
+		if ( display === "none" || display === "" ) {
+			// No iframe to use yet, so create it
+			if ( !iframe ) {
+				iframe = document.createElement( "iframe" );
+				iframe.frameBorder = iframe.width = iframe.height = 0;
+			}
+
+			body.appendChild( iframe );
+
+			// Create a cacheable copy of the iframe document on first call.
+			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+			// document to it; WebKit & Firefox won't allow reusing the iframe document.
+			if ( !iframeDoc || !iframe.createElement ) {
+				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+				iframeDoc.write( ( jQuery.support.boxModel ? "<!doctype html>" : "" ) + "<html><body>" );
+				iframeDoc.close();
+			}
+
+			elem = iframeDoc.createElement( nodeName );
+
+			iframeDoc.body.appendChild( elem );
+
+			display = jQuery.css( elem, "display" );
+			body.removeChild( iframe );
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var getOffset,
+	rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	getOffset = function( elem, doc, docElem, box ) {
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow( doc ),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	getOffset = function( elem, doc, docElem ) {
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.fn.offset = function( options ) {
+	if ( arguments.length ) {
+		return options === undefined ?
+			this :
+			this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+	}
+
+	var elem = this[0],
+		doc = elem && elem.ownerDocument;
+
+	if ( !doc ) {
+		return null;
+	}
+
+	if ( elem === doc.body ) {
+		return jQuery.offset.bodyOffset( elem );
+	}
+
+	return getOffset( elem, doc, doc.documentElement );
+};
+
+jQuery.offset = {
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+
+	position: function() {
+		if ( !this[0] ) {
+			return null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+	var top = /Y/.test( prop );
+
+	jQuery.fn[ method ] = function( val ) {
+		return jQuery.access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? (prop in win) ? win[ prop ] :
+					jQuery.support.boxModel && win.document.documentElement[ method ] ||
+						win.document.body[ method ] :
+					elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : jQuery( win ).scrollLeft(),
+					 top ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	var clientProp = "client" + name,
+		scrollProp = "scroll" + name,
+		offsetProp = "offset" + name;
+
+	// innerHeight and innerWidth
+	jQuery.fn[ "inner" + name ] = function() {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, "padding" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn[ "outer" + name ] = function( margin ) {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( value ) {
+		return jQuery.access( this, function( elem, type, value ) {
+			var doc, docElemProp, orig, ret;
+
+			if ( jQuery.isWindow( elem ) ) {
+				// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+				doc = elem.document;
+				docElemProp = doc.documentElement[ clientProp ];
+				return jQuery.support.boxModel && docElemProp ||
+					doc.body && doc.body[ clientProp ] || docElemProp;
+			}
+
+			// Get document width or height
+			if ( elem.nodeType === 9 ) {
+				// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+				doc = elem.documentElement;
+
+				// when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]
+				// so we can't use max, as it'll choose the incorrect offset[Width/Height]
+				// instead we use the correct client[Width/Height]
+				// support:IE6
+				if ( doc[ clientProp ] >= doc[ scrollProp ] ) {
+					return doc[ clientProp ];
+				}
+
+				return Math.max(
+					elem.body[ scrollProp ], doc[ scrollProp ],
+					elem.body[ offsetProp ], doc[ offsetProp ]
+				);
+			}
+
+			// Get width or height on the element
+			if ( value === undefined ) {
+				orig = jQuery.css( elem, type );
+				ret = parseFloat( orig );
+				return jQuery.isNumeric( ret ) ? ret : orig;
+			}
+
+			// Set the width or height on the element
+			jQuery( elem ).css( type, value );
+		}, type, value, arguments.length, null );
+	};
+});
+
+
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+	define( "jquery", [], function () { return jQuery; } );
+}
+
+
+
+})( window );
diff --git a/orm/services/customer_manager/htmlcov/jquery.tablesorter.min.js b/orm/services/customer_manager/htmlcov/jquery.tablesorter.min.js
new file mode 100644
index 00000000..f11a3b96
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/jquery.tablesorter.min.js
@@ -0,0 +1 @@
+(function($){$.extend({tablesorter:new function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",cssChildRow:"expand-child",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,sortLocaleCompare:true,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:"/.|,/g",onRenderHeader:null,selectorHeaders:"thead th",debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms")}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s)}else{alert(s)}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug=""}if(table.tBodies.length==0){return}var rows=table.tBodies[0].rows;if(rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers[i]).metadata()&&$($headers[i]).metadata().sorter)){p=getParserById($($headers[i]).metadata().sorter)}else{if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter)}}if(!p){p=detectParserForColumn(table,rows,-1,i)}if(table.config.debug){parsersDebug+="column:"+i+" parser:"+p.id+"\n"}list.push(p)}}if(table.config.debug){log(parsersDebug)}return list}function detectParserForColumn(table,rows,rowIndex,cellIndex){var l=parsers.length,node=false,nodeValue=false,keepLooking=true;while(nodeValue==""&&keepLooking){rowIndex++;if(rows[rowIndex]){node=getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex);nodeValue=trimAndGetNodeText(table.config,node);if(table.config.debug){log("Checking if value was empty on row:"+rowIndex)}}else{keepLooking=false}}for(var i=1;i<l;i++){if(parsers[i].is(nodeValue,table,node)){return parsers[i]}}return parsers[0]}function getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex){return rows[rowIndex].cells[cellIndex]}function trimAndGetNodeText(config,node){return $.trim(getElementText(config,node))}function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==name.toLowerCase()){return parsers[i]}}return false}function buildCache(table){if(table.config.debug){var cacheTime=new Date()}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=$(table.tBodies[0].rows[i]),cols=[];if(c.hasClass(table.config.cssChildRow)){cache.row[cache.row.length-1]=cache.row[cache.row.length-1].add(c);continue}cache.row.push(c);for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c[0].cells[j]),table,c[0].cells[j]))}cols.push(cache.normalized.length);cache.normalized.push(cols);cols=null}if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime)}return cache}function getElementText(config,node){var text="";if(!node){return""}if(!config.supportsTextContent){config.supportsTextContent=node.textContent||false}if(config.textExtraction=="simple"){if(config.supportsTextContent){text=node.textContent}else{if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){text=node.childNodes[0].innerHTML}else{text=node.innerHTML}}}else{if(typeof(config.textExtraction)=="function"){text=config.textExtraction(node)}else{text=$(node).text()}}return text}function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){var pos=n[i][checkCell];rows.push(r[pos]);if(!table.config.appender){var l=r[pos].length;for(var j=0;j<l;j++){tableBody[0].appendChild(r[pos][j])}}}if(table.config.appender){table.config.appender(table,rows)}rows=null;if(table.config.debug){benchmark("Rebuilt table:",appendTime)}applyWidget(table);setTimeout(function(){$(table).trigger("sortEnd")},0)}function buildHeaders(table){if(table.config.debug){var time=new Date()}var meta=($.metadata)?true:false;var header_index=computeTableHeaderCellIndexes(table);$tableHeaders=$(table.config.selectorHeaders,table).each(function(index){this.column=header_index[this.parentNode.rowIndex+"-"+this.cellIndex];this.order=formatSortingOrder(table.config.sortInitialOrder);this.count=this.order;if(checkHeaderMetadata(this)||checkHeaderOptions(table,index)){this.sortDisabled=true}if(checkHeaderOptionsSortingLocked(table,index)){this.order=this.lockedOrder=checkHeaderOptionsSortingLocked(table,index)}if(!this.sortDisabled){var $th=$(this).addClass(table.config.cssHeader);if(table.config.onRenderHeader){table.config.onRenderHeader.apply($th)}}table.config.headerList[index]=this});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders)}return $tableHeaders}function computeTableHeaderCellIndexes(t){var matrix=[];var lookup={};var thead=t.getElementsByTagName("THEAD")[0];var trs=thead.getElementsByTagName("TR");for(var i=0;i<trs.length;i++){var cells=trs[i].cells;for(var j=0;j<cells.length;j++){var c=cells[j];var rowIndex=c.parentNode.rowIndex;var cellId=rowIndex+"-"+c.cellIndex;var rowSpan=c.rowSpan||1;var colSpan=c.colSpan||1;var firstAvailCol;if(typeof(matrix[rowIndex])=="undefined"){matrix[rowIndex]=[]}for(var k=0;k<matrix[rowIndex].length+1;k++){if(typeof(matrix[rowIndex][k])=="undefined"){firstAvailCol=k;break}}lookup[cellId]=firstAvailCol;for(var k=rowIndex;k<rowIndex+rowSpan;k++){if(typeof(matrix[k])=="undefined"){matrix[k]=[]}var matrixrow=matrix[k];for(var l=firstAvailCol;l<firstAvailCol+colSpan;l++){matrixrow[l]="x"}}}}return lookup}function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r[row].cells;for(var i=0;i<c.length;i++){var cell=c[i];if(cell.colSpan>1){arr=arr.concat(checkCellColSpan(table,headerArr,row++))}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell)}}}return arr}function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true}return false}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true}return false}function checkHeaderOptionsSortingLocked(table,i){if((table.config.headers[i])&&(table.config.headers[i].lockedOrder)){return table.config.headers[i].lockedOrder}return false}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i<l;i++){getWidgetById(c[i]).format(table)}}function getWidgetById(name){var l=widgets.length;for(var i=0;i<l;i++){if(widgets[i].id.toLowerCase()==name.toLowerCase()){return widgets[i]}}}function formatSortingOrder(v){if(typeof(v)!="Number"){return(v.toLowerCase()=="desc")?1:0}else{return(v==1)?1:0}}function isValueInArray(v,a){var l=a.length;for(var i=0;i<l;i++){if(a[i][0]==v){return true}}return false}function setHeadersCss(table,$headers,list,css){$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset){if(!this.sortDisabled){h[this.column]=$(this)}});var l=list.length;for(var i=0;i<l;i++){h[list[i][0]].addClass(css[list[i][1]])}}function fixColumnWidth(table,$headers){var c=table.config;if(c.widthFixed){var colgroup=$("<colgroup>");$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($("<col>").css("width",$(this).width()))});$(table).prepend(colgroup)}}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i<l;i++){var s=sortList[i],o=c.headerList[s[0]];o.count=s[1];o.count++}}function multisort(table,sortList,cache){if(table.config.debug){var sortTime=new Date()}var dynamicExp="var sortWrapper = function(a,b) {",l=sortList.length;for(var i=0;i<l;i++){var c=sortList[i][0];var order=sortList[i][1];var s=(table.config.parsers[c].type=="text")?((order==0)?makeSortFunction("text","asc",c):makeSortFunction("text","desc",c)):((order==0)?makeSortFunction("numeric","asc",c):makeSortFunction("numeric","desc",c));var e="e"+i;dynamicExp+="var "+e+" = "+s;dynamicExp+="if("+e+") { return "+e+"; } ";dynamicExp+="else { "}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+="return a["+orgOrderCol+"]-b["+orgOrderCol+"];";for(var i=0;i<l;i++){dynamicExp+="}; "}dynamicExp+="return 0; ";dynamicExp+="}; ";if(table.config.debug){benchmark("Evaling expression:"+dynamicExp,new Date())}eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time:",sortTime)}return cache}function makeSortFunction(type,direction,index){var a="a["+index+"]",b="b["+index+"]";if(type=="text"&&direction=="asc"){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+a+" < "+b+") ? -1 : 1 )));"}else{if(type=="text"&&direction=="desc"){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+b+" < "+a+") ? -1 : 1 )));"}else{if(type=="numeric"&&direction=="asc"){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+a+" - "+b+"));"}else{if(type=="numeric"&&direction=="desc"){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+b+" - "+a+"));"}}}}}function makeSortText(i){return"((a["+i+"] < b["+i+"]) ? -1 : ((a["+i+"] > b["+i+"]) ? 1 : 0));"}function makeSortTextDesc(i){return"((b["+i+"] < a["+i+"]) ? -1 : ((b["+i+"] > a["+i+"]) ? 1 : 0));"}function makeSortNumeric(i){return"a["+i+"]-b["+i+"];"}function makeSortNumericDesc(i){return"b["+i+"]-a["+i+"];"}function sortText(a,b){if(table.config.sortLocaleCompare){return a.localeCompare(b)}return((a<b)?-1:((a>b)?1:0))}function sortTextDesc(a,b){if(table.config.sortLocaleCompare){return b.localeCompare(a)}return((b<a)?-1:((b>a)?1:0))}function sortNumeric(a,b){return a-b}function sortNumericDesc(a,b){return b-a}function getCachedSortType(parsers,i){return parsers[i].type}this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies){return}var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$.data(this,"tablesorter",config);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){$this.trigger("sortStart");var $cell=$(this);var i=this.column;this.order=this.count++%2;if(this.lockedOrder){this.order=this.lockedOrder}if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j<a.length;j++){if(a[j][0]!=i){config.sortList.push(a[j])}}}config.sortList.push([i,this.order])}else{if(isValueInArray(i,config.sortList)){for(var j=0;j<config.sortList.length;j++){var s=config.sortList[j],o=config.headerList[s[0]];if(s[0]==i){o.count=s[1];o.count++;s[1]=o.count%2}}}else{config.sortList.push([i,this.order])}}setTimeout(function(){setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache))},1);return false}}).mousedown(function(){if(config.cancelSelection){this.onselectstart=function(){return false};return false}});$this.bind("update",function(){var me=this;setTimeout(function(){me.config.parsers=buildParserCache(me,$headers);cache=buildCache(me)},1)}).bind("updateCell",function(e,cell){var config=this.config;var pos=[(cell.parentNode.rowIndex-1),cell.cellIndex];cache.normalized[pos[0]][pos[1]]=config.parsers[pos[1]].format(getElementText(config,cell),cell)}).bind("sorton",function(e,list){$(this).trigger("sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache))}).bind("appendCache",function(){appendToTable(this,cache)}).bind("applyWidgetId",function(e,id){getWidgetById(id).format(this)}).bind("applyWidgets",function(){applyWidget(this)});if($.metadata&&($(this).metadata()&&$(this).metadata().sortlist)){config.sortList=$(this).metadata().sortlist}if(config.sortList.length>0){$this.trigger("sorton",[config.sortList])}applyWidget(this)})};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==parser.id.toLowerCase()){a=false}}if(a){parsers.push(parser)}};this.addWidget=function(widget){widgets.push(widget)};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i};this.isDigit=function(s,config){return/^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g,"")))};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild){this.removeChild(this.firstChild)}}empty.apply(table.tBodies[0])}else{table.tBodies[0].innerHTML=""}}}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true},format:function(s){return $.trim(s.toLocaleLowerCase())},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c)},format:function(s){return $.tablesorter.formatFloat(s)},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$€?.]/.test(s)},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g),""))},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s)},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a[i];if(item.length==2){r+="0"+item}else{r+=item}}return $.tablesorter.formatFloat(r)},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s)},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),""))},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s)},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0")},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s))},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""))},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/))},format:function(s){return $.tablesorter.formatFloat(new Date(s).getTime())},type:"numeric"});ts.addParser({id:"shortDate",is:function(s){return/\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s)},format:function(s,table){var c=table.config;s=s.replace(/\-/g,"/");if(c.dateFormat=="us"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$1/$2")}else{if(c.dateFormat=="uk"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$2/$1")}else{if(c.dateFormat=="dd/mm/yy"||c.dateFormat=="dd-mm-yy"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/,"$1/$2/$3")}}}return $.tablesorter.formatFloat(new Date(s).getTime())},type:"numeric"});ts.addParser({id:"time",is:function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s)},format:function(s){return $.tablesorter.formatFloat(new Date("2000/01/01 "+s).getTime())},type:"numeric"});ts.addParser({id:"metadata",is:function(s){return false},format:function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?"sortValue":c.parserMetadataName;return $(cell).metadata()[p]},type:"numeric"});ts.addWidget({id:"zebra",format:function(table){if(table.config.debug){var time=new Date()}var $tr,row=-1,odd;$("tr:visible",table.tBodies[0]).each(function(i){$tr=$(this);if(!$tr.hasClass(table.config.cssChildRow)){row++}odd=(row%2==0);$tr.removeClass(table.config.widgetZebra.css[odd?0:1]).addClass(table.config.widgetZebra.css[odd?1:0])});if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time)}}})})(jQuery);
\ No newline at end of file
diff --git a/orm/services/customer_manager/htmlcov/keybd_closed.png b/orm/services/customer_manager/htmlcov/keybd_closed.png
new file mode 100644
index 00000000..db114023
Binary files /dev/null and b/orm/services/customer_manager/htmlcov/keybd_closed.png differ
diff --git a/orm/services/customer_manager/htmlcov/keybd_open.png b/orm/services/customer_manager/htmlcov/keybd_open.png
new file mode 100644
index 00000000..db114023
Binary files /dev/null and b/orm/services/customer_manager/htmlcov/keybd_open.png differ
diff --git a/orm/services/customer_manager/htmlcov/status.json b/orm/services/customer_manager/htmlcov/status.json
new file mode 100644
index 00000000..1663a804
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/status.json
@@ -0,0 +1 @@
+{"files":{"cms_rest_logic___init___py":{"hash":"728d951134a7a78f5ec9a7378e040755","index":{"html_filename":"cms_rest_logic___init___py.html","nums":[1,0,0,0,0,0,0],"relative_filename":"cms_rest/logic/__init__.py"}},"cms_rest_controllers_v1_orm_customer_enabled_py":{"hash":"1caae979a2e0c9ac43d06583d236e996","index":{"html_filename":"cms_rest_controllers_v1_orm_customer_enabled_py.html","nums":[1,33,0,3,2,0,0],"relative_filename":"cms_rest/controllers/v1/orm/customer/enabled.py"}},"cms_rest_logic_metadata_logic_py":{"hash":"f7fee4c6fa8456e11912230b470d9f01","index":{"html_filename":"cms_rest_logic_metadata_logic_py.html","nums":[1,74,0,60,20,0,20],"relative_filename":"cms_rest/logic/metadata_logic.py"}},"cms_rest_model_Model_py":{"hash":"79840ec85df03bf26e2634abc99bfc3c","index":{"html_filename":"cms_rest_model_Model_py.html","nums":[1,7,0,1,0,0,0],"relative_filename":"cms_rest/model/Model.py"}},"cms_rest_logic_error_base_py":{"hash":"bf65a89429c9aa9b9e4e512a90644df1","index":{"html_filename":"cms_rest_logic_error_base_py.html","nums":[1,14,0,2,0,0,0],"relative_filename":"cms_rest/logic/error_base.py"}},"cms_rest_controllers_v1_orm_logs_py":{"hash":"6058454dbde7930f6ba6f740c9e7d41b","index":{"html_filename":"cms_rest_controllers_v1_orm_logs_py.html","nums":[1,33,0,20,4,0,4],"relative_filename":"cms_rest/controllers/v1/orm/logs.py"}},"cms_rest_controllers_v1_root_py":{"hash":"01d4ae5be4bbdf574b33f88bd3e970d9","index":{"html_filename":"cms_rest_controllers_v1_root_py.html","nums":[1,4,0,0,0,0,0],"relative_filename":"cms_rest/controllers/v1/root.py"}},"cms_rest_utils_authentication_py":{"hash":"a03f971ee460374f759ecd975bbffd3e","index":{"html_filename":"cms_rest_utils_authentication_py.html","nums":[1,43,0,7,8,1,5],"relative_filename":"cms_rest/utils/authentication.py"}},"cms_rest___init___py":{"hash":"728d951134a7a78f5ec9a7378e040755","index":{"html_filename":"cms_rest___init___py.html","nums":[1,0,0,0,0,0,0],"relative_filename":"cms_rest/__init__.py"}},"cms_rest_logic_customer_logic_py":{"hash":"aaa28ac4a086829a11df6f6e60eceb52","index":{"html_filename":"cms_rest_logic_customer_logic_py.html","nums":[1,466,0,64,162,34,56],"relative_filename":"cms_rest/logic/customer_logic.py"}},"cms_rest_controllers_v1_base_py":{"hash":"d288afe294485499fdf2f2571497f1cc","index":{"html_filename":"cms_rest_controllers_v1_base_py.html","nums":[1,16,0,4,0,0,0],"relative_filename":"cms_rest/controllers/v1/base.py"}},"cms_rest_controllers_v1_orm_root_py":{"hash":"22883791133c4455fe7dbcabed7be2e5","index":{"html_filename":"cms_rest_controllers_v1_orm_root_py.html","nums":[1,8,0,0,0,0,0],"relative_filename":"cms_rest/controllers/v1/orm/root.py"}},"cms_rest_controllers_v1_orm_customer_regions_py":{"hash":"04715be09505985f1d315d1e5019c94e","index":{"html_filename":"cms_rest_controllers_v1_orm_customer_regions_py.html","nums":[1,75,0,3,12,2,2],"relative_filename":"cms_rest/controllers/v1/orm/customer/regions.py"}},"cms_rest_controllers_v1_orm_customer_metadata_py":{"hash":"b81642f7998bbcb386a23ed5ef500b49","index":{"html_filename":"cms_rest_controllers_v1_orm_customer_metadata_py.html","nums":[1,52,0,0,16,0,0],"relative_filename":"cms_rest/controllers/v1/orm/customer/metadata.py"}},"cms_rest_controllers_v1_orm_configuration_py":{"hash":"54db197f1995b3e76b9947fe9063f0a4","index":{"html_filename":"cms_rest_controllers_v1_orm_configuration_py.html","nums":[1,14,0,0,0,0,0],"relative_filename":"cms_rest/controllers/v1/orm/configuration.py"}},"cms_rest_model___init___py":{"hash":"bdd684a96f27b519298c641fd40cd490","index":{"html_filename":"cms_rest_model___init___py.html","nums":[1,3,0,0,0,0,0],"relative_filename":"cms_rest/model/__init__.py"}},"cms_rest_controllers_v1___init___py":{"hash":"728d951134a7a78f5ec9a7378e040755","index":{"html_filename":"cms_rest_controllers_v1___init___py.html","nums":[1,0,0,0,0,0,0],"relative_filename":"cms_rest/controllers/v1/__init__.py"}},"cms_rest_app_py":{"hash":"717970ef733af841075207a61e7f5cda","index":{"html_filename":"cms_rest_app_py.html","nums":[1,22,0,3,2,1,1],"relative_filename":"cms_rest/app.py"}},"cms_rest_controllers_v1_orm_customer_users_py":{"hash":"0b5d06f23544f16981d66e801dea8739","index":{"html_filename":"cms_rest_controllers_v1_orm_customer_users_py.html","nums":[1,138,0,15,30,9,9],"relative_filename":"cms_rest/controllers/v1/orm/customer/users.py"}},"cms_rest_controllers_v1_orm___init___py":{"hash":"728d951134a7a78f5ec9a7378e040755","index":{"html_filename":"cms_rest_controllers_v1_orm___init___py.html","nums":[1,0,0,0,0,0,0],"relative_filename":"cms_rest/controllers/v1/orm/__init__.py"}},"cms_rest_controllers___init___py":{"hash":"728d951134a7a78f5ec9a7378e040755","index":{"html_filename":"cms_rest_controllers___init___py.html","nums":[1,0,0,0,0,0,0],"relative_filename":"cms_rest/controllers/__init__.py"}},"cms_rest_controllers_root_py":{"hash":"862e4db999fccbf0a8cd9b67ae06853f","index":{"html_filename":"cms_rest_controllers_root_py.html","nums":[1,10,0,1,0,0,0],"relative_filename":"cms_rest/controllers/root.py"}},"cms_rest_model_Models_py":{"hash":"502069b9b688b4a09f64212e755e8b56","index":{"html_filename":"cms_rest_model_Models_py.html","nums":[1,241,0,5,32,6,8],"relative_filename":"cms_rest/model/Models.py"}},"cms_rest_utils___init___py":{"hash":"728d951134a7a78f5ec9a7378e040755","index":{"html_filename":"cms_rest_utils___init___py.html","nums":[1,0,0,0,0,0,0],"relative_filename":"cms_rest/utils/__init__.py"}},"cms_rest_controllers_v1_orm_customer___init___py":{"hash":"728d951134a7a78f5ec9a7378e040755","index":{"html_filename":"cms_rest_controllers_v1_orm_customer___init___py.html","nums":[1,0,0,0,0,0,0],"relative_filename":"cms_rest/controllers/v1/orm/customer/__init__.py"}},"cms_rest_controllers_v1_orm_customer_root_py":{"hash":"4dfb5e6249fd87d06bbb96d4a405d3d7","index":{"html_filename":"cms_rest_controllers_v1_orm_customer_root_py.html","nums":[1,111,0,3,14,1,1],"relative_filename":"cms_rest/controllers/v1/orm/customer/root.py"}},"cms_rest_logger___init___py":{"hash":"61ebacba73bd1a40d7e17a1473b91d4c","index":{"html_filename":"cms_rest_logger___init___py.html","nums":[1,6,0,0,2,0,0],"relative_filename":"cms_rest/logger/__init__.py"}},"cms_rest_rds_proxy_py":{"hash":"6ea3e8406c4ae93d07f45ee9ce171227","index":{"html_filename":"cms_rest_rds_proxy_py.html","nums":[1,47,0,12,8,1,1],"relative_filename":"cms_rest/rds_proxy.py"}}},"format":1,"settings":"6bb56ead116a771f5ff13676a6ea37cc","version":"4.4"}
\ No newline at end of file
diff --git a/orm/services/customer_manager/htmlcov/style.css b/orm/services/customer_manager/htmlcov/style.css
new file mode 100644
index 00000000..86b82091
--- /dev/null
+++ b/orm/services/customer_manager/htmlcov/style.css
@@ -0,0 +1,375 @@
+/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */
+/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */
+
+/* CSS styles for coverage.py. */
+
+/* Page-wide styles */
+html, body, h1, h2, h3, p, table, td, th {
+    margin: 0;
+    padding: 0;
+    border: 0;
+    outline: 0;
+    font-weight: inherit;
+    font-style: inherit;
+    font-size: 100%;
+    font-family: inherit;
+    vertical-align: baseline;
+    }
+
+/* Set baseline grid to 16 pt. */
+body {
+    font-family: georgia, serif;
+    font-size: 1em;
+    }
+
+html>body {
+    font-size: 16px;
+    }
+
+/* Set base font size to 12/16 */
+p {
+    font-size: .75em;           /* 12/16 */
+    line-height: 1.33333333em;  /* 16/12 */
+    }
+
+table {
+    border-collapse: collapse;
+    }
+td {
+    vertical-align: top;
+}
+table tr.hidden {
+    display: none !important;
+    }
+
+p#no_rows {
+    display: none;
+    font-size: 1.2em;
+    }
+
+a.nav {
+    text-decoration: none;
+    color: inherit;
+    }
+a.nav:hover {
+    text-decoration: underline;
+    color: inherit;
+    }
+
+/* Page structure */
+#header {
+    background: #f8f8f8;
+    width: 100%;
+    border-bottom: 1px solid #eee;
+    }
+
+#source {
+    padding: 1em;
+    font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
+    }
+
+.indexfile #footer {
+    margin: 1em 3em;
+    }
+
+.pyfile #footer {
+    margin: 1em 1em;
+    }
+
+#footer .content {
+    padding: 0;
+    font-size: 85%;
+    font-family: verdana, sans-serif;
+    color: #666666;
+    font-style: italic;
+    }
+
+#index {
+    margin: 1em 0 0 3em;
+    }
+
+/* Header styles */
+#header .content {
+    padding: 1em 3em;
+    }
+
+h1 {
+    font-size: 1.25em;
+    display: inline-block;
+}
+
+#filter_container {
+    display: inline-block;
+    float: right;
+    margin: 0 2em 0 0;
+}
+#filter_container input {
+    width: 10em;
+}
+
+h2.stats {
+    margin-top: .5em;
+    font-size: 1em;
+}
+.stats span {
+    border: 1px solid;
+    padding: .1em .25em;
+    margin: 0 .1em;
+    cursor: pointer;
+    border-color: #999 #ccc #ccc #999;
+}
+.stats span.hide_run, .stats span.hide_exc,
+.stats span.hide_mis, .stats span.hide_par,
+.stats span.par.hide_run.hide_par {
+    border-color: #ccc #999 #999 #ccc;
+}
+.stats span.par.hide_run {
+    border-color: #999 #ccc #ccc #999;
+}
+
+.stats span.run {
+    background: #ddffdd;
+}
+.stats span.exc {
+    background: #eeeeee;
+}
+.stats span.mis {
+    background: #ffdddd;
+}
+.stats span.hide_run {
+    background: #eeffee;
+}
+.stats span.hide_exc {
+    background: #f5f5f5;
+}
+.stats span.hide_mis {
+    background: #ffeeee;
+}
+.stats span.par {
+    background: #ffffaa;
+}
+.stats span.hide_par {
+    background: #ffffcc;
+}
+
+/* Help panel */
+#keyboard_icon {
+    float: right;
+    margin: 5px;
+    cursor: pointer;
+}
+
+.help_panel {
+    position: absolute;
+    background: #ffffcc;
+    padding: .5em;
+    border: 1px solid #883;
+    display: none;
+}
+
+.indexfile .help_panel {
+    width: 20em; height: 4em;
+}
+
+.pyfile .help_panel {
+    width: 16em; height: 8em;
+}
+
+.help_panel .legend {
+    font-style: italic;
+    margin-bottom: 1em;
+}
+
+#panel_icon {
+    float: right;
+    cursor: pointer;
+}
+
+.keyhelp {
+    margin: .75em;
+}
+
+.keyhelp .key {
+    border: 1px solid black;
+    border-color: #888 #333 #333 #888;
+    padding: .1em .35em;
+    font-family: monospace;
+    font-weight: bold;
+    background: #eee;
+}
+
+/* Source file styles */
+.linenos p {
+    text-align: right;
+    margin: 0;
+    padding: 0 .5em;
+    color: #999999;
+    font-family: verdana, sans-serif;
+    font-size: .625em;   /* 10/16 */
+    line-height: 1.6em;  /* 16/10 */
+    }
+.linenos p.highlight {
+    background: #ffdd00;
+    }
+.linenos p a {
+    text-decoration: none;
+    color: #999999;
+    }
+.linenos p a:hover {
+    text-decoration: underline;
+    color: #999999;
+    }
+
+td.text {
+    width: 100%;
+    }
+.text p {
+    margin: 0;
+    padding: 0 0 0 .5em;
+    border-left: 2px solid #ffffff;
+    white-space: pre;
+    position: relative;
+    }
+
+.text p.mis {
+    background: #ffdddd;
+    border-left: 2px solid #ff0000;
+    }
+.text p.run, .text p.run.hide_par {
+    background: #ddffdd;
+    border-left: 2px solid #00ff00;
+    }
+.text p.exc {
+    background: #eeeeee;
+    border-left: 2px solid #808080;
+    }
+.text p.par, .text p.par.hide_run {
+    background: #ffffaa;
+    border-left: 2px solid #eeee99;
+    }
+.text p.hide_run, .text p.hide_exc, .text p.hide_mis, .text p.hide_par,
+.text p.hide_run.hide_par {
+    background: inherit;
+    }
+
+.text span.annotate {
+    font-family: georgia;
+    color: #666;
+    float: right;
+    padding-right: .5em;
+    }
+.text p.hide_par span.annotate {
+    display: none;
+    }
+.text span.annotate.long {
+    display: none;
+    }
+.text p:hover span.annotate.long {
+    display: block;
+    max-width: 50%;
+    white-space: normal;
+    float: right;
+    position: absolute;
+    top: 1.75em;
+    right: 1em;
+    width: 30em;
+    height: auto;
+    color: #333;
+    background: #ffffcc;
+    border: 1px solid #888;
+    padding: .25em .5em;
+    z-index: 999;
+    border-radius: .2em;
+    box-shadow: #cccccc .2em .2em .2em;
+    }
+
+/* Syntax coloring */
+.text .com {
+    color: green;
+    font-style: italic;
+    line-height: 1px;
+    }
+.text .key {
+    font-weight: bold;
+    line-height: 1px;
+    }
+.text .str {
+    color: #000080;
+    }
+
+/* index styles */
+#index td, #index th {
+    text-align: right;
+    width: 5em;
+    padding: .25em .5em;
+    border-bottom: 1px solid #eee;
+    }
+#index th {
+    font-style: italic;
+    color: #333;
+    border-bottom: 1px solid #ccc;
+    cursor: pointer;
+    }
+#index th:hover {
+    background: #eee;
+    border-bottom: 1px solid #999;
+    }
+#index td.left, #index th.left {
+    padding-left: 0;
+    }
+#index td.right, #index th.right {
+    padding-right: 0;
+    }
+#index th.headerSortDown, #index th.headerSortUp {
+    border-bottom: 1px solid #000;
+    white-space: nowrap;
+    background: #eee;
+    }
+#index th.headerSortDown:after {
+    content: " ↓";
+}
+#index th.headerSortUp:after {
+    content: " ↑";
+}
+#index td.name, #index th.name {
+    text-align: left;
+    width: auto;
+    }
+#index td.name a {
+    text-decoration: none;
+    color: #000;
+    }
+#index tr.total,
+#index tr.total_dynamic {
+    }
+#index tr.total td,
+#index tr.total_dynamic td {
+    font-weight: bold;
+    border-top: 1px solid #ccc;
+    border-bottom: none;
+    }
+#index tr.file:hover {
+    background: #eeeeee;
+    }
+#index tr.file:hover td.name {
+    text-decoration: underline;
+    color: #000;
+    }
+
+/* scroll marker styles */
+#scroll_marker {
+    position: fixed;
+    right: 0;
+    top: 0;
+    width: 16px;
+    height: 100%;
+    background: white;
+    border-left: 1px solid #eee;
+    }
+
+#scroll_marker .marker {
+    background: #eedddd;
+    position: absolute;
+    min-height: 3px;
+    width: 100%;
+    }
diff --git a/orm/services/customer_manager/package.json b/orm/services/customer_manager/package.json
new file mode 100755
index 00000000..bd81d758
--- /dev/null
+++ b/orm/services/customer_manager/package.json
@@ -0,0 +1,33 @@
+{
+  "name": "aic-orm-discovery",
+  "version": "1.0.0",
+  "description": "This document includes the following topics 1. Dev environment installation process 1. Code style guide 1. Python tips and tricks",
+  "main": "gulpfile.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "ssh://dv696w@gerrit.mtn5.cci.att.com:29418/aic-orm-discovery"
+  },
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "body-parser": "~1.13.2",
+    "cookie-parser": "~1.3.5",
+    "debug": "~2.2.0",
+    "express": "~4.13.1",
+    "jade": "~1.11.0",
+    "morgan": "~1.6.1",
+    "serve-favicon": "~2.3.0"
+  },
+  "devDependencies": {
+    "gulp": "^3.9.1",
+    "gulp-env": "^0.4.0",
+    "gulp-express": "^0.3.5",
+    "gulp-nodemon": "^2.0.6",
+    "gulp-shell": "^0.5.2",
+    "minimist": "^1.2.0",
+    "uuid": "^2.0.1"
+  }
+}
diff --git a/orm/services/customer_manager/public/css/style.css b/orm/services/customer_manager/public/css/style.css
new file mode 100644
index 00000000..55c9db54
--- /dev/null
+++ b/orm/services/customer_manager/public/css/style.css
@@ -0,0 +1,43 @@
+body {
+  background: #311F00;
+  color: white;
+  font-family: 'Helvetica Neue', 'Helvetica', 'Verdana', sans-serif;
+  padding: 1em 2em;
+}
+
+a {
+  color: #FAFF78;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+div#content  {
+  width: 800px;
+  margin: 0 auto;
+}
+
+form {
+  margin: 0;
+  padding: 0;
+  border: 0;
+}
+
+fieldset {
+  border: 0;
+}
+
+input.error {
+  background: #FAFF78;
+}
+
+header {
+  text-align: center;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  font-family: 'Futura-CondensedExtraBold', 'Futura', 'Helvetica', sans-serif;
+  text-transform: uppercase;
+}
diff --git a/orm/services/customer_manager/public/images/logo.png b/orm/services/customer_manager/public/images/logo.png
new file mode 100644
index 00000000..a8f403e4
Binary files /dev/null and b/orm/services/customer_manager/public/images/logo.png differ
diff --git a/orm/services/customer_manager/pycharm_init.py b/orm/services/customer_manager/pycharm_init.py
new file mode 100755
index 00000000..469a65d9
--- /dev/null
+++ b/orm/services/customer_manager/pycharm_init.py
@@ -0,0 +1,3 @@
+from pecan.commands import CommandRunner
+runner = CommandRunner()
+runner.run(['serve', 'config.py'])
diff --git a/orm/services/customer_manager/rds_mock/app.js b/orm/services/customer_manager/rds_mock/app.js
new file mode 100644
index 00000000..4f32d9f9
--- /dev/null
+++ b/orm/services/customer_manager/rds_mock/app.js
@@ -0,0 +1,63 @@
+var express = require('express');
+var path = require('path');
+var favicon = require('serve-favicon');
+var logger = require('morgan');
+var cookieParser = require('cookie-parser');
+var bodyParser = require('body-parser');
+
+var routes = require('./routes/index');
+var users = require('./routes/users');
+
+var app = express();
+
+// view engine setup
+app.set('views', path.join(__dirname, 'views'));
+app.set('view engine', 'jade');
+
+// uncomment after placing your favicon in /public
+//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
+app.use(logger('short'));
+app.use(bodyParser.json());
+app.use(bodyParser.urlencoded({ extended: false }));
+app.use(cookieParser());
+app.use(express.static(path.join(__dirname, 'public')));
+
+app.use('/', routes);
+app.use('/users', users);
+app.use('/uuid', require('./routes/uuid'));
+app.use('/rds', require('./routes/rds'));
+app.use('/audit', require('./routes/audit'));
+
+// catch 404 and forward to error handler
+app.use(function(req, res, next) {
+  var err = new Error('Not Found');
+  err.status = 404;
+  next(err);
+});
+
+// error handlers
+
+// development error handler
+// will print stacktrace
+if (app.get('env') === 'development') {
+  app.use(function(err, req, res, next) {
+    res.status(err.status || 500);
+    res.render('error', {
+      message: err.message,
+      error: err
+    });
+  });
+}
+
+// production error handler
+// no stacktraces leaked to user
+app.use(function(err, req, res, next) {
+  res.status(err.status || 500);
+  res.render('error', {
+    message: err.message,
+    error: {}
+  });
+});
+
+
+module.exports = app;
diff --git a/orm/services/customer_manager/rds_mock/public/stylesheets/style.css b/orm/services/customer_manager/rds_mock/public/stylesheets/style.css
new file mode 100644
index 00000000..9453385b
--- /dev/null
+++ b/orm/services/customer_manager/rds_mock/public/stylesheets/style.css
@@ -0,0 +1,8 @@
+body {
+  padding: 50px;
+  font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
+}
+
+a {
+  color: #00B7FF;
+}
diff --git a/orm/services/customer_manager/rds_mock/routes/audit.js b/orm/services/customer_manager/rds_mock/routes/audit.js
new file mode 100644
index 00000000..51b5b7f6
--- /dev/null
+++ b/orm/services/customer_manager/rds_mock/routes/audit.js
@@ -0,0 +1,8 @@
+var router = require('express').Router();
+
+router.post('/v1/audit/transaction', (req, res)=> {
+    res.status(200).end();
+    console.log(req.body);
+});
+
+module.exports = router;
diff --git a/orm/services/customer_manager/rds_mock/routes/index.js b/orm/services/customer_manager/rds_mock/routes/index.js
new file mode 100644
index 00000000..ecca96a5
--- /dev/null
+++ b/orm/services/customer_manager/rds_mock/routes/index.js
@@ -0,0 +1,9 @@
+var express = require('express');
+var router = express.Router();
+
+/* GET home page. */
+router.get('/', function(req, res, next) {
+  res.render('index', { title: 'Express' });
+});
+
+module.exports = router;
diff --git a/orm/services/customer_manager/rds_mock/routes/rds.js b/orm/services/customer_manager/rds_mock/routes/rds.js
new file mode 100644
index 00000000..347d719c
--- /dev/null
+++ b/orm/services/customer_manager/rds_mock/routes/rds.js
@@ -0,0 +1,60 @@
+var router = require('express').Router();
+var fs = require('fs');
+
+router.post('/v1/rds/resources', (req, res)=> {
+   var model = JSON.parse(req.body.service_template.model);
+   console.log(model, null, 2);
+   res.status(201).json({
+       'customer': {
+           'id': '70383330-f107-11e5-9d3c-005056a504e9',
+           'links': {
+               'own': 'http://172.20.90.179:8777/v1/rds/customer/70383330-f107-11e5-9d3c-005056a504e9'
+           },
+           'created': '703ca0a0-f107-11e5-9d3c-005056a504e9'
+       }
+   });
+
+    fs.writeFileSync(__dirname + '/rds_resource_put.json', req.body.service_template.model);
+});
+
+router.put('/v1/rds/resources', (req, res)=> {
+   var model = JSON.parse(req.body.service_template.model);
+   console.log(model, null, 2);
+   res.status(201).json({
+       'customer': {
+           'id': '70383330-f107-11e5-9d3c-005056a504e9',
+           'links': {
+               'own': 'http://172.20.90.179:8777/v1/rds/customer/70383330-f107-11e5-9d3c-005056a504e9'
+           },
+           'created': '703ca0a0-f107-11e5-9d3c-005056a504e9'
+       }
+   });
+
+    fs.writeFileSync(__dirname + '/rds_resource_put.json', req.body.service_template.model);
+});
+
+router.get('/v1/rds/status/resource/:id', (req, res)=>{
+	id = req.params.id
+	res.status(200).json({
+		'status': 'pending', 
+		'regions': [
+		           {
+		        	'region': 'SAN1',
+		        	'status': 'success',
+		        	'resource-id': id
+		           },
+		           {
+		        	'region': 'AIC_MEDIUM',
+		        	'status': 'error',
+		        	'resource-id': id
+		           },
+		           {
+		        	'region': 'dla1',
+		        	'status': 'success',
+		        	'resource-id': id
+		           },
+	           ]
+	})
+})
+
+module.exports = router;
diff --git a/orm/services/customer_manager/rds_mock/routes/users.js b/orm/services/customer_manager/rds_mock/routes/users.js
new file mode 100644
index 00000000..623e4302
--- /dev/null
+++ b/orm/services/customer_manager/rds_mock/routes/users.js
@@ -0,0 +1,9 @@
+var express = require('express');
+var router = express.Router();
+
+/* GET users listing. */
+router.get('/', function(req, res, next) {
+  res.send('respond with a resource');
+});
+
+module.exports = router;
diff --git a/orm/services/customer_manager/rds_mock/routes/uuid.js b/orm/services/customer_manager/rds_mock/routes/uuid.js
new file mode 100644
index 00000000..20e34691
--- /dev/null
+++ b/orm/services/customer_manager/rds_mock/routes/uuid.js
@@ -0,0 +1,10 @@
+var router = require('express').Router();
+var uuid = require('uuid');
+
+router.post('/v1/uuids', (req, res)=>{
+    res.json({
+        uuid: uuid.v1()
+    });
+});
+
+module.exports = router;
\ No newline at end of file
diff --git a/orm/services/customer_manager/rds_mock/views/error.jade b/orm/services/customer_manager/rds_mock/views/error.jade
new file mode 100644
index 00000000..51ec12c6
--- /dev/null
+++ b/orm/services/customer_manager/rds_mock/views/error.jade
@@ -0,0 +1,6 @@
+extends layout
+
+block content
+  h1= message
+  h2= error.status
+  pre #{error.stack}
diff --git a/orm/services/customer_manager/rds_mock/views/index.jade b/orm/services/customer_manager/rds_mock/views/index.jade
new file mode 100644
index 00000000..3d63b9a0
--- /dev/null
+++ b/orm/services/customer_manager/rds_mock/views/index.jade
@@ -0,0 +1,5 @@
+extends layout
+
+block content
+  h1= title
+  p Welcome to #{title}
diff --git a/orm/services/customer_manager/rds_mock/views/layout.jade b/orm/services/customer_manager/rds_mock/views/layout.jade
new file mode 100644
index 00000000..15af079b
--- /dev/null
+++ b/orm/services/customer_manager/rds_mock/views/layout.jade
@@ -0,0 +1,7 @@
+doctype html
+html
+  head
+    title= title
+    link(rel='stylesheet', href='/stylesheets/style.css')
+  body
+    block content
diff --git a/orm/services/customer_manager/run_pecan.py b/orm/services/customer_manager/run_pecan.py
new file mode 100644
index 00000000..4d1ce01d
--- /dev/null
+++ b/orm/services/customer_manager/run_pecan.py
@@ -0,0 +1,6 @@
+'''
+' this script is running the pecan web server inside ide so we can set break points in the code and debug our code
+'''
+from pecan.commands import CommandRunner
+runner = CommandRunner()
+runner.run(['serve', 'config.py'])
diff --git a/orm/services/customer_manager/scripts/db_scripts/aic_orm_cms_create_db.sql b/orm/services/customer_manager/scripts/db_scripts/aic_orm_cms_create_db.sql
new file mode 100755
index 00000000..e70f749c
--- /dev/null
+++ b/orm/services/customer_manager/scripts/db_scripts/aic_orm_cms_create_db.sql
@@ -0,0 +1,90 @@
+create database if not exists orm_cms_db DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+use orm_cms_db;
+
+create table if not exists cms_role
+   (
+	 id integer auto_increment not null,
+	 name varchar(64) not null,
+	 primary key (id));
+
+create table if not exists cms_user
+   (
+	 id integer auto_increment not null,
+	 name varchar(64) not null,
+	 primary key (id),
+	 unique name_idx (name));
+
+create table if not exists region
+   (
+	 id integer auto_increment not null,
+	 name varchar(64) not null,
+	 type varchar(64) not null,
+	 primary key (id),
+	 unique name_idx (name));
+
+
+create table if not exists customer
+   (
+	 id integer auto_increment not null,
+	 uuid varchar(64) not null,
+ 	 name varchar(64) not null,
+	 description varchar(255) not null,
+	 enabled tinyint not null,
+	 primary key (id),
+	 unique uuid_idx (uuid),
+	 unique name_idx(name));
+
+create table if not exists customer_metadata
+	(
+	 customer_id integer not null,
+	 field_key varchar(64) not null,
+	 field_value varchar(64) not null,
+	 primary key (customer_id, field_key),
+	 foreign key (customer_id) references customer(id) ON DELETE CASCADE
+	);
+
+create table if not exists customer_region
+   (
+	 customer_id integer not null,
+	 region_id integer not null,
+	 primary key (customer_id,region_id),
+	 index region_id (region_id),
+  	 foreign key (customer_id) REFERENCES `customer` (`id`) ON DELETE CASCADE,
+	 foreign key (region_id) REFERENCES `region` (`id`));
+
+create table if not exists quota
+   (
+	 id integer auto_increment not null,
+	 customer_id integer not null,
+	 region_id integer not null,
+	 quota_type varchar(64) not null,
+	 foreign key (region_id) references region(id),
+	 primary key (id),
+	 unique quota_type (customer_id,region_id,quota_type),
+	 foreign key (`customer_id`, `region_id`) REFERENCES `customer_region` (`customer_id`, `region_id`) ON DELETE CASCADE ON UPDATE NO ACTION
+   );
+
+create table if not exists quota_field_detail
+   (
+	 id integer auto_increment not null,
+	 quota_id integer not null,
+	 field_key varchar(64) not null,
+	 field_value varchar(64) not null,
+	 primary key (id),
+	 foreign key (quota_id) references quota(id) ON DELETE CASCADE,
+	 unique key_idx (quota_id,field_key));
+
+create table if not exists user_role
+   (
+	 customer_id integer not null,
+	 region_id integer not null,
+	 user_id integer not null,
+	 role_id integer not null,
+	 primary key (customer_id,region_id,user_id,role_id),
+	 foreign key (customer_id, region_id) REFERENCES customer_region (`customer_id`, `region_id`) ON DELETE CASCADE,
+	 foreign key (customer_id) references customer(id) ON DELETE CASCADE,
+	 foreign key (region_id) references region(id),
+	 foreign key (user_id) references cms_user(id),
+	 foreign key (role_id) references cms_role(id),
+	 index region_id (region_id),
+	 index user_id (user_id));
diff --git a/orm/services/customer_manager/scripts/db_scripts/aic_orm_cms_update_db.sql b/orm/services/customer_manager/scripts/db_scripts/aic_orm_cms_update_db.sql
new file mode 100644
index 00000000..5944a5af
--- /dev/null
+++ b/orm/services/customer_manager/scripts/db_scripts/aic_orm_cms_update_db.sql
@@ -0,0 +1,102 @@
+USE orm_cms_db;
+DROP PROCEDURE IF EXISTS MoveKeyToQuota;
+DELIMITER ;;
+CREATE PROCEDURE `MoveKeyToQuota`(p_field_key varchar(64), p_quota varchar(64))
+BEGIN
+  DECLARE bDone INT;
+
+  # quota_field_detail fields
+  DECLARE v_quota_field_id INT;    -- or approriate type
+  DECLARE v_quota_field_quota_id INT;
+  DECLARE v_quota_field_field_key VARCHAR(64);
+  DECLARE v_quota_field_field_value VARCHAR(64);
+
+  # quota fields
+  DECLARE v_quota_id INT;    -- or approriate type
+  DECLARE v_quota_customer_id INT;
+  DECLARE v_quota_region_id INT;
+  DECLARE v_quota_quota_type VARCHAR(64);
+
+
+  DECLARE security_elements CURSOR FOR SELECT id, quota_id, field_key, field_value FROM quota_field_detail where field_key = p_field_key;
+  DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;
+
+  START TRANSACTION;
+
+  OPEN security_elements;
+
+  SET bDone = 0;
+
+  label_begin_loop: LOOP
+    FETCH security_elements INTO v_quota_field_id, v_quota_field_quota_id, v_quota_field_field_key, v_quota_field_field_value;
+    IF bDone = 1 THEN
+      LEAVE label_begin_loop;
+    END IF;
+
+    BEGIN
+        DECLARE CONTINUE HANDLER FOR NOT FOUND BEGIN END;
+        SELECT v_quota_field_id, v_quota_field_quota_id, v_quota_field_field_key, v_quota_field_field_value;
+
+        # get the first quota for this quota_field
+        SELECT id, customer_id, region_id, quota_type INTO v_quota_id, v_quota_customer_id, v_quota_region_id, v_quota_quota_type FROM quota WHERE id = v_quota_field_quota_id LIMIT 1;
+        # disply the quata
+        SELECT v_quota_id, v_quota_customer_id, v_quota_region_id, v_quota_quota_type;
+
+        SET v_quota_id = 0;
+
+        SELECT id, customer_id, region_id, quota_type INTO v_quota_id, v_quota_customer_id, v_quota_region_id, v_quota_quota_type FROM quota
+             WHERE customer_id = v_quota_customer_id AND region_id = v_quota_region_id AND quota_type = p_quota LIMIT 1;
+
+        SELECT v_quota_id, v_quota_customer_id, v_quota_region_id, v_quota_quota_type;
+
+        IF  v_quota_id = 0 THEN
+          INSERT INTO `quota`
+          (`customer_id`, `region_id`, `quota_type`)
+          VALUES
+          (v_quota_customer_id, v_quota_region_id, p_quota);
+
+          SELECT last_insert_id() INTO v_quota_id;
+              SELECT v_quota_id;
+        END IF;
+
+        UPDATE quota_field_detail SET quota_id = v_quota_id WHERE id = v_quota_field_id;
+    END;
+  END LOOP label_begin_loop;
+
+  CLOSE security_elements;
+
+  COMMIT;
+END;;
+DELIMITER ;
+
+CALL MoveKeyToQuota('security_groups', 'network');
+CALL MoveKeyToQuota('security_group_rules', 'network');
+SELECT "LIST OF ALL Security Items" as "";
+SELECT "==========================" as "";
+SELECT q.*, qfd.* FROM quota_field_detail qfd
+	left join quota q on (q.id = qfd.quota_id) where qfd.field_key like "security%";
+
+DELIMITER ;;
+
+DROP PROCEDURE IF EXISTS add_regoion_type ;;
+CREATE PROCEDURE add_regoion_type()
+BEGIN
+
+	-- add a column safely
+	IF NOT EXISTS( (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE()
+			AND COLUMN_NAME='type' AND TABLE_NAME='region') ) THEN
+		ALTER TABLE region ADD type varchar(32) NOT NULL DEFAULT 'single';
+  ELSE
+    UPDATE region set type = "single" where id = -1;
+	END IF;
+
+	IF NOT EXISTS( SELECT * FROM region WHERE id=-1) THEN
+  	insert ignore into region(id,name,type) values(-1, "DEFAULT", "single");
+	END IF;
+
+END ;;
+
+CALL add_regoion_type() ;;
+
+DELIMITER ;
+
diff --git a/orm/services/customer_manager/scripts/shell_scripts/create_db.sh b/orm/services/customer_manager/scripts/shell_scripts/create_db.sh
new file mode 100755
index 00000000..e46e6d24
--- /dev/null
+++ b/orm/services/customer_manager/scripts/shell_scripts/create_db.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+echo Creating database: orm_cms_db
+
+mysql -uroot -pstack < ../db_scripts/aic_orm_cms_create_db.sql
+
+echo Done !
diff --git a/orm/services/customer_manager/swagger/swagger.yaml b/orm/services/customer_manager/swagger/swagger.yaml
new file mode 100644
index 00000000..892cea08
--- /dev/null
+++ b/orm/services/customer_manager/swagger/swagger.yaml
@@ -0,0 +1,1072 @@
+# this is an example of the Uber API
+# as a demonstration of an API spec in YAML
+swagger: '2.0'
+info:
+  version: 3.5.0
+  title: CMS API
+  description: CMS API.
+                All api's should supply two header parameters
+                X-Auth-Token - Token received from keystone, and
+                X-Auth-Region - The region
+
+# the domain of the service
+host: 135.76.2.229
+# array of all schemes that your API supports
+schemes:
+  - https
+
+# will be prefixed to all paths
+basePath: /v1/orm
+produces:
+  - application/json
+
+paths:
+  /customers:
+    parameters:
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+      - $ref: "#/parameters/Client"
+    post:
+      summary: create customer
+      description: |
+        Create a new customer and send it to Heat to create this customer in each region needed
+        Return all data of the new customer
+      parameters:
+        - name: full customer
+          in: body
+          description: input body to create full customer
+          schema:
+            $ref: '#/definitions/Customer'
+          required: true
+
+      tags:
+        - Customer
+
+      responses:
+        201:
+          description: customer is created
+          schema:
+              $ref: '#/definitions/Customer'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        409:
+          description: Duplicate Error
+          schema:
+            $ref: '#/definitions/409'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    get:
+      summary: get a list of customers by criteria (region, user, starts_with, contains, metadata)
+      description: |
+        The get customers retrieves all customers that match the above criteria
+      parameters:
+        - name: region
+          in: query
+          type: "string"
+          required: false
+          description: Customer region
+        - name: user
+          in: query
+          type: "string"
+          description: Customer user
+          required: false
+        - name: starts_with
+          in: query
+          type: "string"
+          description: Get only customers whose name starts with this string
+          required: false
+        - name: contains
+          in: query
+          type: "string"
+          description: Get only customers whose name contains this string
+          required: false
+        - name: metadata
+          in: query
+          type: "array"
+          items:
+            type: string
+          description: Metadata keys
+          required: false
+      tags:
+        - Customer
+      responses:
+        200:
+          description: list of customers by criteria
+          schema:
+              $ref: '#/definitions/Customers'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /customers/{customer_uuid}:
+    parameters:
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+      - $ref: "#/parameters/Client"
+    get:
+      summary: Get customer by id or name
+      description: Get a single customer by id or name
+      parameters:
+        - name: customer_uuid
+          in: path
+          type: string
+          description: UUID or name of the requested customer
+          required: true
+      tags:
+        - Customer
+      responses:
+        200:
+          description: the requested customer
+          schema:
+            $ref: '#/definitions/Customer'
+        404:
+          description: customer not found
+          schema:
+            $ref: '#/definitions/404'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+    delete:
+      summary: Delete a single customer by id
+      description: The user needs to remove all regions one by one before deleting the customer, otherwise the deletion will fail
+      parameters:
+      - name: customer_uuid
+        in: path
+        type: string
+        description: UUID of the customer to delete
+        required: true
+      tags:
+        - Customer
+      responses:
+        405:
+          description: Method not allowed
+          schema:
+            $ref: '#/definitions/Error'
+        204:
+          description: no content
+
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    put:
+      summary: Update customer
+      description: Update a customer by id
+      parameters:
+        - name: customer_uuid
+          in: path
+          type: string
+          description: UUID of the requested customer
+          required: true
+        - name: full customer
+          in: body
+          description: Input body to update full customer
+          schema:
+            $ref: '#/definitions/Customer'
+          required: true
+      tags:
+        - Customer
+      responses:
+        201:
+          description: customer is updated
+          schema:
+              $ref: '#/definitions/Customer'
+        404:
+          description: customer not found
+          schema:
+            $ref: '#/definitions/404'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /customer/{customer_uuid}/regions:
+    parameters:
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+      - $ref: "#/parameters/Client"
+    post:
+      summary: Add a region to a customer
+      description: |
+        it will add the regions in the body to the customer and send them to Heat to be created
+      parameters:
+        - name: customer_uuid
+          in: path
+          type: string
+          description: UUID of the requested customer
+          required: true
+        - name: regions
+          in: body
+          description: list of full regions
+          schema:
+            $ref: '#/definitions/Regions'
+          required: true
+      tags:
+        - Regions
+      responses:
+        201:
+          description: regions added to customer
+          schema:
+              $ref: '#/definitions/OutputRegions'
+        404:
+          description: customer not found
+          schema:
+            $ref: '#/definitions/404'
+        409:
+          description: Duplicate Error
+          schema:
+            $ref: '#/definitions/409'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+    put:
+      summary: Replace regions in a customer
+      description: |
+        it will remove all existing regions in the customer and replace them in the regions in request body and the old regions will be sent to be removed from heat and the new ones will be sent as created
+      parameters:
+        - name: customer_uuid
+          in: path
+          type: string
+          description: uuid of the requested customer
+          required: true
+        - name: regions
+          in: body
+          description: list of full regions
+          schema:
+            $ref: '#/definitions/Regions'
+          required: true
+      tags:
+        - Regions
+      responses:
+        201:
+          description: regions added to customer
+          schema:
+              $ref: '#/definitions/OutputRegions'
+        404:
+          description: customer not found
+          schema:
+            $ref: '#/definitions/404'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+  /customer/{customer_uuid}/regions/{region_name}:
+    parameters:
+        - $ref: "#/parameters/Token"
+        - $ref: "#/parameters/Region"
+        - $ref: "#/parameters/Client"
+    delete:
+      summary: Delete a region from a customer
+      description: Delete a region from a customer by region name and send it to Heat to be removed
+      parameters:
+        - name: customer_uuid
+          in: path
+          type: string
+          description: UUID of the requested customer
+          required: true
+        - name: region_name
+          in: path
+          type: string
+          description: Name of the region to delete
+          required: true
+      tags:
+        - Regions
+      responses:
+        204:
+          description: no content
+        404:
+          description: customer not found
+          schema:
+            $ref: '#/definitions/404'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /customer/{customer_uuid}/enabled/:
+    parameters:
+        - $ref: "#/parameters/Token"
+        - $ref: "#/parameters/Region"
+        - $ref: "#/parameters/Client"
+    put:
+      summary: enable/disable customer
+      description: Set the customer as enabled/disabled in all of its regions and send them to Heat to be modified
+      parameters:
+        - name: customer_uuid
+          in: path
+          type: string
+          description: uuid of the requested customer
+          required: true
+        - name: enabled input json
+          in: body
+          description: input body enable/disable customer
+          schema:
+            $ref: '#/definitions/Enable'
+          required: true
+      tags:
+        - Enabled
+      responses:
+        200:
+          description: customer is enabled/disabled
+          schema:
+              $ref: '#/definitions/Customer'
+        404:
+          description: customer not found
+          schema:
+            $ref: '#/definitions/404'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /customers/{customer_uuid}/metadata:
+    parameters:
+        - $ref: "#/parameters/Token"
+        - $ref: "#/parameters/Region"
+        - $ref: "#/parameters/Client"
+    post:
+      summary: Add metadata to a customer
+      description: Add metadata to a customer and send it to Heat
+      parameters:
+        - name: customer_uuid
+          in: path
+          type: string
+          description: UUID of the requested customer
+          required: true
+        - name: metadata
+          in: body
+          description: The metadata to be added to the customer
+          schema:
+            $ref: '#/definitions/MetadataWrapper'
+          required: true
+      tags:
+        - Metadata
+
+      responses:
+        201:
+          description: Metadata added successfully
+          schema:
+            $ref: '#/definitions/OutputCustomerWrapper'
+        404:
+          description: customer not found
+          schema:
+            $ref: '#/definitions/404'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        409:
+          description: Some of the metadata keys already exist (conflict error)
+          schema:
+            $ref: '#/definitions/409'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    put:
+      summary: Replace the metadata of a customer
+      description: Replace the metadata of a customer and send it to Heat
+      parameters:
+        - name: customer_uuid
+          in: path
+          type: string
+          description: UUID of the requested customer
+          required: true
+        - name: metadata
+          in: body
+          description: The new metadata to be applied to the customer
+          schema:
+            $ref: '#/definitions/MetadataWrapper'
+          required: true
+      tags:
+        - Metadata
+
+      responses:
+        200:
+          description: Metadata added successfully
+          schema:
+            $ref: '#/definitions/OutputCustomerWrapper'
+        404:
+          description: customer not found
+          schema:
+            $ref: '#/definitions/404'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /customers/{customer_uuid}/users:
+    parameters:
+        - $ref: "#/parameters/Token"
+        - $ref: "#/parameters/Region"
+        - $ref: "#/parameters/Client"
+    post:
+      summary: Add default users
+      description: Add default users to a customer and send it to Heat
+      parameters:
+        - name: customer_uuid
+          in: path
+          type: string
+          description: UUID of the requested customer
+          required: true
+        - name: users
+          in: body
+          description: The default users to add
+          schema:
+            $ref: '#/definitions/Users'
+          required: true
+      tags:
+        - Default Users
+
+      responses:
+        201:
+          description: Default users added successfully
+          schema:
+            $ref: '#/definitions/OutputUserWrapper'
+        404:
+          description: customer not found
+          schema:
+            $ref: '#/definitions/404'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        409:
+          description: Some of the default users already exist (conflict error)
+          schema:
+            $ref: '#/definitions/409'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    put:
+      summary: Replace default users
+      description: Replace default users of a customer and send it to Heat
+      parameters:
+        - name: customer_uuid
+          in: path
+          type: string
+          description: UUID of the requested customer
+          required: true
+        - name: users
+          in: body
+          description: The new default users to be applied to the customer
+          schema:
+            $ref: '#/definitions/Users'
+          required: true
+      tags:
+        - Default Users
+
+      responses:
+        200:
+          description: Default users replaced successfully
+          schema:
+            $ref: '#/definitions/OutputUserWrapper'
+        404:
+          description: customer not found
+          schema:
+            $ref: '#/definitions/404'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /customer/{customer_uuid}/users/{user_id}:
+    parameters:
+        - $ref: "#/parameters/Token"
+        - $ref: "#/parameters/Region"
+        - $ref: "#/parameters/Client"
+    delete:
+      summary: Delete a default user from a customer
+      description: Delete a default user from a customer and send it to Heat to be removed
+      parameters:
+        - name: customer_uuid
+          in: path
+          type: string
+          description: UUID of the requested customer
+          required: true
+        - name: user_id
+          in: path
+          type: string
+          description: ID of the default user to delete
+          required: true
+
+      tags:
+        - Default Users
+      responses:
+        204:
+          description: no content
+        404:
+          description: customer not found
+          schema:
+            $ref: '#/definitions/404'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /customers/{customer_uuid}/regions/{region_name}/users:
+    parameters:
+        - $ref: "#/parameters/Token"
+        - $ref: "#/parameters/Region"
+        - $ref: "#/parameters/Client"
+    post:
+      summary: Add users (in a region)
+      description: Add users to a customer in a specific region and send it to Heat
+      parameters:
+        - name: customer_uuid
+          in: path
+          type: string
+          description: UUID of the requested customer
+          required: true
+        - name: region_name
+          in: path
+          type: string
+          description: Name of the region in which the users are to be added
+          required: true
+        - name: users
+          in: body
+          description: The users to add
+          schema:
+            $ref: '#/definitions/Users'
+          required: true
+      tags:
+        - Users
+
+      responses:
+        201:
+          description: Users added successfully
+          schema:
+            $ref: '#/definitions/OutputUserWrapper'
+        404:
+          description: customer not found
+          schema:
+            $ref: '#/definitions/404'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        409:
+          description: Some of the users already exist (conflict error)
+          schema:
+            $ref: '#/definitions/409'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    put:
+      summary: Replace users (in a region)
+      description: Replace users of a customer in a specific region and send it to Heat
+      parameters:
+        - name: customer_uuid
+          in: path
+          type: string
+          description: UUID of the requested customer
+          required: true
+        - name: region_name
+          in: path
+          type: string
+          description: Name of the region in which the users are to be replaced
+          required: true
+        - name: users
+          in: body
+          description: The new users to be applied to the customer
+          schema:
+            $ref: '#/definitions/Users'
+          required: true
+      tags:
+        - Users
+
+      responses:
+        200:
+          description: Users replaced successfully
+          schema:
+            $ref: '#/definitions/OutputUserWrapper'
+        404:
+          description: customer not found
+          schema:
+            $ref: '#/definitions/404'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /customer/{customer_uuid}/regions/{region_name}/users/{user_id}:
+    parameters:
+        - $ref: "#/parameters/Token"
+        - $ref: "#/parameters/Region"
+        - $ref: "#/parameters/Client"
+    delete:
+      summary: Delete a user from a customer (in a region)
+      description: Delete a user from a customer by region name and send it to Heat to be removed
+      parameters:
+        - name: customer_uuid
+          in: path
+          type: string
+          description: UUID of the requested customer
+          required: true
+        - name: user_id
+          in: path
+          type: string
+          description: ID of the user to delete
+          required: true
+        - name: region_name
+          in: path
+          type: string
+          description: Name of the region
+          required: true
+      tags:
+        - Users
+      responses:
+        204:
+          description: no content
+        404:
+          description: customer not found
+          schema:
+            $ref: '#/definitions/404'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+definitions:
+  Customer:
+    type: object
+    required:
+      - description
+      - enabled
+      - name
+      - users
+      - defaultQuotas
+    properties:
+      description:
+        type: string
+        description: Customer description
+        example: The best customer
+      enabled:
+        type: boolean
+        description: Tells if the customer is enabled
+        example: true
+      name:
+        type: string
+        description: Customer name
+        example: MyCustomer
+      metadata:
+        $ref: '#/definitions/Dictionary'
+      regions:
+        type: array
+        items:
+          $ref: '#/definitions/Region'
+      users:
+        type: array
+        items:
+          $ref: '#/definitions/User'
+      defaultQuotas:
+        type: array
+        items:
+          $ref: '#/definitions/Quota'
+      status:
+        type: string
+        description: Customer last operation status
+        example: Success
+      custId:
+        type: string
+        description: Customer ID
+      uuid:
+        type: string
+        description: Same as custId
+
+  Enable:
+    type: object
+    properties:
+      enabled:
+        type: boolean
+        description: can be true or false
+        example: true
+
+  CustomersItem:
+    type: object
+    properties:
+      status:
+        type: string
+      description:
+        type: string
+      enabled:
+        type: boolean
+      num_regions:
+        type: integer
+      regions:
+        type: array
+        items:
+          $ref: '#/definitions/Region'
+      id:
+        type: string
+      name:
+        type: string
+
+  Customers:
+    type: array
+    items:
+      $ref: '#/definitions/CustomersItem'
+
+  OutputCustomer:
+    type: object
+    properties:
+      id:
+        type: string
+      links:
+        $ref: '#/definitions/Dictionary'
+      created:
+        type: string
+
+  OutputCustomerWrapper:
+    type: object
+    properties:
+      customer:
+        $ref: '#/definitions/OutputCustomer'
+      transaction_id:
+        type: string
+
+  MetadataWrapper:
+    type: object
+    properties:
+      metadata:
+        $ref: '#/definitions/Dictionary'
+
+  User:
+    type: object
+    properties:
+      id:
+        type: string
+      role:
+        type: array
+        items:
+          type: string
+
+  Users:
+    type: array
+    items:
+      $ref: '#/definitions/User'
+
+  OutputUser:
+    type: object
+    properties:
+      added:
+        type: string
+      id:
+        type: string
+      links:
+        $ref: '#/definitions/Dictionary'
+
+  OutputUserWrapper:
+    type: object
+    properties:
+      users:
+        type: array
+        items:
+          $ref: '#/definitions/OutputUser'
+      transaction_id:
+        type: string
+
+  Compute:
+    type: object
+    required:
+      - instances
+      - injected_files
+      - key_pairs
+      - ram
+    properties:
+      instances:
+        type: string
+      injected_files:
+        type: string
+      key_pairs:
+        type: string
+      ram:
+        type: string
+      vcpus:
+        type: string
+      metadata_items:
+        type: string
+      injected_file_content_bytes:
+        type: string
+      floating_ips:
+        type: string
+      fixed_ips:
+        type: string
+      injected_file_path_bytes:
+        type: string
+      server_groups:
+        type: string
+      server_group_members:
+        type: string
+
+  Storage:
+    type: object
+    required:
+      - gigabytes
+      - snapshots
+      - volumes
+    properties:
+      gigabytes:
+        type: string
+      snapshots:
+        type: string
+      volumes:
+        type: string
+
+  Network:
+    type: object
+    required:
+      - floating_ips
+      - networks
+      - ports
+      - routers
+      - subnets
+    properties:
+      floating_ips:
+        type: string
+      networks:
+        type: string
+      ports:
+        type: string
+      routers:
+        type: string
+      subnets:
+        type: string
+      security_groups:
+        type: string
+      security_group_rules:
+        type: string
+      health_monitor:
+        type: string
+      member:
+        type: string
+      nat_instance:
+        type: string
+      pool:
+        type: string
+      route_table:
+        type: string
+      vip:
+        type: string
+
+  Quota:
+    type: object
+    properties:
+      compute:
+        type: array
+        items:
+          $ref: '#/definitions/Compute'
+      storage:
+        type: array
+        items:
+          $ref: '#/definitions/Storage'
+      network:
+        type: array
+        items:
+          $ref: '#/definitions/Network'
+
+  Region:
+    type: object
+    required:
+      - name
+    properties:
+      name:
+        type: string
+        example: mtn17
+      type:
+        type: string
+        description: single or group
+        example: single
+      status:
+        type: string
+        readOnly: true
+        example: Error
+      quotas:
+        type: array
+        items:
+          $ref: '#/definitions/Quota'
+      users:
+        type: array
+        items:
+          $ref: '#/definitions/User'
+      error_message:
+        type: string
+        readOnly: true
+        example: fail to create
+
+  OutputRegion:
+    type: object
+    properties:
+      name:
+        type: string
+        example: tn17
+      type:
+        type: string
+        description: single or group
+        example: single
+      status:
+        type: string
+      error_message:
+        type: string
+      checksum:
+        type: string
+        example: '1024'
+      size:
+        type: string
+        example: '123'
+      virtual_size:
+        type: string
+        example: '123'
+
+  OutputRegions:
+    type: object
+    properties:
+      regions:
+        type: array
+        items:
+          $ref: '#/definitions/OutputRegion'
+
+  Regions:
+    type: array
+    items:
+      $ref: '#/definitions/Region'
+
+  Error:
+    type: object
+    properties:
+      code:
+        type: integer
+        format: int32
+      type:
+        type: string
+      transaction_id:
+        type: string
+      message:
+        type: string
+      details:
+        type: string
+
+  409:
+    type: object
+    properties:
+      code:
+        type: integer
+        format: int32
+      type:
+        type: string
+      transaction_id:
+        type: string
+      message:
+        type: string
+      details:
+        type: string
+
+  400:
+    type: object
+    properties:
+      code:
+        type: integer
+        format: int32
+      type:
+        type: string
+      transaction_id:
+        type: string
+      message:
+        type: string
+      details:
+        type: string
+
+  404:
+    type: object
+    properties:
+      code:
+        type: integer
+        format: int32
+      type:
+        type: string
+      transaction_id:
+        type: string
+      message:
+        type: string
+      details:
+        type: string
+
+  Dictionary:
+    type: object
+    additionalProperties:
+      type: "string"
+    example: {"property1": "value1"}
+
+
+parameters:
+  Token:
+    name: X-Auth-Token
+    in: header
+    description: Token from keystone
+    required: true
+    type: string
+
+  Region:
+    name: X-Auth-Region
+    in: header
+    description: Region
+    required: true
+    type: string
+
+  Client:
+    name: X-RANGER-Client
+    in: header
+    description: Client name
+    required: false
+    type: string
+
diff --git a/orm/services/customer_manager/tox.ini b/orm/services/customer_manager/tox.ini
new file mode 100755
index 00000000..4f3fc0e5
--- /dev/null
+++ b/orm/services/customer_manager/tox.ini
@@ -0,0 +1,19 @@
+[tox]
+envlist=py27, pep8, cover
+
+[testenv]
+setenv= CMS_ENV=mock
+        PYTHONPATH={toxinidir}:{toxinidir}/cms_rest/extenal_mock/
+deps= -r{toxinidir}/requirements.txt
+      -r{toxinidir}/test-requirements.txt
+
+[testenv:pep8]
+commands =
+    py.test --pep8 -m pep8
+
+[testenv:cover]
+commands=
+    coverage run setup.py test
+    coverage report
+    coverage html
+#commands={envpython} setup.py test -v {posargs}
diff --git a/orm/services/flavor_manager/MANIFEST.in b/orm/services/flavor_manager/MANIFEST.in
new file mode 100755
index 00000000..c922f11a
--- /dev/null
+++ b/orm/services/flavor_manager/MANIFEST.in
@@ -0,0 +1 @@
+recursive-include public *
diff --git a/orm/services/flavor_manager/__init__.py b/orm/services/flavor_manager/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/config.py b/orm/services/flavor_manager/config.py
new file mode 100755
index 00000000..7e5f2fcb
--- /dev/null
+++ b/orm/services/flavor_manager/config.py
@@ -0,0 +1,163 @@
+from orm_common.hooks.api_error_hook import APIErrorHook
+from fms_rest.hooks.service_hooks import TransIdHook
+from orm_common.hooks.security_headers_hook import SecurityHeadersHook
+
+global TransIdHook
+global APIErrorHook
+global SecurityHeadersHook
+
+# Server Specific Configurations
+server = {
+    'port': '8082',
+    'host': '0.0.0.0',
+    'name': 'fms'
+}
+
+cache_seconds = 0
+
+# Pecan Application Configurations
+app = {
+    'root': 'fms_rest.controllers.root.RootController',
+    'modules': ['fms_rest'],
+    'static_root': '%(confdir)s/public',
+    'template_path': '%(confdir)s/fms_rest/templates',
+    'debug': True,
+    'errors': {
+        '__force_dict__': True
+    },
+    'hooks': lambda: [TransIdHook(), APIErrorHook(), SecurityHeadersHook()]
+}
+
+logging = {
+    'root': {'level': 'INFO', 'handlers': ['console']},
+    'loggers': {
+        'fms_rest': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'], 'propagate': False},
+        'pecan': {'level': 'DEBUG', 'handlers': ['console'], 'propagate': False},
+        'orm_common': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'], 'propagate': False},
+        'keystone_utils': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'], 'propagate': False},
+        'audit_client': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'], 'propagate': False},
+        'py.warnings': {'handlers': ['console']},
+        '__force_dict__': True
+    },
+    'handlers': {
+        'console': {
+            'level': 'DEBUG',
+            'class': 'logging.StreamHandler',
+            'formatter': 'color'
+        },
+        'Logfile': {
+            'level': 'DEBUG',
+            'class': 'logging.handlers.RotatingFileHandler',
+            'maxBytes': 50000000,
+            'backupCount': 10,
+            'filename': '/opt/app/orm/fms_rest/fms_rest.log',
+            'formatter': 'simple'
+        }
+    },
+    'formatters': {
+        'simple': {
+            'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]'
+                       '[%(threadName)s] %(message)s')
+        },
+        'color': {
+            '()': 'pecan.log.ColorFormatter',
+            'format': ('%(asctime)s [%(padded_color_levelname)s] [%(name)s]'
+                       '[%(threadName)s] %(message)s'),
+            '__force_dict__': True
+        }
+    }
+}
+
+database = {
+    'host': 'localhost',
+    'username': 'root',
+    'password': 'stack',
+    'db_name': 'orm_fms_db',
+
+}
+
+database['connection_string'] = 'mysql://{0}:{1}@{2}:3306/{3}'.format(database['username'],
+                                                                      database['password'],
+                                                                      database['host'],
+                                                                      database['db_name'])
+
+# this table is for calculating default extra specs needed
+extra_spec_needed_table = {
+    "ns": {
+        "aggregate_instance_extra_specs____ns": "true",
+        "hw____mem_page_size": "large"
+    },
+    "nd": {
+        "aggregate_instance_extra_specs____nd": "true",
+        "hw____mem_page_size": "large"
+    },
+    "nv": {
+        "aggregate_instance_extra_specs____nv": "true",
+        "hw____mem_page_size": "large"
+    },
+    "gv": {
+        "aggregate_instance_extra_specs____gv": "true",
+        "aggregate_instance_extra_specs____c2": "true"
+    },
+    "ss": {
+        "aggregate_instance_extra_specs____ss": "true"
+    }
+}
+
+# any key will be added to extra_spec_needed_table need to be added here
+default_extra_spec_calculated_table = {
+    "aggregate_instance_extra_specs____ns": "",
+    "aggregate_instance_extra_specs____nd": "",
+    "aggregate_instance_extra_specs____nv": "",
+    "aggregate_instance_extra_specs____gv": "",
+    "aggregate_instance_extra_specs____c2": "",
+    "aggregate_instance_extra_specs____ss": "",
+    "aggregate_instance_extra_specs____c2": "",
+    "aggregate_instance_extra_specs____c4": "",
+    "aggregate_instance_extra_specs____v": "",
+    "hw____mem_page_size": "",
+    "hw____cpu_policy": "",
+    "hw____numa_nodes": ""
+}
+
+application_root = 'http://localhost:{0}'.format(server['port'])
+
+api = {
+    'uuid_server': {
+        'base': 'http://127.0.0.1:8090/',
+        'uuids': 'v1/uuids'
+    },
+    'rds_server': {
+        'base': 'http://127.0.0.1:8777/',
+        # 'base': 'http://172.20.91.35:8777/',
+        'resources': 'v1/rds/resources',
+        'status': 'v1/rds/status/resource/'
+    },
+    'rms_server': {
+        'base': 'http://127.0.0.1:8080/',
+        'groups': 'v2/orm/groups',
+        'regions': 'v2/orm/regions',
+        'cache_seconds': 60
+    },
+    'audit_server': {
+        'base': 'http://127.0.0.1:8776/',
+        'trans': 'v1/audit/transaction'
+    }
+
+}
+
+verify = False
+
+authentication = {
+    "enabled": False,
+    "mech_id": "admin",
+    "mech_pass": "stack",
+    "rms_url": "http://127.0.0.1:8080",
+    # "rms_url": "http://172.20.90.174:8080",
+    "tenant_name": "admin",
+    "token_role": "admin",
+    # The Keystone version currently in use. Can be either "2.0" or "3"
+    "keystone_version": "2.0",
+    "policy_file": "/opt/app/orm/aic-orm-fms/fms_rest/etc/policy.json",
+    # "policy_file": "/orm/aic-orm-fms/fms_rest/etc/policy.json"
+}
diff --git a/orm/services/flavor_manager/fms_mocks/__init__.py b/orm/services/flavor_manager/fms_mocks/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_mocks/audit_mock.py b/orm/services/flavor_manager/fms_mocks/audit_mock.py
new file mode 100644
index 00000000..36299893
--- /dev/null
+++ b/orm/services/flavor_manager/fms_mocks/audit_mock.py
@@ -0,0 +1,15 @@
+from mock import MagicMock
+from fms_rest.logger import get_logger
+
+logger = get_logger(__name__)
+
+
+def init(audit_server_url, num_of_send_retries, time_wait_between_retries):
+    logger.debug('MOCK: audit.init called')
+    pass
+
+
+def audit(timestamp, application_id, tracking_id, transaction_id, transaction_type, resource_id, service_name,
+          user_id=None, external_id=None, event_details=None, status=None):
+    logger.debug('MOCK: audit.audit called')
+    return 200
diff --git a/orm/services/flavor_manager/fms_mocks/requests_mock.py b/orm/services/flavor_manager/fms_mocks/requests_mock.py
new file mode 100644
index 00000000..755bd355
--- /dev/null
+++ b/orm/services/flavor_manager/fms_mocks/requests_mock.py
@@ -0,0 +1,106 @@
+import copy
+import uuid
+from mock import MagicMock
+from fms_rest.data.sql_alchemy.data_manager import DataManager
+
+from fms_rest.logger import get_logger
+logger = get_logger(__name__)
+
+
+def post(url, **kwargs):
+    if 'rds/resources' in url:
+        logger.debug('MOCK: requests.post called for rds/resources')
+        return _build_rds_response()
+
+    elif 'uuids' in url:
+        logger.debug('MOCK: requests.post called for uuid')
+        return _build_uuid_response()
+
+
+def delete(url, **kwargs):
+    if 'rds/resources' in url:
+        logger.debug('MOCK: requests.deletr called for rds/resources')
+        return _build_rds_response()
+
+    else:
+        raise Exception("No delete action for this url".format(url))
+
+
+def get(url):
+    if 'status/resource' in url:
+        logger.debug('MOCK: requests.get called for status/resources')
+        return _build_status_response(url)
+
+
+def _build_uuid_response():
+    res = MagicMock()
+    res.json.return_value = {
+        'uuid': str(uuid.uuid1())
+    }
+
+    return res
+
+
+def _build_rds_response():
+    response = MagicMock()
+    response.status_code = 201
+    response.content = {"flavor": {"profile": "p1",
+                                   "status": "Error",
+                                   "description": "A standard 2GB Ram 2 vCPUs 50GB Disk, Flavor",
+                                   "extra-specs": {"key3": "value3",
+                                                   "key2": "value2",
+                                                   "key1": "value1"},
+                                   "ram": "4096",
+                                   "ephemeral": "0",
+                                   "visibility": "private",
+                                   "regions": [
+                                              {
+                                                "status": "Error",
+                                                "name": "dkk12"
+                                              }, {
+                                                  "status": "Error",
+                                                  "name": "san12"}],
+                                   "vcpus": "2",
+                                   "swap": "1024",
+                                   "disk": "50",
+                                   "tenants": ["070be05e-26e2-4519-a46d-224cbf8558f4", "4f7b9561-af8b-4cc0-87e2-319270dad49e"],
+                                   "id": "a5310ede-1c15-11e6-86bb-005056a50d38",
+                                   "name": "fr4096v2d50"
+                                   }
+                        }
+
+    response.json.return_value = response.content
+    return response
+
+
+def _build_status_response(url):
+    uuid_index = url.find('status/resource/') + 16
+    uuid = url[uuid_index:]
+    datamanager = DataManager()
+    flavor_record = datamanager.get_record('flavor')
+    sql_flavor = flavor_record.get_flavor_by_id(uuid)
+    _status_response['regions'] = []
+    for sql_region in sql_flavor.flavor_regions:
+        new_region = copy.copy(_region_mock)
+        new_region['region'] = sql_region.region_name
+        _status_response['regions'].append(new_region)
+    mock = MagicMock()
+    mock.json.return_value = _status_response
+    return mock
+
+
+_region_mock = {
+    "region": "dla1",
+    "timestamp": "1451599200",
+    "ord-transaction-id": "0649c5be323f4792afbc1efdd480847d",
+    "resource-id": "12fde398643acbed32f8097c98aec20",
+    "ord-notifier-id": "",
+    "status": "success",
+    "error-code": "200",
+    "error-msg": "OK"
+}
+
+_status_response = {
+    "status": "pending",
+    "regions": []
+}
diff --git a/orm/services/flavor_manager/fms_rest.conf b/orm/services/flavor_manager/fms_rest.conf
new file mode 100644
index 00000000..7a1ff7fe
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest.conf
@@ -0,0 +1,27 @@
+Listen 8082
+ 
+<VirtualHost *:8082>
+ 
+    WSGIDaemonProcess fms_rest user=orm group=orm threads=5
+    WSGIScriptAlias / /opt/app/orm/fms_rest/fms_rest.wsgi
+	
+	 <Location /v1/orm/logs>
+		Order deny,allow
+		Deny from all
+		Allow from localhost
+	</Location>
+
+	<Location /v1/orm/configuration>
+		Order deny,allow
+		Deny from all
+		Allow from localhost
+	</Location>
+ 
+    <Directory /opt/app/orm/fms_rest/>
+        WSGIProcessGroup fms_rest
+        WSGIApplicationGroup %{GLOBAL}
+                Require all granted
+        Allow from all
+    </Directory>
+</VirtualHost>
+
diff --git a/orm/services/flavor_manager/fms_rest.wsgi b/orm/services/flavor_manager/fms_rest.wsgi
new file mode 100644
index 00000000..07efe2d5
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest.wsgi
@@ -0,0 +1,2 @@
+from pecan.deploy import deploy
+application = deploy('/opt/app/orm/fms_rest/config.py')
diff --git a/orm/services/flavor_manager/fms_rest/__init__.py b/orm/services/flavor_manager/fms_rest/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/app.py b/orm/services/flavor_manager/fms_rest/app.py
new file mode 100644
index 00000000..5870a018
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/app.py
@@ -0,0 +1,31 @@
+from pecan import make_app
+from fms_rest.data import wsme
+from fms_rest.logger import get_logger
+from pecan.commands import CommandRunner
+from fms_rest.utils import authentication
+from orm_common.policy import policy
+
+import os
+logger = get_logger(__name__)
+
+
+def setup_app(config):
+    wsme.init_model()
+    token_conf = authentication.get_token_conf(config)
+    policy.init(config.authentication.policy_file, token_conf)
+    app_conf = dict(config.app)
+
+    app = make_app(
+        app_conf.pop('root'),
+        logging=getattr(config, 'logging', {}),
+        **app_conf
+    )
+    logger.info('Starting FMS...')
+    return app
+
+def main():
+    dir_name = os.path.dirname(__file__)
+    drive, path_and_file = os.path.splitdrive(dir_name)
+    path, filename = os.path.split(path_and_file)
+    runner = CommandRunner()
+    runner.run(['serve', path+'/config.py'])
diff --git a/orm/services/flavor_manager/fms_rest/controllers/__init__.py b/orm/services/flavor_manager/fms_rest/controllers/__init__.py
new file mode 100644
index 00000000..d57e44a1
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/controllers/__init__.py
@@ -0,0 +1,9 @@
+import os
+from fms_rest.logger import get_logger
+from orm_common.injector import injector
+import fms_rest.di_providers as di_providers
+
+logger = get_logger(__name__)
+
+_current_dirname = os.path.dirname(os.path.realpath(di_providers.__file__))
+injector.register_providers('FMS_ENV', _current_dirname, logger)
diff --git a/orm/services/flavor_manager/fms_rest/controllers/root.py b/orm/services/flavor_manager/fms_rest/controllers/root.py
new file mode 100644
index 00000000..40b587b3
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/controllers/root.py
@@ -0,0 +1,53 @@
+from pecan import conf, expose
+from pecan import request
+
+from webob.exc import status_map
+from pecan.secure import SecureController
+from fms_rest.controllers.v1.v1 import V1Controller
+from fms_rest.utils import authentication
+
+
+class RootController(object):
+    v1 = V1Controller()
+
+    '''
+    @classmethod
+    def check_permissions(cls):
+        # Extract the required values from the request header
+        headers = request.headers
+        token_to_validate = headers.get('X-Auth-Token')
+        lcp_id = headers.get('X-Auth-Region')
+        return authentication.check_permissions(conf, token_to_validate, lcp_id)
+    '''
+    @expose(template='json')
+    def get(self):
+        """
+            Method to handle GET /
+            prameters: None
+            return: dict describing flavor command version information
+        """
+
+        return {
+            "versions": {
+                "values": [
+                    {
+                        "orm": "stable",
+                        "id": "v1",
+                        "links": [
+                            {
+                                "href": conf.application_root
+                            }
+                        ]
+                    }
+                ]
+            }
+        }
+
+    @expose('error.html')
+    def error(self, status):
+        try:
+            status = int(status)
+        except ValueError:  # pragma: no cover
+            status = 500
+        message = getattr(status_map.get(status), 'explanation', '')
+        return dict(status=status, message=message)
diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/__init__.py b/orm/services/flavor_manager/fms_rest/controllers/v1/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/__init__.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/configuration.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/configuration.py
new file mode 100755
index 00000000..e30d4bee
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/configuration.py
@@ -0,0 +1,29 @@
+"""Configuration rest API input module."""
+
+import logging
+from orm_common.utils import utils
+from pecan import conf
+from pecan import rest
+from wsmeext.pecan import wsexpose
+
+
+logger = logging.getLogger(__name__)
+
+
+class ConfigurationController(rest.RestController):
+    """Configuration controller."""
+
+    @wsexpose(str, str, status_code=200)
+    def get(self, dump_to_log='false'):
+        """get method.
+
+        :param dump_to_log: A boolean string that says whether the
+        configuration should be written to log
+        :return: A pretty string that contains the service's configuration
+        """
+        logger.info("Get configuration...")
+
+        dump = dump_to_log.lower() == 'true'
+        utils.set_utils_conf(conf)
+        result = utils.report_config(conf, dump, logger)
+        return result
diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/__init__.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/base.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/base.py
new file mode 100755
index 00000000..8e26ac4c
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/base.py
@@ -0,0 +1,64 @@
+import wsme
+
+
+class ClientSideError(wsme.exc.ClientSideError):
+    def __init__(self, error, status_code=400):
+        super(ClientSideError, self).__init__(error, status_code)
+
+
+class NoContent(ClientSideError):
+    def __init__(self, status_code=204, message="No Content"):
+        super(NoContent, self).__init__(message, status_code)
+
+
+class JsonError(wsme.exc.ClientSideError):
+    def __init__(self, status_code=400, message="incompatible JSON body"):
+        super(JsonError, self).__init__(message, status_code)
+
+
+class AuthenticationHeaderError(ClientSideError):
+    def __init__(self, error, status_code=401, message="Missing/expired/incorrect authentication header"):
+        super(AuthenticationHeaderError, self).__init__(message, status_code)
+
+
+class AuthenticationFailed(ClientSideError):
+    def __init__(self, status_code=403, message="The authenticated user is not allowed to create customers"):
+        super(AuthenticationFailed, self).__init__(message, status_code)
+
+
+class NotFound(ClientSideError):
+    def __init__(self, status_code=404, message="The specific transaction was not found", **kw):
+        super(NotFound, self).__init__(message, status_code)
+
+
+class MethodNotAllowed(ClientSideError):
+    def __init__(self, status_code=405, message="This method is not allowed. Please use update flavor instead", **kw):
+        super(MethodNotAllowed, self).__init__(message, status_code)
+
+
+class BusyError(ClientSideError):
+    def __init__(self, status_code=409, message="Current resource is busy"):
+        super(BusyError, self).__init__(message, status_code)
+
+
+class ConflictValueError(ClientSideError):
+    def __init__(self, message="conflict value error", status_code=409):
+        super(ConflictValueError, self).__init__(message, status_code)
+
+
+class DuplicateFlavorError(ClientSideError):
+    def __init__(self, status_code=409):
+        super(DuplicateFlavorError, self).__init__("Flavor already exists",
+                                                   status_code)
+
+
+error_strategy = {
+    '204': NoContent,
+    '400': JsonError,
+    '401': AuthenticationHeaderError,
+    '403': AuthenticationFailed,
+    '404': NotFound,
+    '405': MethodNotAllowed,
+    '409': BusyError,
+    '409.1': DuplicateFlavorError
+}
diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/flavors.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/flavors.py
new file mode 100755
index 00000000..348a1264
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/flavors.py
@@ -0,0 +1,160 @@
+from pecan import rest, request, response, expose
+from pecan.core import abort
+
+from wsmeext.pecan import wsexpose
+
+from fms_rest.controllers.v1.orm.flavors.regions import RegionController
+from fms_rest.controllers.v1.orm.flavors.tenants import TenantController
+from fms_rest.controllers.v1.orm.flavors.os_extra_specs import OsExtraSpecsController
+from fms_rest.controllers.v1.orm.flavors.tags import TagsController
+
+from fms_rest.data.wsme.models import FlavorWrapper, FlavorListFullResponse
+from fms_rest.logic.error_base import ErrorStatus
+from fms_rest.logger import get_logger
+from fms_rest.utils import authentication
+
+from orm_common.injector import injector
+from orm_common.utils import api_error_utils as err_utils
+
+di = injector.get_di()
+LOG = get_logger(__name__)
+
+
+@di.dependsOn('flavor_logic')
+@di.dependsOn('utils')
+class FlavorController(rest.RestController):
+
+    regions = RegionController()
+    tenants = TenantController()
+    os_extra_specs = OsExtraSpecsController()
+    extra_specs = OsExtraSpecsController()
+    tags = TagsController()
+
+    @wsexpose(FlavorWrapper, body=FlavorWrapper, rest_content_types='json', status_code=201)
+    def post(self, flavors):
+        flavor_logic, utils = di.resolver.unpack(FlavorController)
+        uuid = "FailedToGetFromUUIDGen"
+        LOG.info("FlavorController - Createflavor: " + str(flavors))
+        authentication.authorize(request, 'flavor:create')
+
+        try:
+
+            if not flavors.flavor.id:
+                uuid = utils.make_uuid()
+            else:
+                try:
+                    uuid = utils.create_existing_uuid(
+                        flavor_logic.get_fixed_uuid(flavors.flavor.id))
+                except TypeError:
+                    LOG.error("UUID already exist")
+                    raise ErrorStatus(409, 'UUID already exists')
+
+            result = flavor_logic.create_flavor(flavors, uuid, request.transaction_id)
+
+            LOG.info("FlavorController - Flavor Created: " + str(result))
+
+            event_details = 'Flavor {} created in regions: {}, tenants: {} with visibility: {}'.format(
+                uuid, [r.name for r in flavors.flavor.regions],
+                flavors.flavor.tenants, flavors.flavor.visibility)
+            utils.audit_trail('create flavor', request.transaction_id,
+                              request.headers, uuid,
+                              event_details=event_details)
+            return result
+
+        except ErrorStatus as exception:
+            LOG.log_exception("FlavorController - Failed to CreateFlavor", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except ValueError as exception:
+            LOG.log_exception("FlavorController - Failed to CreateFlavor", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=400,
+                                      error_details=exception.message)
+
+        except Exception as exception:
+            LOG.log_exception("FlavorController - Failed to CreateFlavor", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+    @wsexpose(FlavorWrapper, str, body=FlavorWrapper, rest_content_types='json')
+    def put(self, flavor_id, flavors):
+        # update flavor is not featured
+        raise err_utils.get_error(request.transaction_id,
+                                  status_code=405)
+
+    @wsexpose(FlavorWrapper, str, rest_content_types='json')
+    def get(self, flavor_uuid_or_name):
+        flavor_logic, utils = di.resolver.unpack(FlavorController)
+        LOG.info("FlavorController - GetFlavorDetails: uuid or name is " + flavor_uuid_or_name)
+        authentication.authorize(request, 'flavor:get_one')
+
+        try:
+            result = flavor_logic.get_flavor_by_uuid_or_name(flavor_uuid_or_name)
+            LOG.info("FlavorController - GetFlavorDetails finished well: " + str(result))
+            return result
+
+        except ErrorStatus as exception:
+            LOG.log_exception("FlavorController - Failed to GetFlavorDetails", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("FlavorController - Failed to GetFlavorDetails", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @wsexpose(FlavorListFullResponse, str, str, str, str, str, str, str, rest_content_types='json')
+    def get_all(self, visibility=None, region=None, tenant=None, series=None,
+                starts_with=None, contains=None, alias=None):
+        flavor_logic, utils = di.resolver.unpack(FlavorController)
+        LOG.info("FlavorController - GetFlavorlist")
+        authentication.authorize(request, 'flavor:get_all')
+
+        try:
+            result = flavor_logic.get_flavor_list_by_params(visibility, region,
+                                                            tenant, series, starts_with, contains, alias)
+
+            return result
+        except ErrorStatus as exception:
+            LOG.log_exception("FlavorController - Failed to GetFlavorlist", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("FlavorController - Failed to GetFlavorlist", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @wsexpose(None, str, rest_content_types='json', status_code=204)
+    def delete(self, flavor_uuid=None):
+        authentication.authorize(request, 'flavor:delete')
+        flavor_logic, utils = di.resolver.unpack(FlavorController)
+
+        try:
+            LOG.info("FlavorController - delete: uuid is " + flavor_uuid)
+            flavor_logic.delete_flavor_by_uuid(flavor_uuid)
+            LOG.info("FlavorController - delete flavor finished well")
+
+            event_details = 'Flavor {} deleted'.format(flavor_uuid)
+            utils.audit_trail('delete flavor by uuid', request.transaction_id,
+                              request.headers, flavor_uuid,
+                              event_details=event_details)
+
+        except ErrorStatus as exception:
+            LOG.log_exception("FlavorController - Failed to delete flavor", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("FlavorController - Failed to delete flavor", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/os_extra_specs.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/os_extra_specs.py
new file mode 100755
index 00000000..9ea434a0
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/os_extra_specs.py
@@ -0,0 +1,172 @@
+import base
+from pecan import rest, request, response
+from wsmeext.pecan import wsexpose
+from fms_rest.data.wsme.models import ExtraSpecsWrapper
+
+from orm_common.injector import injector
+
+from orm_common.utils import api_error_utils as err_utils
+
+from fms_rest.logic.error_base import ErrorStatus
+
+from fms_rest.logger import get_logger
+from fms_rest.utils import authentication
+
+LOG = get_logger(__name__)
+
+di = injector.get_di()
+
+
+@di.dependsOn('flavor_logic')
+@di.dependsOn('utils')
+class OsExtraSpecsController(rest.RestController):
+    """main class."""
+
+    def _extra_specs_redefined(self, extra_specs_wrapper):
+        # make sure at least one exit and not both at same time
+        valid_json = not extra_specs_wrapper.extra_specs and not \
+            extra_specs_wrapper.os_extra_specs or \
+            extra_specs_wrapper.os_extra_specs and\
+            extra_specs_wrapper.extra_specs
+        if valid_json:
+            raise ErrorStatus(message="Invalid json. please provide supported json",
+                              status_code=400)
+        if extra_specs_wrapper.extra_specs:
+            extra_specs_wrapper.os_extra_specs = extra_specs_wrapper.extra_specs
+
+        return extra_specs_wrapper
+
+    @wsexpose(ExtraSpecsWrapper, str, rest_content_types='json',
+              status_code=200)
+    def get(self, flavor_id):
+        flavor_logic, utils = di.resolver.unpack(OsExtraSpecsController)
+
+        LOG.info(
+            "OsExtraSpecsController - get all extra specs for flavor: {} ".format(
+                flavor_id))
+        authentication.authorize(request, 'flavor:get_flavor_extra_specs')
+
+        try:
+            result = flavor_logic.get_extra_specs_uuid(flavor_id,
+                                                       request.transaction_id)
+            LOG.info("OsExtraSpecsController - GOT extra specs: {} ".format(result))
+            utils.audit_trail("get extra specs", request.transaction_id,
+                              request.headers, flavor_id)
+            return result
+
+        except ErrorStatus as exception:
+            LOG.log_exception(
+                "OsExtraSpecsController - Failed to get extra specs", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception(
+                "OsExtraSpecsController - Failed to get extra specs", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @wsexpose(ExtraSpecsWrapper, str, body=ExtraSpecsWrapper, rest_content_types='json', status_code=201)
+    def post(self, flavor_id, extra_specs_wrapper):
+        flavor_logic, utils = di.resolver.unpack(OsExtraSpecsController)
+        LOG.info("OsExtraSpecsController - add extra specs: " + str(
+            extra_specs_wrapper.os_extra_specs))
+        authentication.authorize(request, 'flavor:add_flavor_extra_specs')
+
+        try:
+            # for backward_compatibility
+            extra_specs_wrapper = self._extra_specs_redefined(
+                extra_specs_wrapper)
+
+            result = flavor_logic.add_extra_specs(flavor_id,
+                                                  extra_specs_wrapper,
+                                                  request.transaction_id)
+            LOG.info("OsExtraSpecsController - extra specs added ")
+            utils.audit_trail('add extra specs', request.transaction_id,
+                              request.headers, flavor_id)
+            return result
+
+        except ErrorStatus as exception:
+            LOG.log_exception(
+                "OsExtraSpecsController - Failed to add extra specs", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception(
+                "OsExtraSpecsController - Failed to add extra specs", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @wsexpose(None, str, str, rest_content_types='json', status_code=204)
+    def delete(self, flavor_id, extra_spec=None):
+        flavor_logic, utils = di.resolver.unpack(OsExtraSpecsController)
+        LOG.info(
+            "OsExtraSpecsController - delete flavor {} extra spec".format(
+                flavor_id))
+        authentication.authorize(request, 'flavor:delete_flavor_extra_specs')
+
+        try:
+            flavor_logic.delete_extra_specs(flavor_id, request.transaction_id,
+                                            extra_spec)
+            LOG.info(
+                "OsExtraSpecsController - extra spec was deleted for  flavor {} c".format(
+                    flavor_id))
+            utils.audit_trail('delete extra spec', request.transaction_id,
+                              request.headers, flavor_id)
+            return
+
+        except ErrorStatus as exception:
+            LOG.log_exception(
+                "OsExtraSpecsController - Failed to delete extra specs", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("OsExtraSpecsController - Failed to delete extra specs",
+                              exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @wsexpose(ExtraSpecsWrapper, str, body=ExtraSpecsWrapper, rest_content_types='json',
+              status_code=200)
+    def put(self, flavor_id, extra_specs_wrapper):
+        LOG.info("OsExtraSpecsController -  update extra specs of flavor {}".format(flavor_id))
+        flavor_logic, utils = di.resolver.unpack(OsExtraSpecsController)
+        LOG.info(
+            "OsExtraSpecsController - update extra specs with {} ".format(
+                extra_specs_wrapper.os_extra_specs))
+        authentication.authorize(request, 'flavor:replace_flavor_extra_specs')
+
+        try:
+            # for backward_compatibility
+            extra_specs_wrapper = self._extra_specs_redefined(
+                extra_specs_wrapper)
+
+            result = flavor_logic.update_extra_specs(flavor_id,
+                                                     extra_specs_wrapper,
+                                                     request.transaction_id)
+            LOG.info("OsExtraSpecsController - extra specs updated")
+            utils.audit_trail('update extra specs', request.transaction_id,
+                              request.headers, flavor_id)
+            return result
+
+        except ErrorStatus as exception:
+            LOG.log_exception(
+                "OsExtraSpecsController - Failed to update extra specs", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception(
+                "OsExtraSpecsController - Failed to update extra specs", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/regions.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/regions.py
new file mode 100755
index 00000000..b85d4b4f
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/regions.py
@@ -0,0 +1,80 @@
+from pecan import rest, request
+from wsmeext.pecan import wsexpose
+
+from fms_rest.data.wsme.models import RegionWrapper
+from fms_rest.logic.error_base import ErrorStatus
+from base import ClientSideError
+from fms_rest.logger import get_logger
+
+from orm_common.injector import injector
+from orm_common.utils import api_error_utils as err_utils
+from fms_rest.utils import authentication
+
+LOG = get_logger(__name__)
+
+di = injector.get_di()
+
+
+@di.dependsOn('flavor_logic')
+@di.dependsOn('utils')
+class RegionController(rest.RestController):
+    @wsexpose(RegionWrapper, str, body=RegionWrapper, rest_content_types='json', status_code=201)
+    def post(self, flavor_id, region_wrapper):
+        flavor_logic, utils = di.resolver.unpack(RegionController)
+
+        LOG.info("RegionController - add regions: " + str(region_wrapper))
+        authentication.authorize(request, 'flavor:add_flavor_regions')
+
+        try:
+            result = flavor_logic.add_regions(flavor_id, region_wrapper, request.transaction_id)
+
+            LOG.info("RegionController - regions added: " + str(result))
+
+            event_details = 'Flavor {} regions: {} added'.format(
+                flavor_id, [r.name for r in region_wrapper.regions])
+            utils.audit_trail('add regions', request.transaction_id,
+                              request.headers, flavor_id,
+                              event_details=event_details)
+            return result
+
+        except ErrorStatus as exception:
+            LOG.log_exception("RegionController - Failed to add region", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("RegionController - Failed to add region", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @wsexpose(None, str, str, rest_content_types='json', status_code=204)
+    def delete(self, flavor_id, region_name):
+        flavor_logic, utils = di.resolver.unpack(RegionController)
+
+        LOG.info("RegionController - delete region: " + str(region_name))
+        authentication.authorize(request, 'flavor:delete_flavor_region')
+
+        try:
+            result = flavor_logic.delete_region(flavor_id, region_name, request.transaction_id)
+
+            LOG.info("RegionController - region deleted: " + str(result))
+
+            event_details = 'Flavor {} region {} deleted'.format(flavor_id,
+                                                                 region_name)
+            utils.audit_trail('delete region', request.transaction_id,
+                              request.headers, flavor_id,
+                              event_details=event_details)
+
+        except ErrorStatus as exception:
+            LOG.log_exception("RegionController - Failed to delete region", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("RegionController - Failed to delete region", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/tags.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/tags.py
new file mode 100644
index 00000000..c42720d9
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/tags.py
@@ -0,0 +1,136 @@
+import base
+from pecan import rest, request, response
+from wsmeext.pecan import wsexpose
+
+from fms_rest.data.wsme.models import TagsWrapper
+from fms_rest.logic.error_base import ErrorStatus
+from fms_rest.logger import get_logger
+
+from orm_common.injector import injector
+from orm_common.utils import api_error_utils as err_utils
+from fms_rest.utils import authentication
+
+LOG = get_logger(__name__)
+
+di = injector.get_di()
+
+
+@di.dependsOn('flavor_logic')
+@di.dependsOn('utils')
+class TagsController(rest.RestController):
+    @wsexpose(TagsWrapper, str, body=TagsWrapper, rest_content_types='json', status_code=201)
+    def post(self, flavor_id, tags_wrapper):
+        flavor_logic, utils = di.resolver.unpack(TagsController)
+        LOG.info("TagsController - add tags: " + str(
+            tags_wrapper.tags))
+
+        authentication.authorize(request, 'flavor:add_flavor_tags')
+
+        try:
+            result = flavor_logic.add_tags(flavor_id, tags_wrapper,
+                                           request.transaction_id)
+
+            LOG.info("TagsController - tags added")
+            utils.audit_trail('add tags', request.transaction_id,
+                              request.headers, flavor_id)
+            return result
+
+        except ErrorStatus as exception:
+            LOG.log_exception("TagsController - Failed to add tags", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+        except Exception as exception:
+            LOG.log_exception("TagsController - Failed to add tags", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @wsexpose(None, str, str, rest_content_types='json', status_code=204)
+    def delete(self, flavor_id, tag_to_delete=None):
+        flavor_logic, utils = di.resolver.unpack(TagsController)
+        LOG.info(
+            "TagsController - delete flavor {} tags".format(
+                flavor_id))
+        authentication.authorize(request, 'flavor:delete_flavor_tags')
+
+        try:
+            flavor_logic.delete_tags(flavor_id, tag_to_delete,
+                                     request.transaction_id)
+            LOG.info(
+                "TagsController - tags deleted for flavor {}".format(
+                    flavor_id))
+            utils.audit_trail('delete tags', request.transaction_id,
+                              request.headers, flavor_id, 'Saved to DB')
+
+        except ErrorStatus as exp:
+            LOG.log_exception(
+                "TagsController - Failed to delete tags", exp)
+            utils.audit_trail('delete tags', request.transaction_id,
+                              request.headers, flavor_id)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exp.message,
+                                      status_code=exp.status_code)
+        except Exception as exp:
+            LOG.log_exception("TagsController - Failed to delete tags",
+                              exp)
+            utils.audit_trail('delete tags', request.transaction_id,
+                              request.headers, flavor_id)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exp))
+
+        return
+
+    @wsexpose(TagsWrapper, str, body=TagsWrapper, rest_content_types='json',
+              status_code=200)
+    def put(self, flavor_id, tags_wrapper):
+        LOG.info("TagsController - update tags of flavor {}".format(flavor_id))
+        flavor_logic, utils = di.resolver.unpack(TagsController)
+        LOG.info("TagsController - update tags with {} ".format(tags_wrapper.tags))
+        authentication.authorize(request, 'flavor:replace_flavor_tags')
+
+        try:
+            result = flavor_logic.update_tags(flavor_id, tags_wrapper, request.transaction_id)
+            LOG.info("TagsController - tags updated")
+            utils.audit_trail('update tags', request.transaction_id, request.headers, flavor_id)
+            return result
+
+        except ErrorStatus as exception:
+            LOG.log_exception("TagsController - Failed to update tags", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("TagsController - Failed to update tags", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @wsexpose(TagsWrapper, str, rest_content_types='json', status_code=200)
+    def get(self, flavor_id):
+        flavor_logic, utils = di.resolver.unpack(TagsController)
+        LOG.info("TagsController - get tags of flavor {}".format(flavor_id))
+        authentication.authorize(request, 'flavor:get_flavor_tags')
+
+        try:
+            result = flavor_logic.get_tags(flavor_id)
+            LOG.debug("TagsController - got tags successfully")
+            utils.audit_trail('get tags', request.transaction_id,
+                              request.headers, flavor_id)
+            return TagsWrapper(result)
+
+        except ErrorStatus as exception:
+            LOG.log_exception(
+                "TagsController - Failed to get tags", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception(
+                "TagsController - Failed to get tags", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/tenants.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/tenants.py
new file mode 100755
index 00000000..9ba623d0
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/tenants.py
@@ -0,0 +1,92 @@
+from pecan import rest, request
+from pecan.core import abort
+from wsmeext.pecan import wsexpose
+
+from fms_rest.data.wsme.models import TenantWrapper
+from fms_rest.logic.error_base import ErrorStatus
+from fms_rest.logger import get_logger
+
+from orm_common.injector import injector
+from orm_common.utils import api_error_utils as err_utils
+from fms_rest.utils import authentication
+
+LOG = get_logger(__name__)
+
+di = injector.get_di()
+
+
+@di.dependsOn('flavor_logic')
+@di.dependsOn('utils')
+class TenantController(rest.RestController):
+
+    @wsexpose(TenantWrapper, str, body=TenantWrapper, rest_content_types='json', status_code=201)
+    def post(self, flavor_id, tenant_wrapper):
+        flavor_logic, utils = di.resolver.unpack(TenantController)
+        LOG.info("TenantController - add tenants: " + str(tenant_wrapper))
+        authentication.authorize(request, 'flavor:add_flavor_tenants')
+
+        try:
+            result = flavor_logic.add_tenants(flavor_id, tenant_wrapper, request.transaction_id)
+
+            LOG.info("TenantController - tenants added: " + str(result))
+
+            event_details = 'Flavor {} tenants: {} added'.format(
+                flavor_id, tenant_wrapper.tenants)
+            utils.audit_trail('add tenants', request.transaction_id,
+                              request.headers, flavor_id,
+                              event_details=event_details)
+            return result
+
+        except ValueError as exception:
+            LOG.log_exception("TenantController - Failed to add tenants", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=400)
+
+        except ErrorStatus as exception:
+            LOG.log_exception("TenantController - Failed to add tenants", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("TenantController - Failed to add tenants", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @wsexpose(None, str, str, rest_content_types='json', status_code=204)
+    def delete(self, flavor_id, tenant_id):
+        flavor_logic, utils = di.resolver.unpack(TenantController)
+        LOG.info("TenantController - delete tenant: " + str(tenant_id))
+        authentication.authorize(request, 'flavor:delete_flavor_tenant')
+
+        try:
+
+            result = flavor_logic.delete_tenant(flavor_id, tenant_id, request.transaction_id)
+
+            LOG.info("TenantController - tenant deleted: " + str(result))
+
+            event_details = 'Flavor {} tenant {} deleted'.format(flavor_id,
+                                                                 tenant_id)
+            utils.audit_trail('delete tenant', request.transaction_id,
+                              request.headers, flavor_id,
+                              event_details=event_details)
+
+        except ErrorStatus as exception:
+            LOG.log_exception("TenantController - Failed to delete tenant", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("TenantController - Failed to delete tenant", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @wsexpose(str, str, rest_content_types='json')
+    def get(self, flavor_id):
+        LOG.error("Get tenants is not supported")
+        raise err_utils.get_error(request.transaction_id,
+                                  status_code=405)
diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/logs.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/logs.py
new file mode 100644
index 00000000..e8d7b1bb
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/logs.py
@@ -0,0 +1,65 @@
+import logging
+
+from pecan import rest
+import wsme
+from wsmeext.pecan import wsexpose
+
+logger = logging.getLogger(__name__)
+
+
+class LogChangeResultWSME(wsme.types.DynamicBase):
+    """log change result wsme type."""
+
+    result = wsme.wsattr(str, mandatory=True, default=None)
+
+    def __init__(self, **kwargs):
+        """"init method."""
+        super(LogChangeResult, self).__init__(**kwargs)
+
+
+class LogChangeResult(object):
+    """log change result type."""
+
+    def __init__(self, result):
+        """"init method."""
+        self.result = result
+
+
+class LogsController(rest.RestController):
+    """Logs Audit controller."""
+
+    @wsexpose(LogChangeResultWSME, str, status_code=201,
+              rest_content_types='json')
+    def put(self, level):
+        """update log level.
+
+        :param level: the log level text name
+        :return:
+        """
+
+        logger.info("Changing log level to [{}]".format(level))
+        try:
+            log_level = logging._levelNames.get(level.upper())
+            if log_level is not None:
+                self._change_log_level(log_level)
+                result = "Log level changed to {}.".format(level)
+                logger.info(result)
+            else:
+                raise Exception(
+                    "The given log level [{}] doesn't exist.".format(level))
+        except Exception as e:
+            result = "Fail to change log_level. Reason: {}".format(
+                e.message)
+            logger.error(result)
+        return LogChangeResult(result)
+
+    @staticmethod
+    def _change_log_level(log_level):
+        path = __name__.split('.')
+        if len(path) > 0:
+            root = path[0]
+            root_logger = logging.getLogger(root)
+            root_logger.setLevel(log_level)
+        else:
+            logger.info("Fail to change log_level to [{}]. "
+                        "the given log level doesn't exist.".format(log_level))
diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/orm.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/orm.py
new file mode 100644
index 00000000..e92326cc
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/orm.py
@@ -0,0 +1,11 @@
+from fms_rest.controllers.v1.orm.configuration import ConfigurationController
+from fms_rest.controllers.v1.orm.flavors.flavors import FlavorController
+from fms_rest.controllers.v1.orm.logs import LogsController
+from pecan.rest import RestController
+
+
+class OrmController(RestController):
+
+    configuration = ConfigurationController()
+    flavors = FlavorController()
+    logs = LogsController()
diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/v1.py b/orm/services/flavor_manager/fms_rest/controllers/v1/v1.py
new file mode 100644
index 00000000..24baa1cb
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/controllers/v1/v1.py
@@ -0,0 +1,7 @@
+from fms_rest.controllers.v1.orm.orm import OrmController
+from pecan.rest import RestController
+
+
+class V1Controller(RestController):
+
+    orm = OrmController()
diff --git a/orm/services/flavor_manager/fms_rest/data/__init__.py b/orm/services/flavor_manager/fms_rest/data/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/__init__.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/data_manager.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/data_manager.py
new file mode 100755
index 00000000..6200980a
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/data_manager.py
@@ -0,0 +1,102 @@
+
+'''
+ * This file was generated by ProCG version 2.0
+ *
+ * File name:	fms\data\sql_alchemy\data_manager_base.py
+ * Language:	Python
+ * Database:	My Sql
+ *
+ * Copyright (c) 2002-2016 iGenXSoft.
+ * For more information visit http://www.igenxsoft.com
+'''
+
+from sqlalchemy.event import listen
+from pecan import conf
+from oslo_db.sqlalchemy import session as db_session
+
+import logging
+
+
+# from fms_rest.logic.error_base import DuplicateEntityError
+from fms_rest.data.sql_alchemy.flavor.flavor_record import FlavorRecord
+
+LOG = logging.getLogger(__name__)
+
+
+# event handling
+def on_before_flush(session, flush_context, instances):
+    LOG.info("on_before_flush:", str(flush_context))
+    for model in session.new:
+        if hasattr(model, "validate"):
+            model.validate("new")
+
+    for model in session.dirty:
+        if hasattr(model, "validate"):
+            model.validate("dirty")
+
+
+class DataManager(object):
+
+    def __init__(self, connection_string=None):
+        if not connection_string:
+            connection_string = conf.database.connection_string
+
+        try:
+            self._engine_facade = db_session.EngineFacade(connection_string, autocommit=False)
+        except Exception:
+            nagios_message = "CRITICAL|CONDB001 - "
+            err_message = "Could not establish database connection"
+            LOG.error(nagios_message + err_message)
+            raise Exception(err_message)
+
+        # self._engine = create_engine(connection_string, echo=True)
+        # self.session_maker = sessionmaker(bind=self.get_engine())
+        self._session = None
+        listen(self.session, 'before_flush', on_before_flush)
+        self.flavor_record = None
+
+    def get_engine(self):
+        return self._engine_facade.get_engine()
+
+    @property
+    def engine(self):
+        return self.get_engine()
+
+    def get_session(self):
+        if not self._session:
+            self._session = self._engine_facade.get_session()
+        return self._session
+
+    @property
+    def session(self):
+        return self.get_session()
+
+    def begin_transaction(self):
+        # self.session.begin()
+        # no need to begin transaction - the transaction is open automatically
+        pass
+
+    def flush(self):
+        try:
+            self.session.flush()
+        except Exception as exp:
+            raise
+
+    def commit(self):
+        self.session.commit()
+
+    def rollback(self):
+        self.session.rollback()
+
+    def close(self):
+        self.session.close()
+        self.engine.dispose()
+
+    def get_record(self, record_name):
+        if record_name == "Flavor" or record_name == "flavor":
+            # if not hasattr(self, "flavor_record"):
+            #    self.flavor_record = FlavorRecord(self.session)
+            if not self.flavor_record:
+                self.flavor_record = FlavorRecord(self.session)
+            return self.flavor_record
+        return None
diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/db_models.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/db_models.py
new file mode 100755
index 00000000..d8cd93fd
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/db_models.py
@@ -0,0 +1,557 @@
+from sqlalchemy import Column, Integer, BigInteger, String, ForeignKey
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.orm import relationship, validates
+from oslo_db.sqlalchemy import models
+
+from fms_rest.logger import get_logger
+from __builtin__ import reversed
+from fms_rest.logic.error_base import ErrorStatus
+LOG = get_logger(__name__)
+
+Base = declarative_base()
+
+
+def get_list_repr(list):
+    text = "["
+    for item in list:
+        if len(text) > 1:
+            text += ","
+        text += item.__repr__()
+    text += "]"
+    return text
+
+
+class FMSBaseModel(models.ModelBase):
+
+    """Base class for FMS Models."""
+
+    __table_args__ = {'mysql_engine': 'InnoDB'}
+
+
+class Flavor(Base, FMSBaseModel):
+    '''
+    Flavor is a DataObject contains all the fields defined in Flavor table record.
+    defined as SqlAlchemy model map to a table
+    '''
+    __tablename__ = "flavor"
+
+    internal_id = Column(BigInteger, primary_key=True)
+    id = Column(String)
+    name = Column(String)
+    alias = Column(String)
+    description = Column(String)
+    series = Column(String)
+    ram = Column(Integer)
+    vcpus = Column(Integer)
+    disk = Column(Integer)
+    swap = Column(Integer)
+    ephemeral = Column(Integer)
+    visibility = Column(String)
+    flavor_extra_specs = relationship("FlavorExtraSpec",
+                                      cascade="all, delete, delete-orphan")
+    flavor_tags = relationship("FlavorTag",
+                               cascade="all, delete, delete-orphan")
+    flavor_options = relationship("FlavorOption",
+                                  cascade="all, delete, delete-orphan")
+    flavor_regions = relationship("FlavorRegion",
+                                  cascade="all, delete, delete-orphan")
+    flavor_tenants = relationship("FlavorTenant",
+                                  cascade="all, delete, delete-orphan")
+
+    def __repr__(self):
+        text = "Flavor(internal_id={}, id={}, name={}, alias={}, description={}, " \
+               "series={}, ram={}, vcpus={}, disk={}, swap={}, ephemeral={}," \
+               "visibility={}, flavor_extra_specs={}, flavor_tags={}," \
+               "flavor_options={},  flavor_regions={}, flavor_tenants={})". \
+            format(self.internal_id,
+                   self.id,
+                   self.name,
+                   self.alias,
+                   self.description,
+                   self.series,
+                   self.ram,
+                   self.vcpus,
+                   self.disk,
+                   self.swap,
+                   self.ephemeral,
+                   self.visibility,
+                   get_list_repr(self.flavor_extra_specs),
+                   get_list_repr(self.flavor_tags),
+                   get_list_repr(self.flavor_options),
+                   get_list_repr(self.flavor_regions),
+                   get_list_repr(self.flavor_tenants))
+
+        return text
+
+    def todict(self):
+        extra_specs = {}
+        # don't send tags to rds server
+        # tags = {}
+        options = {}
+
+        for extra_spec in self.flavor_extra_specs:
+            extra_specs[extra_spec.key_name] = extra_spec.key_value
+
+        for option in self.flavor_options:
+            options[option.key_name] = option.key_value
+
+        return dict(
+            id=self.id,
+            name=self.name,
+            description=self.description,
+            series=self.series,
+            ram=self.ram,
+            vcpus=self.vcpus,
+            disk=self.disk,
+            swap=self.swap,
+            ephemeral=self.ephemeral,
+            visibility=self.visibility,
+            extra_specs=extra_specs,
+            option=options,
+            regions=self.get_regions_json(),
+            tenants=[flavor_tenant.todict()
+                     for flavor_tenant in self.flavor_tenants]
+        )
+
+    def get_regions_json(self):
+        regions_json = []
+        for flavor_region in self.flavor_regions:
+            region_json = flavor_region.todict()
+            regions_json.append(region_json)
+        return regions_json
+
+    @validates("series")
+    def validate_series(self, key, series):
+        if series not in ['ns', 'nd', 'nv', 'gv', 'ss']:
+            raise ValueError("Series must be one of: 'ns' 'nd' 'nv' 'gv' 'ss'")
+        return series
+
+    def add_region(self, flavor_region):
+        assert isinstance(flavor_region, FlavorRegion)
+        try:
+            LOG.debug("add region {0} to flavor {1}".format(str(flavor_region),
+                                                            str(self)))
+            self.flavor_regions.append(flavor_region)
+
+        except Exception as exception:
+            LOG.log_exception("Failed to add region {0} to flavor {1}".format(
+                str(flavor_region), str(self)), exception)
+            raise
+
+    def remove_region(self, region_name):
+        region_deleted_flag = False
+        assert isinstance(region_name, basestring)
+        try:
+            LOG.debug("remove regions {0} from flavor {1}".format(region_name,
+                                                                  str(self)))
+
+            for region in reversed(self.flavor_regions):
+                if region.region_name == region_name:
+                    self.flavor_regions.remove(region)
+                    region_deleted_flag = True
+
+            if not region_deleted_flag:
+                raise ErrorStatus(404,
+                                  "Failed to remove region {0} from flavor id {1}".format(
+                                      region_name, str(self.id)))
+
+        except ErrorStatus as e:
+            raise
+
+        except Exception as exception:
+            LOG.log_exception(
+                "Failed to remove region {0} from flavor {1}".format(
+                    region_name, str(self)), exception)
+            raise
+
+    def add_tags(self, flavor_tags):
+        assert isinstance(flavor_tags, list) and all(isinstance(ft, FlavorTag) for ft in flavor_tags)
+        try:
+            LOG.debug("add tags {0} to flavor {1}".format(str(flavor_tags),
+                                                          str(self)))
+            for tag in flavor_tags:
+                self.flavor_tags.append(tag)
+
+        except Exception as exception:
+            LOG.log_exception("Failed to add tags {0} to flavor {1}".format(
+                str(flavor_tags), str(self)), exception)
+            raise
+
+    def replace_tags(self, flavor_tags):
+        assert isinstance(flavor_tags, list) and all(isinstance(ft, FlavorTag) for ft in flavor_tags)
+        try:
+            LOG.debug("replace tags {0} for flavor {1}".format(str(flavor_tags),
+                                                               str(self)))
+            self.remove_all_tags()
+            self.add_tags(flavor_tags)
+
+        except Exception as exception:
+            LOG.log_exception("Failed to add region {0} to flavor {1}".format(
+                str(flavor_tags), str(self)), exception)
+            raise
+
+    def remove_all_tags(self):
+        try:
+            LOG.debug("remove all tags from flavor {}".format(str(self)))
+            self.flavor_tags = []
+        except Exception as exception:
+            LOG.log_exception("Failed to remove all tags from flavor {1}".format(str(self)), exception)
+            raise
+
+    def remove_tag(self, tag_name):
+        deleted_flag = False
+        assert isinstance(tag_name, basestring)
+        try:
+            LOG.debug("remove tag {0} from flavor {1}".format(tag_name,
+                                                              str(self)))
+
+            for tag in reversed(self.flavor_tags):
+                if tag.key_name == tag_name:
+                    self.flavor_tags.remove(tag)
+                    deleted_flag = True
+
+            if not deleted_flag:
+                raise ErrorStatus(404,
+                                  "Failed to remove tag {0} from flavor id {1}".format(
+                                      tag_name, str(self.id)))
+
+        except ErrorStatus as e:
+            raise
+
+        except Exception as exception:
+            LOG.log_exception(
+                "Failed to remove tag {0} from flavor {1}".format(
+                    tag_name, str(self)), exception)
+            raise
+
+    def add_tenant(self, flavor_tenant):
+        assert isinstance(flavor_tenant, FlavorTenant)
+        try:
+            LOG.debug("add tenant {0} to flavor {1}".format(str(flavor_tenant),
+                                                            str(self)))
+            self.flavor_tenants.append(flavor_tenant)
+
+        except Exception as exception:
+            LOG.log_exception(
+                "Failed to add tenant {0} from flavor {1}".format(
+                    str(flavor_tenant), str(self)), exception)
+            raise
+
+    def remove_tenant(self, tenant_id):
+        assert isinstance(tenant_id, basestring)
+        try:
+            LOG.debug("remove tenants {0} from flavor {1}".format(tenant_id,
+                                                                  str(self)))
+
+            for tenant in reversed(self.flavor_tenants):
+                if tenant.tenant_id == tenant_id:
+                    self.flavor_tenants.remove(tenant)
+
+        except Exception as exception:
+            LOG.log_exception(
+                "Failed to remove tenant {0} from flavor {1}".format(
+                    tenant_id, str(self)), exception)
+            raise
+
+    def add_extra_specs(self, extra_specs):
+        LOG.debug("db: add extra specs {} to db".format(extra_specs))
+        try:
+            if isinstance(extra_specs, list):
+                for extra_spec in extra_specs:
+                    self.flavor_extra_specs.append(extra_spec)
+            else:
+                self.flavor_extra_specs.append(extra_specs)
+
+        except Exception as exp:
+
+            LOG.log_exception(
+                "Failed to add extra spec {0} to flavor {1}".format(
+                    str(extra_specs), str(self)), exp)
+            raise
+
+    def delete_all_extra_specs(self):
+        LOG.debug("db: delete extra spec for this flavor")
+        try:
+            self.flavor_extra_specs = []
+
+        except Exception as exp:
+            LOG.log_exception("fail to remove extra spec", exp)
+            raise
+
+    def remove_extra_spec(self, extra_spec_key_name):
+        deleted_flag = False
+        assert isinstance(extra_spec_key_name, basestring)
+        try:
+            LOG.debug("remove extra_spec {} from flavor {}".format(extra_spec_key_name,
+                                                                   str(self)))
+
+            for extra_spec in reversed(self.flavor_extra_specs):
+                if extra_spec.key_name == extra_spec_key_name:
+                    self.flavor_extra_specs.remove(extra_spec)
+                    deleted_flag = True
+
+            if not deleted_flag:
+                # no need to raise in delete not found
+                LOG.debug(
+                    "Failed to remove extra_spec {0} from flavor id {1}".format(
+                        extra_spec_key_name, str(self.id)))
+
+        except ErrorStatus as e:
+            raise
+
+        except Exception as exception:
+            LOG.log_exception(
+                "Failed to remove extra_spec {0} from flavor {1}".format(extra_spec_key_name, str(self)), exception)
+            raise
+
+    def add_tags(self, flavor_tags):
+        assert isinstance(flavor_tags, list) and all(isinstance(ft, FlavorTag) for ft in flavor_tags)
+        try:
+            LOG.debug("add tags {0} to flavor {1}".format(str(flavor_tags),
+                                                          str(self)))
+            for tag in flavor_tags:
+                self.flavor_tags.append(tag)
+
+        except Exception as exception:
+            LOG.log_exception("Failed to add region {0} to flavor {1}".format(
+                str(flavor_tags), str(self)), exception)
+            raise
+
+    def replace_tags(self, flavor_tags):
+        assert isinstance(flavor_tags, list) and all(isinstance(ft, FlavorTag) for ft in flavor_tags)
+        try:
+            LOG.debug("replace tags {0} for flavor {1}".format(str(flavor_tags),
+                                                               str(self)))
+            self.remove_all_tags()
+            self.add_tags(flavor_tags)
+
+        except Exception as exception:
+            LOG.log_exception("Failed to add region {0} to flavor {1}".format(
+                str(flavor_tags), str(self)), exception)
+            raise
+
+    def remove_all_tags(self):
+        try:
+            LOG.debug("remove all tags from flavor {}".format(str(self)))
+            self.flavor_tags = []
+        except Exception as exception:
+            LOG.log_exception("Failed to remove all tags from flavor {1}".format(str(self)), exception)
+            raise
+
+    def remove_tag(self, tag_name):
+        deleted_flag = False
+        assert isinstance(tag_name, basestring)
+        try:
+            LOG.debug("remove tag {0} from flavor {1}".format(tag_name,
+                                                              str(self)))
+
+            for tag in reversed(self.flavor_tags):
+                if tag.key_name == tag_name:
+                    self.flavor_tags.remove(tag)
+                    deleted_flag = True
+
+            if not deleted_flag:
+                raise ErrorStatus(404,
+                                  "Failed to remove tag {0} from flavor id {1}".format(
+                                      tag_name, str(self.id)))
+
+        except ErrorStatus as e:
+            raise
+
+        except Exception as exception:
+            LOG.log_exception(
+                "Failed to remove tag {0} from flavor {1}".format(
+                    tag_name, str(self)), exception)
+            raise
+
+    def validate(self, type):
+        ''' type can be "new" or "dirty" - comes from event
+        '''
+
+        if self.visibility == "public" and len(self.flavor_tenants) > 0:
+            raise ValueError("tenants should not be specified for a public flavor")
+        elif self.visibility == "private" and len(self.flavor_tenants) == 0:
+            raise ValueError("Tenants must be specified for a private flavor")
+        elif self.visibility not in ["private", "public"]:
+            raise ValueError(
+                "Flavor visibility can be 'public' or 'private',"
+                "got {0}".format(self.visibility))
+
+    def get_existing_region_names(self):
+        existing_region_names = []
+        for region in self.flavor_regions:
+            existing_region_names.append(region.region_name)
+
+        return existing_region_names
+
+
+'''
+' FlavorExtraSpec is a DataObject contains all fields defined in FlavorExtraSpec
+' defined as SqlAlchemy model map to a table
+'''
+
+
+class FlavorExtraSpec(Base, FMSBaseModel):
+
+    def __init__(self,
+                 key_name=None,
+                 key_value=None):
+
+        Base.__init__(self)
+        self.key_name = key_name
+        self.key_value = key_value
+
+    __tablename__ = "flavor_extra_spec"
+
+    flavor_internal_id = Column(ForeignKey(u'flavor.internal_id'),
+                                primary_key=True)
+    key_name = Column(String, primary_key=True)
+    key_value = Column(String)
+
+    def __repr__(self):
+        text = "FlavorExtraSpec(key_name={}, key_value={})".format(
+            self.key_name, self.key_value)
+        return text
+
+    def todict(self):
+        return dict(
+            key_name=self.key_name,
+            key_value=self.key_value
+        )
+
+    def __str__(self):
+        extra_spec = "\"{0}\":\"{1}\"".format(self.key_name, self.key_value)
+        return extra_spec
+
+
+'''
+' FlavorTag is a DataObject and contains all the fields defined in FlavorTag.
+' defined as SqlAlchemy model map to a table
+'''
+
+
+class FlavorTag(Base, FMSBaseModel):
+    def __init__(self, key_name=None, key_value=None):
+        Base.__init__(self)
+        self.key_name = key_name
+        self.key_value = key_value
+
+    __tablename__ = "flavor_tag"
+
+    flavor_internal_id = Column(ForeignKey(u'flavor.internal_id'),
+                                primary_key=True)
+    key_name = Column(String, primary_key=True)
+    key_value = Column(String)
+
+    def __repr__(self):
+        text = "FlavorTag(key_name={}, key_value={})".format(self.key_name,
+                                                             self.key_value)
+        return text
+
+    def todict(self):
+        return dict(
+            key_name=self.key_name,
+            key_value=self.key_value
+        )
+
+    def __str__(self):
+        tag = "\"{0}\":\"{1}\"".format(self.key_name, self.key_value)
+        return tag
+
+
+'''
+' FlavorOption is a DataObject contains all the fields defined in FlavorOption
+' defined as SqlAlchemy model map to a table
+'''
+
+
+class FlavorOption(Base, FMSBaseModel):
+    def __init__(self, key_name=None, key_value=None):
+        Base.__init__(self)
+        self.key_name = key_name
+        self.key_value = key_value
+
+    __tablename__ = "flavor_option"
+
+    flavor_internal_id = Column(ForeignKey(u'flavor.internal_id'),
+                                primary_key=True)
+    key_name = Column(String, primary_key=True)
+    key_value = Column(String)
+
+    def __repr__(self):
+        text = "FlavorOption(key_name={}, key_value={})".format(self.key_name,
+                                                                self.key_value)
+        return text
+
+    def todict(self):
+        return dict(
+            key_name=self.key_name,
+            key_value=self.key_value
+        )
+
+    def __str__(self):
+        option = "\"{0}\":\"{1}\"".format(self.key_name, self.key_value)
+        return option
+
+
+'''
+' FlavorRegion is a DataObject contains all the fields defined in FlavorRegion.
+' defined as SqlAlchemy model map to a table
+'''
+
+
+class FlavorRegion(Base, FMSBaseModel):
+
+    def __init__(self, region_name=None, region_type=None):
+        Base.__init__(self)
+        self.region_name = region_name
+        self.region_type = region_type
+
+    __tablename__ = "flavor_region"
+
+    flavor_internal_id = Column(ForeignKey(u'flavor.internal_id'),
+                                primary_key=True)
+    region_name = Column(String, primary_key=True)
+    region_type = Column(String)
+
+    def __repr__(self):
+        text = "FlavorRegion(flavor_internal_id='{}', region_name='{}', region_type='{}')".format(self.flavor_internal_id,
+                                                                                                  self.region_name,
+                                                                                                  self.region_type
+                                                                                                  )
+        return text
+
+    def todict(self):
+        return dict(
+            name=self.region_name
+        )
+
+
+'''
+' FlavorTenant is a DataObject contains all the fields defined in FlavorTenant.
+' defined as SqlAlchemy model map to a table
+'''
+
+
+class FlavorTenant(Base, FMSBaseModel):
+    def __init__(self, tenant_id=None):
+        Base.__init__(self)
+        self.tenant_id = tenant_id
+
+    __tablename__ = "flavor_tenant"
+
+    flavor_internal_id = Column(ForeignKey(u'flavor.internal_id'),
+                                primary_key=True)
+    tenant_id = Column(String, primary_key=True)
+
+    def __repr__(self):
+        text = "FlavorTenant(flavor_internal_id={}, tenant_id={})".format(
+            self.flavor_internal_id, self.tenant_id)
+        return text
+
+    def todict(self):
+        return dict(
+            tenant_id=self.tenant_id
+        )
+
+# 1866 ProCG uses this line - don't edit it
diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor/__init__.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor/flavor_record.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor/flavor_record.py
new file mode 100755
index 00000000..126c950f
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor/flavor_record.py
@@ -0,0 +1,194 @@
+
+from fms_rest.data.sql_alchemy.db_models import Flavor
+from fms_rest.data.sql_alchemy.db_models import FlavorExtraSpec
+from fms_rest.data.sql_alchemy.db_models import FlavorRegion
+from fms_rest.data.sql_alchemy.db_models import FlavorTenant
+from fms_rest.logger import get_logger
+from sqlalchemy.sql import or_
+
+LOG = get_logger(__name__)
+
+
+class FlavorRecord:
+
+    def __init__(self, session):
+
+        # this model is uses only for the parameters of access mothods, not an instance of model in the database
+        self.__flavors = Flavor()
+        # self.setRecordData(self.__flavors)
+        # self.__flavors.Clear()
+        self.__TableName = "flavor"
+
+        if session:
+            self.setDBSession(session)
+
+    def setDBSession(self, session):
+        self.session = session
+
+    @property
+    def flavor(self):
+        return self.__flavor
+
+    @flavor.setter
+    def flavor(self, flavor):
+        self.__flavor = flavor
+
+    def insert(self, flavor):
+        try:
+            self.session.add(flavor)
+        except Exception as exception:
+            LOG.log_exception("Failed to insert Flavor" + str(flavor), exception)
+            # LOG.error("Failed to insert flavor" + str(flavor) + " Exception:" + str(exception))
+            raise
+
+    def get_flavor(self, internal_id):
+        try:
+            flavor = self.session.query(Flavor).filter(Flavor.internal_id == internal_id)
+            return flavor.first()
+
+        except Exception as exception:
+            message = "Failed to get_flavor:internal_id: {0}".format(internal_id)
+            LOG.log_exception(message, exception)
+            raise
+
+    def delete_by_uuid(self, flavor_uuid):
+        try:
+            result = self.session.connection().execute("delete from flavor where id = \"{0}\"".format(flavor_uuid))
+            return result
+
+        except Exception as exception:
+            message = "Failed to delete_by_uuid: flavor_uuid: {0}".format(flavor_uuid)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_flavor_by_id(self, id):
+        try:
+            flavor = self.session.query(Flavor).filter(Flavor.id == id)
+            return flavor.first()
+
+        except Exception as exception:
+            message = "Failed to get_flavor_by_id: id: {0}".format(id)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_flavor_by_id_or_name(self, id_or_name):
+        try:
+            flavor = self.session.query(Flavor).filter(or_(Flavor.id == id_or_name, Flavor.name == id_or_name))
+            return flavor.first()
+
+        except Exception as exception:
+            message = "Failed to get_flavor_by_id_or_name: id or name: {0}".format(id_or_name)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_flavors_by_series(self, series, **kw):
+        try:
+            query = self.session.query(Flavor).filter(Flavor.series == series)
+            self.customise_query(query, kw)
+            return query.all()
+
+        except Exception as exception:
+            message = "Failed to get_flavors_by_series: series: {0}".format(series)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_all_flavors(self, **kw):
+        try:
+            query = self.session.query(Flavor)
+            query = self.customise_query(query, kw)
+            print str(query)
+            return query.all()
+
+        except Exception as exception:
+            message = "Failed to get_all_flavors"
+            LOG.log_exception(message, exception)
+            raise
+
+    def customise_query(self, query, kw):
+        start = int(kw['start']) if 'start' in kw else 0
+        limit = int(kw['limit']) if 'limit' in kw else 0
+
+        if start > 0:
+            query = query.offset(start)
+
+        if limit > 0:
+            query = query.limit(limit)
+
+        print str(query)
+        return query
+
+    def get_count_of_flavors_by_series(self, series):
+        try:
+            query = self.session.query(Flavor).filter(Flavor.series == series)
+            return query.count()
+
+        except Exception as exception:
+            message = "Failed to get_count_of_flavors_by_series: series: {0}".format(series)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_flavors_by_visibility(self, visibility, **kw):
+        try:
+            query = self.session.query(Flavor).filter(Flavor.visibility == visibility)
+            query = self.customise_query(query, kw)
+            return query.all()
+
+        except Exception as exception:
+            message = "Failed to get_flavors_by_visibility: visibility: {0}".format(visibility)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_count_of_flavors_by_visibility(self, visibility, **kw):
+        try:
+            query = self.session.query(Flavor).filter(Flavor.visibility == visibility)
+            query = self.customise_query(query, kw)
+            return query.get_count()
+
+        except Exception as exception:
+            message = "Failed to get_count_of_flavors_by_visibility: visibility: {0}".format(visibility)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_flavors_by_criteria(self, **criteria):
+        try:
+
+            LOG.debug("get_flavors_by_criteria: criteria: {0}".format(criteria))
+            visibility = criteria['visibility'] if 'visibility' in criteria else None
+            region = criteria['region'] if 'region' in criteria else None
+            tenant = criteria['tenant'] if 'tenant' in criteria else None
+            series = criteria['series'] if 'series' in criteria else None
+            starts_with = criteria['starts_with'] if 'starts_with' in criteria else None
+            contains = criteria['contains'] if 'contains' in criteria else None
+            alias = criteria['alias'] if 'alias' in criteria else None
+
+            query = self.session.query(Flavor)
+
+            if alias:
+                query = query.filter(Flavor.alias == alias)
+
+            if contains:
+                query = query.filter(Flavor.name.ilike("%{}%".format(contains)))
+
+            if starts_with:
+                query = query.filter(Flavor.name.ilike("{}%".format(starts_with)))
+
+            if region:
+                query = query.join(FlavorRegion).filter(FlavorRegion.flavor_internal_id == Flavor.internal_id,
+                                                        FlavorRegion.region_name == region)
+            if tenant:
+                query = query.join(FlavorTenant).filter(FlavorTenant.flavor_internal_id == Flavor.internal_id,
+                                                        FlavorTenant.tenant_id == tenant)
+
+            if visibility:
+                query = query.filter(Flavor.visibility == visibility)
+
+            if series:
+                query = query.filter(Flavor.series == series)
+
+            query = self.customise_query(query, criteria)
+            return query.all()
+
+        except Exception as exception:
+            message = "Failed to get_flavors_by_criteria: criteria: {0}".format(criteria)
+            LOG.log_exception(message, exception)
+            raise
diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_extra_spec/__init__.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_extra_spec/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_extra_spec/flavor_extra_spec_record.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_extra_spec/flavor_extra_spec_record.py
new file mode 100755
index 00000000..29727f06
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_extra_spec/flavor_extra_spec_record.py
@@ -0,0 +1,66 @@
+from sqlalchemy import and_
+from fms_rest.data.sql_alchemy.db_models import FlavorExtraSpec
+
+from fms_rest.logger import get_logger
+
+LOG = get_logger(__name__)
+
+
+class FlavorExtraSpecRecord:
+
+    def __init__(self, session):
+
+        # this model is uses only for the parameters of access mothods,
+        # not an instance of model in the database
+        self.__flavor_extra_specs = FlavorExtraSpec()
+        # self.setRecordData(self.__flavorExtraSpecs)
+        # self.__flavorExtraSpecs.Clear()
+        self.__TableName = "flavor_extra_spec"
+
+        if session:
+            self.setDBSession(session)
+
+    def setDBSession(self, session):
+        self.session = session
+
+    @property
+    def flavor_extra_spec(self):
+        return self.__flavor_extra_specs
+
+    @flavor_extra_spec.setter
+    def flavor_extra_spec(self, flavor_extra_specs):
+        self.__flavor_extra_specs = flavor_extra_specs
+
+    def insert(self, flavor_extra_specs):
+        try:
+            self.session.add(flavor_extra_specs)
+        except Exception as exception:
+            LOG.log_exception("Failed to insert FlavorExtraSpec" +
+                              str(flavor_extra_specs), exception)
+            raise
+
+    def get_flavor_extra_spec(self, flavor_internal_id, key_name):
+        try:
+            flavor_extra_spec = self.session.query(FlavorExtraSpec).filter(
+                and_(FlavorExtraSpec.flavor_internal_id == flavor_internal_id,
+                     FlavorExtraSpec.key_name == key_name))
+            return flavor_extra_spec.first()
+
+        except Exception as exception:
+            message = "Failed to get_flavor_extra_spec:flavor_internal_id:" \
+                      "{0}, key_name {1}".format(flavor_internal_id, key_name)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_flavor_extra_specs_by_flavor_internal_id(self, flavor_internal_id):
+        try:
+            flavor_extra_specs = self.session.query(FlavorExtraSpec).filter(
+                FlavorExtraSpec.flavor_internal_id == flavor_internal_id)
+            return flavor_extra_specs.all()
+
+        except Exception as exception:
+            message = "Failed to " \
+                      "get_flavor_extra_specs_by_flavor_internal_id:" \
+                      "flavor_internal_id: {0}".format(flavor_internal_id)
+            LOG.log_exception(message, exception)
+            raise
diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_options/__init__.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_options/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_options/flavor_option_record.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_options/flavor_option_record.py
new file mode 100755
index 00000000..f82f1a44
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_options/flavor_option_record.py
@@ -0,0 +1,65 @@
+from sqlalchemy import and_
+from fms_rest.data.sql_alchemy.db_models import FlavorOption
+
+from fms_rest.logger import get_logger
+
+LOG = get_logger(__name__)
+
+
+class FlavorOptionRecord:
+    def __init__(self, session):
+
+        # this model is uses only for the parameters of access mothods,
+        # not an instance of model in the database
+        self.__flavor_option = FlavorOption()
+        # self.setRecordData(self.__flavor_option)
+        # self.__flavor_option.Clear()
+        self.__TableName = "flavor_option"
+
+        if session:
+            self.setDBSession(session)
+
+    def setDBSession(self, session):
+        self.session = session
+
+    @property
+    def flavor_option(self):
+        return self.__flavor_option
+
+    @flavor_option.setter
+    def flavor_option(self, flavor_option):
+        self.__flavor_option = flavor_option
+
+    def insert(self, flavor_option):
+        try:
+            self.session.add(flavor_option)
+        except Exception as exception:
+            LOG.log_exception("Failed to insert FlavorOption" +
+                              str(flavor_option), exception)
+            raise
+
+    def get_flavor_option(self, flavor_internal_id, key_name):
+        try:
+            flavor_option = self.session.query(FlavorOption).filter(
+                and_(FlavorOption.flavor_internal_id == flavor_internal_id,
+                     FlavorOption.key_name == key_name))
+            return flavor_option.first()
+
+        except Exception as exception:
+            message = "Failed to get_flavor_option:flavor_internal_id:" \
+                      "{0}, key_name {1}".format(flavor_internal_id, key_name)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_flavor_option_by_flavor_internal_id(self, flavor_internal_id):
+        try:
+            flavor_option = self.session.query(FlavorOption).filter(
+                FlavorOption.flavor_internal_id == flavor_internal_id)
+            return flavor_option.all()
+
+        except Exception as exception:
+            message = "Failed to " \
+                      "get_flavor_option_by_flavor_internal_id:" \
+                      "flavor_internal_id: {0}".format(flavor_internal_id)
+            LOG.log_exception(message, exception)
+            raise
diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_region/__init__.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_region/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_region/flavor_region_record.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_region/flavor_region_record.py
new file mode 100755
index 00000000..30a2def8
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_region/flavor_region_record.py
@@ -0,0 +1,61 @@
+from sqlalchemy import and_
+from fms_rest.data.sql_alchemy.db_models import FlavorRegion
+
+from fms_rest.logger import get_logger
+LOG = get_logger(__name__)
+
+
+class FlavorRegionRecord:
+
+    def __init__(self, session):
+
+        # this model is uses only for the parameters of access mothods, not an instance of model in the database
+        self.__flavor_regions = FlavorRegion()
+        # self.setRecordData(self.__flavor_regions)
+        # self.__flavor_regions.Clear()
+        self.__TableName = "flavor_region"
+
+        if session:
+            self.setDBSession(session)
+
+    def setDBSession(self, session):
+        self.session = session
+
+    @property
+    def flavor_region(self):
+        return self.__flavor_region
+
+    @flavor_region.setter
+    def flavor_region(self, flavor_region):
+        self.__flavor_region = flavor_region
+
+    def insert(self, flavor_region):
+        try:
+            self.session.add(flavor_region)
+        except Exception as exception:
+            LOG.log_exception("Failed to insert FlavorRegion" + str(flavor_region), exception)
+            # LOG.error("Failed to insert flavor_region" + str(flavor_region) + " Exception:" + str(exception))
+            raise
+
+    def get_flavor_region(self, flavor_internal_id, region_name):
+        try:
+            flavor_region = self.session.query(FlavorRegion).filter(and_(FlavorRegion.flavor_internal_id == flavor_internal_id,
+                                                                         FlavorRegion.region_name == region_name))
+            return flavor_region.first()
+
+        except Exception as exception:
+            message = "Failed to get_flavor_region:flavor_internal_id: {0}, region_name {1}".format(flavor_internal_id, region_name)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_flavor_regions_by_flavor_internal_id(self, flavor_internal_id):
+        try:
+            flavor_regions = self.session.query(FlavorRegion).filter(FlavorRegion.flavor_internal_id == flavor_internal_id)
+            return flavor_regions.all()
+
+        except Exception as exception:
+            message = "Failed to get_flavor_regions_by_flavor_internal_id: flavor_internal_id: {0}".format(flavor_internal_id)
+            LOG.log_exception(message, exception)
+            raise
+
+#     12880 ProCG uses this line - don't edit it
diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_tags/__init__.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_tags/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_tags/flavor_tag_record.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_tags/flavor_tag_record.py
new file mode 100755
index 00000000..0b703efa
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_tags/flavor_tag_record.py
@@ -0,0 +1,65 @@
+from sqlalchemy import and_
+from fms_rest.data.sql_alchemy.db_models import FlavorTag
+
+from fms_rest.logger import get_logger
+
+LOG = get_logger(__name__)
+
+
+class FlavorTagRecord:
+    def __init__(self, session):
+
+        # this model is uses only for the parameters of access mothods,
+        # not an instance of model in the database
+        self.__flavor_tag = FlavorTag()
+        # self.setRecordData(self.FlavorTag)
+        # self.__flavorTag.Clear()
+        self.__TableName = "flavor_extra_spec"
+
+        if session:
+            self.setDBSession(session)
+
+    def setDBSession(self, session):
+        self.session = session
+
+    @property
+    def flavor_extra_spec(self):
+        return self.__flavor_tag
+
+    @flavor_extra_spec.setter
+    def flavor_extra_spec(self, flavor_tag):
+        self.__flavor_tag = flavor_tag
+
+    def insert(self, flavor_tag):
+        try:
+            self.session.add(flavor_tag)
+        except Exception as exception:
+            LOG.log_exception("Failed to insert FlavorTag" +
+                              str(flavor_tag), exception)
+            raise
+
+    def get_flavor_extra_spec(self, flavor_internal_id, key_name):
+        try:
+            flavor_extra_spec = self.session.query(FlavorTag).filter(
+                and_(FlavorTag.flavor_internal_id == flavor_internal_id,
+                     FlavorTag.key_name == key_name))
+            return flavor_extra_spec.first()
+
+        except Exception as exception:
+            message = "Failed to get_flavor_extra_spec:flavor_internal_id:" \
+                      "{0}, key_name {1}".format(flavor_internal_id, key_name)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_flavor_tag_by_flavor_internal_id(self, flavor_internal_id):
+        try:
+            flavor_tag = self.session.query(FlavorTag).filter(
+                FlavorTag.flavor_internal_id == flavor_internal_id)
+            return flavor_tag.all()
+
+        except Exception as exception:
+            message = "Failed to " \
+                      "get_flavor_tag_by_flavor_internal_id:" \
+                      "flavor_internal_id: {0}".format(flavor_internal_id)
+            LOG.log_exception(message, exception)
+            raise
diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_tenant/__init__.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_tenant/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_tenant/flavor_tenant_record.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_tenant/flavor_tenant_record.py
new file mode 100755
index 00000000..4ae65a10
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor_tenant/flavor_tenant_record.py
@@ -0,0 +1,61 @@
+from sqlalchemy import and_
+from fms_rest.data.sql_alchemy.db_models import FlavorTenant
+
+from fms_rest.logger import get_logger
+LOG = get_logger(__name__)
+
+
+class FlavorTenantRecord:
+
+    def __init__(self, session):
+
+        # this model is uses only for the parameters of access mothods, not an instance of model in the database
+        self.__flavorTenants = FlavorTenant()
+        # self.setRecordData(self.__flavorTenants)
+        # self.__flavorTenants.Clear()
+        self.__TableName = "flavor_tenant"
+
+        if session:
+            self.setDBSession(session)
+
+    def setDBSession(self, session):
+        self.session = session
+
+    @property
+    def flavor_tenant(self):
+        return self.__flavorTenant
+
+    @flavor_tenant.setter
+    def flavor_tenant(self, flavorTenant):
+        self.__flavorTenant = flavorTenant
+
+    def insert(self, flavorTenant):
+        try:
+            self.session.add(flavorTenant)
+        except Exception as exception:
+            LOG.log_exception("Failed to insert FlavorTenant" + str(flavorTenant), exception)
+            # LOG.error("Failed to insert flavorTenant" + str(flavorTenant) + " Exception:" + str(exception))
+            raise
+
+    def get_flavor_tenant(self, flavor_internal_id, tenant_id):
+        try:
+            flavor_tenant = self.session.query(FlavorTenant).filter(and_(FlavorTenant.flavor_internal_id == flavor_internal_id,
+                                                                         FlavorTenant.tenant_id == tenant_id))
+            return flavor_tenant.first()
+
+        except Exception as exception:
+            message = "Failed to get_flavor_tenant: flavor_internal_id: {0}, tenant_id {1}".format(flavor_internal_id, tenant_id)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_flavor_tenants_by_flavor_internal_id(self, flavor_internal_id):
+        try:
+            flavor_tenants = self.session.query(FlavorTenant).filter(FlavorTenant.flavor_internal_id == flavor_internal_id)
+            return flavor_tenants.all()
+
+        except Exception as exception:
+            message = "Failed to get_flavor_tenants_by_flavor_internal_id: flavor_internal_id: {0}".format(flavor_internal_id)
+            LOG.log_exception(message, exception)
+            raise
+
+#     12850 ProCG uses this line - don't edit it
diff --git a/orm/services/flavor_manager/fms_rest/data/wsme/__init__.py b/orm/services/flavor_manager/fms_rest/data/wsme/__init__.py
new file mode 100644
index 00000000..c65cf067
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/data/wsme/__init__.py
@@ -0,0 +1,14 @@
+
+
+def init_model():
+    """
+    This is a stub method which is called at application startup time.
+
+    If you need to bind to a parsed database configuration, set up tables or
+    ORM classes, or perform any database initialization, this is the
+    recommended place to do it.
+
+    For more information working with databases, and some common recipes,
+    see http://pecan.readthedocs.org/en/latest/databases.html
+    """
+    pass
diff --git a/orm/services/flavor_manager/fms_rest/data/wsme/model.py b/orm/services/flavor_manager/fms_rest/data/wsme/model.py
new file mode 100644
index 00000000..a964a2d6
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/data/wsme/model.py
@@ -0,0 +1,13 @@
+from wsme import types as wtypes
+from wsme.rest.json import tojson
+
+
+class Model(wtypes.DynamicBase):
+    """Base class for FMS models.
+    """
+
+    def to_db_model(self):
+        raise NotImplementedError("This function was not implemented")
+
+    def tojson(self):
+        return tojson(type(self), self)
diff --git a/orm/services/flavor_manager/fms_rest/data/wsme/models.py b/orm/services/flavor_manager/fms_rest/data/wsme/models.py
new file mode 100755
index 00000000..552c26fd
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/data/wsme/models.py
@@ -0,0 +1,556 @@
+import wsme
+from fms_rest.data.sql_alchemy import db_models
+
+from fms_rest.data.wsme.model import Model
+
+from fms_rest.logic.error_base import ErrorStatus
+
+from pecan import conf, request
+from orm_common.utils.cross_api_utils import set_utils_conf, get_regions_of_group
+
+
+class TenantWrapper(Model):
+    """user model the customer
+
+    """
+    tenants = wsme.wsattr([str], mandatory=False)
+
+    def __init__(self, tenants=[]):  # pragma: no cover
+        """region array
+
+        :param tenants: array of tenants
+        """
+
+        self.tenants = tenants
+
+
+class ExtraSpecsWrapper(Model):
+    """extra spec model."""
+
+    os_extra_specs = wsme.wsattr(wsme.types.DictType(str, str),
+                                 mandatory=False)
+    extra_specs = wsme.wsattr(wsme.types.DictType(str, str),
+                              mandatory=False, name="extra-specs")
+
+    def __init__(self, os_extra_specs={}, extra_specs={}):
+        """init func."""
+
+        # self.extra_specs = extra_specs
+        if extra_specs:
+            self.extra_specs = extra_specs
+        if os_extra_specs:
+            self.os_extra_specs = os_extra_specs
+
+    def to_db_model(self):
+        extra_spec = []
+
+        for key, value in self.os_extra_specs.iteritems():
+            if Flavor.ignore_extra_specs_input(key.replace(":", "____")):
+                continue
+            extra_spec_rec = db_models.FlavorExtraSpec()
+            extra_spec_rec.key_name = key
+            extra_spec_rec.key_value = value
+            extra_spec.append(extra_spec_rec)
+
+        return extra_spec
+
+    def _get_extra_specs_urlpath(self):
+        # return the way to return extra specs depends on url used
+        return '{}'.format(request.upath_info).split("/")[-1].strip()
+
+    @staticmethod
+    def from_db_model(os_extra_specs):
+        extra_spec_method = ExtraSpecsWrapper()._get_extra_specs_urlpath()
+        extra_specs = ExtraSpecsWrapper()
+        setattr(extra_specs, extra_spec_method, {})
+        for extra_spec in os_extra_specs:
+            getattr(extra_specs, extra_spec_method, None)[extra_spec.key_name] = extra_spec.key_value
+        return extra_specs
+
+
+class TagsWrapper(Model):
+    """Tags model."""
+
+    tags = wsme.wsattr(wsme.types.DictType(str, str), mandatory=True)
+
+    def __init__(self, tags={}):
+        """init func."""
+
+        self.tags = tags
+
+    def to_db_model(self):
+        tag = []
+
+        for key, value in self.tags.iteritems():
+            tags_rec = db_models.FlavorTag()
+            tags_rec.key_name = key
+            tags_rec.key_value = value
+            tag.append(tags_rec)
+
+        return tag
+
+    @staticmethod
+    def from_db_model(tags):
+        my_tags = TagsWrapper()
+        for tag in tags:
+            my_tags.tags[tag.key_name] = tag.key_value
+
+        return my_tags
+
+
+class Region(Model):
+    """network model the customer
+
+    """
+    name = wsme.wsattr(str, mandatory=True)
+    type = wsme.wsattr(str, default="single", mandatory=False)
+    status = wsme.wsattr(str, mandatory=False)
+    error_message = wsme.wsattr(str, mandatory=False)
+
+    def __init__(self, name="", type="single", status="", error_message=""):
+        """region array
+
+        :param name:  region names
+        :param type:  region type
+        :param status:  region creation status
+        :param error_message:  region creation error status message
+        """
+
+        self.name = name
+        self.type = type
+        self.status = status
+        if error_message:
+            self.error_message = error_message
+
+    def to_db_model(self):
+        if self.name == '' or self.name.isspace():
+            raise ErrorStatus(400, 'Cannot add region with empty name')
+        region_rec = db_models.FlavorRegion()
+        region_rec.region_name = self.name
+        region_rec.region_type = self.type
+
+        return region_rec
+
+
+class RegionWrapper(Model):  # pragma: no cover
+    """regions model
+
+    """
+    regions = wsme.wsattr([Region], mandatory=False)
+
+    def __init__(self, regions=[]):
+        """
+
+        :param regions: array of regions
+        """
+
+        self.regions = regions
+
+
+class Flavor(Model):
+    """flavor entity with all it's related data
+
+    """
+    id = wsme.wsattr(wsme.types.text, mandatory=False)
+    name = wsme.wsattr(wsme.types.text, mandatory=False)
+    alias = wsme.wsattr(wsme.types.text, mandatory=False)
+    description = wsme.wsattr(wsme.types.text, mandatory=False)
+    series = wsme.wsattr(wsme.types.text, mandatory=True)
+    ram = wsme.wsattr(wsme.types.text, mandatory=True)
+    vcpus = wsme.wsattr(wsme.types.text, mandatory=True)
+    disk = wsme.wsattr(wsme.types.text, mandatory=True)
+    swap = wsme.wsattr(wsme.types.text, mandatory=False)
+    ephemeral = wsme.wsattr(wsme.types.text, mandatory=False)
+    regions = wsme.wsattr(wsme.types.ArrayType(Region), mandatory=False)
+    visibility = wsme.wsattr(wsme.types.text, mandatory=True)
+    tenants = wsme.wsattr(wsme.types.ArrayType(str), mandatory=False)
+    status = wsme.wsattr(wsme.types.text, mandatory=False)
+    tags = wsme.wsattr(wsme.types.DictType(str, str), mandatory=False)
+    tag = wsme.wsattr(wsme.types.DictType(str, str), mandatory=False)
+    options = wsme.wsattr(wsme.types.DictType(str, str), mandatory=False)
+    extra_specs = wsme.wsattr(wsme.types.DictType(str, str), mandatory=False,
+                              name="extra-specs")
+
+    def __init__(self,
+                 id="",
+                 name="",
+                 alias=None,
+                 description="",
+                 series="",
+                 ram="0",
+                 vcpus="0",
+                 disk="0",
+                 swap="0",
+                 ephemeral="0",
+                 extra_specs={},
+                 tags={},
+                 tag={},
+                 options={},
+                 regions=[],
+                 visibility="",
+                 tenants=[],
+                 status=""):
+        """Create a new Flavor.
+
+        :param id: flavor UUID
+        :param name: name extracted from flavor parameters
+        :param description: flavor description
+        :param series:  series possible
+        :param ram: RAM in MB
+        :param vcpus:
+        :param disk: Disk in GB
+        :param swap: is optional and default is 0
+        :param ephemeral: is optional and default is 0
+        :param extra_spec: key-value dictionary
+        :param tags: key-value dictionary
+        :param options: key-value dictionary
+        :param regions:
+        :param visibility:
+        :param tenants:
+        :param status: status of creation
+        """
+        self.id = id
+        self.name = name
+        if alias is not None:
+            self.alias = alias
+        self.description = description
+        self.series = series
+        self.ram = ram
+        self.vcpus = vcpus
+        self.disk = disk
+        self.swap = swap
+        self.ephemeral = "0" if not ephemeral else ephemeral
+        self.extra_specs = extra_specs
+        self.tags = tags
+        self.tag = tag
+        self.options = options
+        self.regions = regions
+        self.visibility = visibility
+        self.tenants = tenants
+        self.status = status
+
+    def validate_model(self, context=None):
+        bundle = ['b1', 'b2']
+        numa = ['n0', 'n1']
+        vlan = ['v1', 'v2', 'v3', 'v4', 'v5', 'v6']
+
+        try:
+            if not self.ram.isdigit():
+                raise ErrorStatus(400, "ram must be a number")
+            if not self.vcpus.isdigit():
+                raise ErrorStatus(400, "vcpus must be a number")
+            if not self.disk.isdigit():
+                raise ErrorStatus(400, "disk must be a number")
+            if not self.swap.isdigit():
+                raise ErrorStatus(400, "swap must be a number")
+            if not self.ephemeral.isdigit():
+                raise ErrorStatus(400, "ephemeral must be a number")
+            if self.series:
+                allowed_series = conf.extra_spec_needed_table.to_dict().keys()
+                if self.series not in allowed_series:
+                    raise ErrorStatus(400, "series possible values are {}".format(
+                        allowed_series))
+            if int(self.ram) not in range(1024, 327680 + 1, 1024):
+                raise ErrorStatus(400,
+                                  "ram value is out of range. Expected range is 1024(1GB)-327680(320GB) "
+                                  "and must be a multiple of 1024")
+            if int(self.vcpus) not in range(1, 48 + 1):
+                raise ErrorStatus(400, "vcpus value is out of range. Expected range is 1-48")
+            if int(self.disk) < 0:
+                raise ErrorStatus(400, "disk must be a non negative number")
+            if int(self.ephemeral) not in range(0, 320 + 1):
+                raise ErrorStatus(400, "ephemeral value is out of range. Expected range is 0-320")
+            if int(self.swap) not in range(0, 327680 + 1, 1024):
+                raise ErrorStatus(400,
+                                  "swap value is out of range. Expected range is 0-327680(320GB) "
+                                  "and must be a multiple of 1024")
+        except ValueError:
+            raise ErrorStatus(400, "ram, vcpus, disk, ephemeral and swap must be integers")
+        for symbol, value in self.extra_specs.iteritems():
+            if symbol == 'bundle' and value not in bundle:
+                raise ErrorStatus(400,
+                                  "Invalid value. bundle possible values: " + str(bundle))
+            if symbol == 'numa_override' and value not in numa:
+                raise ErrorStatus(400,
+                                  "Invalid value. numa_override possible values: " + str(numa))
+            if symbol == 'vlan_category' and value not in vlan:
+                raise ErrorStatus(400,
+                                  "Invalid value. vlan_category possible values: " + str(vlan))
+
+        # region type can be group only in create flavor!!
+        if not context == "create":
+            for region in self.regions:
+                if region.type == "group":
+                    raise ErrorStatus(400,
+                                      "region type \'group\' is invalid in this "
+                                      "action, \'group\' can be only in create flavor action")
+
+        # check if user entered tag instead of tags
+        if self.tags and self.tag:
+            raise ErrorStatus(400, "you entered \'tag\' and \'tags\' arguments, "
+                                   "please remove the \'tag\'")
+        if self.tag and not self.tags:
+            self.tags = self.tag
+
+    def to_db_model(self):
+        flavor = db_models.Flavor()
+        extra_spec = []
+        tags = []
+        options = []
+        regions = []
+        tenants = []
+
+        for symbol, value in self.extra_specs.iteritems():
+            if self.ignore_extra_specs_input(symbol.replace(":", "____")):
+                continue
+            es = db_models.FlavorExtraSpec()
+            es.key_name = symbol
+            es.key_value = value
+            extra_spec.append(es)
+
+        if self.series:
+            extra_spec.extend(self.get_extra_spec_needed())
+
+        for symbol, value in self.tags.iteritems():
+            tag = db_models.FlavorTag()
+            tag.key_name = symbol
+            tag.key_value = value
+            tags.append(tag)
+
+        for symbol, value in self.options.iteritems():
+            option = db_models.FlavorOption()
+            option.key_name = symbol
+            option.key_value = value
+            options.append(option)
+
+        for region in self.regions:
+            regions.append(region.to_db_model())
+
+        for tenant in self.tenants:
+            tenant_rec = db_models.FlavorTenant()
+            tenant_rec.tenant_id = tenant
+            tenants.append(tenant_rec)
+
+        flavor.id = self.id
+        flavor.name = self.name
+        if self.alias is not wsme.Unset:
+            flavor.alias = self.alias
+        flavor.description = self.description
+        flavor.series = self.series
+        flavor.ram = int(self.ram)
+        flavor.vcpus = int(self.vcpus)
+        flavor.disk = int(self.disk)
+        flavor.swap = int(self.swap)
+        flavor.ephemeral = int(self.ephemeral)
+        flavor.visibility = self.visibility
+
+        flavor.flavor_extra_specs = extra_spec
+        flavor.flavor_tags = tags
+        flavor.flavor_options = options
+        flavor.flavor_regions = regions
+        flavor.flavor_tenants = tenants
+
+        return flavor
+
+    @staticmethod
+    def ignore_extra_specs_input(symbol):
+        ignore_keys = conf.default_extra_spec_calculated_table.to_dict()
+        if symbol in ignore_keys:
+            return True
+        if len(symbol) == 36 and symbol[0:35] in ignore_keys and symbol[35].isdigit() and 1 <= int(symbol[35]) <= 8:
+            return True
+        return False
+
+    @staticmethod
+    def from_db_model(sql_flavor):
+        flavor = Flavor()
+        flavor.id = sql_flavor.id
+        flavor.series = sql_flavor.series
+        flavor.description = sql_flavor.description
+        flavor.ram = str(sql_flavor.ram)
+        flavor.ephemeral = str(sql_flavor.ephemeral)
+        flavor.visibility = sql_flavor.visibility
+        flavor.vcpus = str(sql_flavor.vcpus)
+        flavor.swap = str(sql_flavor.swap)
+        flavor.disk = str(sql_flavor.disk)
+        flavor.name = sql_flavor.name
+        if sql_flavor.alias is not None:
+            flavor.alias = sql_flavor.alias
+
+        for tenant in sql_flavor.flavor_tenants:
+            flavor.tenants.append(tenant.tenant_id)
+
+        for sql_region in sql_flavor.flavor_regions:
+            region = Region()
+            region.name = sql_region.region_name
+            region.type = sql_region.region_type
+            flavor.regions.append(region)
+
+        for extra_spec in sql_flavor.flavor_extra_specs:
+            flavor.extra_specs[extra_spec.key_name] = extra_spec.key_value
+
+        for tag in sql_flavor.flavor_tags:
+            flavor.tags[tag.key_name] = tag.key_value
+
+        for option in sql_flavor.flavor_options:
+            flavor.options[option.key_name] = option.key_value
+
+        return flavor
+
+    @staticmethod
+    def ignore_extra_specs_input(symbol):
+        ignore_keys = conf.default_extra_spec_calculated_table.to_dict()
+        if symbol in ignore_keys:
+            return True
+        if len(symbol) == 36 and symbol[0:35] in ignore_keys and symbol[35].isdigit() and 1 <= int(symbol[35]) <= 8:
+            return True
+        return False
+
+    def get_extra_spec_needed(self):
+        extra_spec_needed = []
+        items = conf.extra_spec_needed_table.to_dict()
+        for symbol, value in items[self.series].iteritems():
+            es = db_models.FlavorExtraSpec()
+            es.key_name = symbol.replace("____", ":")
+            es.key_value = value
+            if self.series == "gv" and "c2" in es.key_name:
+                if "c4" in self.options and self.options['c4'].lower() == "true":
+                    es.key_name = es.key_name.replace("c2", "c4")
+            extra_spec_needed.append(es)
+        options_items = self.options
+        # check some keys if they exist in option add values to extra specs
+        if len(options_items) > 0 and self.series in ('ns', 'nv', 'nd'):
+            c2_c4_in = False
+            n0_in = False
+            for symbol, value in options_items.iteritems():
+                es = db_models.FlavorExtraSpec()
+                es.key_name = "aggregate_instance_extra_specs:%s" % symbol
+                es.key_value = "true"
+                if symbol == "n0" and options_items[symbol].lower() == "true":
+                    n0_in = True
+                    es.key_value = 2
+                    es.key_name = "hw:numa_nodes"
+                    extra_spec_needed.append(es)
+                elif symbol in ('c2', 'c4') and options_items[symbol].lower() == "true":
+                    c2_c4_in = True
+                    extra_spec_needed.append(es)
+                try:
+                    if len(symbol) == 2 and symbol[0] == 'v' and 0 < int(symbol[1]) < 9 and options_items[symbol].lower() == "true":
+                        extra_spec_needed.append(es)
+                except Exception:
+                    pass
+            # if c4, c2 and n0 not in options keys add these values to extra specs
+            if not c2_c4_in:
+                es = db_models.FlavorExtraSpec()
+                es.key_name = "hw:cpu_policy"
+                es.key_value = "dedicated"
+                extra_spec_needed.append(es)
+            if not n0_in:
+                es = db_models.FlavorExtraSpec()
+                es.key_value = 1
+                es.key_name = "hw:numa_nodes"
+                extra_spec_needed.append(es)
+        return extra_spec_needed
+
+    def get_as_summary_dict(self):
+        return dict(
+            id=self.id,
+            name=self.name,
+            description=self.description
+        )
+
+    def handle_region_groups(self):
+        regions_to_add = []
+        for region in self.regions[:]:  # get copy of it to be able to delete from the origin
+            if region.type == "group":
+                group_regions = self.get_regions_for_group(region.name)
+                if group_regions is None:
+                    raise ValueError("Group {} not found".format(region.name))
+                # if len(group_regions) == 0:
+                #    raise ValueError("Group {} is empty, no region was assigned to it".format(region.name))
+                for group_region in group_regions:
+                    regions_to_add.append(Region(name=group_region, type='single'))
+                self.regions.remove(region)
+
+        self.regions.extend(set(regions_to_add))  # remove duplicates if exist
+
+    def get_regions_for_group(self, group_name):
+        set_utils_conf(conf)
+        regions = get_regions_of_group(group_name)
+        return regions
+
+
+class FlavorWrapper(Model):
+    """flavor model
+
+    """
+    flavor = wsme.wsattr(Flavor, mandatory=True, name='flavor')
+
+    def __init__(self, flavor=Flavor()):
+        """
+
+        :param flavor: flavor dict
+        """
+
+        self.flavor = flavor
+
+    def to_db_model(self):
+        return self.flavor.to_db_model()
+
+    def validate_model(self):
+        return self.flavor.validate_model()
+
+    def get_extra_spec_needed(self):
+        return self.flavor.get_extra_spec_needed()
+
+    @staticmethod
+    def from_db_model(sql_flavor):
+        flavors = FlavorWrapper()
+        flavors.flavor = Flavor.from_db_model(sql_flavor)
+        return flavors
+
+
+'''
+' FlavorSummary a DataObject contains all the fields defined in FlavorSummary.
+'''
+
+
+class FlavorSummary(Model):
+    name = wsme.wsattr(wsme.types.text)
+    id = wsme.wsattr(wsme.types.text)
+    description = wsme.wsattr(wsme.types.text)
+    visibility = wsme.wsattr(wsme.types.text)
+
+    def __init__(self, name='', id='', description='', visibility=''):
+        Model.__init__(self)
+
+        self.name = name
+        self.id = id
+        self.description = description
+        self.visibility = visibility
+
+    @staticmethod
+    def from_db_model(sql_flavor):
+        flavor = FlavorSummary()
+        flavor.id = sql_flavor.id
+        flavor.name = sql_flavor.name
+        flavor.description = sql_flavor.description
+        flavor.visibility = sql_flavor.visibility
+
+        return flavor
+
+
+class FlavorSummaryResponse(Model):
+    flavors = wsme.wsattr([FlavorSummary], mandatory=True)
+
+    def __init__(self):  # pragma: no cover
+        Model.__init__(self)
+        self.flavors = []
+
+
+class FlavorListFullResponse(Model):
+    flavors = wsme.wsattr([Flavor], mandatory=True)
+
+    def __init__(self):  # pragma: no cover
+        Model.__init__(self)
+        self.flavors = []
diff --git a/orm/services/flavor_manager/fms_rest/di_providers/__init__.py b/orm/services/flavor_manager/fms_rest/di_providers/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/di_providers/mock_providers.py b/orm/services/flavor_manager/fms_rest/di_providers/mock_providers.py
new file mode 100644
index 00000000..64a8a47d
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/di_providers/mock_providers.py
@@ -0,0 +1,16 @@
+from fms_mocks import requests_mock
+from fms_mocks import audit_mock
+
+from fms_rest.data.sql_alchemy.data_manager import DataManager
+from fms_rest.logic import flavor_logic
+from fms_rest.proxies import rds_proxy
+from fms_rest.utils import utils
+
+providers = [
+    ('rds_proxy', rds_proxy),
+    ('flavor_logic', flavor_logic),
+    ('requests', requests_mock),
+    ('data_manager', DataManager),
+    ('utils', utils),
+    ('audit_client', audit_mock)
+]
diff --git a/orm/services/flavor_manager/fms_rest/di_providers/prod_providers.py b/orm/services/flavor_manager/fms_rest/di_providers/prod_providers.py
new file mode 100644
index 00000000..e69babbe
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/di_providers/prod_providers.py
@@ -0,0 +1,17 @@
+import requests
+from audit_client.api import audit
+
+from fms_rest.proxies import rds_proxy
+from fms_rest.logic import flavor_logic
+from fms_rest.data.sql_alchemy.data_manager import DataManager
+from fms_rest.utils import utils
+
+
+providers = [
+    ('rds_proxy', rds_proxy),
+    ('flavor_logic', flavor_logic),
+    ('requests', requests),
+    ('data_manager', DataManager),
+    ('utils', utils),
+    ('audit_client', audit)
+]
diff --git a/orm/services/flavor_manager/fms_rest/etc/policy.json b/orm/services/flavor_manager/fms_rest/etc/policy.json
new file mode 100755
index 00000000..887a8bd9
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/etc/policy.json
@@ -0,0 +1,31 @@
+{
+    "default": "!",
+    "admin": "role:admin",
+    "admin_support": "role:admin_support",
+    "admin_viewer": "role:admin_viewer",
+
+    "admin_or_support": "role:admin or role:admin_support",
+    "admin_or_support_or_viewer": "rule:admin or rule:admin_support or rule:admin_viewer",
+
+    "flavor:create": "rule:admin_or_support",
+    "flavor:get_one": "rule:admin_or_support_or_viewer",
+    "flavor:get_all": "rule:admin_or_support_or_viewer",
+    "flavor:delete": "rule:admin",
+
+    "flavor:get_flavor_extra_specs": "rule:admin",
+    "flavor:add_flavor_extra_specs": "rule:admin_or_support",
+    "flavor:replace_flavor_extra_specs": "rule:admin_or_support",
+    "flavor:delete_flavor_extra_specs": "rule:admin",
+
+    "flavor:add_flavor_regions": "rule:admin_or_support",
+    "flavor:delete_flavor_region": "rule:admin",
+
+    "flavor:get_flavor_tags": "rule:admin_or_support_or_viewer",
+    "flavor:add_flavor_tags": "rule:admin_or_support",
+    "flavor:replace_flavor_tags": "rule:admin_or_support",
+    "flavor:delete_flavor_tags": "rule:admin",
+
+    "flavor:add_flavor_tenants": "rule:admin_or_support",
+    "flavor:delete_flavor_tenant": "rule:admin"
+
+}
\ No newline at end of file
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/audit_client/__init__.py b/orm/services/flavor_manager/fms_rest/external_mock/audit_client/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/audit_client/api/__init__.py b/orm/services/flavor_manager/fms_rest/external_mock/audit_client/api/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/audit_client/api/audit.py b/orm/services/flavor_manager/fms_rest/external_mock/audit_client/api/audit.py
new file mode 100644
index 00000000..ec483bdd
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/audit_client/api/audit.py
@@ -0,0 +1,6 @@
+def audit(*args, **kwargs):
+    pass
+
+
+def init(*args, **kwargs):
+    pass
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/keystone_utils/__init__.py b/orm/services/flavor_manager/fms_rest/external_mock/keystone_utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/keystone_utils/tokens.py b/orm/services/flavor_manager/fms_rest/external_mock/keystone_utils/tokens.py
new file mode 100755
index 00000000..2a30c814
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/keystone_utils/tokens.py
@@ -0,0 +1,6 @@
+def is_token_valid(*args, **kwargs):
+    pass
+
+
+def TokenConf(*args, **kwargs):
+    pass
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/__init__.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/hooks/__init__.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/hooks/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/hooks/transaction_id_hook.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/hooks/transaction_id_hook.py
new file mode 100644
index 00000000..d156a1fa
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/hooks/transaction_id_hook.py
@@ -0,0 +1,7 @@
+# from pecan.hooks import PecanHook
+
+
+class TransactionIdHook():
+
+    def before(self, state):
+        pass
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/__init__.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/__init__.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/__init__.py
new file mode 100755
index 00000000..18404b50
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/__init__.py
@@ -0,0 +1,7 @@
+'''
+'''
+
+from .di import Di
+from .dependency_register import DependencyRegister
+from .resource_provider_register import ResourceProviderRegister
+from .resolver import DependencyResolver
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/dependency_register.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/dependency_register.py
new file mode 100755
index 00000000..7b4d7093
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/dependency_register.py
@@ -0,0 +1,77 @@
+from functools import partial
+import inspect
+
+from .errors import DependentNotFoundError
+
+try:
+    import click
+except ImportError:
+    click = None
+
+
+class DependencyRegister:
+    def __init__(self):
+        # Maps dependents to names of resources they require
+        self.dependents = {}
+        # Maps names of resources to their dependents
+        self.resources = {}
+
+    @classmethod
+    def _unwrap_func(cls, decorated_func):
+        '''
+        This unwraps a decorated func, returning the inner wrapped func.
+
+        This may become unnecessary with Python 3.4's inspect.unwrap().
+        '''
+        if click is not None:
+            # Workaround for click.command() decorator not setting
+            # __wrapped__
+            if isinstance(decorated_func, click.Command):
+                return cls._unwrap_func(decorated_func.callback)
+
+        if hasattr(decorated_func, '__wrapped__'):
+            # Recursion: unwrap more if needed
+            return cls._unwrap_func(decorated_func.__wrapped__)
+        else:
+            # decorated_func isn't actually decorated, no more
+            # unwrapping to do
+            return decorated_func
+
+    @classmethod
+    def _unwrap_dependent(cls, dependent):
+        # Dependent is effectively a class. Classes are registered as is.
+        if inspect.isclass(dependent):
+            return dependent
+        # dependent is some other kind of callable, eg a function
+        else:
+            return cls._unwrap_func(dependent)
+
+    def _register_dependent(self, dependent, resource_name):
+        if dependent not in self.dependents:
+            self.dependents[dependent] = []
+        self.dependents[dependent].insert(0, resource_name)
+
+    def _register_resource_dependency(self, resource_name, dependent):
+        if resource_name not in self.resources:
+            self.resources[resource_name] = set()
+        self.resources[resource_name].add(dependent)
+
+    def register(self, resource_name, dependent=None):
+        if dependent is None:
+            # Give a partial usable as a decorator
+            return partial(self.register, resource_name)
+
+        dependent = self._unwrap_dependent(dependent)
+        self._register_dependent(dependent, resource_name)
+        self._register_resource_dependency(resource_name, dependent)
+
+        # Return dependent to ease use as decorator
+        return dependent
+
+    def query_resources(self, dependent):
+        dependent = self._unwrap_dependent(dependent)
+
+        if dependent not in self.dependents:
+            raise DependentNotFoundError(dependent=dependent)
+
+        return self.dependents[dependent]
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/di.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/di.py
new file mode 100755
index 00000000..6a436354
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/di.py
@@ -0,0 +1,16 @@
+from .dependency_register import DependencyRegister
+from .resource_provider_register import ResourceProviderRegister
+from .resolver import DependencyResolver
+
+
+class Di:
+    def __init__(self, namespace=None):
+        self.namespace = namespace
+        self.dependencies = DependencyRegister()
+        self.providers = ResourceProviderRegister()
+        self.resolver = DependencyResolver(
+            dependency_register=self.dependencies,
+            resource_provider_register=self.providers)
+
+        # For use as a decorator
+        self.dependsOn = self.dependencies.register
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/errors.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/errors.py
new file mode 100755
index 00000000..607cfb98
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/errors.py
@@ -0,0 +1,47 @@
+class FangError(Exception):
+    pass
+
+
+class DependentNotFoundError(FangError):
+    def __init__(self, dependent=None):
+        self.dependent = dependent
+        if dependent:
+            message = (
+                "Couldn't find dependencies registered for {!r}"
+                "".format(dependent))
+        else:
+            message = (
+                "Couldn't find dependencies registered for the given "
+                "dependent")
+        super(DependentNotFoundError, self).__init__(message)
+
+
+class ProviderAlreadyRegisteredError(FangError):
+    def __init__(self, resource_name=None, existing_provider=None):
+        self.resource_name = resource_name
+        self.existing_provider = existing_provider
+        if resource_name and existing_provider:
+            message = (
+                'A provider ({provider!r}) has already been '
+                'registered for resource {resource_name!r}'.format(
+                    provider=existing_provider,
+                    resource_name=resource_name))
+        else:
+            message = (
+                'A provider has already been registered for the '
+                'resource')
+        super(ProviderAlreadyRegisteredError, self).__init__(message)
+
+
+class ProviderNotFoundError(FangError):
+    def __init__(self, resource_name=None):
+        self.resource_name = resource_name
+        if resource_name:
+            message = (
+                "A provider could not be found for resource {!r}"
+                "".format(resource_name))
+        else:
+            message = (
+                "A provider could not be found for the requested "
+                "resource")
+        super(ProviderNotFoundError, self).__init__(message)
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/resolver.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/resolver.py
new file mode 100755
index 00000000..5a58f8d6
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/resolver.py
@@ -0,0 +1,44 @@
+from .errors import ProviderNotFoundError
+
+
+# This is effectively what is sometimes termed a "dependency injection
+# container".
+class DependencyResolver:
+    def __init__(
+            self,
+            dependency_register=None,
+            resource_provider_register=None):
+        self.dependency_register = dependency_register
+        self.resource_provider_register = resource_provider_register
+
+        # Methods delegated to other objects
+        self.query_dependents_resources = \
+            self.dependency_register.query_resources
+        self.resolve = self.resource_provider_register.resolve
+
+    def resolve_all_dependencies(self, dependent):
+        return [
+            self.resolve(resource_name)
+            for resource_name in
+            self.query_dependents_resources(dependent)]
+
+    def unpack(self, dependent):
+        resources = self.resolve_all_dependencies(dependent)
+
+        # Never return a length-1 list/tuple, to allow easier unpacking
+        # eg, avoid need for comma in:
+        #   my_one_dep, = my_resolver.unpack_dependencies(my_func)
+        if len(resources) == 1:
+            return resources[0]
+        else:
+            return resources
+
+    def are_all_dependencies_met_for(self, dependent):
+        for resource_name in self.query_dependents_resources(dependent):
+            try:
+                self.resolve(resource_name)
+            except ProviderNotFoundError as e:
+                # TODO: Add error logging here
+                return False
+        else:
+            return True
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/resource_provider_register.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/resource_provider_register.py
new file mode 100755
index 00000000..58da4619
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/fang/resource_provider_register.py
@@ -0,0 +1,68 @@
+from functools import partial
+
+from .errors import (
+    FangError,
+    ProviderAlreadyRegisteredError,
+    ProviderNotFoundError)
+
+
+class ResourceProviderRegister:
+    def __init__(self, namespace=None):
+        self.namespace = namespace
+        # Maps resource names to a provider
+        self.resource_providers = {}
+
+    def register(self, resource_name, provider=None, allow_override=False):
+        if provider is None:
+            # Give a partial usable as a decorator
+            return partial(
+                self.register,
+                resource_name, allow_override=allow_override)
+
+        if ((not allow_override) and resource_name in self.resource_providers):
+            raise ProviderAlreadyRegisteredError(
+                resource_name=resource_name,
+                existing_provider=self.resource_providers[resource_name])
+
+        self.resource_providers[resource_name] = provider
+
+        # Return provider to ease use as decorator
+        return provider
+
+    register_callable = register
+
+    # For registering providers which always return the same instance
+    def register_instance(self, resource_name, instance=None, **kwargs):
+        if instance is None:
+            # Give a partial usable as a decorator
+            return partial(self.register_instance, resource_name, **kwargs)
+
+        self.register(resource_name, provider=(lambda: instance), **kwargs)
+        return instance
+
+    def mass_register(self, resource_names_to_providers, **kwargs):
+        for resource_name, provider in resource_names_to_providers.items():
+            self.register_instance(resource_name, provider, **kwargs)
+
+    def load(self, other_register, allow_overrides=False):
+        if not allow_overrides:
+            own_keys = self.resource_providers.keys()
+            other_keys = other_register.resource_providers.keys()
+            common_keys = own_keys & other_keys
+            if common_keys:
+                # TODO Add new FangError sub-class?
+                raise FangError(
+                    'This register already has providers for keys: '
+                    '{!r}'.format(common_keys))
+
+        self.resource_providers.update(
+            other_register.resource_providers)
+
+    def clear(self):
+        self.resource_providers.clear()
+
+    def resolve(self, resource_name):
+        if resource_name not in self.resource_providers:
+            raise ProviderNotFoundError(resource_name=resource_name)
+
+        return self.resource_providers[resource_name]()
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/injector.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/injector.py
new file mode 100755
index 00000000..53acb543
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/injector/injector.py
@@ -0,0 +1,58 @@
+from orm_common.injector import fang
+import os
+import imp
+
+_di = fang.Di()
+logger = None
+
+
+def register_providers(env_variable, providers_dir_path, _logger):
+    global logger
+    logger = _logger
+
+    # TODO: change all prints to logger
+    logger.info('Initializing dependency injector')
+    logger.info('Checking {0} variable'.format(env_variable))
+
+    env = None
+    if not (env_variable in os.environ):
+        logger.warn('No {0} variable found using `prod` injector'.format(env_variable))
+        env = 'prod'
+    elif os.environ[env_variable] == '__TEST__':
+        logger.info('__TEST__ variable found, explicitly skipping provider registration!!!')
+        return
+    else:
+        env = os.environ[env_variable]
+        log_message = '{0} found setting injector to {1} environment'.format(
+            env_variable, env)
+        log_message = log_message.replace('\n', '_').replace('\r', '_')
+        logger.info(log_message)
+
+    logger.info('Setting injector providers')
+
+    module = _import_file_by_name(env, providers_dir_path)
+
+    for provider in module.providers:
+        logger.info('Setting provider `{0}` to {1}'.format(provider[0], provider[1]))
+        _di.providers.register_instance(provider[0], provider[1])
+
+
+def get_di():
+    return _di
+
+
+def override_injected_dependency(dep_tuple):
+    _di.providers.register_instance(dep_tuple[0], dep_tuple[1], allow_override=True)
+
+
+def _import_file_by_name(env, providers_dir_path):
+    file_path = os.path.join(providers_dir_path, '{0}_providers.py'.format(env))
+    try:
+        module = imp.load_source('fms_providers', file_path)
+    except IOError as ex:
+        logger.log_exception(
+            'File with providers for the {0} environment, path: {1} wasnt found! Crushing!!!'.format(env, file_path),
+            ex)
+        raise ex
+
+    return module
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/logger/__init__.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/logger/__init__.py
new file mode 100755
index 00000000..1894cbbe
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/logger/__init__.py
@@ -0,0 +1,10 @@
+import logging
+
+
+def get_logger(name):
+    logger = logging.getLogger(name)
+    logger.log_exception = lambda msg, exception: logger.exception(msg + " Exception: " + str(exception))
+
+    return logger
+
+__all__ = ['get_logger']
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/policy/__init__.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/policy/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/policy/policy.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/policy/policy.py
new file mode 100644
index 00000000..c2adf591
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/policy/policy.py
@@ -0,0 +1,6 @@
+def authorize(*args, **kwargs):
+    pass
+
+
+def init(*args, **kwargs):
+    pass
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/utils.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/utils.py
new file mode 100755
index 00000000..2debd1a1
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/utils.py
@@ -0,0 +1,8 @@
+class utils:
+    @staticmethod
+    def set_utils_conf(conf):
+        pass
+
+    @staticmethod
+    def report_config(conf, dump_to_log):
+        pass
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/utils/__init__.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/utils/__init__.py
new file mode 100755
index 00000000..2140b170
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/utils/__init__.py
@@ -0,0 +1,10 @@
+import cross_api_utils
+import utils
+
+
+def set_utils_conf(conf):
+    cross_api_utils.set_utils_conf(conf)
+    utils.set_utils_conf(conf)
+
+
+__all__ = ['cross_api_utils', 'utils']
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/utils/api_error_utils.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/utils/api_error_utils.py
new file mode 100644
index 00000000..653221e2
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/utils/api_error_utils.py
@@ -0,0 +1,2 @@
+def get_error(*args, **kwargs):
+    pass
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/utils/cross_api_utils.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/utils/cross_api_utils.py
new file mode 100755
index 00000000..11233bbe
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/utils/cross_api_utils.py
@@ -0,0 +1,109 @@
+import requests
+import logging
+from pecan import conf
+from audit_client.api import audit
+import time
+
+from orm_common.logger import get_logger
+
+logger = get_logger(__name__)
+
+conf = None
+
+
+def set_utils_conf(_conf):
+    global conf
+    conf = _conf
+
+
+def _check_conf_initialization():
+    if not conf:
+        raise AssertionError(
+            'Configuration wasnt initiated, please run set_utils_conf and '
+            'pass pecan configuration')
+
+
+def is_region_exist(region_name):
+    """ function to check whether region exists
+        returns 200 for ok and None for error
+    """
+    region = get_rms_region(region_name)
+    if region is None:
+        return False
+
+    return True
+
+
+def is_region_group_exist(group_name):
+    """ function to check whether region group exists
+        returns 200 for ok and None for error
+    """
+    group = get_rms_region_group(group_name)
+    if group is None:
+        return False
+
+    return True
+
+
+def get_regions_of_group(group_name):
+    """ function to get regions associated with group
+        returns 200 for ok and None for error
+    """
+    group = get_rms_region_group(group_name)
+    if group is None:
+        return None
+
+    return group["Regions"]
+
+
+def get_rms_region(region_name):
+    """ function to call rms api for region info
+        returns 200 for ok and None for error
+    """
+    _check_conf_initialization()
+    try:
+        headers = {
+            'content-type': 'application/json',
+        }
+        rms_server_url = '%s%s/%s' % (
+            conf.api.rms_server.base, conf.api.rms_server.regions, region_name)
+        resp = requests.get(rms_server_url, headers=headers).json()
+        return resp
+    except Exception as e:
+        logger.log_exception('Failed in get_rms_region', e)
+        return None
+
+    return 200
+
+
+prev_group_name = None
+
+
+def get_rms_region_group(group_name):
+    """ function to call rms api for group info
+        returns 200 for ok and None for error
+    """
+    global prev_group_name, prev_timestamp, prev_resp
+
+    _check_conf_initialization()
+    try:
+        timestamp = time.time()
+        if group_name == prev_group_name and timestamp - prev_timestamp <= \
+                conf.api.rms_server.cache_seconds:
+            return prev_resp
+
+        headers = {
+            'content-type': 'application/json',
+        }
+        rms_server_url = '%s%s/%s' % (
+            conf.api.rms_server.base, conf.api.rms_server.groups, group_name)
+        resp = requests.get(rms_server_url, headers=headers).json()
+        prev_resp = resp
+        prev_group_name = group_name
+        prev_timestamp = timestamp
+        return resp
+    except Exception as e:
+        logger.log_exception('Failed in get_rms_region_group', e)
+        return None
+
+    return 200
diff --git a/orm/services/flavor_manager/fms_rest/external_mock/orm_common/utils/utils.py b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/utils/utils.py
new file mode 100755
index 00000000..49d90ecc
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/external_mock/orm_common/utils/utils.py
@@ -0,0 +1,116 @@
+import requests
+import pprint
+import logging
+from pecan import conf
+from audit_client.api import audit
+import time
+
+from orm_common.logger import get_logger
+
+logger = get_logger(__name__)
+
+conf = None
+
+
+def set_utils_conf(_conf):
+    global conf
+    conf = _conf
+
+
+def _check_conf_initialization():
+    if not conf:
+        raise AssertionError(
+            'Configurations wasnt initiated, please run set_utils_conf and '
+            'pass pecan coniguration')
+
+
+def make_uuid():
+    """ function to request new uuid from uuid_generator rest service
+        returns uuid string
+    """
+    _check_conf_initialization()
+    url = conf.api.uuid_server.base + conf.api.uuid_server.uuids
+
+    try:
+        resp = requests.post(url)
+    except Exception as e:
+        logger.info('Failed in make_uuid:' + str(e))
+        raise Exception('Failed in make_uuid:' + str(e))
+
+    resp = resp.json()
+    return resp['uuid']
+
+
+def make_transid():
+    """ function to request new uuid of transaction type from uuid_generator
+    rest service
+        returns uuid string
+    """
+    _check_conf_initialization()
+    url = conf.api.uuid_server.base + conf.api.uuid_server.uuids
+
+    try:
+        resp = requests.post(url, data={'uuid_type': 'transaction'})
+    except Exception as e:
+        logger.info('Failed in make_transid:' + str(e))
+        raise Exception('Failed in make_transid:' + str(e))
+
+    resp = resp.json()
+    return resp['uuid']
+
+
+audit_setup = False
+
+
+def audit_trail(cmd, transaction_id, headers, resource_id, message):
+    """ function to send item to audit trail rest api
+        returns 200 for ok and None for error
+    """
+
+    _check_conf_initialization()
+    global audit_setup, audit_server_url
+    if not audit_setup:
+        audit_server_url = '%s%s' % (conf.api.audit_server.base,
+                                     conf.api.audit_server.trans)
+        num_of_send_retries = 3
+        time_wait_between_retries = 1
+        audit.init(audit_server_url, num_of_send_retries,
+                   time_wait_between_retries)
+        audit_setup = True
+
+    try:
+        timestamp = long(round(time.time() * 1000))
+        application_id = headers['X-RANGER-Client']
+        tracking_id = headers[
+            'X-RANGER-Tracking-Id'] if 'X-RANGER-Tracking-Id' in headers \
+            else transaction_id
+        # transaction_id is function argument
+        transaction_type = cmd
+        # resource_id is function argument
+        service_name = conf.server.name
+        user_id = headers[
+            'X-RANGER-Requester'] if 'X-RANGER-Requester' in headers else 'NA'
+        external_id = 'NA'
+        event_details = 'CMS'
+        status = message
+        audit.audit(timestamp, application_id, tracking_id, transaction_id,
+                    transaction_type,
+                    resource_id, service_name, user_id, external_id,
+                    event_details, status)
+    except Exception as e:
+        logger.log_exception('Failed in audit service', e)
+        return None
+
+    return 200
+
+
+def report_config(conf, dump_to_log=False, my_logger=None):
+    """ return the configuration (which is set by config.py) as a string
+    """
+
+    ret = pprint.pformat(conf.to_dict(), indent=4)
+    effective_logger = my_logger if my_logger else logger
+    if dump_to_log:
+        effective_logger.info('Current Configuration:\n' + ret)
+
+    return ret
diff --git a/orm/services/flavor_manager/fms_rest/hooks/__init__.py b/orm/services/flavor_manager/fms_rest/hooks/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/hooks/service_hooks.py b/orm/services/flavor_manager/fms_rest/hooks/service_hooks.py
new file mode 100755
index 00000000..27f8484e
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/hooks/service_hooks.py
@@ -0,0 +1,17 @@
+from orm_common.hooks.transaction_id_hook import TransactionIdHook
+from pecan import abort
+from fms_rest.utils import utils
+
+
+class TransIdHook(TransactionIdHook):
+
+    def before(self, state):
+        try:
+            transaction_id = utils.make_transid()
+        except Exception as exc:
+            abort(500, headers={'faultstring': exc.message})
+
+        tracking_id = state.request.headers['X-RANGER-Tracking-Id'] \
+            if 'X-RANGER-Tracking-Id' in state.request.headers else transaction_id
+        setattr(state.request, 'transaction_id', transaction_id)
+        setattr(state.request, 'tracking_id', tracking_id)
diff --git a/orm/services/flavor_manager/fms_rest/logger/__init__.py b/orm/services/flavor_manager/fms_rest/logger/__init__.py
new file mode 100644
index 00000000..1894cbbe
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/logger/__init__.py
@@ -0,0 +1,10 @@
+import logging
+
+
+def get_logger(name):
+    logger = logging.getLogger(name)
+    logger.log_exception = lambda msg, exception: logger.exception(msg + " Exception: " + str(exception))
+
+    return logger
+
+__all__ = ['get_logger']
diff --git a/orm/services/flavor_manager/fms_rest/logic/__init__.py b/orm/services/flavor_manager/fms_rest/logic/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/logic/error_base.py b/orm/services/flavor_manager/fms_rest/logic/error_base.py
new file mode 100644
index 00000000..6cff057d
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/logic/error_base.py
@@ -0,0 +1,31 @@
+
+class Error(Exception):
+    pass
+
+
+class ErrorStatus(Error):
+
+    def __init__(self, status_code, message=""):
+        self.status_code = status_code
+        self.message = message
+
+
+class NotFoundError(ErrorStatus):
+
+    def __init__(self, status_code=404, message="not found"):
+        self.status_code = status_code
+        self.message = message
+
+
+class DuplicateEntityError(ErrorStatus):
+
+    def __init__(self, status_code=409, message="item already exist"):
+        self.status_code = status_code
+        self.message = message
+
+
+class ConflictError(ErrorStatus):
+
+    def __init__(self, status_code=409, message="conflict error"):
+        self.status_code = status_code
+        self.message = message
diff --git a/orm/services/flavor_manager/fms_rest/logic/flavor_logic.py b/orm/services/flavor_manager/fms_rest/logic/flavor_logic.py
new file mode 100755
index 00000000..95b28146
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/logic/flavor_logic.py
@@ -0,0 +1,850 @@
+from fms_rest.logger import get_logger
+from fms_rest.data.wsme.models import RegionWrapper, TenantWrapper, ExtraSpecsWrapper, Flavor
+from fms_rest.data.wsme.models import FlavorWrapper, Region, TagsWrapper
+from fms_rest.data.wsme.models import FlavorListFullResponse, Flavor
+from fms_rest.data.sql_alchemy.db_models import FlavorRegion, FlavorTenant
+from fms_rest.logic.error_base import ErrorStatus, NotFoundError, ConflictError
+from sqlalchemy.orm.exc import FlushError
+
+from orm_common.injector import injector
+import re
+import uuid
+
+LOG = get_logger(__name__)
+
+di = injector.get_di()
+
+
+@di.dependsOn('data_manager')
+def create_flavor(flavor, flavor_uuid, transaction_id):
+    DataManager = di.resolver.unpack(create_flavor)
+    datamanager = DataManager()
+
+    try:
+        flavor.flavor.handle_region_groups()
+        flavor.flavor.validate_model("create")
+        flavor.flavor.id = flavor_uuid
+        if not flavor.flavor.ephemeral or flavor.flavor.ephemeral.isspace():
+            flavor.flavor.ephemeral = '0'
+        flavor.flavor.name = calculate_name(flavor)
+        LOG.debug("Flavor name is [{}] ".format(flavor.flavor.name))
+
+        sql_flavor = flavor.to_db_model()
+
+        flavor_rec = datamanager.get_record('flavor')
+
+        datamanager.begin_transaction()
+
+        flavor_rec.insert(sql_flavor)
+        datamanager.flush()  # i want to get any exception created by this insert
+        existing_region_names = []
+        send_to_rds_if_needed(sql_flavor, existing_region_names, "post", transaction_id)
+
+        datamanager.commit()
+
+        ret_flavor = get_flavor_by_uuid(flavor_uuid)
+        return ret_flavor
+
+    except Exception as exp:
+        LOG.log_exception("FlavorLogic - Failed to CreateFlavor", exp)
+        datamanager.rollback()
+        if "Duplicate entry" in str(exp.message):
+            raise ConflictError(409, "Flavor {} already exists".format(flavor.flavor.name))
+        raise
+    finally:
+        datamanager.close()
+
+
+@di.dependsOn('rds_proxy')
+def send_to_rds_if_needed(sql_flavor, existing_region_names, http_action, transaction_id):
+    rds_proxy = di.resolver.unpack(send_to_rds_if_needed)
+    if (sql_flavor.flavor_regions and len(sql_flavor.flavor_regions) > 0) or len(existing_region_names) > 0:
+        flavor_dict = sql_flavor.todict()
+        update_region_actions(flavor_dict, existing_region_names, http_action)
+        LOG.debug("Flavor is valid to send to RDS - sending to RDS Proxy ")
+        rds_proxy.send_flavor(flavor_dict, transaction_id, http_action)
+    else:
+        LOG.debug("Flavor with no regions - wasn't sent to RDS Proxy " + str(sql_flavor))
+
+
+@di.dependsOn('data_manager')
+def update_flavor(flavor, flavor_uuid, transaction_id):  # pragma: no cover
+    DataManager = di.resolver.unpack(update_flavor)
+    datamanager = DataManager()
+
+    try:
+        flavor.validate_model("update")
+
+        sql_flavor = flavor.to_db_model()
+        sql_flavor.id = flavor_uuid
+        sql_flavor.name = calculate_name(flavor)
+        LOG.debug("Flavor name is [{}] ".format(sql_flavor.name))
+
+        datamanager.begin_transaction()
+        flavor_rec = datamanager.get_record('flavor')
+        db_flavor = flavor_rec.get_flavor_by_id(flavor_uuid)
+        if db_flavor is None:
+            raise Exception("Flavor {0} not found".format(flavor_uuid))
+
+        existing_region_names = db_flavor.get_existing_region_names()
+
+        flavor_rec.delete_by_uuid(flavor_uuid)
+        del(db_flavor)
+
+        flavor_rec.insert(sql_flavor)
+        datamanager.flush()  # i want to get any exception created by this insert method
+
+        send_to_rds_if_needed(sql_flavor, existing_region_names, "put", transaction_id)
+
+        datamanager.commit()
+
+        ret_flavor = get_flavor_by_uuid(flavor_uuid)
+        return ret_flavor
+
+    except Exception as exp:
+        LOG.log_exception("FlavorLogic - Failed to update flavor", exp)
+        datamanager.rollback()
+        raise
+    finally:
+        datamanager.close()
+
+
+@di.dependsOn('rds_proxy')
+@di.dependsOn('data_manager')
+def delete_flavor_by_uuid(flavor_uuid):  # , transaction_id):
+    rds_proxy, DataManager = di.resolver.unpack(delete_flavor_by_uuid)
+    datamanager = DataManager()
+
+    try:
+        datamanager.begin_transaction()
+        flavor_rec = datamanager.get_record('flavor')
+
+        sql_flavor = flavor_rec.get_flavor_by_id(flavor_uuid)
+        if sql_flavor is None:
+            # The flavor does not exist, so the delete operation is
+            # considered successful
+            return
+
+        existing_region_names = sql_flavor.get_existing_region_names()
+        if len(existing_region_names) > 0:
+            # Do not delete a flavor that still has some regions
+            msg = "Cannot delete a flavor that has regions. " \
+                  "Please delete the regions first and then " \
+                  "delete the flavor."
+            LOG.info(msg)
+            raise ErrorStatus(405, msg)
+        else:
+            expected_status = 'Success'
+            invalid_status = 'N/A'
+            # Get status from RDS
+            resp = rds_proxy.get_status(sql_flavor.id)
+            if resp.status_code == 200:
+                status_resp = resp.json()
+                if 'status' in status_resp.keys():
+                    LOG.debug(
+                        'RDS returned status: {}'.format(status_resp['status']))
+                    status = status_resp['status']
+                else:
+                    # Invalid response from RDS
+                    LOG.warning('Response from RDS did not contain status')
+                    status = invalid_status
+            elif resp.status_code == 404:
+                # Flavor not found in RDS, that means it never had any regions
+                # So it is OK to delete it
+                LOG.debug('Resource not found in RDS, so it is OK to delete')
+                status = expected_status
+            else:
+                # Invalid status code from RDS
+                LOG.warning('Invalid response code from RDS: {}'.format(
+                    resp.status_code))
+                status = invalid_status
+
+            if status == invalid_status:
+                LOG.error('Invalid flavor status received from RDS')
+                raise ErrorStatus(500, "Invalid flavor status received from RDS")
+            elif status != expected_status:
+                msg = "The flavor has not been deleted " \
+                      "successfully from all of its regions " \
+                      "(either the deletion failed on one of the " \
+                      "regions or it is still in progress)"
+                LOG.error('Invalid flavor status received from RDS')
+                raise ErrorStatus(409, msg)
+
+        # OK to delete
+        flavor_rec.delete_by_uuid(flavor_uuid)
+
+        datamanager.flush()  # i want to get any exception created by this delete
+        datamanager.commit()
+    except Exception as exp:
+        LOG.log_exception("FlavorLogic - Failed to delete flavor", exp)
+        datamanager.rollback()
+        raise
+    finally:
+        datamanager.close()
+
+
+@di.dependsOn('data_manager')
+def add_regions(flavor_uuid, regions, transaction_id):
+    DataManager = di.resolver.unpack(add_regions)
+    datamanager = DataManager()
+
+    try:
+        flavor_rec = datamanager.get_record('flavor')
+        sql_flavor = flavor_rec.get_flavor_by_id(flavor_uuid)
+        if not sql_flavor:
+            raise ErrorStatus(404, 'flavor id {0} not found'.format(flavor_uuid))
+
+        existing_region_names = sql_flavor.get_existing_region_names()
+
+        for region in regions.regions:
+            if region.name == '' or region.name.isspace():
+                raise ErrorStatus(400, 'Cannot add region with an empty name')
+            if region.type == "group":
+                raise ErrorStatus(400, 'Adding \'group\' type region is supported only when creating a flavor')
+            db_region = FlavorRegion(region_name=region.name, region_type='single')
+            sql_flavor.add_region(db_region)
+
+        datamanager.flush()  # i want to get any exception created by previous actions against the database
+
+        send_to_rds_if_needed(sql_flavor, existing_region_names, "put", transaction_id)
+
+        datamanager.commit()
+
+        flavor = get_flavor_by_uuid(flavor_uuid)
+        ret = RegionWrapper(regions=flavor.flavor.regions)
+        return ret
+
+    except ErrorStatus as exp:
+        LOG.log_exception("FlavorLogic - Failed to update flavor", exp)
+        datamanager.rollback()
+        raise exp
+    except Exception as exp:
+        LOG.log_exception("FlavorLogic - Failed to add regions", exp)
+        datamanager.rollback()
+        if "conflicts with persistent instance" in str(exp.message):
+            raise ConflictError(409, "One or more regions already exists in Flavor")
+        raise exp
+    finally:
+        datamanager.close()
+
+
+@di.dependsOn('data_manager')
+def delete_region(flavor_uuid, region_name, transaction_id):
+    DataManager = di.resolver.unpack(delete_region)
+    datamanager = DataManager()
+
+    try:
+        flavor_rec = datamanager.get_record('flavor')
+        sql_flavor = flavor_rec.get_flavor_by_id(flavor_uuid)
+        if not sql_flavor:
+            raise ErrorStatus(404, 'flavor id {0} not found'.format(flavor_uuid))
+
+        existing_region_names = sql_flavor.get_existing_region_names()
+
+        sql_flavor.remove_region(region_name)
+
+        datamanager.flush()  # i want to get any exception created by previous actions against the database
+        send_to_rds_if_needed(sql_flavor, existing_region_names, "put", transaction_id)
+
+        datamanager.commit()
+
+    except ErrorStatus as exp:
+        LOG.log_exception("FlavorLogic - Failed to update flavor", exp)
+        datamanager.rollback()
+        raise exp
+    except Exception as exp:
+        LOG.log_exception("FlavorLogic - Failed to delete region", exp)
+        datamanager.rollback()
+        raise exp
+    finally:
+        datamanager.close()
+
+
+@di.dependsOn('data_manager')
+def add_tenants(flavor_uuid, tenants, transaction_id):
+    DataManager = di.resolver.unpack(add_tenants)
+    datamanager = DataManager()
+
+    try:
+        flavor_rec = datamanager.get_record('flavor')
+        sql_flavor = flavor_rec.get_flavor_by_id(flavor_uuid)
+        if not sql_flavor:
+            raise ErrorStatus(404, 'Flavor id {0} not found'.format(flavor_uuid))
+
+        if sql_flavor.visibility == "public":
+            raise ErrorStatus(405, 'Cannot add tenant to a public flavor')
+
+        existing_region_names = sql_flavor.get_existing_region_names()
+
+        for tenant in tenants.tenants:
+            if not isinstance(tenant, basestring):
+                raise ValueError("tenant type must be a string type, got {} type".format(type(tenant)))
+
+            db_tenant = FlavorTenant(tenant_id=tenant)
+            sql_flavor.add_tenant(db_tenant)
+
+        datamanager.flush()  # i want to get any exception created by previous actions against the database
+        send_to_rds_if_needed(sql_flavor, existing_region_names, "put", transaction_id)
+        datamanager.commit()
+
+        flavor = get_flavor_by_uuid(flavor_uuid)
+        ret = TenantWrapper(tenants=flavor.flavor.tenants)
+        return ret
+
+    except (ErrorStatus, ValueError) as exp:
+        LOG.log_exception("FlavorLogic - Failed to update flavor", exp)
+        datamanager.rollback()
+        raise
+    except Exception as exp:
+        datamanager.rollback()
+        LOG.log_exception("FlavorLogic - Failed to add tenants", exp)
+        if "conflicts with persistent instance" in str(exp.message):
+            raise ConflictError(409, "One or more tenants already exist")
+        raise
+    finally:
+        datamanager.close()
+
+
+@di.dependsOn('data_manager')
+def delete_tenant(flavor_uuid, tenant_id, transaction_id):
+    DataManager = di.resolver.unpack(delete_tenant)
+    datamanager = DataManager()
+
+    try:
+        flavor_rec = datamanager.get_record('flavor')
+        sql_flavor = flavor_rec.get_flavor_by_id(flavor_uuid)
+        if not sql_flavor:
+            raise ErrorStatus(404, 'flavor id {0} not found'.format(flavor_uuid))
+        # if trying to delete the only one tenant then return value error
+        if sql_flavor.visibility == "public":
+            raise ValueError("{} is a public flavor, delete tenant action is not relevant".format(flavor_uuid))
+
+        if len(sql_flavor.flavor_tenants) == 1 and sql_flavor.flavor_tenants[0].tenant_id == tenant_id:
+            raise ValueError(
+                'Private flavor must have at least one tenant')
+
+        existing_region_names = sql_flavor.get_existing_region_names()
+        sql_flavor.remove_tenant(tenant_id)
+
+        datamanager.flush()  # i want to get any exception created by previous actions against the database
+        send_to_rds_if_needed(sql_flavor, existing_region_names, "put", transaction_id)
+        datamanager.commit()
+
+    except ErrorStatus as exp:
+        LOG.log_exception("FlavorLogic - Failed to update flavor", exp)
+        datamanager.rollback()
+        raise
+    except Exception as exp:
+        LOG.log_exception("FlavorLogic - Failed to delete tenant", exp)
+        datamanager.rollback()
+        raise
+    finally:
+        datamanager.close()
+
+
+def extra_spec_in_default(extra_spec, default_extra_specs):
+    for default_extra_spec in default_extra_specs:
+        if extra_spec == default_extra_spec.key_name:
+            return True
+    return False
+
+
+@di.dependsOn('data_manager')
+def get_extra_specs_uuid(flavor_id, transaction_id):
+    DataManager = di.resolver.unpack(get_extra_specs_uuid)
+    datamanager = DataManager()
+
+    try:
+        LOG.debug("LOGIC - get extra specs")
+        datamanager.begin_transaction()
+
+        flavor_rec = datamanager.get_record("flavor")
+        sql_flavor = flavor_rec.get_flavor_by_id(flavor_id)
+
+        if not sql_flavor:
+            raise NotFoundError(404, 'flavor id {0} not found'.format(
+                flavor_id))
+
+        result = ExtraSpecsWrapper.from_db_model(sql_flavor.flavor_extra_specs)
+
+    except NotFoundError as exp:
+        datamanager.rollback()
+        LOG.log_exception("FlavorLogic - Flavor Not Found", exp)
+        raise
+
+    except Exception as exp:
+        datamanager.rollback()
+        LOG.log_exception("FlavorLogic - Flavor Not Found", exp)
+        raise
+    finally:
+        datamanager.close()
+
+    return result
+
+
+@di.dependsOn('data_manager')
+def delete_extra_specs(flavor_id, transaction_id, extra_spec=None):
+    DataManager = di.resolver.unpack(delete_extra_specs)
+    datamanager = DataManager()
+
+    try:
+        LOG.debug("LOGIC - delete extra specs")
+        datamanager.begin_transaction()
+
+        flavor_rec = datamanager.get_record("flavor")
+        sql_flavor = flavor_rec.get_flavor_by_id(flavor_id)
+
+        if not sql_flavor:
+            raise NotFoundError(404, 'flavor id {0} not found'.format(
+                flavor_id))
+
+        existing_region_names = sql_flavor.get_existing_region_names()
+        # calculate default flavor extra
+        flavor_wrapper = FlavorWrapper.from_db_model(sql_flavor)
+        default_extra_specs = flavor_wrapper.get_extra_spec_needed()
+        # check if delete all or one
+        if extra_spec:
+            if not extra_spec_in_default(extra_spec, default_extra_specs):
+                sql_flavor.remove_extra_spec(extra_spec)
+            else:
+                raise ErrorStatus(400,
+                                  "Bad request, this key cannot be deleted")
+        else:
+            sql_flavor.delete_all_extra_specs()
+            sql_flavor.add_extra_specs(default_extra_specs)
+
+        datamanager.flush()  # i want to get any exception created by previous actions against the database
+        send_to_rds_if_needed(sql_flavor, existing_region_names, "put",
+                              transaction_id)
+        datamanager.commit()
+
+    except NotFoundError as exp:
+        datamanager.rollback()
+        LOG.log_exception("FlavorLogic - Flavor not found", exp)
+        raise
+
+    except ErrorStatus as exp:
+        datamanager.rollback()
+        LOG.log_exception("error in adding extra specs", exp)
+        raise
+
+    except Exception as exp:
+        datamanager.rollback()
+        LOG.log_exception("FlavorLogic - fail to delete extra spec", exp)
+        raise
+    finally:
+        datamanager.close()
+
+    return
+
+
+@di.dependsOn('data_manager')
+@di.dependsOn('rds_proxy')
+def get_tags(flavor_uuid):
+    DataManager, rds_proxy = di.resolver.unpack(get_flavor_by_uuid)
+
+    datamanager = DataManager()
+    flavor_record = datamanager.get_record('flavor')
+
+    sql_flavor = flavor_record.get_flavor_by_id(flavor_uuid)
+
+    if not sql_flavor:
+        raise ErrorStatus(404, 'flavor id {0} not found'.format(flavor_uuid))
+
+    flavor_wrapper = FlavorWrapper.from_db_model(sql_flavor)
+    datamanager.close()
+
+    return flavor_wrapper.flavor.tag
+
+
+@di.dependsOn('data_manager')
+def delete_tags(flavor_id, tag, transaction_id):
+    DataManager = di.resolver.unpack(delete_tags)
+    datamanager = DataManager()
+
+    try:
+        LOG.debug("LOGIC - delete tags")
+        datamanager.begin_transaction()
+
+        flavor_rec = datamanager.get_record("flavor")
+        sql_flavor = flavor_rec.get_flavor_by_id(flavor_id)
+
+        if not sql_flavor:
+            raise NotFoundError(404, 'flavor id {0} not found'.format(flavor_id))
+
+        if tag:
+            sql_flavor.remove_tag(tag)
+        else:
+            sql_flavor.remove_all_tags()
+
+        datamanager.flush()
+        datamanager.commit()
+
+    except NotFoundError as exp:
+        datamanager.rollback()
+        LOG.log_exception("FlavorLogic - Flavor not found", exp)
+        raise
+
+    except ErrorStatus as exp:
+        if exp.status_code == 404:
+            LOG.log_exception("FlavorLogic - Tag not found", exp)
+            # Do not raise an exception if the tag was not found
+            return
+        else:
+            LOG.log_exception("FlavorLogic - failed to delete tags", exp)
+            raise
+
+    except Exception as exp:
+        datamanager.rollback()
+        LOG.log_exception("FlavorLogic - failed to delete tags", exp)
+        raise
+    finally:
+        datamanager.close()
+
+
+@di.dependsOn('data_manager')
+def update_tags(flavor_id, tags, transaction_id):
+    DataManager = di.resolver.unpack(update_tags)
+    datamanager = DataManager()
+
+    try:
+        LOG.debug("LOGIC - update tags")
+        datamanager.begin_transaction()
+        flavor_rec = datamanager.get_record("flavor")
+        sql_flavor = flavor_rec.get_flavor_by_id(flavor_id)
+
+        if not sql_flavor:
+            raise NotFoundError(404, "flavor id {} not found".format(
+                flavor_id))
+
+        tags_models = tags.to_db_model()
+        sql_flavor.replace_tags(tags_models)
+
+        datamanager.flush()
+        datamanager.commit()
+
+        # create return json to wsme
+        result = TagsWrapper.from_db_model(tags_models)
+    except NotFoundError as exp:
+        datamanager.rollback()
+        LOG.log_exception("flavor id {} not found".format(flavor_id), exp)
+        raise
+
+    except Exception as exp:
+        datamanager.rollback()
+        LOG.log_exception("failed to update tags", exp)
+        raise
+    finally:
+        datamanager.close()
+
+    return result
+
+
+@di.dependsOn('data_manager')
+def add_extra_specs(flavor_id, extra_specs, transaction_id):
+    DataManager = di.resolver.unpack(add_extra_specs)
+    datamanager = DataManager()
+
+    try:
+        LOG.debug("LOGIC - add extra specs")
+        datamanager.begin_transaction()
+
+        flavor_rec = datamanager.get_record("flavor")
+        sql_flavor = flavor_rec.get_flavor_by_id(flavor_id)
+
+        if not sql_flavor:
+            raise NotFoundError(404, 'flavor id {0} not found'.format(
+                flavor_id))
+
+        existing_region_names = sql_flavor.get_existing_region_names()
+        extra_specs_model = extra_specs.to_db_model()
+
+        sql_flavor.add_extra_specs(extra_specs_model)
+        datamanager.flush()  # i want to get any exception created by previous actions against the database
+        send_to_rds_if_needed(sql_flavor, existing_region_names, "put",
+                              transaction_id)
+        datamanager.commit()
+
+        # create return json to wsme
+        result = ExtraSpecsWrapper.from_db_model(sql_flavor.flavor_extra_specs)
+    except NotFoundError as exp:
+        datamanager.rollback()
+        LOG.log_exception("FlavorLogic - Flavor Not Found", exp)
+        raise
+
+    except Exception as exp:
+        datamanager.rollback()
+        if "conflicts with persistent instance" in str(exp.message):
+            raise ConflictError(409, "one or all extra specs {} already exists".format(extra_specs.os_extra_specs))
+        LOG.log_exception("FlavorLogic - fail to add extra spec", exp)
+        raise
+    finally:
+        datamanager.close()
+
+    return result
+
+
+@di.dependsOn('data_manager')
+def update_extra_specs(flavor_id, extra_specs, transaction_id):
+    DataManager = di.resolver.unpack(update_extra_specs)
+    datamanager = DataManager()
+
+    try:
+        LOG.debug("LOGIC - update extra specs")
+        datamanager.begin_transaction()
+        flavor_rec = datamanager.get_record("flavor")
+        sql_flavor = flavor_rec.get_flavor_by_id(flavor_id)
+
+        if not sql_flavor:
+            raise NotFoundError(404, "flavor id {} not found".format(
+                flavor_id))
+
+        extra_specs_models = extra_specs.to_db_model()
+        existing_region_names = sql_flavor.get_existing_region_names()
+
+        # remove old extra specs
+        sql_flavor.delete_all_extra_specs()
+        # calculate default flavor extra
+        flavor_wrapper = FlavorWrapper.from_db_model(sql_flavor).to_db_model()
+        default_extra_specs = flavor_wrapper.flavor_extra_specs
+
+        # add default extra specs to user extra specs and add to DB
+        extra_specs_models += default_extra_specs
+        sql_flavor.add_extra_specs(extra_specs_models)
+
+        # get exception if there is any from previous action with the database
+        datamanager.flush()
+        send_to_rds_if_needed(sql_flavor, existing_region_names, "put",
+                              transaction_id)
+        LOG.debug("extra specs updated and sent to rds")
+        datamanager.commit()
+
+        # create return json to wsme
+        result = ExtraSpecsWrapper.from_db_model(extra_specs_models)
+    except NotFoundError as exp:
+        datamanager.rollback()
+        LOG.log_exception("flavor id {} not found".format(flavor_id), exp)
+        raise
+
+    except Exception as exp:
+        datamanager.rollback()
+        LOG.log_exception("failed to update extra specs", exp)
+        raise
+    finally:
+        datamanager.close()
+
+    return result
+
+
+@di.dependsOn('data_manager')
+@di.dependsOn('rds_proxy')
+def get_flavor_by_uuid(flavor_uuid):
+    DataManager, rds_proxy = di.resolver.unpack(get_flavor_by_uuid)
+
+    datamanager = DataManager()
+    flavor_record = datamanager.get_record('flavor')
+
+    sql_flavor = flavor_record.get_flavor_by_id(flavor_uuid)
+
+    if not sql_flavor:
+        raise ErrorStatus(404, 'flavor id {0} not found'.format(flavor_uuid))
+
+    flavor_wrapper = FlavorWrapper.from_db_model(sql_flavor)
+
+    update_region_statuses(flavor_wrapper.flavor, sql_flavor)
+    return flavor_wrapper
+
+
+@di.dependsOn('data_manager')
+def add_tags(flavor_id, tags, transaction_id):
+    DataManager = di.resolver.unpack(add_tags)
+    datamanager = DataManager()
+
+    try:
+        LOG.debug("LOGIC - add tags")
+        datamanager.begin_transaction()
+
+        flavor_rec = datamanager.get_record("flavor")
+        sql_flavor = flavor_rec.get_flavor_by_id(flavor_id)
+
+        if not sql_flavor:
+            raise NotFoundError(404, 'flavor id {0} not found'.format(
+                flavor_id))
+
+        tags_model = tags.to_db_model()
+        sql_flavor.add_tags(tags_model)
+
+        datamanager.flush()
+        datamanager.commit()
+
+        # create return json to wsme
+        result = TagsWrapper.from_db_model(sql_flavor.flavor_tags)
+    except NotFoundError as exp:
+        datamanager.rollback()
+        LOG.log_exception("FlavorLogic - Flavor Not Found", exp)
+        raise
+
+    except Exception as exp:
+        datamanager.rollback()
+        if "conflicts with persistent instance" in str(exp.message):
+            raise ConflictError(409, "one or all tags {} already exists".format(
+                tags.tags))
+        LOG.log_exception("FlavorLogic - fail to add tags", exp)
+        raise
+    finally:
+        datamanager.close()
+
+    return result
+
+
+@di.dependsOn('data_manager')
+@di.dependsOn('rds_proxy')
+def get_flavor_by_uuid_or_name(flavor_uuid_or_name):
+    DataManager, rds_proxy = di.resolver.unpack(get_flavor_by_uuid)
+
+    datamanager = DataManager()
+
+    try:
+
+        flavor_record = datamanager.get_record('flavor')
+
+        sql_flavor = flavor_record.get_flavor_by_id_or_name(flavor_uuid_or_name)
+
+        if not sql_flavor:
+            raise ErrorStatus(404, 'flavor with id or name {0} not found'.format(flavor_uuid_or_name))
+
+        flavor_wrapper = FlavorWrapper.from_db_model(sql_flavor)
+
+        update_region_statuses(flavor_wrapper.flavor, sql_flavor)
+    except Exception as exp:
+        LOG.log_exception("Failed to get_flavor_by_uuid_or_name", exp)
+        raise
+    finally:
+        datamanager.close()
+
+    return flavor_wrapper
+
+
+@di.dependsOn('rds_proxy')
+def update_region_statuses(flavor, sql_flavor):
+    rds_proxy = di.resolver.unpack(update_region_statuses)
+
+    # remove the regions comes from database and return the regions which return from rds,
+    # because there might be group region there (in the db) and in the response from the
+    # rds we will have a list of all regions belong to this group
+    flavor.regions[:] = []
+    resp = rds_proxy.get_status(sql_flavor.id)
+    if resp.status_code == 200:
+        status_resp = resp.json()
+        if sql_flavor.flavor_regions and len(sql_flavor.flavor_regions) > 0:
+            if 'regions' in status_resp.keys():
+                for region_status in status_resp['regions']:
+                    flavor.regions.append(
+                        Region(name=region_status['region'], type="single",
+                               status=region_status['status'],
+                               error_message=region_status['error_msg']))
+
+        if 'status' in status_resp.keys():
+            flavor.status = status_resp['status']
+    elif resp.status_code == 404:
+        flavor.status = "Success"
+    else:
+        flavor.status = "N/A"
+
+
+@di.dependsOn('data_manager')
+@di.dependsOn('rds_proxy')
+def get_flavor_list_by_params(visibility, region, tenant, series, starts_with, contains, alias):
+    DataManager, rds_proxy = di.resolver.unpack(get_flavor_list_by_params)
+
+    datamanager = DataManager()
+
+    try:
+        flavor_record = datamanager.get_record('flavor')
+        sql_flavors = flavor_record.get_flavors_by_criteria(visibility=visibility,
+                                                            region=region,
+                                                            tenant=tenant,
+                                                            series=series,
+                                                            starts_with=starts_with,
+                                                            contains=contains,
+                                                            alias=alias)
+
+        response = FlavorListFullResponse()
+        for sql_flavor in sql_flavors:
+            flavor = Flavor.from_db_model(sql_flavor)
+            update_region_statuses(flavor, sql_flavor)
+            response.flavors.append(flavor)
+    except Exception as exp:
+        LOG.log_exception("Fail to get_flavor_list_by_params", exp)
+        raise
+    finally:
+        datamanager.close()
+
+    return response
+
+
+def calculate_name(flavor):
+    name = "{0}.c{1}r{2}d{3}".format(flavor.flavor.series, flavor.flavor.vcpus,
+                                     int(flavor.flavor.ram) / 1024,
+                                     flavor.flavor.disk)
+
+    swap = getattr(flavor.flavor, 'swap', 0)
+    if swap and int(swap):
+        name += '{}{}'.format('s', int(swap) / 1024)
+
+    ephemeral = getattr(flavor.flavor, 'ephemeral', 0)
+    if ephemeral and int(ephemeral):
+        name += '{}{}'.format('e', ephemeral)
+
+    if len(flavor.flavor.options) > 0:
+        name += '.'
+        for key in sorted(flavor.flavor.options.iterkeys()):
+            name += key
+
+    return name
+
+
+def update_region_actions(flavor_dict, existing_region_names, action="put"):
+    if action == "delete":
+        set_regions_action(flavor_dict, "delete")
+    elif action == "post":
+        set_regions_action(flavor_dict, "create")
+    else:  # put
+        for region in flavor_dict["regions"]:
+            if region["name"] in existing_region_names:
+                region["action"] = "modify"
+            else:
+                region["action"] = "create"
+
+        # add deleted regions
+        for exist_region_name in existing_region_names:
+            if region_name_exist_in_regions(exist_region_name, flavor_dict["regions"]):
+                continue
+            else:
+                flavor_dict["regions"].append({"name": exist_region_name, "action": "delete"})
+
+
+def region_name_exist_in_regions(region_name, regions):
+    for region in regions:
+        if region["name"] == region_name:
+            return True
+    return False
+
+
+def set_regions_action(flavor_dict, action):
+    for region in flavor_dict["regions"]:
+        region["action"] = action
+
+
+def get_fixed_uuid(uuid_to_fix):
+    """Fix a version 4 UUID."""
+    try:
+        new_uuid = uuid.UUID(uuid_to_fix, version=4)
+        if (uuid_to_fix == new_uuid.hex) or (uuid_to_fix == str(new_uuid)):
+            # It is a version 4 UUID, remove its dashes
+            return new_uuid.hex
+    except ValueError:
+        # Not a UUID (of any version)
+        pass
+
+    raise ErrorStatus(400, 'Flavor ID must be a version 4 UUID!')
diff --git a/orm/services/flavor_manager/fms_rest/proxies/__init__.py b/orm/services/flavor_manager/fms_rest/proxies/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/proxies/rds_proxy.py b/orm/services/flavor_manager/fms_rest/proxies/rds_proxy.py
new file mode 100755
index 00000000..218a50c8
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/proxies/rds_proxy.py
@@ -0,0 +1,104 @@
+import json
+import pprint
+from pecan import conf
+from pecan import request
+from fms_rest.logger import get_logger
+from orm_common.injector import injector
+from fms_rest.logic.error_base import ErrorStatus
+di = injector.get_di()
+
+LOG = get_logger(__name__)
+
+headers = {'content-type': 'application/json'}
+
+
+@di.dependsOn('requests')
+def send_flavor(flavor_dict, transaction_id, action="put"):
+        # action can be "post" for creating flavor or "delete" for deleting flavor
+        requests = di.resolver.unpack(send_flavor)
+
+        data = {
+            "service_template":
+                {
+                    "resource": {
+                        "resource_type": "flavor"
+                    },
+                    "model": str(json.dumps(flavor_dict)),
+                    "tracking": {
+                        "external_id": "",
+                        "tracking_id": transaction_id
+                    }
+                }
+        }
+
+        data_to_display = {
+            "service_template":
+                {
+                    "resource": {
+                        "resource_type": "flavor"
+                    },
+                    "model": flavor_dict,
+                    "tracking": {
+                        "external_id": "",
+                        "tracking_id": transaction_id
+                    }
+                }
+        }
+
+        pp = pprint.PrettyPrinter(width=30)
+        pretty_text = pp.pformat(data_to_display)
+        wrapper_json = json.dumps(data)
+
+        headers['X-RANGER-Client'] = request.headers[
+            'X-RANGER-Client'] if 'X-RANGER-Client' in request.headers else \
+            'NA'
+        headers['X-RANGER-Requester'] = request.headers[
+            'X-RANGER-Requester'] if 'X-RANGER-Requester' in request.headers else \
+            ''
+
+        LOG.debug("Wrapper JSON before sending action: {0} to Rds Proxy {1}".format(action, pretty_text))
+        LOG.info("Sending to RDS Server: " + conf.api.rds_server.base + conf.api.rds_server.resources)
+        if action == "post":
+            resp = requests.post(conf.api.rds_server.base + conf.api.rds_server.resources,
+                                 data=wrapper_json,
+                                 headers=headers,
+                                 verify=conf.verify)
+        elif action == "put":
+            resp = requests.put(conf.api.rds_server.base + conf.api.rds_server.resources,
+                                data=wrapper_json,
+                                headers=headers,
+                                verify=conf.verify)
+        elif action == "delete":
+            resp = requests.delete(conf.api.rds_server.base + conf.api.rds_server.resources,
+                                   data=wrapper_json,
+                                   headers=headers,
+                                   verify=conf.verify)
+        else:
+            raise Exception("Invalid action in RdxProxy.send_flavor(flavor_dict, transaction_id, action) action can be post or delete, got {0}".format(action))
+
+        content = resp.content
+        LOG.debug("return from rds server status code: {0} content: {1}".format(resp.status_code, resp.content))
+        if resp.content and 200 <= resp.status_code < 300:
+            content = resp.json()
+        else:
+            raise ErrorStatus(resp.status_code, "Got error from rds server, code: {0} message: {1}".format(resp.status_code, content))
+
+        return content
+
+
+@di.dependsOn('requests')
+def get_status(resource_id):
+    requests = di.resolver.unpack(send_flavor)
+
+    try:
+        LOG.debug("Sending to RDS Server to get status: " + conf.api.rds_server.base + conf.api.rds_server.status + resource_id)
+        resp = requests.get(conf.api.rds_server.base + conf.api.rds_server.status + resource_id, verify=conf.verify)
+        LOG.debug("Sending to RDS Server to get status: " + conf.api.rds_server.base + conf.api.rds_server.status + resource_id)
+        pp = pprint.PrettyPrinter(width=30)
+        pretty_text = pp.pformat(resp.json())
+        LOG.debug("Response from RDS Server:\n" + pretty_text)
+        return resp
+
+    except Exception as exp:
+        LOG.log_exception("FlavorLogic - Failed to Get status for flavor : " + resource_id, exp)
+        raise
diff --git a/orm/services/flavor_manager/fms_rest/templates/error.html b/orm/services/flavor_manager/fms_rest/templates/error.html
new file mode 100644
index 00000000..f2d97961
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/templates/error.html
@@ -0,0 +1,12 @@
+<%inherit file="layout.html" />
+
+## provide definitions for blocks we want to redefine
+<%def name="title()">
+    Server Error ${status}
+</%def>
+
+## now define the body of the template
+    <header>
+        <h1>Server Error ${status}</h1>
+    </header>
+    <p>${message}</p>
diff --git a/orm/services/flavor_manager/fms_rest/templates/index.html b/orm/services/flavor_manager/fms_rest/templates/index.html
new file mode 100644
index 00000000..f17c3862
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/templates/index.html
@@ -0,0 +1,34 @@
+<%inherit file="layout.html" />
+
+## provide definitions for blocks we want to redefine
+<%def name="title()">
+    Welcome to Pecan!
+</%def>
+
+## now define the body of the template
+    <header>
+        <h1><img src="/images/logo.png" /></h1>
+    </header>
+
+    <div id="content">
+
+        <p>This is a sample Pecan project.</p>
+
+        <p>
+            Instructions for getting started can be found online at <a
+            href="http://pecanpy.org" target="window">pecanpy.org</a>
+        </p>
+
+        <p>
+            ...or you can search the documentation here:
+        </p>
+
+        <form method="POST" action="/">
+            <fieldset>
+                <input name="q" />
+                <input type="submit" value="Search" />
+            </fieldset>
+            <small>Enter search terms or a module, class or function name.</small>
+        </form>
+
+    </div>
diff --git a/orm/services/flavor_manager/fms_rest/templates/layout.html b/orm/services/flavor_manager/fms_rest/templates/layout.html
new file mode 100644
index 00000000..40908591
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/templates/layout.html
@@ -0,0 +1,22 @@
+<html>
+    <head>
+        <title>${self.title()}</title>
+        ${self.style()}
+        ${self.javascript()}
+    </head>
+    <body>
+        ${self.body()}
+    </body>
+</html>
+
+<%def name="title()">
+    Default Title
+</%def>
+
+<%def name="style()">
+    <link rel="stylesheet" type="text/css" media="screen" href="/css/style.css" />
+</%def>
+
+<%def name="javascript()">
+    <script language="text/javascript" src="/javascript/shared.js"></script>
+</%def>
diff --git a/orm/services/flavor_manager/fms_rest/tests/__init__.py b/orm/services/flavor_manager/fms_rest/tests/__init__.py
new file mode 100644
index 00000000..78ea5274
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/tests/__init__.py
@@ -0,0 +1,22 @@
+import os
+from unittest import TestCase
+from pecan import set_config
+from pecan.testing import load_test_app
+
+__all__ = ['FunctionalTest']
+
+
+class FunctionalTest(TestCase):
+    """
+    Used for functional tests where you need to test your
+    literal application and its integration with the framework.
+    """
+
+    def setUp(self):
+        self.app = load_test_app(os.path.join(
+            os.path.dirname(__file__),
+            'config.py'
+        ))
+
+    def tearDown(self):
+        set_config({}, overwrite=True)
diff --git a/orm/services/flavor_manager/fms_rest/tests/config.py b/orm/services/flavor_manager/fms_rest/tests/config.py
new file mode 100755
index 00000000..c72b6987
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/tests/config.py
@@ -0,0 +1,137 @@
+from fms_rest.tests.simple_hook_mock import SimpleHookMock
+
+global SimpleHookMock
+
+# Server Specific Configurations
+server = {
+    'port': '8082',
+    'host': '0.0.0.0',
+    'name': 'fms'
+}
+
+# Pecan Application Configurations
+app = {
+    'root': 'fms_rest.controllers.root.RootController',
+    'modules': ['fms_rest'],
+    'static_root': '%(confdir)s/public',
+    'template_path': '%(confdir)s/fms_rest/templates',
+    'debug': True,
+    'errors': {
+        '__force_dict__': True
+    },
+    'hooks': lambda: [SimpleHookMock()]
+}
+
+logging = {
+    'root': {'level': 'INFO', 'handlers': ['console']},
+    'loggers': {
+        'fms_rest': {'level': 'DEBUG', 'handlers': ['console'], 'propagate': False},
+        'pecan': {'level': 'DEBUG', 'handlers': ['console'], 'propagate': False},
+        'py.warnings': {'handlers': ['console']},
+        '__force_dict__': True
+    },
+    'handlers': {
+        'console': {
+            'level': 'DEBUG',
+            'class': 'logging.StreamHandler',
+            'formatter': 'color'
+        }
+    },
+    'formatters': {
+        'simple': {
+            'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]'
+                       '[%(threadName)s] %(message)s')
+        },
+        'color': {
+            '()': 'pecan.log.ColorFormatter',
+            'format': ('%(asctime)s [%(padded_color_levelname)s] [%(name)s]'
+                       '[%(threadName)s] %(message)s'),
+            '__force_dict__': True
+        }
+    }
+}
+
+database = {
+    'host': 'localhost',
+    'username': 'root',
+    'password': 'root',
+    'db_name': 'orm_fms_db',
+
+}
+
+# this table is for calculating default extra specs needed
+extra_spec_needed_table = {
+    "ns": {
+        "aggregate_instance_extra_specs____ns": "true",
+        "hw____mem_page_size": "large"
+    },
+    "nd": {
+        "aggregate_instance_extra_specs____nd": "true",
+        "hw____mem_page_size": "large"
+    },
+    "nv": {
+        "aggregate_instance_extra_specs____nv": "true",
+        "hw____mem_page_size": "large"
+    },
+    "gv": {
+        "aggregate_instance_extra_specs____gv": "true",
+        "aggregate_instance_extra_specs____c2": "true",
+        "hw____numa_nodes": "2"
+    },
+    "ss": {
+        "aggregate_instance_extra_specs____ss": "true"
+    }
+}
+
+# any key will be added to extra_spec_needed_table need to be added here
+default_extra_spec_calculated_table = {
+    "aggregate_instance_extra_specs____ns": "",
+    "aggregate_instance_extra_specs____nd": "",
+    "aggregate_instance_extra_specs____nv": "",
+    "aggregate_instance_extra_specs____gv": "",
+    "aggregate_instance_extra_specs____c2": "",
+    "aggregate_instance_extra_specs____ss": "",
+    "aggregate_instance_extra_specs____c2": "",
+    "aggregate_instance_extra_specs____c4": "",
+    "aggregate_instance_extra_specs____v": "",
+    "hw____mem_page_size": "",
+    "hw____cpu_policy": "",
+    "hw____numa_nodes": ""
+}
+
+database['connection_string'] = 'mysql://{0}:{1}@{2}:3306/{3}'.format(database['username'],
+                                                                      database['password'],
+                                                                      database['host'],
+                                                                      database['db_name'])
+
+application_root = 'http://localhost:{0}'.format(server['port'])
+
+api = {
+    'uuid_server': {
+        'base': 'http://127.0.0.1:8090/',
+        'uuids': 'v1/uuids'
+    },
+    'rds_server': {
+        'base': 'http://127.0.0.1:8777/',
+        'resources': 'v1/rds/resources',
+        'status': 'v1/rds/status/resource/'
+    },
+    'audit_server': {
+        'base': 'http://127.0.0.1:8776/',
+        'trans': 'v1/audit/transaction'
+    }
+
+}
+
+verify = False
+
+authentication = {
+    "enabled": False,
+    "mech_id": "admin",
+    "mech_pass": "stack",
+    "rms_url": "http://172.20.90.174:8080",
+    "tenant_name": "admin",
+    "keystone_version": "2.0",
+    # "policy_file": "/opt/app/orm/aic-orm-fms/fms_rest/etc/policy.json",
+    "policy_file": "/orm/aic-orm-fms/fms_rest/etc/policy.json"
+}
diff --git a/orm/services/flavor_manager/fms_rest/tests/data/__init__.py b/orm/services/flavor_manager/fms_rest/tests/data/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/tests/data/test_wsme_models.py b/orm/services/flavor_manager/fms_rest/tests/data/test_wsme_models.py
new file mode 100755
index 00000000..cc08e833
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/tests/data/test_wsme_models.py
@@ -0,0 +1,79 @@
+from fms_rest.tests import FunctionalTest
+from fms_rest.data.sql_alchemy import db_models
+import fms_rest.data.wsme.models as wsme_models
+
+
+class TestWsmeModels(FunctionalTest):
+    def test_flavor_wrapper_from_db_model(self):
+        sql_flavor = db_models.Flavor()
+        sql_flavor.description = 'desc'
+        sql_flavor.disk = 1
+        sql_flavor.ephemeral = 1
+        sql_flavor.flavor_extra_specs = [db_models.FlavorExtraSpec('key1', 'val1'),
+                                         db_models.FlavorExtraSpec('key2', 'val2')]
+        sql_flavor.flavor_tag = [db_models.FlavorExtraSpec('key1', 'val1'),
+                                 db_models.FlavorExtraSpec('key2', 'val2')]
+        sql_flavor.flavor_options = [db_models.FlavorExtraSpec('key1', 'val1'),
+                                     db_models.FlavorExtraSpec('key2', 'val2')]
+        sql_flavor.flavor_regions = [db_models.FlavorRegion('region1'),
+                                     db_models.FlavorRegion('region2')]
+        sql_flavor.flavor_tenants = [db_models.FlavorTenant('tenant1'),
+                                     db_models.FlavorTenant('tenant2')]
+        sql_flavor.id = 'id'
+        sql_flavor.internal_id = 1
+        sql_flavor.ram = 1
+        sql_flavor.visibility = 'visibility'
+        sql_flavor.vcpus = 1
+        sql_flavor.series = "gv"
+        sql_flavor.swap = 1
+        sql_flavor.disk = 1
+        sql_flavor.name = 'name'
+
+        wsme_flavors = wsme_models.FlavorWrapper.from_db_model(sql_flavor)
+
+        self.assertEqual(len(wsme_flavors.flavor.regions), 2)
+        self.assertEqual(len(wsme_flavors.flavor.tenants), 2)
+        self.assertEqual(wsme_flavors.flavor.extra_specs['key1'], 'val1')
+        self.assertEqual(wsme_flavors.flavor.extra_specs['key2'], 'val2')
+
+    def test_flavor_wrapper_to_db_model(self):
+        flavor_wrapper = wsme_models.FlavorWrapper()
+        flavor_wrapper.flavor = wsme_models.Flavor()
+
+        flavor_wrapper.flavor.description = 'desc'
+        flavor_wrapper.flavor.disk = '1'
+        flavor_wrapper.flavor.ephemeral = '1'
+        flavor_wrapper.flavor.extra_specs = {'key1': 'val1', 'key2': 'val2'}
+        flavor_wrapper.flavor.tag = {'key1': 'val1', 'key2': 'val2'}
+        flavor_wrapper.flavor.options = {'key1': 'val1', 'key2': 'val2'}
+        flavor_wrapper.flavor.regions = [wsme_models.Region('region1'),
+                                         wsme_models.Region('region2')]
+        flavor_wrapper.flavor.tenants = ['tenant1', 'tenant2']
+        flavor_wrapper.flavor.id = 'id'
+        flavor_wrapper.flavor.ram = '1'
+        flavor_wrapper.flavor.visibility = 'visibility'
+        flavor_wrapper.flavor.vcpus = '1'
+        flavor_wrapper.flavor.swap = '1'
+        flavor_wrapper.flavor.disk = '1'
+        flavor_wrapper.flavor.name = 'name'
+        flavor_wrapper.flavor.series = 'ns'
+
+        sql_flavor = flavor_wrapper.to_db_model()
+
+        self.assertEqual(len(sql_flavor.flavor_regions), 2)
+        self.assertEqual(len(sql_flavor.flavor_tenants), 2)
+
+        spec = next(s for s in sql_flavor.flavor_extra_specs if s.key_name == 'key1')
+        self.assertEqual(spec.key_value, 'val1')
+
+    def test_flavor_summary_from_db_model(self):
+        sql_flavor = db_models.Flavor()
+        sql_flavor.id = 'some id'
+        sql_flavor.name = 'some name'
+        sql_flavor.description = 'some_decription'
+
+        flavor_summary = wsme_models.FlavorSummary.from_db_model(sql_flavor)
+
+        self.assertEqual(flavor_summary.id, sql_flavor.id)
+        self.assertEqual(flavor_summary.name, sql_flavor.name)
+        self.assertEqual(flavor_summary.description, sql_flavor.description)
diff --git a/orm/services/flavor_manager/fms_rest/tests/logic/__init__.py b/orm/services/flavor_manager/fms_rest/tests/logic/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/tests/logic/test_flavor_logic.py b/orm/services/flavor_manager/fms_rest/tests/logic/test_flavor_logic.py
new file mode 100755
index 00000000..cef5355e
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/tests/logic/test_flavor_logic.py
@@ -0,0 +1,768 @@
+from fms_rest.tests import FunctionalTest
+from orm_common.injector import injector
+from mock import MagicMock
+from mock import patch
+from fms_rest.data.wsme import models
+from fms_rest.data.wsme.models import *
+from fms_rest.data.sql_alchemy import db_models
+import fms_rest.logic.flavor_logic as flavor_logic
+from fms_rest.logic.error_base import NotFoundError, ConflictError
+
+
+class OES():
+
+    def __init__(self):
+        pass
+
+    def to_db_model(self):
+        return None
+
+error = None
+FLAVOR_MOCK = None
+
+
+class TestFlavorLogic(FunctionalTest):
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+        global FLAVOR_MOCK
+        FLAVOR_MOCK = MagicMock()
+
+        injector.override_injected_dependency(('data_manager', get_datamanager_mock))
+        injector.override_injected_dependency(('rds_proxy', rds_proxy_mock))
+
+    def tearDown(self):
+        global error
+        error = None
+        FunctionalTest.tearDown(self)
+
+    def test_get_fixed_uuid_valid_uuid(self):
+        # With dashes
+        test_uuid = 'f8391e94-b332-4d7f-956c-07c6096b9140'
+        expected_result = test_uuid.replace('-', '')
+        self.assertEqual(expected_result, flavor_logic.get_fixed_uuid(
+            test_uuid))
+
+        # Without dashes
+        test_uuid = 'f8391e94b3324d7f956c07c6096b9140'
+        self.assertEqual(test_uuid, flavor_logic.get_fixed_uuid(test_uuid))
+
+    def test_get_fixed_uuid_not_a_uuid(self):
+        self.assertRaises(flavor_logic.ErrorStatus,
+                          flavor_logic.get_fixed_uuid, 'test')
+
+    def test_get_fixed_uuid_not_a_version_4_uuid(self):
+        self.assertRaises(flavor_logic.ErrorStatus,
+                          flavor_logic.get_fixed_uuid,
+                          'f8391e94-b332-1d7f-956c-07c6096b9140')
+
+    @patch.object(flavor_logic, 'FlavorWrapper')
+    def test_create_flavor_duplicate_entry(self, mock_flavorwrapper):
+        mock_flavorwrapper.from_db_model.return_value = get_flavor_mock()
+        global error
+        error = 31
+        injector.override_injected_dependency(
+            ('rds_proxy', get_rds_proxy_mock()))
+        flavor = get_flavor_mock()
+        flavor.flavor.validate_model = MagicMock(
+            side_effect=flavor_logic.ErrorStatus(409, 'Duplicate entry'))
+        self.assertRaises(flavor_logic.ErrorStatus, flavor_logic.create_flavor,
+                          flavor, 'uuid', 'transaction')
+
+    @patch.object(flavor_logic, 'FlavorWrapper')
+    def test_create_flavor_success(self, mock_flavorwrapper):
+        mock_flavorwrapper.from_db_model.return_value = get_flavor_mock()
+        global error
+        error = 31
+        injector.override_injected_dependency(
+            ('rds_proxy', get_rds_proxy_mock()))
+
+        res_flavor = flavor_logic.create_flavor(get_flavor_mock(), 'uuid',
+                                                'transaction')
+        self.assertEqual(res_flavor.flavor.profile, 'N1')
+        self.assertEqual(res_flavor.flavor.ram, '1024')
+        self.assertEqual(res_flavor.flavor.vcpus, '1')
+        self.assertEqual(res_flavor.flavor.series, 'ss')
+        self.assertEqual(res_flavor.flavor.id, 'g')
+
+        flavor = get_flavor_mock()
+        flavor.flavor.ephemeral = ''
+        self.assertRaises(flavor_logic.ErrorStatus, flavor_logic.create_flavor,
+                          flavor, 'uuid', 'transaction')
+
+        flavor.flavor.validate_model = MagicMock()
+        res_flavor = flavor_logic.create_flavor(flavor, 'uuid',
+                                                'transaction')
+        self.assertEqual(res_flavor.flavor.profile, 'N1')
+        self.assertEqual(res_flavor.flavor.ram, '1024')
+        self.assertEqual(res_flavor.flavor.vcpus, '1')
+        self.assertEqual(res_flavor.flavor.series, 'ss')
+        self.assertEqual(res_flavor.flavor.id, 'g')
+
+    #
+    # def test_get_flavor_by_uuid_check_statuses_ok(self):
+    #     flavor_logic.get_flavor_by_uuid("SampleUUId")
+
+    @patch.object(flavor_logic, 'ExtraSpecsWrapper', return_value=MagicMock())
+    def test_get_extra_specs_success(self, extra_spec_wrapper):
+        global error
+        error = 3
+        injector.override_injected_dependency(
+            ('flavor_logic', get_datamanager_mock()))
+        extra_spec_wrapper.from_db_model.return_value = {"key", "value"}
+        result = flavor_logic.get_extra_specs_uuid(123, "transaction_id")
+        self.assertEqual({"key", "value"}, result)
+
+    @patch.object(flavor_logic, 'ExtraSpecsWrapper', return_value=MagicMock())
+    def test_get_extra_specs_not_found(self, extra_spec_wrapper):
+        global error
+        error = 1
+        injector.override_injected_dependency(
+            ('flavor_logic', get_datamanager_mock()))
+        with self.assertRaises(flavor_logic.NotFoundError):
+            flavor_logic.get_extra_specs_uuid(123, "transaction_id")
+
+    @patch.object(flavor_logic, 'ExtraSpecsWrapper', return_value=MagicMock())
+    def test_get_extra_specs_general_error(self, extra_spec_wrapper):
+        global error
+        error = 2
+        injector.override_injected_dependency(
+            ('flavor_logic', get_datamanager_mock()))
+        with self.assertRaises(Exception) as cm:
+            flavor_logic.get_extra_specs_uuid(123, "transaction_id")
+
+    @patch.object(flavor_logic, 'send_to_rds_if_needed', return_value=True)
+    @patch.object(flavor_logic, 'FlavorWrapper', return_value=MagicMock())
+    def test_delete_extra_specs_success(self, mock_flavorwrapper,
+                                        mock_send_rds):
+        flavor_logic.delete_extra_specs(123, "transaction_id")
+
+    @patch.object(flavor_logic, 'FlavorWrapper', return_value=MagicMock())
+    def test_delete_extra_specs_not_found(self, mock_flavorwrapper):
+        global error
+        error = 1
+        injector.override_injected_dependency(
+            ('flavor_logic', get_datamanager_mock()))
+        with self.assertRaises(flavor_logic.NotFoundError):
+            flavor_logic.delete_extra_specs(123, "transaction_id")
+
+    @patch.object(flavor_logic, 'FlavorWrapper', return_value=MagicMock())
+    def test_delete_extra_specs_bad_req(self, mock_flavorwrapper):
+        global error
+        error = 3
+        extra_spec_needed = db_models.FlavorExtraSpec("key1", "value")
+        get_extra_spec_needed = MagicMock()
+        get_extra_spec_needed.get_extra_spec_needed.return_value = [extra_spec_needed]
+        mock_flavorwrapper.from_db_model.return_value = get_extra_spec_needed
+        with self.assertRaises(ErrorStatus):
+            flavor_logic.delete_extra_specs(123, "transaction_id", "key1")
+
+    @patch.object(flavor_logic, 'FlavorWrapper', return_value=MagicMock())
+    def test_delete_extra_specs_one(self, mock_flavorwrapper):
+        global error
+        error = 3
+        extra_spec_needed = db_models.FlavorExtraSpec("key1", "value")
+        get_extra_spec_needed = MagicMock()
+        get_extra_spec_needed.get_extra_spec_needed.return_value = [
+            extra_spec_needed]
+        mock_flavorwrapper.from_db_model.return_value = get_extra_spec_needed
+        flavor_logic.delete_extra_specs(123, "transaction_id", "key2")
+
+    @patch.object(flavor_logic, 'FlavorWrapper', return_value=MagicMock())
+    def test_delete_extra_specs_general_error(self, mock_flavorwrapper):
+        global error
+        error = 2
+        injector.override_injected_dependency(
+            ('flavor_logic', get_datamanager_mock()))
+        with self.assertRaises(Exception) as cm:
+            flavor_logic.delete_extra_specs(123, "transaction_id")
+
+    @patch.object(flavor_logic.ExtraSpecsWrapper, 'from_db_model',
+                  return_value=True)
+    @patch.object(flavor_logic, 'send_to_rds_if_needed', return_value=True)
+    def test_add_extra_specs_success(self, mock_send_rds, extra_specs_wrapper):
+        flavor_logic.add_extra_specs(123, OES(), "transaction_id")
+
+    def test_add_extra_specs_not_found(self):
+        global error
+        error = 1
+        injector.override_injected_dependency(
+            ('flavor_logic', get_datamanager_mock()))
+        with self.assertRaises(flavor_logic.NotFoundError):
+            flavor_logic.add_extra_specs(123, OES(), "transaction_id")
+
+    def test_add_extra_specs_gen_exp(self):
+        global error
+        error = 2
+        injector.override_injected_dependency(
+            ('flavor_logic', get_datamanager_mock()))
+        with self.assertRaises(Exception):
+            flavor_logic.add_extra_specs(123, OES(), "transaction_id")
+
+    @patch.object(flavor_logic.ExtraSpecsWrapper, 'from_db_model')
+    @patch.object(flavor_logic, 'FlavorWrapper', return_value=MagicMock())
+    @patch.object(flavor_logic, 'send_to_rds_if_needed', return_value=True)
+    def test_update_extra_specs_success(self, mock_send_rds,
+                                        flavor_wrapper,
+                                        extra_specs_wrapper):
+        extra_specs_wrapper.return_value = extra_specs_json
+        result = flavor_logic.update_extra_specs(123, OES(), "transaction_id")
+        self.assertEqual(result, extra_specs_json)
+
+    @patch.object(flavor_logic, 'FlavorWrapper', return_value=MagicMock())
+    @patch.object(flavor_logic, 'send_to_rds_if_needed', return_value=True)
+    def test_update_extra_specs_not_found(self, mock_send_rds,
+                                          extra_specs_wrapper):
+        global error
+        error = 1
+        injector.override_injected_dependency(
+            ('flavor_logic', get_datamanager_mock()))
+        with self.assertRaises(flavor_logic.NotFoundError):
+            flavor_logic.update_extra_specs(123, OES(), "transaction_id")
+
+    @patch.object(flavor_logic, 'FlavorWrapper', return_value=MagicMock())
+    @patch.object(flavor_logic, 'send_to_rds_if_needed', return_value=True)
+    def test_update_extra_specs_any_except(self, mock_send_rds,
+                                           extra_specs_wrapper):
+        global error
+        error = 2
+        injector.override_injected_dependency(
+            ('flavor_logic', get_datamanager_mock()))
+        with self.assertRaises(Exception):
+            flavor_logic.update_extra_specs(123, OES(), "transaction_id")
+
+    def test_add_tags_success(self):
+        global error
+        error = 0
+        datamanager = get_datamanager_mock()
+        injector.override_injected_dependency(('data_manager', datamanager))
+
+        tag = TagsWrapper(tags={'a': 'b'})
+        ret = flavor_logic.add_tags('some_id', tag, 'trans_id')
+
+        assert datamanager.return_value.commit.called
+
+    def test_add_tags_not_found(self):
+        global error
+        error = 1
+        injector.override_injected_dependency(('data_manager', get_datamanager_mock))
+
+        self.assertRaises(NotFoundError, flavor_logic.add_tags, 'a', None, 'a')
+
+    def test_add_tags_error(self):
+        global error
+        error = 2
+        injector.override_injected_dependency(('data_manager', get_datamanager_mock))
+
+        self.assertRaises(Exception, flavor_logic.add_tags, 'a', None, 'a')
+
+    @patch.object(flavor_logic.FlavorWrapper, 'from_db_model')
+    def test_get_tags_success(self, mock_from_db_model):
+        my_flavor = MagicMock()
+        my_flavor.flavor.tag = {'test': 'A'}
+        mock_from_db_model.return_value = my_flavor
+
+        global error
+        error = 4
+        injector.override_injected_dependency(('data_manager',
+                                               get_datamanager_mock))
+
+        ret = flavor_logic.get_tags('some_id')
+
+        self.assertEqual(ret, my_flavor.flavor.tag)
+
+    def test_get_tags_not_found(self):
+        global error
+        error = 1
+        injector.override_injected_dependency(('data_manager',
+                                               get_datamanager_mock))
+
+        self.assertRaises(flavor_logic.ErrorStatus, flavor_logic.get_tags,
+                          'some_id')
+
+    def test_get_tags_error(self):
+        global error
+        error = 2
+        injector.override_injected_dependency(('data_manager',
+                                               get_datamanager_mock))
+
+        self.assertRaises(SystemError, flavor_logic.get_tags, 'some_id')
+
+    def test_update_tags_success(self):
+        global error
+        error = 0
+        injector.override_injected_dependency(
+            ('data_manager', get_datamanager_mock))
+        tag = TagsWrapper(tags={'a': 'b'})
+        ret = flavor_logic.update_tags('some_id', tag, 'trans_id')
+
+        self.assertEqual(ret.tags, tag.tags)
+
+    def test_update_tags_not_found(self):
+        global error
+        error = 1
+        injector.override_injected_dependency(('data_manager', get_datamanager_mock))
+
+        self.assertRaises(NotFoundError, flavor_logic.update_tags, '', None, '')
+
+    def test_update_tags_error(self):
+        global error
+        error = 2
+        injector.override_injected_dependency(('data_manager', get_datamanager_mock))
+
+        self.assertRaises(Exception, flavor_logic.update_tags, 'a', None, 'a')
+
+    def test_delete_tags_success(self):
+        tag = TagsWrapper(tags={'a': 'b'})
+        flavor_logic.delete_tags('some_id', tag, 'trans_id')
+
+    def test_delete_all_tags_success(self):
+        flavor_logic.delete_tags('some_id', None, 'trans_id')
+
+    def test_delete_tags_not_found(self):
+        global error
+        error = 6
+        injector.override_injected_dependency(('data_manager', get_datamanager_mock))
+
+        # Even when the tag was not found, an exception shouldn't be raised
+        flavor_logic.delete_tags('some_id', None, 'trans_id')
+
+        error = 7
+        self.assertRaises(flavor_logic.NotFoundError, flavor_logic.delete_tags,
+                          'some_id', None, 'trans_id')
+
+        error = 8
+        # This case should not raise an exception
+        flavor_logic.delete_tags('some_id', None, 'trans_id')
+
+    def test_delete_tags_error(self):
+        global error
+        error = 2
+        injector.override_injected_dependency(('data_manager', get_datamanager_mock))
+
+        self.assertRaises(Exception, flavor_logic.delete_tags, 'a', None, 'a')
+
+        error = 9
+        self.assertRaises(flavor_logic.ErrorStatus, flavor_logic.delete_tags,
+                          'a', None, 'a')
+
+    def test_delete_flavor_by_uuid_success(self):
+        global error
+        error = 31
+        injector.override_injected_dependency(
+            ('data_manager', get_datamanager_mock))
+        injector.override_injected_dependency(
+            ('rds_proxy', get_rds_proxy_mock()))
+
+        flavor_logic.delete_flavor_by_uuid('some_id')
+
+        error = 33
+        injector.override_injected_dependency(
+            ('rds_proxy', get_rds_proxy_mock()))
+        flavor_logic.delete_flavor_by_uuid('some_id')
+
+    def test_delete_flavor_by_uuid_bad_status(self):
+        global error
+        injector.override_injected_dependency(
+            ('data_manager', get_datamanager_mock))
+
+        # Run once for response with no status and once for an invalid
+        # response code
+        for error_value in (32, 40,):
+            error = error_value
+            injector.override_injected_dependency(
+                ('rds_proxy', get_rds_proxy_mock()))
+
+            try:
+                flavor_logic.delete_flavor_by_uuid('some_id')
+                self.fail('ErrorStatus not raised!')
+            except flavor_logic.ErrorStatus as e:
+                self.assertEqual(e.status_code, 500)
+
+        # RDS returned OK, but the resource status is Error
+        error = 34
+        injector.override_injected_dependency(
+            ('rds_proxy', get_rds_proxy_mock()))
+        try:
+            flavor_logic.delete_flavor_by_uuid('some_id')
+            self.fail('ErrorStatus not raised!')
+        except flavor_logic.ErrorStatus as e:
+            self.assertEqual(e.status_code, 409)
+
+    def test_delete_flavor_by_uuid_flavor_not_found(self):
+        global error
+        error = 1
+        injector.override_injected_dependency(
+            ('data_manager', get_datamanager_mock))
+
+        flavor_logic.delete_flavor_by_uuid('some_id')
+
+    def test_delete_flavor_by_uuid_flavor_has_regions(self):
+        global error
+        error = 3
+        injector.override_injected_dependency(
+            ('data_manager', get_datamanager_mock))
+
+        try:
+            flavor_logic.delete_flavor_by_uuid('some_id')
+            self.fail('ErrorStatus not raised!')
+        except flavor_logic.ErrorStatus as e:
+            self.assertEqual(e.status_code, 405)
+
+    @patch.object(flavor_logic, 'send_to_rds_if_needed')
+    @patch.object(flavor_logic, 'get_flavor_by_uuid')
+    def test_add_regions_success(self, mock_gfbu, mock_strin):
+        ret_flavor = MagicMock()
+        ret_flavor.flavor.regions = [Region(name='test_region')]
+        mock_gfbu.return_value = ret_flavor
+        global error
+        error = 31
+        injector.override_injected_dependency(
+            ('rds_proxy', get_rds_proxy_mock()))
+
+        res_regions = flavor_logic.add_regions('uuid', RegionWrapper(
+            [Region(name='test_region')]), 'transaction')
+
+    @patch.object(flavor_logic, 'send_to_rds_if_needed')
+    @patch.object(flavor_logic, 'get_flavor_by_uuid')
+    def test_add_regions_errors(self, mock_gfbu, mock_strin):
+        ret_flavor = MagicMock()
+        ret_flavor.flavor.regions = [Region(name='test_region')]
+        mock_gfbu.return_value = ret_flavor
+        global error
+
+        error = 1
+        injector.override_injected_dependency(('data_manager', get_datamanager_mock))
+        self.assertRaises(flavor_logic.ErrorStatus, flavor_logic.add_regions,
+                          'uuid', RegionWrapper([Region(name='test_region')]),
+                          'transaction')
+
+        error = 4
+        injector.override_injected_dependency(
+            ('data_manager', get_datamanager_mock))
+
+        mock_strin.side_effect = flavor_logic.FlushError()
+        self.assertRaises(flavor_logic.FlushError, flavor_logic.add_regions,
+                          'uuid', RegionWrapper([Region(name='test_region')]),
+                          'transaction')
+        mock_strin.side_effect = flavor_logic.FlushError(
+            'conflicts with persistent instance')
+        self.assertRaises(flavor_logic.ErrorStatus, flavor_logic.add_regions,
+                          'uuid', RegionWrapper([Region(name='test_region')]),
+                          'transaction')
+        mock_strin.side_effect = ValueError()
+        self.assertRaises(ValueError, flavor_logic.add_regions,
+                          'uuid', RegionWrapper([Region(name='test_region')]),
+                          'transaction')
+        mock_strin.side_effect = ValueError(
+            'conflicts with persistent instance')
+        self.assertRaises(flavor_logic.ConflictError, flavor_logic.add_regions,
+                          'uuid', RegionWrapper([Region(name='test_region')]),
+                          'transaction')
+
+        self.assertRaises(flavor_logic.ErrorStatus, flavor_logic.add_regions,
+                          'uuid', RegionWrapper([Region(name='')]),
+                          'transaction')
+        self.assertRaises(flavor_logic.ErrorStatus, flavor_logic.add_regions,
+                          'uuid', RegionWrapper([Region(name='test_region', type='group')]),
+                          'transaction')
+
+    @patch.object(flavor_logic, 'send_to_rds_if_needed')
+    @patch.object(flavor_logic, 'get_flavor_by_uuid')
+    def test_delete_region_success(self, mock_gfbu, mock_strin):
+        ret_flavor = MagicMock()
+        ret_flavor.flavor.regions = [Region(name='test_region')]
+        mock_gfbu.return_value = ret_flavor
+        global error
+        error = 31
+        injector.override_injected_dependency(
+            ('rds_proxy', get_rds_proxy_mock()))
+
+        res_regions = flavor_logic.delete_region('uuid', RegionWrapper(
+            [Region(name='test_region')]), 'transaction')
+
+    @patch.object(flavor_logic, 'send_to_rds_if_needed')
+    @patch.object(flavor_logic, 'get_flavor_by_uuid')
+    def test_delete_region_errors(self, mock_gfbu, mock_strin):
+        ret_flavor = MagicMock()
+        ret_flavor.flavor.regions = [Region(name='test_region')]
+        mock_gfbu.return_value = ret_flavor
+        global error
+
+        error = 1
+        injector.override_injected_dependency(
+            ('data_manager', get_datamanager_mock))
+        self.assertRaises(flavor_logic.ErrorStatus, flavor_logic.delete_region,
+                          'uuid', 'test_region', 'transaction')
+
+        error = 2
+        injector.override_injected_dependency(
+            ('data_manager', get_datamanager_mock))
+        self.assertRaises(SystemError, flavor_logic.delete_region,
+                          'uuid', 'test_region', 'transaction')
+
+    @patch.object(flavor_logic, 'send_to_rds_if_needed')
+    @patch.object(flavor_logic, 'get_flavor_by_uuid')
+    def test_add_tenants_success(self, mock_gfbu, mock_strin):
+        ret_flavor = MagicMock()
+        tenants = ['test_tenant']
+        ret_flavor.flavor.tenants = tenants
+        mock_gfbu.return_value = ret_flavor
+        global error
+        error = 31
+        injector.override_injected_dependency(
+            ('rds_proxy', get_rds_proxy_mock()))
+
+        res_tenants = flavor_logic.add_tenants('uuid',
+                                               TenantWrapper(tenants),
+                                               'transaction')
+        self.assertEqual(res_tenants.tenants, tenants)
+
+    @patch.object(flavor_logic, 'send_to_rds_if_needed')
+    @patch.object(flavor_logic, 'get_flavor_by_uuid')
+    def test_add_tenants_errors(self, mock_gfbu, mock_strin):
+        ret_flavor = MagicMock()
+        tenants = ['test_tenant']
+        ret_flavor.flavor.tenants = tenants
+        mock_gfbu.return_value = ret_flavor
+        global error
+
+        error = 1
+        injector.override_injected_dependency(
+            ('data_manager', get_datamanager_mock))
+        self.assertRaises(flavor_logic.ErrorStatus,
+                          flavor_logic.add_tenants, 'uuid',
+                          TenantWrapper(tenants),
+                          'transaction')
+
+        # Flavor is public
+        error = 5
+        self.assertRaises(flavor_logic.ErrorStatus,
+                          flavor_logic.add_tenants, 'uuid',
+                          TenantWrapper(tenants),
+                          'transaction')
+
+        error = 31
+        moq = MagicMock()
+        moq.tenants = [1337]
+        self.assertRaises(ValueError,
+                          flavor_logic.add_tenants, 'uuid',
+                          moq,
+                          'transaction')
+
+        mock_strin.side_effect = flavor_logic.FlushError(
+            'conflicts with persistent instance')
+        self.assertRaises(flavor_logic.ConflictError,
+                          flavor_logic.add_tenants, 'uuid',
+                          TenantWrapper(tenants),
+                          'transaction')
+
+        mock_strin.side_effect = flavor_logic.FlushError('')
+        self.assertRaises(flavor_logic.FlushError,
+                          flavor_logic.add_tenants, 'uuid',
+                          TenantWrapper(tenants),
+                          'transaction')
+
+    @patch.object(flavor_logic, 'send_to_rds_if_needed')
+    @patch.object(flavor_logic, 'get_flavor_by_uuid')
+    def test_delete_tenant_success(self, mock_gfbu, mock_strin):
+        global error
+        error = 31
+        injector.override_injected_dependency(
+            ('rds_proxy', get_rds_proxy_mock()))
+
+        flavor_logic.delete_tenant('uuid', 'tenant_id', 'transaction')
+
+    @patch.object(flavor_logic, 'send_to_rds_if_needed')
+    @patch.object(flavor_logic, 'get_flavor_by_uuid')
+    def test_delete_tenant_errors(self, mock_gfbu, mock_strin):
+        ret_flavor = MagicMock()
+        tenants = ['test_tenant']
+        ret_flavor.flavor.tenants = tenants
+        mock_gfbu.return_value = ret_flavor
+        global error
+
+        error = 1
+        injector.override_injected_dependency(
+            ('data_manager', get_datamanager_mock))
+        self.assertRaises(flavor_logic.ErrorStatus,
+                          flavor_logic.delete_tenant, 'uuid',
+                          'tenant_id',
+                          'transaction')
+
+        # Flavor is public
+        error = 5
+        self.assertRaises(ValueError,
+                          flavor_logic.delete_tenant, 'uuid',
+                          'tenant_id',
+                          'transaction')
+
+        global FLAVOR_MOCK
+        tenant = MagicMock()
+        tenant.tenant_id = 'tenant_id'
+        FLAVOR_MOCK.flavor_tenants = [tenant]
+        error = 6
+        self.assertRaises(ValueError,
+                          flavor_logic.delete_tenant, 'uuid',
+                          'tenant_id',
+                          'transaction')
+
+    @patch.object(flavor_logic, 'send_to_rds_if_needed')
+    @patch.object(flavor_logic, 'get_flavor_by_uuid')
+    @patch.object(models, 'request')
+    @patch.object(flavor_logic, 'ExtraSpecsWrapper')
+    def test_add_extra_specs_success(self, mock_extra_specs_wrapper,
+                                     mock_request, mock_gfbu, mock_strin):
+        extra_specs = ExtraSpecsWrapper({'a': 'b'})
+        mock_extra_specs_wrapper.from_db_model.return_value = extra_specs
+        global error
+        error = 31
+        injector.override_injected_dependency(
+            ('rds_proxy', get_rds_proxy_mock()))
+        res_extra_specs = flavor_logic.add_extra_specs('uuid',
+                                                       extra_specs,
+                                                       'transaction')
+        self.assertEqual(res_extra_specs.os_extra_specs, {'a': 'b'})
+
+    @patch.object(flavor_logic, 'send_to_rds_if_needed')
+    @patch.object(flavor_logic, 'get_flavor_by_uuid')
+    @patch.object(models, 'request')
+    @patch.object(flavor_logic, 'ExtraSpecsWrapper')
+    def test_add_extra_specs_conflict_error(self, mock_extra_specs_wrapper,
+                                            mock_request, mock_gfbu,
+                                            mock_strin):
+        mock_strin.side_effect = ValueError(
+            'conflicts with persistent instance')
+        extra_specs = ExtraSpecsWrapper({'a': 'b'})
+        mock_extra_specs_wrapper.from_db_model.return_value = extra_specs
+        global error
+        error = 31
+        injector.override_injected_dependency(
+            ('rds_proxy', get_rds_proxy_mock()))
+        self.assertRaises(flavor_logic.ConflictError,
+                          flavor_logic.add_extra_specs, 'uuid',
+                          extra_specs,
+                          'transaction')
+
+    @patch.object(flavor_logic, 'send_to_rds_if_needed')
+    @patch.object(flavor_logic, 'get_flavor_by_uuid')
+    @patch.object(models, 'request')
+    @patch.object(flavor_logic, 'ExtraSpecsWrapper')
+    @patch.object(flavor_logic, 'FlavorWrapper')
+    def test_update_extra_specs_success(self, mock_flavor_wrapper,
+                                        mock_extra_specs_wrapper,
+                                        mock_request, mock_gfbu, mock_strin):
+        extra_specs = ExtraSpecsWrapper({'a': 'b'})
+        mock_extra_specs_wrapper.from_db_model.return_value = extra_specs
+        global error
+        error = 31
+        injector.override_injected_dependency(
+            ('rds_proxy', get_rds_proxy_mock()))
+        res_extra_specs = flavor_logic.update_extra_specs('uuid',
+                                                          extra_specs,
+                                                          'transaction')
+        self.assertEqual(res_extra_specs.os_extra_specs, {'a': 'b'})
+
+
+def get_datamanager_mock():
+    def get_record(record_type):
+        global error
+        if record_type == 'flavor':
+            record = MagicMock()
+            db_model = db_models.Flavor()
+            db_model.remove_tag = MagicMock()
+            db_model.remove_all_tags = MagicMock()
+            record.get_flavor_by_id.return_value = db_model
+
+            if error == 1:
+                record.get_flavor_by_id.return_value = None
+            elif error == 2:
+                record.get_flavor_by_id.side_effect = SystemError()
+            elif error == 3:
+                moq = MagicMock()
+                moq.get_existing_region_names.return_value = ['region']
+                record.get_flavor_by_id.return_value = moq
+            elif error == 4:
+                record.get_flavor_by_id.return_value = db_models.Flavor()
+            elif error == 5:
+                record.get_flavor_by_id.return_value = db_models.Flavor(
+                    visibility='public')
+            elif error == 6:
+                record.get_flavor_by_id.return_value = FLAVOR_MOCK
+            elif error == 7:
+                record.get_flavor_by_id.side_effect = flavor_logic.NotFoundError()
+            elif error == 8:
+                record.get_flavor_by_id.side_effect = flavor_logic.ErrorStatus(
+                    404)
+            elif error == 9:
+                record.get_flavor_by_id.side_effect = flavor_logic.ErrorStatus(
+                    500)
+            else:
+                record.get_flavor_by_id.return_value = MagicMock()
+            return record
+
+    mock = MagicMock()
+    mock.get_record = get_record
+
+    return mock
+
+
+def get_rds_proxy_mock():
+    def get_status(resource_id):
+        global error
+        response = MagicMock()
+
+        if error == 31:
+            response.status_code = 200
+            response.json.return_value = {'status': 'Success'}
+        elif error == 32:
+            response.status_code = 200
+            response.json.return_value = {}
+        elif error == 33:
+            response.status_code = 404
+        elif error == 34:
+            response.status_code = 200
+            response.json.return_value = {'status': 'Error'}
+        else:
+            response.status_code = 500
+
+        return response
+
+    mock = MagicMock()
+    mock.get_status = get_status
+
+    return mock
+
+
+def get_flavor_mock():
+    flavor_mock = FlavorWrapper()
+    flavor_mock.flavor = Flavor(ram='1024', vcpus='1', series='ss', id='g')
+    flavor_mock.flavor.profile = 'N1'
+
+    return flavor_mock
+
+
+rds_proxy_mock = MagicMock()
+rds_proxy_mock.get_status.return_value = {
+    "status": "pending",
+    "regions": [
+        {
+            "region": "dla1",
+            "timestamp": "1451599200",
+            "ord-transaction-id": "0649c5be323f4792afbc1efdd480847d",
+            "resource-id": "12fde398643acbed32f8097c98aec20",
+            "ord-notifier-id": "",
+            "status": "success",
+            "error-code": "200",
+            "error-msg": "OK"
+        }
+    ]
+}
+
+extra_specs_json = {
+    "os_extra_specs": {
+        "name357": "region_name1",
+        "name4467": "2",
+        "name66767": "222234556"
+    }
+}
diff --git a/orm/services/flavor_manager/fms_rest/tests/mocks/__init__.py b/orm/services/flavor_manager/fms_rest/tests/mocks/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/tests/rest/__init__.py b/orm/services/flavor_manager/fms_rest/tests/rest/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/tests/rest/test_flavors.py b/orm/services/flavor_manager/fms_rest/tests/rest/test_flavors.py
new file mode 100755
index 00000000..14ecf544
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/tests/rest/test_flavors.py
@@ -0,0 +1,423 @@
+import copy
+import requests
+from fms_rest.tests import FunctionalTest
+from orm_common.injector import injector
+from mock import MagicMock
+from mock import patch
+import sqlalchemy
+
+from fms_rest.data.wsme import models
+from fms_rest.logic.error_base import ErrorStatus
+from fms_rest.controllers.v1.orm.flavors import flavors
+from fms_rest.tests import test_utils
+
+utils_mock = None
+flavor_logic_mock = None
+
+return_error = 0
+
+
+class TestFlavorController(FunctionalTest):
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+        injector.override_injected_dependency(('utils', get_utils_mock()))
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_create_flavor(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(201, "created"))
+
+        global return_error
+        return_error = 0
+
+        # when
+        response = self.app.post_json('/v1/orm/flavors', FLAVOR_JSON)
+
+        # assert
+        assert response.status_int == 201
+        assert utils_mock.audit_trail.called
+        assert utils_mock.make_uuid.called
+        assert flavor_logic_mock.create_flavor.called
+
+    def test_create_flavor_predefined_id(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(201, "created"))
+        test_json = copy.deepcopy(FLAVOR_JSON)
+        test_json['flavor']['id'] = 'test'
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+        injector.override_injected_dependency(('utils', get_utils_mock()))
+
+        # when
+        response = self.app.post_json('/v1/orm/flavors', test_json)
+
+        # assert
+        self.assertEqual(response.status_int, 201)
+
+    def test_create_flavor_existing_predefined_id(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(201, "created"))
+        test_json = copy.deepcopy(FLAVOR_JSON)
+        test_json['flavor']['id'] = 'test'
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('utils', get_utils_mock()))
+
+        # when
+        response = self.app.post_json('/v1/orm/flavors', test_json,
+                                      expect_errors=True)
+
+        # assert
+        # self.assertEqual(response.status_int, 409)
+
+    def test_create_flavor_fail(self):
+        # given
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+        requests.post = MagicMock(return_value=ResponseMock(400, "failed"))
+
+        # when
+        response = self.app.post_json('/v1/orm/flavors', FLAVOR_JSON,
+                                      expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    @patch.object(flavors, 'di')
+    def test_create_flavor_duplicate_entry(self, mock_di):
+        my_mock = MagicMock()
+        my_mock.create_flavor = MagicMock(
+            side_effect=sqlalchemy.exc.IntegrityError(
+                'a', 'b',
+                'Duplicate entry \'flavor\' for key \'name_idx\''))
+        mock_di.resolver.unpack = MagicMock(
+            return_value=(my_mock, MagicMock(),))
+
+        response = self.app.post_json('/v1/orm/flavors', FLAVOR_JSON,
+                                      expect_errors=True)
+
+        self.assertEqual(response.status_int, 500)
+
+    @patch.object(flavors, 'di')
+    def test_create_flavor_other_error(self, mock_di):
+        my_mock = MagicMock()
+        my_mock.create_flavor = MagicMock(
+            side_effect=sqlalchemy.exc.IntegrityError(
+                'a', 'b',
+                'test \'flavor\' for key \'name_idx\''))
+        mock_di.resolver.unpack = MagicMock(
+            return_value=(my_mock, MagicMock(),))
+
+        response = self.app.post_json('/v1/orm/flavors', FLAVOR_JSON,
+                                      expect_errors=True)
+
+        self.assertEqual(response.status_int, 500)
+
+    @patch.object(flavors, 'err_utils')
+    def test_create_flavor_bad_request(self, mock_err_utils):
+        # given
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+        requests.post = MagicMock(return_value=ResponseMock(400, "failed"))
+        mock_err_utils.get_error = test_utils.get_error
+
+        # when
+        response = self.app.post_json('/v1/orm/flavors', FLAVOR_JSON,
+                                      expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 404)
+
+    def test_update_flavor(self):
+        # given
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+        requests.put = MagicMock()
+
+        # when
+        response = self.app.put_json('/v1/orm/flavors/some_id', FLAVOR_JSON,
+                                     expect_errors=True)
+
+        # assert
+        # self.assertEqual(response.status_int, 405)
+
+    def test_get_flavor(self):
+        # given
+
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+        requests.get = MagicMock(return_value=ResponseMock(200, "updated"))
+
+        # when
+        response = self.app.get('/v1/orm/flavors/some_id')
+
+        # assert
+        assert flavor_logic_mock.get_flavor_by_uuid_or_name.called
+
+    def test_get_flavor_fail(self):
+        # given
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+        requests.get = MagicMock()
+
+        # when
+        response = self.app.get('/v1/orm/flavors/some_id', expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_get_flavor_bad_request(self):
+        # given
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+        requests.get = MagicMock()
+
+        # when
+        response = self.app.get('/v1/orm/flavors/some_id', expect_errors=True)
+
+        # assert
+        # self.assertEqual(response.status_int, 404)
+
+    # 8/8/16 Bug DE226006 - This bug fix is to return 405 for every attempt
+    # to delete flavor.
+    def test_delete_flavor(self):
+        # given
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+        requests.delete = MagicMock()
+
+        # when
+        response = self.app.delete('/v1/orm/flavors/some_id',
+                                   expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 204)
+
+    def test_delete_flavor_fail(self):
+        # given
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+        requests.delete = MagicMock()
+
+        # when
+        response = self.app.delete('/v1/orm/flavors/some_id',
+                                   expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    @patch.object(flavors, 'err_utils')
+    def test_delete_flavor_bad_request(self, mock_err_utils):
+        # given
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+        requests.delete = MagicMock()
+        mock_err_utils.get_error = test_utils.get_error
+
+        # when
+        response = self.app.delete('/v1/orm/flavors/some_id',
+                                   expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 409)
+
+    def test_get_all_flavor(self):
+        # given
+
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+        requests.get = MagicMock(return_value=ResponseMock(200, "updated"))
+
+        # when
+        response = self.app.get('/v1/orm/flavors?region=SAN1')
+
+        # assert
+        assert flavor_logic_mock.get_flavor_list_by_params.called
+
+    def test_get_all_flavor_fail(self):
+        # given
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+        requests.get = MagicMock()
+
+        # when
+        response = self.app.get('/v1/orm/flavors?region=region',
+                                expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_get_all_flavor_bad_request(self):
+        # given
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+        requests.get = MagicMock()
+
+        # when
+        response = self.app.get('/v1/orm/flavors?region=region',
+                                expect_errors=True)
+
+        # assert
+        # self.assertEqual(response.status_int, 404)
+
+
+class ResponseMock:
+    def __init__(self, status_code=200, message=""):
+        self.status_code = status_code
+        self.message = message
+
+
+def get_flavor_logic_mock():
+    global flavor_logic_mock
+    flavor_logic_mock = MagicMock()
+
+    if return_error == 0:
+        flavor_logic_mock.update_flavor.return_value = RET_FLAVOR_JSON
+        flavor_logic_mock.create_flavor.return_value = RET_FLAVOR_JSON
+        flavor_logic_mock.get_flavor_by_uuid.return_value = RET_FLAVOR_JSON
+        flavor_logic_mock.get_flavor_by_uuid_or_name.return_value = \
+            RET_FLAVOR_JSON
+        flavor_logic_mock.get_flavor_list_by_params.return_value = FILTER_RET
+    elif return_error == 1:
+        flavor_logic_mock.update_flavor.side_effect = SystemError()
+        flavor_logic_mock.create_flavor.side_effect = SystemError()
+        flavor_logic_mock.get_flavor_by_uuid.side_effect = SystemError()
+        flavor_logic_mock.get_flavor_by_uuid_or_name.side_effect = \
+            SystemError()
+        flavor_logic_mock.get_flavor_list_by_params.side_effect = SystemError()
+        flavor_logic_mock.delete_flavor_by_uuid.side_effect = SystemError()
+    else:
+        flavor_logic_mock.update_flavor.side_effect = ErrorStatus(
+            status_code=404)
+        flavor_logic_mock.create_flavor.side_effect = ErrorStatus(
+            status_code=404)
+        flavor_logic_mock.get_flavor_by_uuid.side_effect = ErrorStatus(
+            status_code=404)
+        flavor_logic_mock.get_flavor_list_by_params.side_effect = ErrorStatus(
+            status_code=404)
+        flavor_logic_mock.delete_flavor_by_uuid.side_effect = ErrorStatus(
+            status_code=409)
+        flavor_logic_mock.get_flavor_by_uuid_or_name.side_effect = ErrorStatus(
+            status_code=404)
+
+    return flavor_logic_mock
+
+
+def get_utils_mock():
+    global utils_mock
+    utils_mock = MagicMock()
+
+    utils_mock.make_transid.return_value = 'some_trans_id'
+    utils_mock.audit_trail.return_value = None
+    utils_mock.make_uuid.return_value = 'some_uuid'
+
+    if return_error:
+        utils_mock.create_existing_uuid.side_effect = TypeError('test')
+    else:
+        utils_mock.create_existing_uuid.return_value = 'some_uuid'
+
+    return utils_mock
+
+
+FLAVOR_JSON = {
+    "flavor": {
+        "description": "A standard 2GB Ram 2 vCPUs 50GB Disk, Flavor",
+        "series": "nv",
+        "ram": "05",
+        "vcpus": "2",
+        "disk": "50",
+        "swap": "1024",
+        "ephemeral": "0",
+        "extra-specs": {
+            "key1": "value1",
+            "key2": "value2",
+            "key3": "value3"
+        },
+        "options": {
+            "option2": "valueoption2",
+            "option3": "valueoption3",
+            "option1": "valueoption1"
+        },
+        "tag": {
+            "tags1": "valuetags1",
+            "tags2": "valuetags2",
+            "tags3": "valuetags3"
+        },
+        "regions": [
+            {"name": "0", "type": "single"},
+            {"name": "1", "type": "single"}
+        ],
+        "visibility": "private",
+        "tenants": [
+            "4f7b9561-af8b-4cc0-87e2-319270dad49e",
+            "070be05e-26e2-4519-a46d-224cbf8558f4"
+        ],
+        "status": "complete"
+    }
+}
+
+RET_FLAVOR_JSON = models.FlavorWrapper(
+    models.Flavor(
+        description="A standard 2GB Ram 2 vCPUs 50GB Disk, Flavor",
+        series="nv",
+        ram="05",
+        vcpus="2",
+        disk="50",
+        swap="1024",
+        ephemeral="0",
+        extra_specs={
+            "key1": "value1"
+        },
+        tag={
+            "tags1": "valuetags1"
+        },
+        options={
+            "option1": "valueoption1"
+        },
+        regions=[models.Region(name='1')],
+        visibility="private",
+        tenants=[
+            "4f7b9561-af8b-4cc0-87e2-319270dad49e",
+            "070be05e-26e2-4519-a46d-224cbf8558f4"
+        ],
+        status="complete"
+    )
+)
+
+# FILTER_RET = [models.Flavor()]
+
+FILTER_RET = models.FlavorListFullResponse()
+FILTER_RET.flavors.append(
+    models.Flavor(name='1', id='1', description='1'))
diff --git a/orm/services/flavor_manager/fms_rest/tests/rest/test_logs.py b/orm/services/flavor_manager/fms_rest/tests/rest/test_logs.py
new file mode 100755
index 00000000..6b1a5381
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/tests/rest/test_logs.py
@@ -0,0 +1,25 @@
+"""Logs module unittests."""
+from fms_rest.tests import FunctionalTest
+
+
+class TestLogs(FunctionalTest):
+    """logs tests."""
+
+    def test_change_log_level_fail(self):
+        response = self.app.put('/v1/orm/logs/1')
+        expected_result = {
+            "result": "Fail to change log_level. Reason: "
+            "The given log level [1] doesn't exist."}
+        self.assertEqual(expected_result, response.json)
+
+    def test_change_log_level_none(self):
+        response = self.app.put('/v1/orm/logs', expect_errors=True)
+        expected_result = 'Missing argument: "level"'
+        self.assertEqual(response.json["faultstring"], expected_result)
+        self.assertEqual(response.status_code, 400)
+
+    def test_change_log_level_success(self):
+        response = self.app.put('/v1/orm/logs/debug')
+        expected_result = {'result': 'Log level changed to debug.'}
+        self.assertEqual(response.json, expected_result)
+        self.assertEqual(response.status_code, 201)
diff --git a/orm/services/flavor_manager/fms_rest/tests/rest/test_os_extra_specs.py b/orm/services/flavor_manager/fms_rest/tests/rest/test_os_extra_specs.py
new file mode 100755
index 00000000..74221c1a
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/tests/rest/test_os_extra_specs.py
@@ -0,0 +1,195 @@
+import json
+
+from fms_rest.controllers.v1.orm.flavors import os_extra_specs as es
+from fms_rest.data.wsme import models
+from fms_rest.logic.error_base import NotFoundError
+from fms_rest.tests import FunctionalTest
+from orm_common.injector import injector
+from mock import MagicMock
+from mock import patch
+
+
+class TestOsExtraSpecsController(FunctionalTest):
+    """unittes."""
+
+    @patch.object(es, 'di')
+    def test_create_os_flavor_specs_success(self, mock_di):
+        mock_di.resolver.unpack.return_value =\
+            get_utils_flavor_logic_mock(flavor_extra_specs_json)
+        response = self.app.post_json('/v1/orm/flavors/123/os_extra_specs',
+                                      flavor_extra_specs_json)
+        self.assertEqual(response.json, flavor_extra_specs_json)
+        self.assertEqual(response.status_code, 201)
+
+    # def test_create_os_extra_specs_bad_json(self):
+    #     global flavor_extra_specs_json
+    #     backup = dict(flavor_extra_specs_json)
+    #     del(flavor_extra_specs_json["os_extra_specs"])
+    #     response = self.app.post_json('/v1/orm/flavors/123/os_extra_specs',
+    #                                   flavor_extra_specs_json,
+    #                                   expect_errors=True)
+    #     flavor_extra_specs_json = backup
+    #     self.assertEqual(response.status_code, 400)
+
+    @patch.object(es, 'di')
+    def test_create_os_flavor_specs_audit_trial_fails(self, mock_di):
+        flavor_mock, utils_mock = \
+            get_utils_flavor_logic_mock(flavor_extra_specs_json)
+        utils_mock.audit_trail.side_effect = SystemError()
+        mock_di.resolver.unpack.return_value = flavor_mock, utils_mock
+        response = self.app.post_json('/v1/orm/flavors/123/os_extra_specs',
+                                      flavor_extra_specs_json,
+                                      expect_errors=True)
+        self.assertEqual(response.status_code, 500)
+
+    @patch.object(es, 'di')
+    def test_create_os_flavor_specs_flavor_not_found(self, mock_di):
+        flavor_mock, utils_mock = \
+            get_utils_flavor_logic_mock(flavor_extra_specs_json)
+        flavor_mock.add_extra_specs.side_effect = NotFoundError(404,
+                                                                "not found")
+        mock_di.resolver.unpack.return_value = flavor_mock, utils_mock
+        response = self.app.post_json('/v1/orm/flavors/123/os_extra_specs',
+                                      flavor_extra_specs_json,
+                                      expect_errors=True)
+
+        # dict_body = json.loads(response.body)
+        # my_json = json.loads(dict_body['faultstring'])
+
+        # self.assertEqual(response.status_code, 404)
+        # self.assertEqual(my_json['message'], 'not found')
+
+    @patch.object(es, 'di')
+    def test_update_os_flavor_specs_success(self, mock_di):
+        mock_di.resolver.unpack.return_value = \
+            get_utils_flavor_logic_mock(flavor_extra_specs_json)
+        response = self.app.put_json('/v1/orm/flavors/123/os_extra_specs',
+                                     flavor_extra_specs_json)
+        self.assertEqual(response.json, flavor_extra_specs_json)
+        self.assertEqual(response.status_code, 200)
+
+    # def test_update_os_extra_specs_bad_json(self):
+    #     global flavor_extra_specs_json
+    #     backup = dict(flavor_extra_specs_json)
+    #     del (flavor_extra_specs_json["os_extra_specs"])
+    #     response = self.app.put_json('/v1/orm/flavors/123/os_extra_specs',
+    #                                  flavor_extra_specs_json,
+    #                                  expect_errors=True)
+    #     flavor_extra_specs_json = backup
+    #     self.assertEqual(response.status_code, 400)
+
+    @patch.object(es, 'di')
+    def test_update_os_flavor_specs_audit_trial_fails(self, mock_di):
+        flavor_mock, utils_mock = \
+            get_utils_flavor_logic_mock(flavor_extra_specs_json)
+        utils_mock.audit_trail.side_effect = SystemError()
+        mock_di.resolver.unpack.return_value = flavor_mock, utils_mock
+        response = self.app.put_json('/v1/orm/flavors/123/os_extra_specs',
+                                     flavor_extra_specs_json,
+                                     expect_errors=True)
+        self.assertEqual(response.status_code, 500)
+
+    @patch.object(es, 'di')
+    def test_update_os_flavor_specs_flavor_not_found(self, mock_di):
+        flavor_mock, utils_mock = \
+            get_utils_flavor_logic_mock(flavor_extra_specs_json)
+        flavor_mock.update_extra_specs.side_effect = NotFoundError(404,
+                                                                   "not found")
+        mock_di.resolver.unpack.return_value = flavor_mock, utils_mock
+        response = self.app.put_json('/v1/orm/flavors/123/os_extra_specs',
+                                     flavor_extra_specs_json,
+                                     expect_errors=True)
+
+        # dict_body = json.loads(response.body)
+        # my_json = json.loads(dict_body['faultstring'])
+
+        # self.assertEqual(response.status_code, 404)
+        # self.assertEqual(my_json['message'], 'not found')
+
+    @patch.object(es, 'di')
+    def test_get_os_flavor_specs_flavor_not_found(self, mock_di):
+        flavor_mock, utils_mock = \
+            get_utils_flavor_logic_mock(flavor_extra_specs_json)
+        flavor_mock.get_extra_specs_uuid.side_effect = NotFoundError(404,
+                                                                     "not found")
+        mock_di.resolver.unpack.return_value = flavor_mock, utils_mock
+        response = self.app.get('/v1/orm/flavors/123/os_extra_specs',
+                                expect_errors=True)
+
+        # dict_body = json.loads(response.body)
+        # my_json = json.loads(dict_body['faultstring'])
+
+        # self.assertEqual(response.status_code, 404)
+        # self.assertEqual(my_json['message'], 'not found')
+
+    @patch.object(es, 'di')
+    def test_get_os_flavor_specs_success(self, mock_di):
+        mock_di.resolver.unpack.return_value = \
+            get_utils_flavor_logic_mock(flavor_extra_specs_json)
+        response = self.app.get('/v1/orm/flavors/123/os_extra_specs')
+        self.assertEqual(response.json, flavor_extra_specs_json)
+        self.assertEqual(response.status_code, 200)
+
+    @patch.object(es, 'di')
+    def test_get_os_flavor_specs_audit_trial_fails(self, mock_di):
+        flavor_mock, utils_mock = \
+            get_utils_flavor_logic_mock(flavor_extra_specs_json)
+        utils_mock.audit_trail.side_effect = SystemError()
+        mock_di.resolver.unpack.return_value = flavor_mock, utils_mock
+        response = self.app.get('/v1/orm/flavors/123/os_extra_specs',
+                                expect_errors=True)
+        self.assertEqual(response.status_code, 500)
+
+    @patch.object(es, 'di')
+    def test_delete_os_flavor_specs_success(self, mock_di):
+        mock_di.resolver.unpack.return_value = \
+            get_utils_flavor_logic_mock(flavor_extra_specs_json)
+        response = self.app.delete('/v1/orm/flavors/123/os_extra_specs')
+        self.assertEqual(response.status_code, 204)
+
+    @patch.object(es, 'di')
+    def test_delete_os_flavor_specs_audit_trial_fails(self, mock_di):
+        flavor_mock, utils_mock = \
+            get_utils_flavor_logic_mock(flavor_extra_specs_json)
+        utils_mock.audit_trail.side_effect = SystemError()
+        mock_di.resolver.unpack.return_value = flavor_mock, utils_mock
+        response = self.app.delete('/v1/orm/flavors/123/os_extra_specs',
+                                   flavor_extra_specs_json,
+                                   expect_errors=True)
+        self.assertEqual(response.status_code, 500)
+
+    @patch.object(es, 'di')
+    def test_delete_os_flavor_specs_flavor_not_found(self, mock_di):
+        flavor_mock, utils_mock = \
+            get_utils_flavor_logic_mock(flavor_extra_specs_json)
+        flavor_mock.delete_extra_specs.side_effect = NotFoundError(404,
+                                                                   "not found")
+        mock_di.resolver.unpack.return_value = flavor_mock, utils_mock
+        response = self.app.delete('/v1/orm/flavors/123/os_extra_specs',
+                                   expect_errors=True)
+
+        # dict_body = json.loads(response.body)
+        # my_json = json.loads(dict_body['faultstring'])
+
+        # self.assertEqual(response.status_code, 404)
+        # self.assertEqual(my_json['message'], 'not found')
+
+
+def get_utils_flavor_logic_mock(input_json=None):
+    es = models.ExtraSpecsWrapper(input_json["os_extra_specs"])
+    utils_mock = MagicMock()
+    flavor_logic_mock = MagicMock()
+    flavor_logic_mock.add_extra_specs.return_value = es
+    flavor_logic_mock.update_extra_specs.return_value = es
+    flavor_logic_mock.get_extra_specs_uuid.return_value = es
+    utils_mock.audit_trail.return_value = None
+    return flavor_logic_mock, utils_mock
+
+
+flavor_extra_specs_json = {
+    "os_extra_specs": {
+        "name357": "region_name1",
+        "name4467": "2",
+        "name66767": "222234556"
+    }
+}
diff --git a/orm/services/flavor_manager/fms_rest/tests/rest/test_regions.py b/orm/services/flavor_manager/fms_rest/tests/rest/test_regions.py
new file mode 100755
index 00000000..bb968684
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/tests/rest/test_regions.py
@@ -0,0 +1,150 @@
+import requests
+from fms_rest.tests import FunctionalTest
+from orm_common.injector import injector
+from mock import MagicMock
+from mock import patch
+
+from fms_rest.controllers.v1.orm.flavors import regions
+from fms_rest.data.wsme import models
+from fms_rest.logic.error_base import ErrorStatus
+from fms_rest.tests import test_utils
+
+utils_mock = None
+region_logic_mock = None
+
+return_error = 0
+
+
+class TestRegionController(FunctionalTest):
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+        injector.override_injected_dependency(('flavor_logic', get_region_logic_mock()))
+        injector.override_injected_dependency(('utils', get_utils_mock()))
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_add_regions(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(200, "added"))
+
+        global return_error
+        return_error = 0
+
+        # when
+        response = self.app.post_json('/v1/orm/flavors/flavor_id/regions', REGION_JSON)
+
+        # assert
+        assert utils_mock.audit_trail.called
+        assert region_logic_mock.add_regions.called
+
+    def test_add_regions_fail(self):
+        # given
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('flavor_logic', get_region_logic_mock()))
+        requests.post = MagicMock()
+
+        # when
+        response = self.app.post_json('/v1/orm/flavors/{flavor_id}/regions/', REGION_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    @patch.object(regions, 'err_utils')
+    def test_add_regions_bad_request(self, mock_err_utils):
+        # given
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(('flavor_logic', get_region_logic_mock()))
+        requests.post = MagicMock()
+        mock_err_utils.get_error = test_utils.get_error
+
+        # when
+        response = self.app.post_json('/v1/orm/flavors/{flavor_id}/regions/', REGION_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 404)
+
+    def test_delete_region(self):
+        # given
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(('flavor_logic', get_region_logic_mock()))
+        requests.delete = MagicMock(return_value=ResponseMock(204))
+
+        # when
+        self.app.delete('/v1/orm/flavors/flavor_id/regions/region_id')
+
+        # assert
+        assert utils_mock.audit_trail.called
+        assert region_logic_mock.delete_region.called
+
+    def test_delete_region_fail(self):
+        # given
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('flavor_logic', get_region_logic_mock()))
+        requests.delete = MagicMock()
+
+        # when
+        response = self.app.delete('/v1/orm/flavors/flavor_id/regions/{region_id}', expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_delete_region_bad_request(self):
+        # given
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(('flavor_logic', get_region_logic_mock()))
+        requests.delete = MagicMock()
+
+        # when
+        response = self.app.delete('/v1/orm/flavors/flavor_id/regions/{region_id}', expect_errors=True)
+
+        # assert
+        # self.assertEqual(response.status_int, 404)
+
+
+class ResponseMock:
+    def __init__(self, status_code=200, message=""):
+        self.status_code = status_code
+        self.message = message
+
+
+def get_region_logic_mock():
+    global region_logic_mock
+    region_logic_mock = MagicMock()
+
+    if return_error == 0:
+        region_logic_mock.add_regions.return_value = RET_REGION_JSON
+    elif return_error == 1:
+        region_logic_mock.add_regions.side_effect = SystemError()
+        region_logic_mock.delete_region.side_effect = SystemError()
+    else:
+        region_logic_mock.add_regions.side_effect = ErrorStatus(status_code=404)
+        region_logic_mock.delete_region.side_effect = ErrorStatus(status_code=404)
+
+    return region_logic_mock
+
+
+def get_utils_mock():
+    global utils_mock
+    utils_mock = MagicMock()
+
+    utils_mock.make_transid.return_value = 'some_trans_id'
+    utils_mock.audit_trail.return_value = None
+    utils_mock.make_uuid.return_value = 'some_uuid'
+
+    return utils_mock
+
+
+REGION_JSON = {
+    "regions": [
+        {"name": "76", "type": "single"}
+    ]
+}
+
+RET_REGION_JSON = models.RegionWrapper([models.Region(name='76', status='done')])
diff --git a/orm/services/flavor_manager/fms_rest/tests/rest/test_tags.py b/orm/services/flavor_manager/fms_rest/tests/rest/test_tags.py
new file mode 100644
index 00000000..568031bd
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/tests/rest/test_tags.py
@@ -0,0 +1,354 @@
+import requests
+from fms_rest.tests import FunctionalTest
+from orm_common.injector import injector
+from mock import MagicMock
+from mock import patch
+import sqlalchemy
+
+from fms_rest.data.wsme import models
+from fms_rest.logic.error_base import ErrorStatus
+from fms_rest.controllers.v1.orm.flavors import flavors
+
+utils_mock = None
+flavor_logic_mock = None
+
+return_error = 0
+
+
+class TestTagsController(FunctionalTest):
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+        injector.override_injected_dependency(('utils', get_utils_mock()))
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_create_tags_success(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(201, "created"))
+
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+
+        # when
+        response = self.app.post_json('/v1/orm/flavors/test/tags', FLAVOR_JSON)
+
+        # assert
+        self.assertEqual(response.status_int, 201)
+
+    def test_create_tags_exception_raised(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(201, "created"))
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+
+        # when
+        response = self.app.post_json('/v1/orm/flavors/test/tags', FLAVOR_JSON,
+                                      expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+        # assert utils_mock.audit_trail.called
+
+    def test_create_tags_errorstatus_raised(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(201, "created"))
+
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+
+        # when
+        response = self.app.post_json('/v1/orm/flavors/test/tags', FLAVOR_JSON,
+                                      expect_errors=True)
+
+        # assert
+        # self.assertEqual(response.status_int, 404)
+        # assert utils_mock.audit_trail.called
+
+    def test_update_tags_success(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(201, "created"))
+
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+
+        # when
+        response = self.app.put_json('/v1/orm/flavors/test/tags', FLAVOR_JSON)
+
+        # assert
+        self.assertEqual(response.status_int, 200)
+        # assert utils_mock.audit_trail.called
+
+    def test_update_tags_exception_raised(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(201, "created"))
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+
+        # when
+        response = self.app.put_json('/v1/orm/flavors/test/tags', FLAVOR_JSON,
+                                     expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+        # assert utils_mock.audit_trail.called
+
+    def test_update_tags_errorstatus_raised(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(201, "created"))
+
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+
+        # when
+        response = self.app.put_json('/v1/orm/flavors/test/tags', FLAVOR_JSON,
+                                     expect_errors=True)
+
+        # assert
+        # self.assertEqual(response.status_int, 404)
+        # assert utils_mock.audit_trail.called
+
+    def test_delete_tags_success(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(201, "created"))
+
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+
+        # when
+        response = self.app.delete('/v1/orm/flavors/test/tags')
+
+        # assert
+        self.assertEqual(response.status_int, 204)
+        # assert utils_mock.audit_trail.called
+
+    def test_delete_tags_exception_raised(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(201, "created"))
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+
+        # when
+        response = self.app.delete('/v1/orm/flavors/test/tags',
+                                   expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+        # assert utils_mock.audit_trail.called
+
+    def test_delete_tags_error_raised(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(201, "created"))
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+
+        # when
+        response = self.app.delete('/v1/orm/flavors/test/tags',
+                                   expect_errors=True)
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_get_tags_success(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(201, "created"))
+
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+
+        # when
+        response = self.app.get('/v1/orm/flavors/test/tags')
+
+        # assert
+        # assert response.status_int == 200
+
+    def test_get_tags_exception_raised(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(201, "created"))
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+
+        # when
+        response = self.app.get('/v1/orm/flavors/test/tags',
+                                expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+        # assert utils_mock.audit_trail.called
+
+    def test_get_tags_errorstatus_raised(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(201, "created"))
+
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(
+            ('flavor_logic', get_flavor_logic_mock()))
+
+        # when
+        response = self.app.get('/v1/orm/flavors/test/tags',
+                                expect_errors=True)
+
+        # assert
+        # self.assertEqual(response.status_int, 404)
+
+
+class ResponseMock:
+    def __init__(self, status_code=200, message=""):
+        self.status_code = status_code
+        self.message = message
+
+
+def get_flavor_logic_mock():
+    global flavor_logic_mock
+    flavor_logic_mock = MagicMock()
+
+    if return_error == 0:
+        flavor_logic_mock.get_tags.return_value = FLAVOR_JSON['tags']
+        flavor_logic_mock.add_tags.return_value = RET_FLAVOR_JSON
+        flavor_logic_mock.delete_tags.return_value = RET_FLAVOR_JSON
+        flavor_logic_mock.update_tags.return_value = RET_FLAVOR_JSON
+        flavor_logic_mock.update_flavor.return_value = RET_FLAVOR_JSON
+        flavor_logic_mock.create_flavor.return_value = RET_FLAVOR_JSON
+        flavor_logic_mock.get_flavor_by_uuid.return_value = RET_FLAVOR_JSON
+        flavor_logic_mock.get_flavor_by_uuid_or_name.return_value = \
+            RET_FLAVOR_JSON
+        flavor_logic_mock.get_flavor_list_by_params.return_value = FILTER_RET
+    elif return_error == 1:
+        flavor_logic_mock.get_tags.side_effect = SystemError()
+        flavor_logic_mock.add_tags.side_effect = SystemError()
+        flavor_logic_mock.delete_tags.side_effect = SystemError()
+        flavor_logic_mock.update_tags.side_effect = SystemError()
+        flavor_logic_mock.update_flavor.side_effect = SystemError()
+        flavor_logic_mock.create_flavor.side_effect = SystemError()
+        flavor_logic_mock.get_flavor_by_uuid.side_effect = SystemError()
+        flavor_logic_mock.get_flavor_by_uuid_or_name.side_effect = \
+            SystemError()
+        flavor_logic_mock.get_flavor_list_by_params.side_effect = SystemError()
+        flavor_logic_mock.delete_flavor_by_uuid.side_effect = SystemError()
+    else:
+        flavor_logic_mock.get_tags.side_effect = ErrorStatus(
+            status_code=404)
+        flavor_logic_mock.add_tags.side_effect = ErrorStatus(
+            status_code=404)
+        flavor_logic_mock.delete_tags.side_effect = ErrorStatus(
+            status_code=404)
+        flavor_logic_mock.update_tags.side_effect = ErrorStatus(
+            status_code=404)
+        flavor_logic_mock.update_flavor.side_effect = ErrorStatus(
+            status_code=404)
+        flavor_logic_mock.create_flavor.side_effect = ErrorStatus(
+            status_code=404)
+        flavor_logic_mock.get_flavor_by_uuid.side_effect = ErrorStatus(
+            status_code=404)
+        flavor_logic_mock.get_flavor_list_by_params.side_effect = ErrorStatus(
+            status_code=404)
+        flavor_logic_mock.delete_flavor_by_uuid.side_effect = ErrorStatus(
+            status_code=404)
+        flavor_logic_mock.get_flavor_by_uuid_or_name.side_effect = ErrorStatus(
+            status_code=404)
+
+    return flavor_logic_mock
+
+
+def get_utils_mock():
+    global utils_mock
+    utils_mock = MagicMock()
+
+    utils_mock.make_transid.return_value = 'some_trans_id'
+    utils_mock.audit_trail.return_value = None
+    utils_mock.make_uuid.return_value = 'some_uuid'
+
+    if return_error:
+        utils_mock.create_existing_uuid.side_effect = TypeError('test')
+    else:
+        utils_mock.create_existing_uuid.return_value = 'some_uuid'
+
+    return utils_mock
+
+
+FLAVOR_JSON = {
+    "tags": {
+        "A": "B"
+    }
+}
+
+RET_FLAVOR_JSON = models.TagsWrapper(
+    FLAVOR_JSON["tags"]
+)
+
+FILTER_RET = [
+    {
+        "status": "Error",
+        "description": "A standard 2GB Ram 2 vCPUs 50GB Disk, Flavor",
+        "series": "ss",
+        "extra-specs": {
+            "aggregate_instance_extra_specs:ss": "true",
+            "spec2": "valuespec2",
+            "spec3": "valuespec3",
+            "spec1": "valuespec1"
+        },
+        "ram": "1024",
+        "ephemeral": "1",
+        "visibility": "private",
+        "options": {
+            "option2": "valueoption2",
+            "option3": "valueoption3",
+            "bundle": "test",
+            "option1": "valueoption1"
+        },
+        "regions": [
+            {
+                "status": "Error",
+                "type": "single",
+                "name": "lcp_1"
+            }
+        ],
+        "vcpus": "20",
+        "tag": {
+            "tags1": "valuetags1",
+            "tags2": "valuetags2",
+            "tags3": "valuetags3"
+        },
+        "swap": "1",
+        "disk": "2048",
+        "tenants": [
+            "070be05e-26e2-4519-a46d-224cbf8558f4",
+            "4f7b9561-af8b-4cc0-87e2-319270dad49e"
+        ],
+        "id": "e2b86034eeec4b7abd01b9e0287a13ff",
+        "name": "ss.c20r1d2048s1e1.bundleoption1option2option3"
+    }]
+
+FILTER_RET = models.FlavorListFullResponse()
+FILTER_RET.flavors.append(
+    models.Flavor(name='1', id='1', description='1'))
diff --git a/orm/services/flavor_manager/fms_rest/tests/rest/test_tenants.py b/orm/services/flavor_manager/fms_rest/tests/rest/test_tenants.py
new file mode 100755
index 00000000..1b3ec133
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/tests/rest/test_tenants.py
@@ -0,0 +1,145 @@
+import requests
+from fms_rest.tests import FunctionalTest
+from orm_common.injector import injector
+from mock import MagicMock
+
+from fms_rest.data.wsme import models
+from fms_rest.logic.error_base import ErrorStatus
+
+utils_mock = None
+tenant_logic_mock = None
+
+return_error = 0
+
+
+class TestTenantController(FunctionalTest):
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+        injector.override_injected_dependency(('flavor_logic', get_tenant_logic_mock()))
+        injector.override_injected_dependency(('utils', get_utils_mock()))
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_add_tenants(self):
+        # given
+        requests.post = MagicMock(return_value=ResponseMock(200, "added"))
+
+        global return_error
+        return_error = 0
+
+        # when
+        response = self.app.post_json('/v1/orm/flavors/flavor_id/tenants', TENANT_JSON)
+
+        # assert
+        assert utils_mock.audit_trail.called
+        assert tenant_logic_mock.add_tenants.called
+
+    def test_add_tenants_fail(self):
+        # given
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('flavor_logic', get_tenant_logic_mock()))
+        requests.post = MagicMock()
+
+        # when
+        response = self.app.post_json('/v1/orm/flavors/{flavor_id}/tenants/', TENANT_JSON, expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_add_tenants_bad_request(self):
+        # given
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(('flavor_logic', get_tenant_logic_mock()))
+        requests.post = MagicMock()
+
+        # when
+        response = self.app.post_json('/v1/orm/flavors/{flavor_id}/tenants/', TENANT_JSON, expect_errors=True)
+
+        # assert
+        # self.assertEqual(response.status_int, 404)
+
+    def test_delete_tenant(self):
+        # given
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(('flavor_logic', get_tenant_logic_mock()))
+        requests.delete = MagicMock(return_value=ResponseMock(204))
+
+        # when
+        self.app.delete('/v1/orm/flavors/flavor_id/tenants/tenant_id')
+
+        # assert
+        assert utils_mock.audit_trail.called
+        assert tenant_logic_mock.delete_tenant.called
+
+    def test_delete_tenant_fail(self):
+        # given
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('flavor_logic', get_tenant_logic_mock()))
+        requests.delete = MagicMock()
+
+        # when
+        response = self.app.delete('/v1/orm/flavors/flavor_id/tenants/{tenant_id}', expect_errors=True)
+
+        # assert
+        self.assertEqual(response.status_int, 500)
+
+    def test_delete_tenant_bad_request(self):
+        # given
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(('flavor_logic', get_tenant_logic_mock()))
+        requests.delete = MagicMock()
+
+        # when
+        response = self.app.delete('/v1/orm/flavors/flavor_id/tenants/{tenant_id}', expect_errors=True)
+
+        # assert
+        # self.assertEqual(response.status_int, 404)
+
+
+class ResponseMock:
+    def __init__(self, status_code=200, message=""):
+        self.status_code = status_code
+        self.message = message
+
+
+def get_tenant_logic_mock():
+    global tenant_logic_mock
+    tenant_logic_mock = MagicMock()
+
+    if return_error == 0:
+        tenant_logic_mock.add_tenants.return_value = RET_TENANT_JSON
+    elif return_error == 1:
+        tenant_logic_mock.add_tenants.side_effect = SystemError()
+        tenant_logic_mock.delete_tenant.side_effect = SystemError()
+    else:
+        tenant_logic_mock.add_tenants.side_effect = ErrorStatus(status_code=404)
+        tenant_logic_mock.delete_tenant.side_effect = ErrorStatus(status_code=404)
+
+    return tenant_logic_mock
+
+
+def get_utils_mock():
+    global utils_mock
+    utils_mock = MagicMock()
+
+    utils_mock.make_transid.return_value = 'some_trans_id'
+    utils_mock.audit_trail.return_value = None
+    utils_mock.make_uuid.return_value = 'some_uuid'
+
+    return utils_mock
+
+
+TENANT_JSON = {
+    "tenants": [
+        "tenant1"
+    ]
+}
+
+RET_TENANT_JSON = models.TenantWrapper(tenants=["tenant1", "tenant2"])
diff --git a/orm/services/flavor_manager/fms_rest/tests/simple_hook_mock.py b/orm/services/flavor_manager/fms_rest/tests/simple_hook_mock.py
new file mode 100755
index 00000000..73b98ed1
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/tests/simple_hook_mock.py
@@ -0,0 +1,6 @@
+from pecan.hooks import PecanHook
+
+
+class SimpleHookMock(PecanHook):
+    def before(self, state):
+        setattr(state.request, 'transaction_id', 'some_id')
diff --git a/orm/services/flavor_manager/fms_rest/tests/test_authentication.py b/orm/services/flavor_manager/fms_rest/tests/test_authentication.py
new file mode 100755
index 00000000..e6deb140
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/tests/test_authentication.py
@@ -0,0 +1,53 @@
+import mock
+from fms_rest.tests import FunctionalTest
+from pecan import conf
+
+from fms_rest.utils import authentication
+
+
+class TestUtil(FunctionalTest):
+
+    def setUp(self):
+        FunctionalTest.setUp(self)
+        self.mock_response = mock.Mock()
+
+    @mock.patch('keystone_utils.tokens.TokenConf')
+    def test_get_token_conf(self, mock_TokenConf):
+        mock_TokenConf.return_value = 123
+        token_conf = authentication.get_token_conf(conf)
+        self.assertEqual(token_conf, 123)
+
+    @mock.patch('keystone_utils.tokens.is_token_valid')
+    @mock.patch('keystone_utils.tokens.TokenConf')
+    def test_check_permissions_token_valid(self, mock_get_token_conf, mock_is_token_valid):
+        setattr(conf.authentication, 'enabled', True)
+        mock_get_token_conf.return_value = 123
+        mock_is_token_valid.return_value = True
+        is_permitted = authentication.check_permissions(conf, 'asher', 0)
+        self.assertEqual(is_permitted, True)
+
+    @mock.patch('keystone_utils.tokens.is_token_valid')
+    @mock.patch('keystone_utils.tokens.TokenConf')
+    def test_check_permissions_token_invalid(self, mock_get_token_conf, mock_is_token_valid):
+        setattr(conf.authentication, 'enabled', True)
+        mock_get_token_conf.return_value = 123
+        mock_is_token_valid.return_value = False
+        is_permitted = authentication.check_permissions(conf, 'asher', 0)
+        self.assertEqual(is_permitted, False)
+
+    @mock.patch('keystone_utils.tokens.is_token_valid')
+    @mock.patch('keystone_utils.tokens.TokenConf')
+    def test_check_permissions_disabled(self, mock_get_token_conf, mock_is_token_valid):
+        setattr(conf.authentication, 'enabled', False)
+        mock_get_token_conf.return_value = 123
+        mock_is_token_valid.return_value = False
+        is_permitted = authentication.check_permissions(conf, 'asher', 0)
+        self.assertEqual(is_permitted, True)
+
+    @mock.patch('keystone_utils.tokens.is_token_valid')
+    @mock.patch('keystone_utils.tokens.TokenConf')
+    def test_check_permissions_is_token_valid_breaks(self, mock_get_token_conf, mock_is_token_valid):
+        setattr(conf.authentication, 'enabled', True)
+        mock_is_token_valid.side_effect = Exception('boom')
+        is_permitted = authentication.check_permissions(conf, 'asher', 0)
+        self.assertEqual(is_permitted, False)
diff --git a/orm/services/flavor_manager/fms_rest/tests/test_configuration.py b/orm/services/flavor_manager/fms_rest/tests/test_configuration.py
new file mode 100755
index 00000000..c5d03376
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/tests/test_configuration.py
@@ -0,0 +1,15 @@
+"""Get configuration module unittests."""
+from fms_rest.controllers.v1.orm import configuration
+from fms_rest.tests import FunctionalTest
+from mock import patch
+
+
+class TestGetConfiguration(FunctionalTest):
+    """Main get configuration test case."""
+
+    @patch('orm_common.utils.utils.report_config')
+    def test_get_configuration_success(self, mock_report):
+        """Test get_configuration returns the expected value on success."""
+        mock_report.return_value = '12345'
+        response = self.app.get('/v1/orm/configuration')
+        self.assertEqual(response.json, '12345')
diff --git a/orm/services/flavor_manager/fms_rest/tests/test_models.py b/orm/services/flavor_manager/fms_rest/tests/test_models.py
new file mode 100755
index 00000000..21cda170
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/tests/test_models.py
@@ -0,0 +1,41 @@
+import mock
+from fms_rest.tests import FunctionalTest
+
+from fms_rest.data.wsme import models
+
+GROUP_REGIONS = [
+    "DPK",
+    "SNA1",
+    "SNA2"
+]
+
+
+class TestModels(FunctionalTest):
+
+    def setUp(self):
+        FunctionalTest.setUp(self)
+        models.get_regions_of_group = mock.MagicMock(return_value=GROUP_REGIONS)
+        models.set_utils_conf = mock.MagicMock()
+
+    def test_handle_group_success(self):
+        flavor = get_flavor_model()
+        flavor.handle_region_groups()
+
+        self.assertEqual(len(flavor.regions), 3)
+
+    def test_handle_group_not_found(self):
+        models.get_regions_of_group = mock.MagicMock(return_value=None)
+        flavor = get_flavor_model()
+
+        self.assertRaises(ValueError, flavor.handle_region_groups,)
+
+
+def get_flavor_model():
+    """
+    this function create a customer model object for testing
+    :return: new customer object
+    """
+
+    flavor = models.Flavor(id='1', regions=[models.Region(name='r1', type='group')])
+
+    return flavor
diff --git a/orm/services/flavor_manager/fms_rest/tests/test_rds_proxy.py b/orm/services/flavor_manager/fms_rest/tests/test_rds_proxy.py
new file mode 100755
index 00000000..53708c64
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/tests/test_rds_proxy.py
@@ -0,0 +1,45 @@
+import mock
+from fms_rest.tests import FunctionalTest
+from fms_rest import proxies
+from fms_rest.data.sql_alchemy import db_models
+from fms_rest.logic.error_base import ErrorStatus
+from testfixtures import log_capture, compare
+
+
+class Response:
+    def __init__(self, status_code, content):
+        self.status_code = status_code
+        self.content = content
+
+    def json(self):
+        return self.content
+
+
+class TestUtil(FunctionalTest):
+
+    @mock.patch.object(proxies.rds_proxy, 'request')
+    @mock.patch('requests.post')
+    @log_capture('fms_rest.proxies.rds_proxy')
+    def test_send_good(self, mock_post, mock_request, l):
+        resp = Response(200, 'my content')
+        mock_post.return_value = resp
+        send_res = proxies.rds_proxy.send_flavor(db_models.Flavor().todict(), "1234", "post")
+        # self.assertRegexpMatches(l.records[-2].getMessage(), 'Wrapper JSON before sending action')
+        # self.assertRegexpMatches(l.records[-1].getMessage(), 'return from rds server status code')
+
+    @mock.patch('requests.post')
+    @log_capture('fms_rest.proxies.rds_proxy')
+    def test_bad_status(self, mock_post, l):
+        resp = Response(400, 'my content')
+        mock_post.return_value = resp
+        # self.assertRegexpMatches(l.records[-2].getMessage(), 'Wrapper JSON before sending action')
+        # self.assertRegexpMatches(l.records[-1].getMessage(), 'return from rds server status code')
+
+    @mock.patch('requests.post')
+    @log_capture('fms_rest.proxies.rds_proxy')
+    def test_no_content(self, mock_post, l):
+        resp = Response(200, None)
+        mock_post.return_value = resp
+        # self.assertRaises(ErrorStatus, proxies.rds_proxy.send_flavor, db_models.Flavor(), "1234")
+        for r in l.records:
+            self.assertNotRegexpMatches(r.getMessage(), 'return from rds server status code')
diff --git a/orm/services/flavor_manager/fms_rest/tests/test_utils.py b/orm/services/flavor_manager/fms_rest/tests/test_utils.py
new file mode 100755
index 00000000..a56e0953
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/tests/test_utils.py
@@ -0,0 +1,14 @@
+import json
+from wsme.exc import ClientSideError
+
+
+def get_error(transaction_id, status_code, error_details=None,
+              message=None):
+    return ClientSideError(json.dumps({
+        'code': status_code,
+        'type': 'test',
+        'created': '0.0',
+        'transaction_id': transaction_id,
+        'message': message if message else error_details,
+        'details': 'test'
+    }), status_code=status_code)
diff --git a/orm/services/flavor_manager/fms_rest/utils/__init__.py b/orm/services/flavor_manager/fms_rest/utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/flavor_manager/fms_rest/utils/authentication.py b/orm/services/flavor_manager/fms_rest/utils/authentication.py
new file mode 100644
index 00000000..99cb1c4b
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/utils/authentication.py
@@ -0,0 +1,55 @@
+import logging
+
+from keystone_utils import tokens
+from orm_common.policy import policy
+from orm_common.utils import api_error_utils as err_utils
+
+from pecan import conf
+logger = logging.getLogger(__name__)
+
+
+def authorize(request, action):
+    if not _is_authorization_enabled(conf):
+        return
+
+    auth_region = request.headers.get('X-Auth-Region')
+    policy.authorize(action, request, conf)
+
+
+def _is_authorization_enabled(app_conf):
+    return app_conf.authentication.enabled
+
+
+def get_token_conf(app_conf):
+    mech_id = app_conf.authentication.mech_id
+    mech_password = app_conf.authentication.mech_pass
+    rms_url = app_conf.authentication.rms_url
+    tenant_name = app_conf.authentication.tenant_name
+    keystone_version = app_conf.authentication.keystone_version
+    conf = tokens.TokenConf(mech_id, mech_password, rms_url, tenant_name,
+                            keystone_version)
+    return conf
+
+
+def check_permissions(app_conf, token_to_validate, lcp_id):
+    logger.debug("Check permissions...start")
+    try:
+        if _is_authorization_enabled(app_conf):
+            if token_to_validate is not None and lcp_id is not None and str(token_to_validate).strip() != '' and str(lcp_id).strip() != '':
+                token_conf = get_token_conf(app_conf)
+                logger.debug("Authorization: validating token=[{}] on lcp_id=[{}]".format(token_to_validate, lcp_id))
+                is_permitted = tokens.is_token_valid(token_to_validate, lcp_id, token_conf)
+                logger.debug("Authorization: The token=[{}] on lcp_id=[{}] is [{}]"
+                             .format(token_to_validate, lcp_id, "valid" if is_permitted else "invalid"))
+            else:
+                raise Exception("Token=[{}] and/or Region=[{}] are empty/none.".format(token_to_validate, lcp_id))
+        else:
+            logger.debug("The authentication service is disabled. No authentication is needed.")
+            is_permitted = True
+    except Exception as e:
+        msg = "Fail to validate request. due to {}.".format(e.message)
+        logger.error(msg)
+        logger.exception(e)
+        is_permitted = False
+    logger.debug("Check permissions...end")
+    return is_permitted
diff --git a/orm/services/flavor_manager/fms_rest/utils/utils.py b/orm/services/flavor_manager/fms_rest/utils/utils.py
new file mode 100755
index 00000000..3a02d50b
--- /dev/null
+++ b/orm/services/flavor_manager/fms_rest/utils/utils.py
@@ -0,0 +1,130 @@
+from pecan import conf
+import time
+from orm_common.injector import injector
+
+from fms_rest.logger import get_logger
+
+logger = get_logger(__name__)
+
+di = injector.get_di()
+
+
+@di.dependsOn('requests')
+def make_uuid():
+    """ function to request new uuid from uuid_generator rest service
+        returns uuid string
+    """
+
+    requests = di.resolver.unpack(make_uuid)
+    url = conf.api.uuid_server.base + conf.api.uuid_server.uuids
+
+    try:
+        resp = requests.post(url, verify=conf.verify)
+    except requests.exceptions.ConnectionError as exp:
+        nagios = 'CON{}UUIDGEN001'.format(conf.server.name.upper())
+        logger.critical(
+            'CRITICAL|{}|Failed in make_uuid: connection error: {}'.format(
+                nagios, str(exp)))
+        exp.message = 'connection error: Failed to get uuid: unable to connect to server'
+        raise
+    except Exception as e:
+        logger.info('Failed in make_uuid:' + str(e))
+        raise Exception('Failed in make_uuid:' + str(e))
+
+    resp = resp.json()
+    return resp['uuid']
+
+
+@di.dependsOn('requests')
+def create_existing_uuid(uuid):
+    """ function to request new uuid from uuid_generator rest service
+        returns uuid string
+    """
+
+    requests = di.resolver.unpack(make_uuid)
+    url = conf.api.uuid_server.base + conf.api.uuid_server.uuids
+
+    try:
+        logger.debug('Creating UUID: {}, using URL: {}'.format(uuid, url))
+        resp = requests.post(url, data={'uuid': uuid}, verify=conf.verify)
+    except requests.exceptions.ConnectionError as exp:
+        nagios = 'CON{}UUIDGEN001'.format(conf.server.name.upper())
+        logger.critical(
+            'CRITICAL|{}|Failed in create_existing_uuid: connection error: {}'.format(
+                nagios, str(exp)))
+        exp.message = 'connection error: Failed to get uuid: unable to connect to server'
+        raise
+    except Exception as e:
+        logger.info('Failed in make_uuid:' + str(e))
+        return None
+
+    if resp.status_code == 400:
+        raise TypeError('duplicate key for uuid')
+    resp = resp.json()
+    return resp['uuid']
+
+
+@di.dependsOn('requests')
+def make_transid():
+    """ function to request new uuid of transaction type from uuid_generator rest service
+        returns uuid string
+    """
+    url = conf.api.uuid_server.base + conf.api.uuid_server.uuids
+    requests = di.resolver.unpack(make_uuid)
+
+    try:
+        resp = requests.post(url, data={'uuid_type': 'transaction'},
+                             verify=conf.verify)
+    except requests.exceptions.ConnectionError as exp:
+        nagios = 'CON{}UUIDGEN001'.format(conf.server.name.upper())
+        logger.critical(
+            'CRITICAL|{}|Failed in make_transid: connection error: {}'.format(
+                nagios, str(exp)))
+        exp.message = 'connection error: Failed to get uuid: unable to connect to server'
+        raise
+    except Exception as e:
+        logger.info('Failed in make_transid:' + str(e))
+        raise Exception('Failed in make_transid:' + str(e))
+
+    resp = resp.json()
+    if 'uuid' in resp:
+        return resp['uuid']
+    else:
+        return None
+
+audit_setup = False
+
+
+@di.dependsOn('audit_client')
+def audit_trail(cmd, transaction_id, headers, resource_id, event_details=''):
+    """ function to send item to audit trail rest api
+        returns 200 for ok and None for error
+    """
+    audit = di.resolver.unpack(audit_trail)
+
+    global audit_setup, audit_server_url
+    if not audit_setup:
+        audit_server_url = '%s%s' % (conf.api.audit_server.base, conf.api.audit_server.trans)
+        num_of_send_retries = 3
+        time_wait_between_retries = 1
+        audit.init(audit_server_url, num_of_send_retries,
+                   time_wait_between_retries, conf.server.name.upper())
+        audit_setup = True
+
+    try:
+        timestamp = long(round(time.time() * 1000))
+        application_id = headers['X-RANGER-Client'] if 'X-RANGER-Client' in headers else 'NA'
+        tracking_id = headers['X-RANGER-Tracking-Id'] if 'X-RANGER-Tracking-Id' in headers else transaction_id
+        # transaction_id is function argument
+        transaction_type = cmd
+        # resource_id is function argument
+        service_name = conf.server.name.upper()
+        user_id = headers['X-RANGER-Requester'] if 'X-RANGER-Requester' in headers else ''
+        external_id = 'NA'
+        audit.audit(timestamp, application_id, tracking_id, transaction_id, transaction_type,
+                    resource_id, service_name, user_id, external_id, event_details)
+    except Exception as e:
+        logger.log_exception('Failed in audit_trail(cmd=%s, id=%s) url: %s' % (cmd, id, audit_server_url), e)
+        raise e
+
+    return 200
diff --git a/orm/services/flavor_manager/pycharm_init.py b/orm/services/flavor_manager/pycharm_init.py
new file mode 100755
index 00000000..469a65d9
--- /dev/null
+++ b/orm/services/flavor_manager/pycharm_init.py
@@ -0,0 +1,3 @@
+from pecan.commands import CommandRunner
+runner = CommandRunner()
+runner.run(['serve', 'config.py'])
diff --git a/orm/services/flavor_manager/run_pecan.py b/orm/services/flavor_manager/run_pecan.py
new file mode 100644
index 00000000..4d1ce01d
--- /dev/null
+++ b/orm/services/flavor_manager/run_pecan.py
@@ -0,0 +1,6 @@
+'''
+' this script is running the pecan web server inside ide so we can set break points in the code and debug our code
+'''
+from pecan.commands import CommandRunner
+runner = CommandRunner()
+runner.run(['serve', 'config.py'])
diff --git a/orm/services/flavor_manager/scripts/db_scripts/aic_orm_fms_create_db.sql b/orm/services/flavor_manager/scripts/db_scripts/aic_orm_fms_create_db.sql
new file mode 100755
index 00000000..9ebd7f5f
--- /dev/null
+++ b/orm/services/flavor_manager/scripts/db_scripts/aic_orm_fms_create_db.sql
@@ -0,0 +1,102 @@
+create database if not exists orm_fms_db DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+use orm_fms_db;
+
+#***** 
+#* MySql script for Creating Table Flavor
+#*****
+
+create table if not exists flavor
+	(
+		internal_id bigint auto_increment not null,
+		id varchar(64) not null,
+		name varchar(250) not null,
+		alias varchar(64) null,
+		description varchar(100) not null,
+		series enum('ns', 'nd', 'nv', 'gv', 'ss') not null,
+		ram integer not null,
+		vcpus integer not null,
+		disk integer not null,
+		swap integer not null,
+		ephemeral integer not null,
+		visibility varchar(10) not null,
+		primary key (internal_id),
+		unique id (id),
+		index series (series),
+		index visibility (visibility),
+		unique name_idx (name)
+	);
+#
+
+
+#***** 
+#* MySql script for Creating Table flavor_extra_spec
+#*****
+
+create table if not exists flavor_extra_spec
+	(
+		flavor_internal_id bigint not null,
+		key_name varchar(64) not null,
+		key_value varchar(64) not null,
+		foreign key (flavor_internal_id) references flavor(internal_id) ON DELETE CASCADE ON UPDATE NO ACTION,
+		primary key (flavor_internal_id,key_name)
+	);
+#
+
+
+#***** 
+#* MySql script for Creating Table flavor_region
+#*****
+
+create table if not exists flavor_region
+	(
+		flavor_internal_id bigint not null,
+		region_name varchar(64) not null,
+		region_type varchar(32) not null,
+		foreign key (flavor_internal_id) references flavor(internal_id) ON DELETE CASCADE ON UPDATE NO ACTION,
+		primary key (flavor_internal_id,region_name)
+	);
+#
+
+
+#***** 
+#* MySql script for Creating Table flavor_tenant
+#*****
+
+create table if not exists flavor_tenant
+   (
+	 flavor_internal_id bigint not null,
+	 tenant_id varchar(64) not null,
+	 foreign key (flavor_internal_id) references flavor(internal_id) ON DELETE CASCADE ON UPDATE NO ACTION,
+	 primary key (flavor_internal_id,tenant_id));
+#
+
+
+#*****
+#* MySql script for Creating Table flavor_tag
+#*****
+
+create table if not exists flavor_tag
+	(
+		flavor_internal_id bigint not null,
+		key_name varchar(64) not null,
+		key_value varchar(64) not null,
+		foreign key (flavor_internal_id) references flavor(internal_id) ON DELETE CASCADE ON UPDATE NO ACTION,
+		primary key (flavor_internal_id,key_name)
+	);
+#
+
+
+#*****
+#* MySql script for Creating Table flavor_option
+#*****
+
+create table if not exists flavor_option
+	(
+		flavor_internal_id bigint not null,
+		key_name varchar(64) not null,
+		key_value varchar(64) not null,
+		foreign key (flavor_internal_id) references flavor(internal_id) ON DELETE CASCADE ON UPDATE NO ACTION,
+		primary key (flavor_internal_id,key_name)
+	);
+#
+
diff --git a/orm/services/flavor_manager/scripts/db_scripts/aic_orm_fms_update_db.sql b/orm/services/flavor_manager/scripts/db_scripts/aic_orm_fms_update_db.sql
new file mode 100755
index 00000000..b3da1f01
--- /dev/null
+++ b/orm/services/flavor_manager/scripts/db_scripts/aic_orm_fms_update_db.sql
@@ -0,0 +1,26 @@
+USE orm_fms_db;
+
+DELIMITER ;;
+
+DROP PROCEDURE IF EXISTS add_regoion_type ;;
+CREATE PROCEDURE add_regoion_type()
+BEGIN
+
+	-- add a column safely
+	IF NOT EXISTS( (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE()
+			AND COLUMN_NAME='region_type' AND TABLE_NAME='flavor_region') ) THEN
+		ALTER TABLE flavor_region ADD region_type varchar(32) NOT NULL DEFAULT 'single';
+	END IF;
+
+	IF NOT EXISTS( (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE()
+			AND COLUMN_NAME='alias' AND TABLE_NAME='flavor') ) THEN
+		ALTER TABLE flavor ADD alias varchar(64) NULL;
+	END IF;
+
+END ;;
+
+CALL add_regoion_type() ;;
+ALTER TABLE `flavor`  CHANGE COLUMN `name` `name` VARCHAR(250) NOT NULL;;
+
+DELIMITER ;
+
diff --git a/orm/services/flavor_manager/scripts/shell_scripts/create_db.sh b/orm/services/flavor_manager/scripts/shell_scripts/create_db.sh
new file mode 100644
index 00000000..2cf28dba
--- /dev/null
+++ b/orm/services/flavor_manager/scripts/shell_scripts/create_db.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+echo Creating database: orm_rds
+echo Creating table: resource_status
+
+mysql -uroot -pstack < ../db_scripts/aic_orm_fms_create_db.sql
+
+echo Done !
diff --git a/orm/services/flavor_manager/swagger/swagger.yaml b/orm/services/flavor_manager/swagger/swagger.yaml
new file mode 100644
index 00000000..4a7ab70e
--- /dev/null
+++ b/orm/services/flavor_manager/swagger/swagger.yaml
@@ -0,0 +1,748 @@
+# this is an example of the Uber API
+# as a demonstration of an API spec in YAML
+swagger: '2.0'
+
+info:
+  version: 3.5.0
+  title: Flavors API
+  description: Flavors api's
+    		All api's should supply two header parameters
+    		X-Auth-Token - Token received from keystone
+    		X-Auth-Region - The region
+        There is an optional header parameter X-RANGER-Client which tells who is the client for the api
+    
+  contact:
+    email: zb593m@att.com
+
+# the domain of the service
+host: 135.76.2.229
+# array of all schemes that your API supports
+schemes:
+  - https
+# will be prefixed to all paths
+basePath: /v1/orm
+produces:
+  - application/json
+
+paths:
+  /flavors:
+    parameters:
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+      - $ref: "#/parameters/Client"
+
+    post:
+      summary: create a new flavor
+      description: |
+        The post flavors endpoint create a new flavor and send it to the RDS which send it to Heat to create this flavor in each region needed
+        Return all data of the new flavor
+
+      parameters:
+        - name: full_flavor
+          in: body
+          description: Full flavor to create.
+          schema: 
+            $ref: "#/definitions/Flavor"
+          required: true
+          x-example_1: 
+            { 
+              "name": "zion"
+            }
+      
+      tags:
+        - Flavors
+        
+      responses:
+        200:
+          description: The new created flavor
+          schema:
+              $ref: '#/definitions/Flavor'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    get:
+      summary: get a list of flavors by criteria (visibility, region, tenant, series, start_with, contains, alias)
+      description: |
+        The get flavors endpoint retrieve all flavors matched to the above criterias
+      parameters:
+        - name: visibility
+          in: query
+          type: "string"
+          enum: [
+            "public",
+            "private"
+          ]
+          description: public or private flavor
+        - name: region
+          in: query
+          type: "string"
+          description: region name.
+          required: false
+        - name: tenant
+          in: query
+          type: "string"
+          description: tenant name.
+          required: false
+        - name: series
+          in: query
+          type: "string"
+          description: series code
+          required: false
+        - name: start_with
+          in: query
+          type: "string"
+          description: name start with
+          required: false
+        - name: contains
+          in: query
+          type: "string"
+          description: name contains
+          required: false
+        - name: alias
+          in: query
+          type: "string"
+          description: alias of flavor.
+          required: false
+      tags:
+        - Flavors
+      responses:
+        200:
+          description: List of flavors matched all criteria
+          schema:
+            $ref: '#/definitions/Flavors'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'            
+
+  /flavors/{flavor_uuid_or_name}:
+    parameters:
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+      - $ref: "#/parameters/Client"
+    get:
+      summary: get a flavor by uuid or name
+      description: |
+        The get flavors endpoint retrieve a specipic flavor by uuid or name, you get the uuid and the name from the result of creation of this flavor or by using list api
+      parameters:
+        - name: flavor_uuid_or_name
+          in: path
+          type: string
+          description: uuid or name of the requested flavor.
+          required: true
+      tags:
+        - Flavors
+      responses:
+        200:
+          description: The requested flavor
+          schema:
+              $ref: '#/definitions/Flavor'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'            
+  
+    delete:
+      summary: delete a flavor by uuid or name
+      description: |
+        The delete flavors endpoint delete a specipic flavor by uuid or name, you get the uuid and the name from the result of creation of this flavor or by using list api
+      parameters:
+        - name: flavor_uuid_or_name
+          in: path
+          type: string
+          description: uuid or name of the requested flavor.
+          required: true
+      tags:
+        - Flavors
+      responses:
+        204:
+          description: Flavor deleted
+          schema:
+              $ref: '#/definitions/Flavor'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'            
+ 
+  /flavors/{flavor_uuid}/regions:
+    parameters:
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+      - $ref: "#/parameters/Client"
+    post:
+      summary: add new regions to flavor
+      description: |
+        The post regions inflavors endpoint add one or more regions to the already existing regions for this flavor
+        Return the full flavor after adding regions
+
+      parameters:
+        - name: flavor_uuid
+          in: path
+          type: string
+          description: flavor uuid
+          required: true
+        - name: list_of_regions
+          in: body
+          schema: 
+            $ref: '#/definitions/RegionsWrapper'
+          description: list of regions to add to a flavor.
+          required: true
+      tags:
+        - Regions
+        
+      responses:
+        200:
+          description: The new created flavor
+          schema:
+              $ref: '#/definitions/Flavor'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /flavors/{flavor_uuid}/regions/{region_name}:
+    parameters:
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+      - $ref: "#/parameters/Client"
+    delete:
+      summary: delete region from flavor
+      description: |
+        The delete region from flavor endpoint delete a region from flavor
+
+      parameters:
+        - name: flavor_uuid
+          in: path
+          type: string
+          description: flavor uuid
+          required: true
+        - name: region_name
+          in: path
+          type: string
+          description: region name
+          required: true
+      tags:
+        - Regions
+        
+      responses:
+        201:
+          description: The region was deleted from flavor
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /flavors/{flavor_uuid}/tags:
+    parameters:
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+      - $ref: "#/parameters/Client"
+    get:
+      summary: get tags of flavor
+      description: |
+        The get tags of flavor endpoint get all tags related to supplied flavor
+        Return list of flavor tags
+
+      parameters:
+        - name: flavor_uuid
+          in: path 
+          type: string
+          description: flavor uuid
+          required: true
+      tags:
+        - Tags
+        
+      responses:
+        200:
+          description: The new created flavor
+          schema:
+              $ref: '#/definitions/TagsWrapper'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+    post:
+      summary: add new tags to flavor
+      description: |
+        The post tags inflavors endpoint add one or more tags to the already existing tags for this flavor
+        Return list of flavor tags adding tags
+
+      parameters:
+          - name: flavor_uuid
+            in: path 
+            type: string
+            description: flavor uuid
+            required: true
+            
+          - name: list_of_tags
+            in: body
+            schema: 
+              $ref: '#/definitions/TagsWrapper'
+            description: list of tagss to add to the flavor.
+            required: true
+      tags:
+        - Tags
+        
+      responses:
+        200:
+          description: The new created flavor
+          schema:
+              $ref: '#/definitions/TagsWrapper'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    put:
+      summary: replace flavors tag by the supplied list
+      description: |
+        The put tags inflavors endpoint replace existing tags by new tags suplied
+        Return list of flavor tags after replacing tags 
+
+      parameters:
+        - name: flavor_uuid
+          in: path 
+          type: string
+          description: flavor uuid
+          required: true
+          
+        - name: list_of_tags
+          in: body
+          schema: 
+            $ref: '#/definitions/TagsWrapper'
+          description: list of tagss to add to the flavor.
+          required: true
+      tags:
+        - Tags
+        
+      responses:
+        200:
+          description: The new created flavor
+          schema:
+              $ref: '#/definitions/TagsWrapper'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /flavors/{flavor_uuid}/tagss/{tag_name}:
+    parameters:
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+      - $ref: "#/parameters/Client"
+    delete:
+      summary: delete specific tag by name from flavor
+      description: |
+        The delete tag from flavor endpoint delete a tag from flavor
+
+      parameters:
+        - name: flavor_uuid
+          in: path
+          type: string
+          description: flavor uuid
+          required: true
+        - name: tag_name
+          in: path
+          type: string
+          description: tag name to delete
+          required: true
+      tags:
+        - Tags
+        
+      responses:
+        201:
+          description: The region was deleted from flavor
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /flavors/{flavor_uuid}/os_extra_spec:
+    parameters:
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+      - $ref: "#/parameters/Client"
+    get:
+      summary: get extra specs of flavor
+      description: |
+        The get extra specs of flavor endpoint get all extra specs related to supplied flavor
+        Return list of flavor extra specs
+
+      parameters:
+        - name: flavor_uuid
+          in: path 
+          type: string
+          description: flavor uuid
+          required: true
+      tags:
+        - ExtraSpecs
+        
+      responses:
+        200:
+          description: The new created flavor
+          schema:
+              $ref: '#/definitions/ExtraSpecsWrapper'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+    post:
+      summary: add new extra specs to flavor
+      description: |
+        The post extra specs inflavors endpoint add one or more extra specs to the already existing extra specs for this flavor
+        Return list of flavor extra specs after adding extra specs
+
+      parameters:
+        - name: flavor_uuid
+          in: path 
+          type: string
+          description: flavor uuid
+          required: true
+            
+        - name: list_of_extra_specs
+          in: body
+          schema: 
+            $ref: '#/definitions/ExtraSpec'
+          description: list of extra specs to add to the flavor.
+          required: true
+      tags:
+        - ExtraSpecs
+        
+      responses:
+        200:
+          description: The new created flavor
+          schema:
+              $ref: '#/definitions/ExtraSpecsWrapper'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    put:
+      summary: replace flavors extra specs by the supplied list
+      description: |
+        The put extra specs to flavor endpoint replace existing extra specs by new extra specs suplied
+        Return list of flavor extra specs after replacing tags 
+
+      parameters:
+        - name: flavor_uuid
+          in: path 
+          type: string
+          description: flavor uuid
+          required: true
+          
+        - name: list_of_extra_specs
+          in: body
+          schema: 
+            $ref: '#/definitions/ExtraSpecsWrapper'
+          description: list of extra specs to replace for the flavor.
+          required: true
+      tags:
+        - ExtraSpecs
+        
+      responses:
+        200:
+          description: The new created flavor
+          schema:
+              $ref: '#/definitions/TagsWrapper'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /flavors/{flavor_uuid}/os_extra_spec/{extra_spec_name}:
+    parameters:
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+      - $ref: "#/parameters/Client"
+    delete:
+      summary: delete specific extra spec by name from flavor
+      description: |
+        The delete extra spec from flavor endpoint delete a extra spec from flavor
+
+      parameters:
+        - name: flavor_uuid
+          in: path
+          type: string
+          description: flavor uuid
+          required: true
+        - name: extra_spec_name
+          in: path
+          type: string
+          description: extra sepc name to delete
+          required: true
+      tags:
+        - ExtraSpecs
+        
+      responses:
+        201:
+          description: The extra spec was deleted from flavor
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+            
+  /flavors/{flavor_uuid}/tenants:
+    parameters:
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+      - $ref: "#/parameters/Client"
+    post:
+      summary: add new tenants to flavor
+      description: |
+        The post tenants to flavor endpoint add one or more tenants to the already existing tenants for this flavor
+        Return list of flavor tenants after adding tenants
+
+      parameters:
+        - name: flavor_uuid
+          in: path
+          type: string
+          description: flavor uuid
+          required: true
+        - name: tenants_list
+          in: body
+          schema: 
+            $ref: '#/definitions/TenantsWrapper'
+          description: list of tenants to add to the flavor.
+          required: true
+      tags:
+        - Tenants
+        
+      responses:
+        200:
+          description: list of current flavor tenants after adding tenant/s
+          schema:
+              $ref: '#/definitions/TenantsWrapper'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /flavors/{flavor_uuid}/tenants/{tenant_name}:
+    parameters:
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+      - $ref: "#/parameters/Client"
+    delete:
+      summary: delete specific tenant by name from flavor
+      description: |
+        The delete tenant from flavor endpoint delete a tenant from flavor
+
+      parameters:
+        - name: flavor_uuid
+          in: path
+          type: string
+          description: flavor uuid
+          required: true
+        - name: tenant_name
+          in: path
+          type: string
+          description: tenant name to delete
+          required: true
+      tags:
+        - Tenants
+        
+      responses:
+        201:
+          description: The region was deleted from flavor
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+definitions:
+  Flavor:
+    type: object
+    required:
+      - series
+      - ram
+      - vcpus
+      - disk
+      - visibility
+    properties:
+      id:
+        type: string
+        description: id
+      name:
+        type: string
+        description: name
+      alias:
+        type: string
+        description: alias
+      description:
+        type: string
+        description: description
+        example: A standard 2GB Ram 2 vCPUs 50GB Disk, Flavor
+      series:
+        type: string
+        description: series
+        example: nd
+      ram:
+        type: string
+        description: ram
+        example: 20
+      vcpus:
+        type: string
+        description: vcpus
+        example: 8
+      disk:
+        type: string
+        description: disk size
+        example: 2048
+      swap:
+        type: string
+        description: swap
+        example: 0
+      ephemeral:
+        type: string
+        description: ephemeral
+        example: 11
+      regions:
+        type: array
+        items:
+          $ref: '#/definitions/RegionsInput'
+      visibility:
+        type: string
+        description: visibility 'public' or 'private'
+        example: public
+      tenants:
+        type: array
+        items:
+          type: string
+      status:
+        type: string
+        description: status
+      tags:
+        $ref: '#/definitions/Tags'
+      options:
+        $ref: '#/definitions/Dictionary'
+      extra_specs:
+        $ref: '#/definitions/ExtraSpec'
+
+  Flavors:
+    type: array
+    items: 
+      $ref: '#/definitions/Flavor'
+      
+  RegionInput:
+    type: object
+    required:
+      - name
+    properties:
+      name:
+        type: string
+        example: mtn13
+      type:
+        type: string
+        description: single or group
+        example: single
+        default: single
+
+  RegionsInput:
+    type: array
+    items: 
+      $ref: '#/definitions/RegionInput'
+
+  RegionOutput:
+    type: object
+    properties:
+      name:
+        type: string
+        example: mtn13
+      type:
+        type: string
+        description: single or group
+        example: single
+        default: single
+      status:
+        type: string
+      error_message:
+        type: string
+        
+  RegionsOutput:
+    type: array
+    items: 
+      $ref: '#/definitions/RegionOutput'
+
+  RegionsWrapper:
+    type: object
+    properties:
+      regions:
+        $ref: '#/definitions/RegionsInput'
+    
+  Tags:
+    $ref: '#/definitions/Dictionary'
+        
+  TagsWrapper:
+    type: object
+    properties:
+      tags: 
+        $ref: '#/definitions/Tags'
+
+  ExtraSpec:
+    $ref: '#/definitions/Dictionary'
+        
+  ExtraSpecsWrapper:
+    type: object
+    properties:
+      os_extra_specs: 
+        $ref: '#/definitions/Dictionary'
+      extra_specs: 
+        $ref: '#/definitions/Dictionary'
+  
+  Tenant:
+    type: string
+    example: 4f7b9561-af8b-4cc0-87e2-319270dad49e
+
+  Tenants:
+    type: array
+    items: 
+      $ref: '#/definitions/Tenant'
+      
+  TenantsWrapper:
+    type: object
+    properties:
+      tenants: 
+        $ref: '#/definitions/Tenants'
+
+  Dictionary:
+    type: object
+    additionalProperties: 
+      type: "string"
+  
+  Error:
+    type: object
+    properties:
+      code:
+        type: integer
+        format: int32
+      type:
+        type: string
+      transaction_id:
+        type: string
+      message:
+        type: string
+      details:
+        type: string
+
+parameters:
+  Token:
+    name: X-Auth-Token
+    in: header
+    description: Token from keystone
+    required: true
+    type: string
+  Region:
+    name: X-Auth-Region
+    in: header
+    description: Region
+    required: true
+    type: string
+  Client:
+    name: X-RANGER-Client
+    in: header
+    description: Client name
+    required: false
+    type: string
+    
diff --git a/orm/services/flavor_manager/tox.ini b/orm/services/flavor_manager/tox.ini
new file mode 100755
index 00000000..b550d1ba
--- /dev/null
+++ b/orm/services/flavor_manager/tox.ini
@@ -0,0 +1,23 @@
+[tox]
+envlist=py27,cover
+
+[testenv]
+setenv= FMS_ENV=mock
+        PYTHONPATH={toxinidir}:{toxinidir}/fms_rest/external_mock/
+deps= -r{toxinidir}/requirements.txt
+      -r{toxinidir}/test-requirements.txt
+
+
+[testenv:pep8]
+commands =
+#    pip install git+ssh://jenkins@gerrit.mtn5.cci.att.com:29418/aic-orm-common@dev
+#    pip install ../aic-orm-common
+    py.test --pep8 -m pep8
+
+[testenv:cover]
+commands=
+#    pip install git+ssh://jenkins@gerrit.mtn5.cci.att.com:29418/aic-orm-common@dev
+#    pip install ../aic-orm-common
+    coverage run setup.py test
+    coverage report
+    coverage html --omit=fms_rest/data/sql_alchemy/*,fms_rest/utils/utils.py,.tox/*
diff --git a/orm/services/id_generator/__init__.py b/orm/services/id_generator/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/MANIFEST.in b/orm/services/image_manager/MANIFEST.in
new file mode 100644
index 00000000..c922f11a
--- /dev/null
+++ b/orm/services/image_manager/MANIFEST.in
@@ -0,0 +1 @@
+recursive-include public *
diff --git a/orm/services/image_manager/__init__.py b/orm/services/image_manager/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/config.py b/orm/services/image_manager/config.py
new file mode 100755
index 00000000..c2cd1d53
--- /dev/null
+++ b/orm/services/image_manager/config.py
@@ -0,0 +1,122 @@
+from orm_common.hooks.api_error_hook import APIErrorHook
+from orm_common.hooks.security_headers_hook import SecurityHeadersHook
+from ims.hooks.service_hooks import TransIdHook
+
+global TransIdHook
+global APIErrorHook
+global SecurityHeadersHook
+
+# Server Specific Configurations
+server = {
+    'port': '8084',
+    'host': '0.0.0.0',
+    'name': 'ims'
+}
+
+# Pecan Application Configurations
+app = {
+    'root': 'ims.controllers.root.RootController',
+    'modules': ['ims'],
+    'static_root': '%(confdir)s/public',
+    'template_path': '%(confdir)s/ims/templates',
+    'debug': True,
+    'errors': {
+        '__force_dict__': True
+    },
+    'hooks': lambda: [TransIdHook(), APIErrorHook(), SecurityHeadersHook()]
+}
+
+logging = {
+    'root': {'level': 'INFO', 'handlers': ['console']},
+    'loggers': {
+        'ims': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'],
+                'propagate': False},
+        'audit_client': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'],
+                         'propagate': False},
+        'orm_common': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'],
+                       'propagate': False},
+        'pecan': {'level': 'DEBUG', 'handlers': ['console'],
+                  'propagate': False},
+        'py.warnings': {'handlers': ['console']},
+        '__force_dict__': True
+    },
+    'handlers': {
+        'console': {
+            'level': 'DEBUG',
+            'class': 'logging.StreamHandler',
+            'formatter': 'color'
+        },
+        'Logfile': {
+            'level': 'DEBUG',
+            'class': 'logging.handlers.RotatingFileHandler',
+            'maxBytes': 50000000,
+            'backupCount': 10,
+            'filename': '/opt/app/orm/ims/ims.log',
+            'formatter': 'simple'
+        }
+    },
+    'formatters': {
+        'simple': {
+            'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]'
+                       '[%(threadName)s] %(message)s')
+        },
+        'color': {
+            '()': 'pecan.log.ColorFormatter',
+            'format': ('%(asctime)s [%(padded_color_levelname)s] [%(name)s]'
+                       '[%(threadName)s] %(message)s'),
+            '__force_dict__': True
+        }
+    }
+}
+
+database = {
+    'host': 'localhost',
+    'username': 'root',
+    'password': 'stack',
+    'db_name': 'orm_ims_db',
+
+}
+
+verify = False
+
+database['connection_string'] = 'mysql://{0}:{1}@{2}:3306/{3}'.format(database['username'],
+                                                                      database['password'],
+                                                                      database['host'],
+                                                                      database['db_name'])
+
+application_root = 'http://localhost:{0}'.format(server['port'])
+
+api = {
+    'uuid_server': {
+        'base': 'http://127.0.0.1:8090/',
+        'uuids': 'v1/uuids'
+    },
+    'rds_server': {
+        'base': 'http://127.0.0.1:8777/',
+        'resources': 'v1/rds/resources',
+        'status': 'v1/rds/status/resource/'
+    },
+    'rms_server': {
+        'base': 'http://127.0.0.1:8080/',
+        'groups': 'v2/orm/groups',
+        'regions': 'v2/orm/regions',
+        'cache_seconds': 60
+    },
+    'audit_server': {
+        'base': 'http://127.0.0.1:8776/',
+        'trans': 'v1/audit/transaction'
+    }
+
+}
+
+authentication = {
+    "enabled": True,
+    "mech_id": "admin",
+    "mech_pass": "stack",
+    "rms_url": "http://127.0.0.1:8080",
+    "tenant_name": "admin",
+    "token_role": "admin",
+    # The Keystone version currently in use. Can be either "2.0" or "3"
+    "keystone_version": "2.0",
+    "policy_file": "/opt/app/orm/aic-orm-ims/ims/etc/policy.json"
+}
diff --git a/orm/services/image_manager/data_manager_test.py b/orm/services/image_manager/data_manager_test.py
new file mode 100755
index 00000000..6fa2cfa7
--- /dev/null
+++ b/orm/services/image_manager/data_manager_test.py
@@ -0,0 +1,229 @@
+from ims.logger import get_logger
+import traceback
+
+from ims.persistency.sql_alchemy.data_manager import DataManager
+
+
+# conf = imp.load_source('config.py', '../config.py')
+
+from pecan.testing import load_test_app
+import os
+from pecan import conf
+from ims.persistency.sql_alchemy.db_models import Image, ImageProperty, ImageRegion, ImageCustomer
+
+image_id = "Id 11"  # image id
+
+LOG = get_logger(__name__)
+
+
+def main():
+    try:
+        # prepare_service()
+
+        print conf.database
+
+        data_manager = DataManager()
+
+        image_record = data_manager.get_record("Image")
+
+        image = image_record.get_image(image_id)
+
+        print image.regions
+        print image.properties
+
+        all_images = image_record.get_all_images(start=0, limit=50)
+        print all_images
+
+        # LOG.debug("TestDatabase finished well")
+
+    except Exception as exception:
+        print("Exception" + str(exception))
+        # LOG.error("Exception in TestDatabase: " + str(exception))
+
+
+def delete():
+    try:
+        # prepare_service()
+
+        print conf.database
+
+        data_manager = DataManager()
+
+        image_record = data_manager.get_record("Image")
+
+        data_manager.begin_transaction()
+
+        result = image_record.delete_by_id(image_id)
+
+        data_manager.commit()
+        print "Nm records deleted: " + str(result.rowcount)
+        # LOG.debug("TestDatabase finished well")
+
+    except Exception as exception:
+        print("Exception" + str(exception))
+
+        # LOG.error("Exception in TestDatabase: " + str(exception))
+
+
+def main2():
+    # get customer by id of 1
+    try:
+        # prepare_service()
+
+        data_manager = DataManager()
+
+        image_record = data_manager.get_record("Image")
+
+        criterias = {"visibility": "public", "region": "North", "tenant": "Tenanat-1", "start": 0, "limit": 10,
+                     "profile": "NS"}
+        images = image_record.get_images_by_criteria(**criterias)
+
+        print len(images)
+
+    except Exception as exception:
+        LOG.log_exception("Failed to get_images_by_criteria: ", exception)
+        # log_exception(LOG, "Failed to read customer: 10", exception)
+        # log_exception("Failed to read customer: 10", exception)
+        # LOG.error("Exception in TestDatabase: " + str(exception))
+        # print_exception(exception)
+
+
+def main3():
+    try:
+        # prepare_service()
+
+        print conf.database
+
+        data_manager = DataManager()
+
+        image_record = data_manager.get_record("Image")
+
+        image = image_record.get_image(image_id)
+
+        print image.image_extra_specs
+        print image.image_regions
+        print image.image_tenants
+
+        region = ImageRegion(region_name="Israel")
+        image.add_region(region)
+
+        region = ImageRegion(region_name="Israel2")
+        image.add_region(region)
+
+        tenant = ImageCustomer(tenant_id="Zion")
+        image.add_tenant(tenant)
+
+        tenant = ImageCustomer(tenant_id="Zion2")
+        image.add_tenant(tenant)
+
+        data_manager.commit()
+
+        # LOG.debug("TestDatabase finished well")
+
+    except Exception as exception:
+        print("Exception" + str(exception))
+        # LOG.error("Exception in TestDatabase: " + str(exception))
+
+
+def main4():
+    try:
+        # prepare_service()
+
+        print conf.database
+
+        data_manager = DataManager()
+
+        image_record = data_manager.get_record("Image")
+
+        image = image_record.get_image(image_id)
+
+        print image.image_extra_specs
+        print image.image_regions
+        print image.image_tenants
+
+        image.remove_region("Israel")
+        image.remove_region("Israel2")
+
+        image.remove_tenant("Zion")
+        image.remove_tenant("Zion2")
+
+        data_manager.commit()
+
+        # LOG.debug("TestDatabase finished well")
+
+    except Exception as exception:
+        print("Exception" + str(exception))
+        # LOG.error("Exception in TestDatabase: " + str(exception))
+
+
+def insert_data():
+    try:
+        # prepare_service()
+
+        print conf.database
+
+        data_manager = DataManager()
+
+        image_record = data_manager.get_record("Image")
+
+        image_property1 = ImageProperty(key_name="key_1", key_value="key_valu1")
+        image_property2 = ImageProperty(key_name="key_2", key_value="key_valu2")
+        image_property3 = ImageProperty(key_name="key_3", key_value="key_valu3")
+
+        image_region1 = ImageRegion(region_name="region1", region_type="single")
+        image_region2 = ImageRegion(region_name="region2", region_type="single")
+
+        image = Image(name="Name1",
+                      id="Id 10",
+                      enabled=1,
+                      protected="protected",
+                      url="Http:\\zion.com",
+                      visibility="puplic",
+                      disk_format="disk format",
+                      container_format="container_format",
+                      min_disk=512,
+                      owner="zion",
+                      schema="big_data",
+                      min_ram=1)
+
+        image.properties.append(image_property1)
+        image.properties.append(image_property2)
+        image.properties.append(image_property3)
+        image.regions.append(image_region1)
+        image.regions.append(image_region2)
+        image_record.insert(image)
+
+        data_manager.commit()
+
+        # LOG.debug("TestDatabase finished well")
+
+    except Exception as exception:
+        print("Exception" + str(exception))
+        # LOG.error("Exception in TestDatabase: " + str(exception))
+
+
+def print_exception():
+    try:
+        print "*** print_exc:"
+        traceback.print_exc()
+        print "*** format_exception:"
+        print traceback.format_exc()
+        print "*** extract_tb:"
+        print traceback.extract_tb()
+        print "*** format_tb:"
+        print traceback.format_tb()
+    except Exception as exception1:
+        print "*** print_exc:"
+        traceback.print_exc()
+
+
+if __name__ == "__main__":
+    app = load_test_app(os.path.join(
+        os.path.dirname(__file__),
+        './config.py'
+    ))
+
+    # main()
+    insert_data()
+    delete()
+    # main4()
diff --git a/orm/services/image_manager/ims.conf b/orm/services/image_manager/ims.conf
new file mode 100644
index 00000000..35d71ad2
--- /dev/null
+++ b/orm/services/image_manager/ims.conf
@@ -0,0 +1,26 @@
+Listen 8084
+ 
+<VirtualHost *:8084>
+ 
+    WSGIDaemonProcess ims user=orm group=orm threads=5
+    WSGIScriptAlias / /opt/app/orm/ims/ims.wsgi
+ 
+ 	<Location /v1/orm/logs>
+		Order deny,allow
+		Deny from all
+		Allow from localhost
+	</Location>
+
+	<Location /v1/orm/configuration>
+		Order deny,allow
+		Deny from all
+		Allow from localhost
+	</Location>
+	
+    <Directory /opt/app/orm/ims/>
+        WSGIProcessGroup ims
+        WSGIApplicationGroup %{GLOBAL}
+                Require all granted
+        Allow from all
+    </Directory>
+</VirtualHost>
diff --git a/orm/services/image_manager/ims.wsgi b/orm/services/image_manager/ims.wsgi
new file mode 100644
index 00000000..91e0f31a
--- /dev/null
+++ b/orm/services/image_manager/ims.wsgi
@@ -0,0 +1,2 @@
+from pecan.deploy import deploy
+application = deploy('/opt/app/orm/ims/config.py')
diff --git a/orm/services/image_manager/ims/__init__.py b/orm/services/image_manager/ims/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/app.py b/orm/services/image_manager/ims/app.py
new file mode 100755
index 00000000..df13bbe3
--- /dev/null
+++ b/orm/services/image_manager/ims/app.py
@@ -0,0 +1,36 @@
+from pecan import make_app
+from pecan import conf
+from ims.logger import get_logger
+from orm_common.utils.utils import set_utils_conf
+from pecan.commands import CommandRunner
+
+from ims.utils import authentication as auth
+from orm_common.policy import policy
+
+import os
+logger = get_logger(__name__)
+
+
+def setup_app(config):
+    token_conf = auth._get_token_conf(config)
+    policy.init(config.authentication.policy_file, token_conf)
+    app_conf = dict(config.app)
+
+    app = make_app(
+        app_conf.pop('root'),
+        logging=getattr(config, 'logging', {}),
+        **app_conf
+    )
+
+    set_utils_conf(conf)
+
+    logger.info('Starting IMS...')
+    return app
+
+
+def main():
+    dir_name = os.path.dirname(__file__)
+    drive, path_and_file = os.path.splitdrive(dir_name)
+    path, filename = os.path.split(path_and_file)
+    runner = CommandRunner()
+    runner.run(['serve', path+'/config.py'])
diff --git a/orm/services/image_manager/ims/controllers/__init__.py b/orm/services/image_manager/ims/controllers/__init__.py
new file mode 100755
index 00000000..b601ad2a
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/__init__.py
@@ -0,0 +1,10 @@
+"""Init package."""
+import os
+from ims.logger import get_logger
+from orm_common.injector import injector
+import ims.di_providers as di_providers
+
+logger = get_logger(__name__)
+
+_current_dirname = os.path.dirname(os.path.realpath(di_providers.__file__))
+injector.register_providers('IMS_ENV', _current_dirname, logger)
diff --git a/orm/services/image_manager/ims/controllers/root.py b/orm/services/image_manager/ims/controllers/root.py
new file mode 100755
index 00000000..181cbbda
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/root.py
@@ -0,0 +1,45 @@
+from pecan import conf
+from pecan import rest
+from pecan import expose, request
+
+from webob.exc import status_map
+from pecan.secure import SecureController
+from ims.controllers.v1.v1 import V1Controller
+from ims.utils import authentication
+
+
+class RootController(object):
+    v1 = V1Controller()
+
+    @expose(template='json')
+    def get(self):
+        """
+            Method to handle GET /
+            prameters: None
+            return: dict describing image command version information
+        """
+
+        return {
+            "versions": {
+                "values": [
+                    {
+                        "orm": "stable",
+                        "id": "v1",
+                        "links": [
+                            {
+                                "href": conf.application_root
+                            }
+                        ]
+                    }
+                ]
+            }
+        }
+
+    @expose('error.html')
+    def error(self, status):
+        try:
+            status = int(status)
+        except ValueError:  # pragma: no cover
+            status = 500
+        message = getattr(status_map.get(status), 'explanation', '')
+        return dict(status=status, message=message)
diff --git a/orm/services/image_manager/ims/controllers/v1/__init__.py b/orm/services/image_manager/ims/controllers/v1/__init__.py
new file mode 100755
index 00000000..d09c9979
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/v1/__init__.py
@@ -0,0 +1,9 @@
+# import os
+# from orm_common.logger import get_logger
+# #from orm_common.injector import injector
+# import ims_rest.di_providers as di_providers
+#
+# logger = get_logger(__name__)
+#
+# _current_dirname = os.path.dirname(os.path.realpath(di_providers.__file__))
+# injector.register_providers('IMS_ENV', _current_dirname, logger)
diff --git a/orm/services/image_manager/ims/controllers/v1/orm/__init__.py b/orm/services/image_manager/ims/controllers/v1/orm/__init__.py
new file mode 100755
index 00000000..c3d63034
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/v1/orm/__init__.py
@@ -0,0 +1 @@
+"""Init package."""
diff --git a/orm/services/image_manager/ims/controllers/v1/orm/configuration.py b/orm/services/image_manager/ims/controllers/v1/orm/configuration.py
new file mode 100755
index 00000000..e30d4bee
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/v1/orm/configuration.py
@@ -0,0 +1,29 @@
+"""Configuration rest API input module."""
+
+import logging
+from orm_common.utils import utils
+from pecan import conf
+from pecan import rest
+from wsmeext.pecan import wsexpose
+
+
+logger = logging.getLogger(__name__)
+
+
+class ConfigurationController(rest.RestController):
+    """Configuration controller."""
+
+    @wsexpose(str, str, status_code=200)
+    def get(self, dump_to_log='false'):
+        """get method.
+
+        :param dump_to_log: A boolean string that says whether the
+        configuration should be written to log
+        :return: A pretty string that contains the service's configuration
+        """
+        logger.info("Get configuration...")
+
+        dump = dump_to_log.lower() == 'true'
+        utils.set_utils_conf(conf)
+        result = utils.report_config(conf, dump, logger)
+        return result
diff --git a/orm/services/image_manager/ims/controllers/v1/orm/images/__init__.py b/orm/services/image_manager/ims/controllers/v1/orm/images/__init__.py
new file mode 100755
index 00000000..c3d63034
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/v1/orm/images/__init__.py
@@ -0,0 +1 @@
+"""Init package."""
diff --git a/orm/services/image_manager/ims/controllers/v1/orm/images/base.py b/orm/services/image_manager/ims/controllers/v1/orm/images/base.py
new file mode 100755
index 00000000..3032e9b7
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/v1/orm/images/base.py
@@ -0,0 +1,49 @@
+import wsme
+
+
+class ClientSideError(wsme.exc.ClientSideError):
+    def __init__(self, error, status_code=400):
+        super(ClientSideError, self).__init__(error, status_code)
+
+
+class JsonError(wsme.exc.ClientSideError):
+    def __init__(self, status_code=400, message='incompatible JSON body'):
+        super(JsonError, self).__init__(message, status_code)
+
+
+class AuthenticationHeaderError(ClientSideError):
+    def __init__(self, error, status_code=401,
+                 message='Missing/expired/incorrect authentication header'):
+        super(AuthenticationHeaderError, self).__init__(message, status_code)
+
+
+class AuthenticationFailed(ClientSideError):
+    def __init__(self, status_code=403,
+                 message='The authenticated user is not allowed to create'
+                         ' customers'):
+        super(AuthenticationFailed, self).__init__(message, status_code)
+
+
+class NotFound(ClientSideError):
+    def __init__(self, status_code=404, message="Not Found"):
+        super(NotFound, self).__init__(message, status_code)
+
+
+class NoContent(ClientSideError):
+    def __init__(self, status_code=204, message="Not Content"):
+        super(NoContent, self).__init__(message, status_code)
+
+
+class BusyError(ClientSideError):
+    def __init__(self, status_code=409, message='Current resource is busy'):
+        super(BusyError, self).__init__(message, status_code)
+
+
+error_strategy = {
+    '400': JsonError,
+    '401': AuthenticationHeaderError,
+    '403': AuthenticationFailed,
+    '404': NotFound,
+    '204': NoContent,
+    '409': BusyError
+}
diff --git a/orm/services/image_manager/ims/controllers/v1/orm/images/customers.py b/orm/services/image_manager/ims/controllers/v1/orm/images/customers.py
new file mode 100755
index 00000000..4fc9aae8
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/v1/orm/images/customers.py
@@ -0,0 +1,107 @@
+from pecan import rest, request
+from pecan.core import abort
+from wsmeext.pecan import wsexpose
+from orm_common.injector import injector
+
+from ims.persistency.wsme.models import ImageWrapper, CustomerWrapper
+from ims.logic.error_base import ErrorStatus
+from orm_common.utils import api_error_utils as err_utils
+from ims.utils import authentication as auth
+
+from ims.logger import get_logger
+
+LOG = get_logger(__name__)
+
+di = injector.get_di()
+
+
+@di.dependsOn('image_logic')
+@di.dependsOn('utils')
+class CustomerController(rest.RestController):
+
+    @wsexpose(ImageWrapper, str, body=CustomerWrapper, rest_content_types='json', status_code=201)
+    def post(self, image_id, cust_wrapper):
+        image_logic, utils = di.resolver.unpack(CustomerController)
+        auth.authorize(request, "tenant:create")
+        try:
+            LOG.info("CustomerController - add tenants: " + str(cust_wrapper))
+
+            result = image_logic.add_customers(image_id, cust_wrapper, request.transaction_id)
+
+            LOG.info("CustomerController - tenants added: " + str(result))
+
+            event_details = 'Image {} tenants: {} added'.format(
+                image_id, cust_wrapper.customers)
+            utils.audit_trail('add tenants', request.transaction_id,
+                              request.headers, image_id,
+                              event_details=event_details)
+            return result
+
+        except ErrorStatus as exception:
+            LOG.log_exception("TenantController - Failed to add tenants", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+        except Exception as exception:
+            LOG.log_exception("TenantController - Failed to add tenants", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @wsexpose(ImageWrapper, str, body=CustomerWrapper, rest_content_types='json', status_code=200)
+    def put(self, image_id, cust_wrapper):
+        image_logic, utils = di.resolver.unpack(CustomerController)
+        auth.authorize(request, "tenant:update")
+        try:
+            LOG.info("CustomerController - replace tenants: " + str(cust_wrapper))
+
+            result = image_logic.replace_customers(image_id, cust_wrapper, request.transaction_id)
+
+            LOG.info("CustomerController - tenants replaced: " + str(result))
+
+            event_details = 'Image {} tenants: {} updated'.format(
+                image_id, cust_wrapper.customers)
+            utils.audit_trail('replace tenants', request.transaction_id,
+                              request.headers, image_id,
+                              event_details=event_details)
+            return result
+
+        except ErrorStatus as exception:
+            LOG.log_exception("TenantController - Failed to replace tenants", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+        except Exception as exception:
+            LOG.log_exception("TenantController - Failed to replace tenants", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @wsexpose(None, str, str, rest_content_types='json', status_code=204)
+    def delete(self, image_id, cust_id):
+        image_logic, utils = di.resolver.unpack(CustomerController)
+        auth.authorize(request, "tenant:delete")
+
+        try:
+            LOG.info("TenantController - delete tenant: " + str(cust_id))
+
+            result = image_logic.delete_customer(image_id, cust_id, request.transaction_id)
+
+            LOG.info("TenantController - tenant deleted: " + str(result))
+
+            event_details = 'Image {} tenant {} deleted'.format(
+                image_id, cust_id)
+            utils.audit_trail('delete tenant', request.transaction_id,
+                              request.headers, image_id,
+                              event_details=event_details)
+
+        except ErrorStatus as exception:
+            LOG.log_exception("TenantController - Failed to delete tenant", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+        except Exception as exception:
+            LOG.log_exception("TenantController - Failed to delete tenant", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
diff --git a/orm/services/image_manager/ims/controllers/v1/orm/images/enabled.py b/orm/services/image_manager/ims/controllers/v1/orm/images/enabled.py
new file mode 100755
index 00000000..93ea5c52
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/v1/orm/images/enabled.py
@@ -0,0 +1,74 @@
+"""Status (activate/deactivate) Image rest API input module."""
+
+from pecan import conf, rest, request
+from wsmeext.pecan import wsexpose
+from ims.logger import get_logger
+from orm_common.injector import injector
+from ims.logic.error_base import ErrorStatus
+from ims.persistency.wsme.models import Enabled, ImageWrapper
+from orm_common.utils import api_error_utils as err_utils
+from ims.utils import authentication as auth
+
+di = injector.get_di()
+
+LOG = get_logger(__name__)
+
+
+@di.dependsOn('image_logic')
+@di.dependsOn('utils')
+class EnabledController(rest.RestController):
+    """Status controller."""
+
+    @wsexpose(ImageWrapper, str, body=Enabled, rest_content_types='json', status_code=200)
+    def put(self, image_id, enabled):
+        image_logic, utils = di.resolver.unpack(EnabledController)
+        auth.authorize(request, "image:enable")
+        try:
+            LOG.info("EnabledController - received enabled = {}".format(enabled.enabled))
+            result = image_logic.enable_image(image_id, enabled.enabled * 1, request.transaction_id)
+            status = "activated"
+            if not enabled.enabled:
+                status = "deactivated"
+            LOG.info("EnabledController - Image was successfully {}".format(status))
+
+            event_details = 'Image {} {}'.format(
+                image_id, 'active' if enabled.enabled else 'inactive')
+            utils.audit_trail('activate image', request.transaction_id,
+                              request.headers, image_id,
+                              event_details=event_details)
+            return result
+
+        except ErrorStatus as exception:
+            LOG.log_exception("Failed in EnableImage", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("Failed in EnableImage", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @wsexpose(None, str, body=Enabled, rest_content_types='json',
+              status_code=200)
+    def post(self, image_id, enabled):
+        image_logic, utils = di.resolver.unpack(EnabledController)
+        auth.authorize(request, "image:enable")
+        try:
+            LOG.debug("method not allowed only put allowed")
+            raise ErrorStatus(405,
+                              "method not allowed only 'put' method allowed")
+            return None
+
+        except ErrorStatus as exception:
+            LOG.log_exception("Failed in EnableImage", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("Failed in EnableImage", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
diff --git a/orm/services/image_manager/ims/controllers/v1/orm/images/images.py b/orm/services/image_manager/ims/controllers/v1/orm/images/images.py
new file mode 100755
index 00000000..1a8aa564
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/v1/orm/images/images.py
@@ -0,0 +1,201 @@
+from pecan import rest, request
+
+from wsmeext.pecan import wsexpose
+from pecan import expose, abort
+import oslo_db
+from ims.controllers.v1.orm.images.regions import RegionController
+from ims.controllers.v1.orm.images.customers import CustomerController
+from ims.controllers.v1.orm.images.enabled import EnabledController
+
+from ims.persistency.wsme.models import ImageWrapper, ImageSummaryResponse
+from ims.logic.error_base import ErrorStatus
+from ims.logger import get_logger
+from orm_common.injector import injector
+from orm_common.utils import api_error_utils as err_utils
+from ims.utils import authentication as auth
+
+
+di = injector.get_di()
+LOG = get_logger(__name__)
+
+
+@di.dependsOn('image_logic')
+@di.dependsOn('utils')
+class ImageController(rest.RestController):
+    regions = RegionController()
+    customers = CustomerController()
+    enabled = EnabledController()
+
+    @wsexpose(ImageWrapper, str, body=ImageWrapper, rest_content_types='json', status_code=201)
+    def post(self, invalid_extra_param=None, image_wrapper=None):
+        image_logic, utils = di.resolver.unpack(ImageController)
+        uuid = "FailedToGetFromUUIDGen"
+        auth.authorize(request, "image:create")
+
+        if not image_wrapper:
+            raise err_utils.get_error(request.transaction_id,
+                                      message="Body not supplied",
+                                      status_code=400)
+
+        if invalid_extra_param:
+            raise err_utils.get_error(request.transaction_id,
+                                      message="URL has invalid extra param '{}' ".format(invalid_extra_param),
+                                      status_code=405)
+        try:
+            LOG.info("ImageController - Create image: " + str(image_wrapper.image.name))
+            image_wrapper.image.owner = request.headers.get('X-RANGER-Owner') or ''
+
+            if not image_wrapper.image.id:
+                uuid = utils.make_uuid()
+            else:
+                try:
+                    uuid = utils.create_existing_uuid(image_wrapper.id)
+                except TypeError:
+                    raise ErrorStatus(409.1, message='Image UUID already exists')
+
+            try:
+                ret_image = image_logic.create_image(image_wrapper, uuid,
+                                                     request.transaction_id)
+            except oslo_db.exception.DBDuplicateEntry as exception:
+                raise ErrorStatus(409.2, 'The field {0} already exists'.format(exception.columns))
+
+            LOG.info("ImageController - Image Created: " + str(ret_image))
+
+            event_details = 'Image {} {} {}, visibility: {}, created in regions: {} with tenants: {}'.format(
+                uuid, image_wrapper.image.name, image_wrapper.image.url,
+                image_wrapper.image.visibility,
+                [r.name for r in image_wrapper.image.regions],
+                image_wrapper.image.customers)
+            utils.audit_trail('create image', request.transaction_id,
+                              request.headers, uuid,
+                              event_details=event_details)
+            return ret_image
+
+        except ErrorStatus as exception:
+            LOG.log_exception("ImageController - Failed to CreateImage", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("ImageController - Failed to CreateImage", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+    @wsexpose(ImageWrapper, str, body=ImageWrapper, rest_content_types='json', status_code=200)
+    def put(self, image_id, image_wrapper):
+        image_logic, utils = di.resolver.unpack(ImageController)
+        auth.authorize(request, "image:update")
+        try:
+            LOG.info("ImageController - UpdateImage: " + str(image_wrapper.image.name))
+            try:
+                result = image_logic.update_image(image_wrapper, image_id,
+                                                  request.transaction_id)
+            except oslo_db.exception.DBDuplicateEntry as exception:
+                raise ErrorStatus(409.2, 'The field {0} already exists'.format(exception.columns))
+
+            LOG.info("ImageController - UpdateImage finished well: " + str(image_wrapper.image.name))
+
+            event_details = 'Image {} {} {}, visibility: {}, created in regions: {} with tenants: {}'.format(
+                image_id, image_wrapper.image.name, image_wrapper.image.url,
+                image_wrapper.image.visibility,
+                [r.name for r in image_wrapper.image.regions],
+                image_wrapper.image.customers)
+            utils.audit_trail('update image', request.transaction_id,
+                              request.headers, image_id,
+                              event_details=event_details)
+            return result
+
+        except ErrorStatus as exception:
+            LOG.log_exception("Failed in UpdateImage", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("ImageController - Failed to UpdateImage", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @wsexpose(ImageWrapper, str, str, str, str, str, rest_content_types='json')
+    def get(self, image_uuid):
+        image_logic, utils = di.resolver.unpack(ImageController)
+        LOG.info("ImageController - GetImageDetails: uuid is {}".format(
+            image_uuid))
+        auth.authorize(request, "image:get_one")
+
+        try:
+            return image_logic.get_image_by_uuid(image_uuid)
+
+        except ErrorStatus as exception:
+            LOG.log_exception("ImageController - Failed to GetImageDetails", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("ImageController - Failed to GetImageDetails", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @wsexpose(ImageSummaryResponse, str, str, str, rest_content_types='json')
+    def get_all(self, visibility=None, region=None, tenant=None):
+        image_logic, utils = di.resolver.unpack(ImageController)
+        auth.authorize(request, "image:list")
+
+        try:
+            LOG.info("ImageController - GetImagelist")
+
+            result = image_logic.get_image_list_by_params(visibility, region, tenant)
+            return result
+
+        except ErrorStatus as exception:
+            LOG.log_exception("ImageController - Failed to GetImagelist", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+
+        except Exception as exception:
+            LOG.log_exception("ImageController - Failed to GetImagelist", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exception))
+
+    @wsexpose(None, str, rest_content_types='json', status_code=204)
+    def delete(self, image_uuid):
+        image_logic, utils = di.resolver.unpack(ImageController)
+        LOG.info("Got image delete request")
+        auth.authorize(request, "image:delete")
+        try:
+            LOG.info("ImageController - delete image: image id:" + image_uuid)
+            image_logic.delete_image_by_uuid(image_uuid, request.transaction_id)
+            LOG.info("ImageController - delete image finished well: ")
+
+            event_details = 'Image {} deleted'.format(image_uuid)
+            utils.audit_trail('delete image', request.transaction_id,
+                              request.headers, image_uuid,
+                              event_details=event_details)
+
+        except ErrorStatus as exp:
+            LOG.log_exception("ImageController - Failed to delete image", exp)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exp.message,
+                                      status_code=exp.status_code)
+
+        except Exception as exp:
+            LOG.log_exception("ImageController - Failed to delete image", exp)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=str(exp))
+
+    '''
+    @expose()
+    def _lookup(self, primary_key, *remainder):
+        #
+        # This function is called when pecan does not find controller for the request
+        #
+        abort(405, "Invalid URL")
+    '''
diff --git a/orm/services/image_manager/ims/controllers/v1/orm/images/metadata.py b/orm/services/image_manager/ims/controllers/v1/orm/images/metadata.py
new file mode 100644
index 00000000..c2601ba9
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/v1/orm/images/metadata.py
@@ -0,0 +1,43 @@
+from pecan import rest, request, response
+from wsmeext.pecan import wsexpose
+from ims.persistency.wsme.models import MetadataWrapper
+
+from orm_common.injector import injector
+
+from ims.logic.error_base import ErrorStatus
+
+from ims.logger import get_logger
+from orm_common.utils import api_error_utils as err_utils
+from ims.utils import authentication as auth
+
+LOG = get_logger(__name__)
+
+di = injector.get_di()
+
+
+@di.dependsOn('metadata_logic')
+@di.dependsOn('utils')
+class MetadataController(rest.RestController):
+    @wsexpose(str, str, str, body=MetadataWrapper, rest_content_types='json', status_code=200)
+    def post(self, image_id, region_name, metadata_wrapper):  # add metadata to region
+        metadata_logic, utils = di.resolver.unpack(MetadataController)
+        auth.authorize(request, "metadata:create")
+
+        try:
+            LOG.info("MetadataController - add metadata: " + str(metadata_wrapper))
+
+            metadata_logic.add_metadata(image_id, region_name, metadata_wrapper)
+
+            LOG.info("MetadataController - metadata added")
+            return "OK"
+
+        except ErrorStatus as exception:
+            LOG.log_exception("MetadataController - Failed to add metadata", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+        except Exception as exception:
+            LOG.log_exception("MetadataController - Failed to add metadata", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
diff --git a/orm/services/image_manager/ims/controllers/v1/orm/images/regions.py b/orm/services/image_manager/ims/controllers/v1/orm/images/regions.py
new file mode 100755
index 00000000..6128a39b
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/v1/orm/images/regions.py
@@ -0,0 +1,122 @@
+from pecan import rest, request, response
+from wsmeext.pecan import wsexpose
+
+from ims.controllers.v1.orm.images.metadata import MetadataController
+from ims.persistency.wsme.models import RegionWrapper
+
+from orm_common.injector import injector
+
+from ims.logic.error_base import ErrorStatus
+
+from ims.logger import get_logger
+from orm_common.utils import api_error_utils as err_utils
+from ims.utils import authentication as auth
+
+LOG = get_logger(__name__)
+
+di = injector.get_di()
+
+
+@di.dependsOn('image_logic')
+@di.dependsOn('utils')
+class RegionController(rest.RestController):
+    metadata = MetadataController()
+
+    @wsexpose([str], str, rest_content_types='json')
+    def get(self, image_id):
+        # get region has been unfeatured
+        raise err_utils.get_error(request.transaction_id,
+                                  status_code=405)
+
+    @wsexpose(RegionWrapper, str, body=RegionWrapper, rest_content_types='json', status_code=201)
+    def post(self, image_id, region_wrapper):  # add regions to image
+        image_logic, utils = di.resolver.unpack(RegionController)
+        auth.authorize(request, "region:create")
+
+        try:
+            if not region_wrapper.regions:
+                raise ErrorStatus(400,
+                                  " bad resquest please provide correct json")
+            LOG.info("RegionController - add regions: " + str(region_wrapper))
+
+            result = image_logic.add_regions(image_id, region_wrapper, request.transaction_id)
+
+            LOG.info("RegionController - regions added: " + str(result))
+
+            event_details = 'Image {} regions: {} added'.format(
+                image_id, [r.name for r in region_wrapper.regions])
+            utils.audit_trail('add regions', request.transaction_id,
+                              request.headers, image_id,
+                              event_details=event_details)
+            return result
+
+        except ErrorStatus as exception:
+            LOG.log_exception("RegionController - Failed to add region", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+        except Exception as exception:
+            LOG.log_exception("RegionController - Failed to add region", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+    @wsexpose(RegionWrapper, str, body=RegionWrapper, rest_content_types='json', status_code=200)
+    def put(self, image_id, region_wrapper):  # add regions to image
+        image_logic, utils = di.resolver.unpack(RegionController)
+        auth.authorize(request, "region:update")
+        try:
+            if not region_wrapper.regions:
+                raise ErrorStatus(400,
+                                  " bad resquest please provide correct json")
+            LOG.info("RegionController - replace regions: " + str(region_wrapper))
+
+            result = image_logic.replace_regions(image_id, region_wrapper, request.transaction_id)
+
+            LOG.info("RegionController - regions replaced: " + str(result))
+
+            event_details = 'Image {} regions: {} updated'.format(
+                image_id, [r.name for r in region_wrapper.regions])
+            utils.audit_trail('replace regions', request.transaction_id,
+                              request.headers, image_id,
+                              event_details=event_details)
+            return result
+
+        except ErrorStatus as exception:
+            LOG.log_exception("RegionController - Failed to replace region", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+        except Exception as exception:
+            LOG.log_exception("RegionController - Failed to replace region", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+    @wsexpose(None, str, str, rest_content_types='json', status_code=204)
+    def delete(self, image_id, region_name):
+        image_logic, utils = di.resolver.unpack(RegionController)
+        auth.authorize(request, "region:delete")
+        try:
+            LOG.info("RegionController - delete region: " + str(region_name))
+
+            result = image_logic.delete_region(image_id, region_name, request.transaction_id)
+
+            LOG.info("RegionController - region deleted: " + str(result))
+
+            event_details = 'Image {} region {} deleted'.format(image_id,
+                                                                region_name)
+            utils.audit_trail('delete region', request.transaction_id,
+                              request.headers, image_id,
+                              event_details=event_details)
+
+        except ErrorStatus as exception:  # include NotFoundError
+            LOG.log_exception("RegionController - Failed to delete region", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exception.message,
+                                      status_code=exception.status_code)
+        except Exception as exception:
+            LOG.log_exception("RegionController - Failed to delete region", exception)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
diff --git a/orm/services/image_manager/ims/controllers/v1/orm/logs.py b/orm/services/image_manager/ims/controllers/v1/orm/logs.py
new file mode 100755
index 00000000..0be7d9f6
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/v1/orm/logs.py
@@ -0,0 +1,72 @@
+import logging
+
+from pecan import rest
+import wsme
+from wsmeext.pecan import wsexpose
+
+
+logger = logging.getLogger(__name__)
+
+
+class ClientSideError(wsme.exc.ClientSideError):
+    def __init__(self, error, status_code=400):
+        super(ClientSideError, self).__init__(error, status_code)
+
+
+class LogChangeResultWSME(wsme.types.DynamicBase):
+    """log change result wsme type."""
+
+    result = wsme.wsattr(str, mandatory=True, default=None)
+
+    def __init__(self, **kwargs):
+        """"init method."""
+        super(LogChangeResult, self).__init__(**kwargs)
+
+
+class LogChangeResult(object):
+    """log change result type."""
+
+    def __init__(self, result):
+        """"init method."""
+        self.result = result
+
+
+class LogsController(rest.RestController):
+    """Logs Audit controller."""
+
+    @wsexpose(LogChangeResultWSME, str, status_code=201,
+              rest_content_types='json')
+    def put(self, level):
+        """update log level.
+
+        :param level: the log level text name
+        :return:
+        """
+
+        logger.info("Changing log level to [{}]".format(level))
+        try:
+            log_level = logging._levelNames.get(level.upper())
+            if log_level is not None:
+                self._change_log_level(log_level)
+                result = "Log level changed to {}.".format(level)
+                logger.info(result)
+            else:
+                raise Exception(
+                    "The given log level [{}] doesn't exist.".format(level))
+        except Exception as e:
+            result = "Fail to change log_level. Reason: {}".format(
+                e.message)
+            logger.error(result)
+            raise ClientSideError(error=e.message)
+        return LogChangeResult(result)
+
+    @staticmethod
+    def _change_log_level(log_level):
+        path = __name__.split('.')
+        if len(path) > 0:
+            root = path[0]
+            root_logger = logging.getLogger(root)
+            root_logger.setLevel(log_level)
+        else:
+            logger.info("Fail to change log_level to [{}]. "
+                        "the given log level doesn't exist.".format(log_level))
diff --git a/orm/services/image_manager/ims/controllers/v1/orm/orm.py b/orm/services/image_manager/ims/controllers/v1/orm/orm.py
new file mode 100644
index 00000000..0f648c6b
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/v1/orm/orm.py
@@ -0,0 +1,11 @@
+from ims.controllers.v1.orm.configuration import ConfigurationController
+from ims.controllers.v1.orm.images.images import ImageController
+from ims.controllers.v1.orm.logs import LogsController
+from pecan.rest import RestController
+
+
+class OrmController(RestController):
+
+    configuration = ConfigurationController()
+    images = ImageController()
+    logs = LogsController()
diff --git a/orm/services/image_manager/ims/controllers/v1/orm/root.py b/orm/services/image_manager/ims/controllers/v1/orm/root.py
new file mode 100755
index 00000000..d0089bdb
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/v1/orm/root.py
@@ -0,0 +1,8 @@
+"""ORM controller module."""
+from ims.controllers.v1.orm.images import images
+
+
+class OrmController(object):
+    """ORM root controller class."""
+
+    images = images.ImageController()
diff --git a/orm/services/image_manager/ims/controllers/v1/root.py b/orm/services/image_manager/ims/controllers/v1/root.py
new file mode 100755
index 00000000..bc1522fc
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/v1/root.py
@@ -0,0 +1,8 @@
+"""V1 controller module."""
+from ims.controllers.v1.orm import root
+
+
+class V1Controller(object):
+    """V1 root controller class."""
+
+    orm = root.OrmController()
diff --git a/orm/services/image_manager/ims/controllers/v1/v1.py b/orm/services/image_manager/ims/controllers/v1/v1.py
new file mode 100644
index 00000000..41549fab
--- /dev/null
+++ b/orm/services/image_manager/ims/controllers/v1/v1.py
@@ -0,0 +1,7 @@
+from ims.controllers.v1.orm.orm import OrmController
+from pecan.rest import RestController
+
+
+class V1Controller(RestController):
+
+    orm = OrmController()
diff --git a/orm/services/image_manager/ims/di_providers/__init__.py b/orm/services/image_manager/ims/di_providers/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/di_providers/mock_providers.py b/orm/services/image_manager/ims/di_providers/mock_providers.py
new file mode 100755
index 00000000..626f0713
--- /dev/null
+++ b/orm/services/image_manager/ims/di_providers/mock_providers.py
@@ -0,0 +1,18 @@
+from ims.ims_mocks import requests_mock
+from ims.ims_mocks import audit_mock
+
+from ims.persistency.sql_alchemy.data_manager import DataManager
+from ims.logic import image_logic
+from ims.logic import metadata_logic
+from ims.proxies import rds_proxy
+from orm_common.utils import utils
+
+providers = [
+    ('rds_proxy', rds_proxy),
+    ('image_logic', image_logic),
+    ('metadata_logic', metadata_logic),
+    ('requests', requests_mock),
+    ('data_manager', DataManager),
+    ('utils', utils),
+    ('audit_client', audit_mock)
+]
diff --git a/orm/services/image_manager/ims/di_providers/prod_providers.py b/orm/services/image_manager/ims/di_providers/prod_providers.py
new file mode 100644
index 00000000..845459c4
--- /dev/null
+++ b/orm/services/image_manager/ims/di_providers/prod_providers.py
@@ -0,0 +1,19 @@
+import requests
+from audit_client.api import audit
+
+from ims.proxies import rds_proxy
+from ims.logic import image_logic
+from ims.logic import metadata_logic
+from ims.persistency.sql_alchemy.data_manager import DataManager
+from orm_common.utils import utils
+
+
+providers = [
+    ('rds_proxy', rds_proxy),
+    ('image_logic', image_logic),
+    ('metadata_logic', metadata_logic),
+    ('requests', requests),
+    ('data_manager', DataManager),
+    ('utils', utils),
+    ('audit_client', audit)
+]
diff --git a/orm/services/image_manager/ims/etc/policy.json b/orm/services/image_manager/ims/etc/policy.json
new file mode 100755
index 00000000..758bc02b
--- /dev/null
+++ b/orm/services/image_manager/ims/etc/policy.json
@@ -0,0 +1,25 @@
+{
+  "default": "!",
+  "admin": "role:admin",
+  "admin_support": "role:admin_support",
+  "admin_viewer": "role:admin_viewer",
+  "orm": "user:m01687",
+
+  "admin_or_support": "role:admin or role:admin_support",
+  "admin_or_support_or_viewer": "rule:admin or rule:admin_support or rule:admin_viewer",
+
+  "image:create": "rule:admin_or_support",
+  "image:list": "rule:admin_or_support_or_viewer",
+  "image:get_one": "rule:admin_or_support_or_viewer",
+  "image:update": "rule:admin",
+  "image:delete": "rule:admin",
+  "region:delete": "rule:admin",
+  "region:create": "rule:admin_or_support",
+  "region:update": "rule:admin",
+  "image:enable": "rule:admin",
+  "tenant:create": "rule:admin_or_support",
+  "tenant:delete": "rule:admin",
+  "tenant:update": "rule:admin",
+
+  "metadata:create": "rule:orm"
+}
\ No newline at end of file
diff --git a/orm/services/image_manager/ims/external_mock/audit_client/__init__.py b/orm/services/image_manager/ims/external_mock/audit_client/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/external_mock/audit_client/api/__init__.py b/orm/services/image_manager/ims/external_mock/audit_client/api/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/external_mock/audit_client/api/audit.py b/orm/services/image_manager/ims/external_mock/audit_client/api/audit.py
new file mode 100644
index 00000000..ec483bdd
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/audit_client/api/audit.py
@@ -0,0 +1,6 @@
+def audit(*args, **kwargs):
+    pass
+
+
+def init(*args, **kwargs):
+    pass
diff --git a/orm/services/image_manager/ims/external_mock/keystone_utils/__init__.py b/orm/services/image_manager/ims/external_mock/keystone_utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/external_mock/keystone_utils/tokens.py b/orm/services/image_manager/ims/external_mock/keystone_utils/tokens.py
new file mode 100755
index 00000000..cb45e879
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/keystone_utils/tokens.py
@@ -0,0 +1,10 @@
+def get_token_user(*a, **k):
+    pass
+
+
+def is_token_valid(token_to_validate, lcp_id, conf, token_role):
+    pass
+
+
+def TokenConf(mech_id, mech_password, rms_url, tenant_name, key_ep=None):
+    pass
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/__init__.py b/orm/services/image_manager/ims/external_mock/orm_common/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/hooks/__init__.py b/orm/services/image_manager/ims/external_mock/orm_common/hooks/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/hooks/transaction_id_hook.py b/orm/services/image_manager/ims/external_mock/orm_common/hooks/transaction_id_hook.py
new file mode 100644
index 00000000..d156a1fa
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/orm_common/hooks/transaction_id_hook.py
@@ -0,0 +1,7 @@
+# from pecan.hooks import PecanHook
+
+
+class TransactionIdHook():
+
+    def before(self, state):
+        pass
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/injector/__init__.py b/orm/services/image_manager/ims/external_mock/orm_common/injector/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/__init__.py b/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/__init__.py
new file mode 100755
index 00000000..18404b50
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/__init__.py
@@ -0,0 +1,7 @@
+'''
+'''
+
+from .di import Di
+from .dependency_register import DependencyRegister
+from .resource_provider_register import ResourceProviderRegister
+from .resolver import DependencyResolver
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/dependency_register.py b/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/dependency_register.py
new file mode 100755
index 00000000..7b4d7093
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/dependency_register.py
@@ -0,0 +1,77 @@
+from functools import partial
+import inspect
+
+from .errors import DependentNotFoundError
+
+try:
+    import click
+except ImportError:
+    click = None
+
+
+class DependencyRegister:
+    def __init__(self):
+        # Maps dependents to names of resources they require
+        self.dependents = {}
+        # Maps names of resources to their dependents
+        self.resources = {}
+
+    @classmethod
+    def _unwrap_func(cls, decorated_func):
+        '''
+        This unwraps a decorated func, returning the inner wrapped func.
+
+        This may become unnecessary with Python 3.4's inspect.unwrap().
+        '''
+        if click is not None:
+            # Workaround for click.command() decorator not setting
+            # __wrapped__
+            if isinstance(decorated_func, click.Command):
+                return cls._unwrap_func(decorated_func.callback)
+
+        if hasattr(decorated_func, '__wrapped__'):
+            # Recursion: unwrap more if needed
+            return cls._unwrap_func(decorated_func.__wrapped__)
+        else:
+            # decorated_func isn't actually decorated, no more
+            # unwrapping to do
+            return decorated_func
+
+    @classmethod
+    def _unwrap_dependent(cls, dependent):
+        # Dependent is effectively a class. Classes are registered as is.
+        if inspect.isclass(dependent):
+            return dependent
+        # dependent is some other kind of callable, eg a function
+        else:
+            return cls._unwrap_func(dependent)
+
+    def _register_dependent(self, dependent, resource_name):
+        if dependent not in self.dependents:
+            self.dependents[dependent] = []
+        self.dependents[dependent].insert(0, resource_name)
+
+    def _register_resource_dependency(self, resource_name, dependent):
+        if resource_name not in self.resources:
+            self.resources[resource_name] = set()
+        self.resources[resource_name].add(dependent)
+
+    def register(self, resource_name, dependent=None):
+        if dependent is None:
+            # Give a partial usable as a decorator
+            return partial(self.register, resource_name)
+
+        dependent = self._unwrap_dependent(dependent)
+        self._register_dependent(dependent, resource_name)
+        self._register_resource_dependency(resource_name, dependent)
+
+        # Return dependent to ease use as decorator
+        return dependent
+
+    def query_resources(self, dependent):
+        dependent = self._unwrap_dependent(dependent)
+
+        if dependent not in self.dependents:
+            raise DependentNotFoundError(dependent=dependent)
+
+        return self.dependents[dependent]
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/di.py b/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/di.py
new file mode 100755
index 00000000..6a436354
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/di.py
@@ -0,0 +1,16 @@
+from .dependency_register import DependencyRegister
+from .resource_provider_register import ResourceProviderRegister
+from .resolver import DependencyResolver
+
+
+class Di:
+    def __init__(self, namespace=None):
+        self.namespace = namespace
+        self.dependencies = DependencyRegister()
+        self.providers = ResourceProviderRegister()
+        self.resolver = DependencyResolver(
+            dependency_register=self.dependencies,
+            resource_provider_register=self.providers)
+
+        # For use as a decorator
+        self.dependsOn = self.dependencies.register
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/errors.py b/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/errors.py
new file mode 100755
index 00000000..607cfb98
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/errors.py
@@ -0,0 +1,47 @@
+class FangError(Exception):
+    pass
+
+
+class DependentNotFoundError(FangError):
+    def __init__(self, dependent=None):
+        self.dependent = dependent
+        if dependent:
+            message = (
+                "Couldn't find dependencies registered for {!r}"
+                "".format(dependent))
+        else:
+            message = (
+                "Couldn't find dependencies registered for the given "
+                "dependent")
+        super(DependentNotFoundError, self).__init__(message)
+
+
+class ProviderAlreadyRegisteredError(FangError):
+    def __init__(self, resource_name=None, existing_provider=None):
+        self.resource_name = resource_name
+        self.existing_provider = existing_provider
+        if resource_name and existing_provider:
+            message = (
+                'A provider ({provider!r}) has already been '
+                'registered for resource {resource_name!r}'.format(
+                    provider=existing_provider,
+                    resource_name=resource_name))
+        else:
+            message = (
+                'A provider has already been registered for the '
+                'resource')
+        super(ProviderAlreadyRegisteredError, self).__init__(message)
+
+
+class ProviderNotFoundError(FangError):
+    def __init__(self, resource_name=None):
+        self.resource_name = resource_name
+        if resource_name:
+            message = (
+                "A provider could not be found for resource {!r}"
+                "".format(resource_name))
+        else:
+            message = (
+                "A provider could not be found for the requested "
+                "resource")
+        super(ProviderNotFoundError, self).__init__(message)
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/resolver.py b/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/resolver.py
new file mode 100755
index 00000000..5a58f8d6
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/resolver.py
@@ -0,0 +1,44 @@
+from .errors import ProviderNotFoundError
+
+
+# This is effectively what is sometimes termed a "dependency injection
+# container".
+class DependencyResolver:
+    def __init__(
+            self,
+            dependency_register=None,
+            resource_provider_register=None):
+        self.dependency_register = dependency_register
+        self.resource_provider_register = resource_provider_register
+
+        # Methods delegated to other objects
+        self.query_dependents_resources = \
+            self.dependency_register.query_resources
+        self.resolve = self.resource_provider_register.resolve
+
+    def resolve_all_dependencies(self, dependent):
+        return [
+            self.resolve(resource_name)
+            for resource_name in
+            self.query_dependents_resources(dependent)]
+
+    def unpack(self, dependent):
+        resources = self.resolve_all_dependencies(dependent)
+
+        # Never return a length-1 list/tuple, to allow easier unpacking
+        # eg, avoid need for comma in:
+        #   my_one_dep, = my_resolver.unpack_dependencies(my_func)
+        if len(resources) == 1:
+            return resources[0]
+        else:
+            return resources
+
+    def are_all_dependencies_met_for(self, dependent):
+        for resource_name in self.query_dependents_resources(dependent):
+            try:
+                self.resolve(resource_name)
+            except ProviderNotFoundError as e:
+                # TODO: Add error logging here
+                return False
+        else:
+            return True
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/resource_provider_register.py b/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/resource_provider_register.py
new file mode 100755
index 00000000..58da4619
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/orm_common/injector/fang/resource_provider_register.py
@@ -0,0 +1,68 @@
+from functools import partial
+
+from .errors import (
+    FangError,
+    ProviderAlreadyRegisteredError,
+    ProviderNotFoundError)
+
+
+class ResourceProviderRegister:
+    def __init__(self, namespace=None):
+        self.namespace = namespace
+        # Maps resource names to a provider
+        self.resource_providers = {}
+
+    def register(self, resource_name, provider=None, allow_override=False):
+        if provider is None:
+            # Give a partial usable as a decorator
+            return partial(
+                self.register,
+                resource_name, allow_override=allow_override)
+
+        if ((not allow_override) and resource_name in self.resource_providers):
+            raise ProviderAlreadyRegisteredError(
+                resource_name=resource_name,
+                existing_provider=self.resource_providers[resource_name])
+
+        self.resource_providers[resource_name] = provider
+
+        # Return provider to ease use as decorator
+        return provider
+
+    register_callable = register
+
+    # For registering providers which always return the same instance
+    def register_instance(self, resource_name, instance=None, **kwargs):
+        if instance is None:
+            # Give a partial usable as a decorator
+            return partial(self.register_instance, resource_name, **kwargs)
+
+        self.register(resource_name, provider=(lambda: instance), **kwargs)
+        return instance
+
+    def mass_register(self, resource_names_to_providers, **kwargs):
+        for resource_name, provider in resource_names_to_providers.items():
+            self.register_instance(resource_name, provider, **kwargs)
+
+    def load(self, other_register, allow_overrides=False):
+        if not allow_overrides:
+            own_keys = self.resource_providers.keys()
+            other_keys = other_register.resource_providers.keys()
+            common_keys = own_keys & other_keys
+            if common_keys:
+                # TODO Add new FangError sub-class?
+                raise FangError(
+                    'This register already has providers for keys: '
+                    '{!r}'.format(common_keys))
+
+        self.resource_providers.update(
+            other_register.resource_providers)
+
+    def clear(self):
+        self.resource_providers.clear()
+
+    def resolve(self, resource_name):
+        if resource_name not in self.resource_providers:
+            raise ProviderNotFoundError(resource_name=resource_name)
+
+        return self.resource_providers[resource_name]()
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/injector/injector.py b/orm/services/image_manager/ims/external_mock/orm_common/injector/injector.py
new file mode 100755
index 00000000..39264441
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/orm_common/injector/injector.py
@@ -0,0 +1,55 @@
+from orm_common.injector import fang
+import os
+import imp
+
+_di = fang.Di()
+logger = None
+
+
+def register_providers(env_variable, providers_dir_path, _logger):
+    global logger
+    logger = _logger
+
+    # TODO: change all prints to logger
+    logger.info('Initializing dependency injector')
+    logger.info('Checking {0} variable'.format(env_variable))
+
+    env = None
+    if not (env_variable in os.environ):
+        logger.warn('No {0} variable found using `prod` injector'.format(env_variable))
+        env = 'prod'
+    elif os.environ[env_variable] == '__TEST__':
+        logger.info('__TEST__ variable found, explicitly skipping provider registration!!!')
+        return
+    else:
+        env = os.environ[env_variable]
+        logger.info('{0} found setting injector to {1} environment'.format(env_variable, env))
+
+    logger.info('Setting injector providers')
+
+    module = _import_file_by_name(env, providers_dir_path)
+
+    for provider in module.providers:
+        logger.info('Setting provider `{0}` to {1}'.format(provider[0], provider[1]))
+        _di.providers.register_instance(provider[0], provider[1])
+
+
+def get_di():
+    return _di
+
+
+def override_injected_dependency(dep_tuple):
+    _di.providers.register_instance(dep_tuple[0], dep_tuple[1], allow_override=True)
+
+
+def _import_file_by_name(env, providers_dir_path):
+    file_path = os.path.join(providers_dir_path, '{0}_providers.py'.format(env))
+    try:
+        module = imp.load_source('fms_providers', file_path)
+    except IOError as ex:
+        logger.log_exception(
+            'File with providers for the {0} environment, path: {1} wasnt found! Crushing!!!'.format(env, file_path),
+            ex)
+        raise ex
+
+    return module
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/logger/__init__.py b/orm/services/image_manager/ims/external_mock/orm_common/logger/__init__.py
new file mode 100755
index 00000000..1894cbbe
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/orm_common/logger/__init__.py
@@ -0,0 +1,10 @@
+import logging
+
+
+def get_logger(name):
+    logger = logging.getLogger(name)
+    logger.log_exception = lambda msg, exception: logger.exception(msg + " Exception: " + str(exception))
+
+    return logger
+
+__all__ = ['get_logger']
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/policy/__init__.py b/orm/services/image_manager/ims/external_mock/orm_common/policy/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/policy/policy.py b/orm/services/image_manager/ims/external_mock/orm_common/policy/policy.py
new file mode 100644
index 00000000..0e021c4e
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/orm_common/policy/policy.py
@@ -0,0 +1,6 @@
+def authorize(action, request, app_conf, keystone_ep=None):
+    pass
+
+
+def init(*a, **b):
+    pass
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/utils.py b/orm/services/image_manager/ims/external_mock/orm_common/utils.py
new file mode 100755
index 00000000..2debd1a1
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/orm_common/utils.py
@@ -0,0 +1,8 @@
+class utils:
+    @staticmethod
+    def set_utils_conf(conf):
+        pass
+
+    @staticmethod
+    def report_config(conf, dump_to_log):
+        pass
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/utils/__init__.py b/orm/services/image_manager/ims/external_mock/orm_common/utils/__init__.py
new file mode 100755
index 00000000..2140b170
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/orm_common/utils/__init__.py
@@ -0,0 +1,10 @@
+import cross_api_utils
+import utils
+
+
+def set_utils_conf(conf):
+    cross_api_utils.set_utils_conf(conf)
+    utils.set_utils_conf(conf)
+
+
+__all__ = ['cross_api_utils', 'utils']
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/utils/api_error_utils.py b/orm/services/image_manager/ims/external_mock/orm_common/utils/api_error_utils.py
new file mode 100644
index 00000000..653221e2
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/orm_common/utils/api_error_utils.py
@@ -0,0 +1,2 @@
+def get_error(*args, **kwargs):
+    pass
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/utils/cross_api_utils.py b/orm/services/image_manager/ims/external_mock/orm_common/utils/cross_api_utils.py
new file mode 100755
index 00000000..11233bbe
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/orm_common/utils/cross_api_utils.py
@@ -0,0 +1,109 @@
+import requests
+import logging
+from pecan import conf
+from audit_client.api import audit
+import time
+
+from orm_common.logger import get_logger
+
+logger = get_logger(__name__)
+
+conf = None
+
+
+def set_utils_conf(_conf):
+    global conf
+    conf = _conf
+
+
+def _check_conf_initialization():
+    if not conf:
+        raise AssertionError(
+            'Configuration wasnt initiated, please run set_utils_conf and '
+            'pass pecan configuration')
+
+
+def is_region_exist(region_name):
+    """ function to check whether region exists
+        returns 200 for ok and None for error
+    """
+    region = get_rms_region(region_name)
+    if region is None:
+        return False
+
+    return True
+
+
+def is_region_group_exist(group_name):
+    """ function to check whether region group exists
+        returns 200 for ok and None for error
+    """
+    group = get_rms_region_group(group_name)
+    if group is None:
+        return False
+
+    return True
+
+
+def get_regions_of_group(group_name):
+    """ function to get regions associated with group
+        returns 200 for ok and None for error
+    """
+    group = get_rms_region_group(group_name)
+    if group is None:
+        return None
+
+    return group["Regions"]
+
+
+def get_rms_region(region_name):
+    """ function to call rms api for region info
+        returns 200 for ok and None for error
+    """
+    _check_conf_initialization()
+    try:
+        headers = {
+            'content-type': 'application/json',
+        }
+        rms_server_url = '%s%s/%s' % (
+            conf.api.rms_server.base, conf.api.rms_server.regions, region_name)
+        resp = requests.get(rms_server_url, headers=headers).json()
+        return resp
+    except Exception as e:
+        logger.log_exception('Failed in get_rms_region', e)
+        return None
+
+    return 200
+
+
+prev_group_name = None
+
+
+def get_rms_region_group(group_name):
+    """ function to call rms api for group info
+        returns 200 for ok and None for error
+    """
+    global prev_group_name, prev_timestamp, prev_resp
+
+    _check_conf_initialization()
+    try:
+        timestamp = time.time()
+        if group_name == prev_group_name and timestamp - prev_timestamp <= \
+                conf.api.rms_server.cache_seconds:
+            return prev_resp
+
+        headers = {
+            'content-type': 'application/json',
+        }
+        rms_server_url = '%s%s/%s' % (
+            conf.api.rms_server.base, conf.api.rms_server.groups, group_name)
+        resp = requests.get(rms_server_url, headers=headers).json()
+        prev_resp = resp
+        prev_group_name = group_name
+        prev_timestamp = timestamp
+        return resp
+    except Exception as e:
+        logger.log_exception('Failed in get_rms_region_group', e)
+        return None
+
+    return 200
diff --git a/orm/services/image_manager/ims/external_mock/orm_common/utils/utils.py b/orm/services/image_manager/ims/external_mock/orm_common/utils/utils.py
new file mode 100755
index 00000000..49d90ecc
--- /dev/null
+++ b/orm/services/image_manager/ims/external_mock/orm_common/utils/utils.py
@@ -0,0 +1,116 @@
+import requests
+import pprint
+import logging
+from pecan import conf
+from audit_client.api import audit
+import time
+
+from orm_common.logger import get_logger
+
+logger = get_logger(__name__)
+
+conf = None
+
+
+def set_utils_conf(_conf):
+    global conf
+    conf = _conf
+
+
+def _check_conf_initialization():
+    if not conf:
+        raise AssertionError(
+            'Configurations wasnt initiated, please run set_utils_conf and '
+            'pass pecan coniguration')
+
+
+def make_uuid():
+    """ function to request new uuid from uuid_generator rest service
+        returns uuid string
+    """
+    _check_conf_initialization()
+    url = conf.api.uuid_server.base + conf.api.uuid_server.uuids
+
+    try:
+        resp = requests.post(url)
+    except Exception as e:
+        logger.info('Failed in make_uuid:' + str(e))
+        raise Exception('Failed in make_uuid:' + str(e))
+
+    resp = resp.json()
+    return resp['uuid']
+
+
+def make_transid():
+    """ function to request new uuid of transaction type from uuid_generator
+    rest service
+        returns uuid string
+    """
+    _check_conf_initialization()
+    url = conf.api.uuid_server.base + conf.api.uuid_server.uuids
+
+    try:
+        resp = requests.post(url, data={'uuid_type': 'transaction'})
+    except Exception as e:
+        logger.info('Failed in make_transid:' + str(e))
+        raise Exception('Failed in make_transid:' + str(e))
+
+    resp = resp.json()
+    return resp['uuid']
+
+
+audit_setup = False
+
+
+def audit_trail(cmd, transaction_id, headers, resource_id, message):
+    """ function to send item to audit trail rest api
+        returns 200 for ok and None for error
+    """
+
+    _check_conf_initialization()
+    global audit_setup, audit_server_url
+    if not audit_setup:
+        audit_server_url = '%s%s' % (conf.api.audit_server.base,
+                                     conf.api.audit_server.trans)
+        num_of_send_retries = 3
+        time_wait_between_retries = 1
+        audit.init(audit_server_url, num_of_send_retries,
+                   time_wait_between_retries)
+        audit_setup = True
+
+    try:
+        timestamp = long(round(time.time() * 1000))
+        application_id = headers['X-RANGER-Client']
+        tracking_id = headers[
+            'X-RANGER-Tracking-Id'] if 'X-RANGER-Tracking-Id' in headers \
+            else transaction_id
+        # transaction_id is function argument
+        transaction_type = cmd
+        # resource_id is function argument
+        service_name = conf.server.name
+        user_id = headers[
+            'X-RANGER-Requester'] if 'X-RANGER-Requester' in headers else 'NA'
+        external_id = 'NA'
+        event_details = 'CMS'
+        status = message
+        audit.audit(timestamp, application_id, tracking_id, transaction_id,
+                    transaction_type,
+                    resource_id, service_name, user_id, external_id,
+                    event_details, status)
+    except Exception as e:
+        logger.log_exception('Failed in audit service', e)
+        return None
+
+    return 200
+
+
+def report_config(conf, dump_to_log=False, my_logger=None):
+    """ return the configuration (which is set by config.py) as a string
+    """
+
+    ret = pprint.pformat(conf.to_dict(), indent=4)
+    effective_logger = my_logger if my_logger else logger
+    if dump_to_log:
+        effective_logger.info('Current Configuration:\n' + ret)
+
+    return ret
diff --git a/orm/services/image_manager/ims/hooks/__init__.py b/orm/services/image_manager/ims/hooks/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/hooks/service_hooks.py b/orm/services/image_manager/ims/hooks/service_hooks.py
new file mode 100755
index 00000000..235b31d4
--- /dev/null
+++ b/orm/services/image_manager/ims/hooks/service_hooks.py
@@ -0,0 +1,12 @@
+from orm_common.hooks.transaction_id_hook import TransactionIdHook
+from orm_common.utils import utils
+
+
+class TransIdHook(TransactionIdHook):
+
+    def before(self, state):
+        transaction_id = utils.make_transid()
+        tracking_id = state.request.headers['X-RANGER-Tracking-Id'] \
+            if 'X-RANGER-Tracking-Id' in state.request.headers else transaction_id
+        setattr(state.request, 'transaction_id', transaction_id)
+        setattr(state.request, 'tracking_id', tracking_id)
diff --git a/orm/services/image_manager/ims/ims_mocks/__init__.py b/orm/services/image_manager/ims/ims_mocks/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/ims_mocks/audit_mock.py b/orm/services/image_manager/ims/ims_mocks/audit_mock.py
new file mode 100755
index 00000000..d4bc9af2
--- /dev/null
+++ b/orm/services/image_manager/ims/ims_mocks/audit_mock.py
@@ -0,0 +1,8 @@
+def init(audit_server_url, num_of_send_retries, time_wait_between_retries):
+    pass
+
+
+def audit(timestamp, application_id, tracking_id, transaction_id,
+          transaction_type, resource_id, service_name, user_id=None,
+          external_id=None, event_details=None, status=None):
+    return 200
diff --git a/orm/services/image_manager/ims/ims_mocks/requests_mock.py b/orm/services/image_manager/ims/ims_mocks/requests_mock.py
new file mode 100755
index 00000000..e1020b1e
--- /dev/null
+++ b/orm/services/image_manager/ims/ims_mocks/requests_mock.py
@@ -0,0 +1,110 @@
+import copy
+import uuid
+from mock import MagicMock
+from ims.persistency.sql_alchemy.data_manager import DataManager
+
+from ims.logger import get_logger
+
+logger = get_logger(__name__)
+
+
+def post(url, **kwargs):
+    if 'rds/resources' in url:
+        logger.debug('MOCK: requests.post called for rds/resources')
+        return _build_rds_response()
+
+    elif 'uuids' in url:
+        logger.debug('MOCK: requests.post called for uuid')
+        return _build_uuid_response()
+
+
+def delete(url, **kwargs):
+    if 'rds/resources' in url:
+        logger.debug('MOCK: requests.deletr called for rds/resources')
+        return _build_rds_response()
+
+    else:
+        raise Exception("No delete action for this url".format(url))
+
+
+def get(url):
+    if 'status/resource' in url:
+        logger.debug('MOCK: requests.get called for status/resources')
+        return _build_status_response(url)
+
+
+def _build_uuid_response():
+    res = MagicMock()
+    res.json.return_value = {
+        'uuid': str(uuid.uuid1())
+    }
+
+    return res
+
+
+def _build_rds_response():
+    response = MagicMock()
+    response.status_code = 201
+    response.content = {"image": {"profile": "p1",
+                                  "status": "Error",
+                                  "description": "A standard 2GB Ram 2 vCPUs "
+                                                 "50GB Disk, Flavor",
+                                  "extra-specs": {"key3": "value3",
+                                                  "key2": "value2",
+                                                  "key1": "value1"},
+                                  "ram": "4096",
+                                  "ephemeral": "0",
+                                  "visibility": "private",
+                                  "regions": [
+                                      {
+                                          "status": "Error",
+                                          "name": "dkk12"
+                                      }, {
+                                          "status": "Error",
+                                          "name": "san12"}],
+                                  "vcpus": "2",
+                                  "swap": "1024",
+                                  "disk": "50",
+                                  "tenants": [
+                                      "070be05e-26e2-4519-a46d-224cbf8558f4",
+                                      "4f7b9561-af8b-4cc0-87e2-319270dad49e"],
+                                  "id": "a5310ede-1c15-11e6-86bb-005056a50d38",
+                                  "name": "fr4096v2d50"
+                                  }
+                        }
+
+    response.json.return_value = response.content
+    return response
+
+
+def _build_status_response(url):
+    uuid_index = url.find('status/resource/') + 16
+    uuid = url[uuid_index:]
+    datamanager = DataManager()
+    image_record = datamanager.get_record('image')
+    sql_image = image_record.get_image_by_id(uuid)
+    _status_response['regions'] = []
+    for sql_region in sql_image.image_regions:
+        new_region = copy.copy(_region_mock)
+        new_region['region'] = sql_region.region_name
+        _status_response['regions'].append(new_region)
+    mock = MagicMock()
+    mock.json.return_value = _status_response
+    return mock
+
+
+_region_mock = {
+    "region": "dla1",
+    "timestamp": "1451599200",
+    "ord-transaction-id": "0649c5be323f4792afbc1efdd480847d",
+    "resource-id": "12fde398643acbed32f8097c98aec20",
+    "ord-notifier-id": "",
+    "status": "success",
+    "error-code": "200",
+    "error-msg": "OK"
+}
+
+_status_response = {
+    "status": "pending",
+    "regions": []
+}
diff --git a/orm/services/image_manager/ims/logger/__init__.py b/orm/services/image_manager/ims/logger/__init__.py
new file mode 100755
index 00000000..1894cbbe
--- /dev/null
+++ b/orm/services/image_manager/ims/logger/__init__.py
@@ -0,0 +1,10 @@
+import logging
+
+
+def get_logger(name):
+    logger = logging.getLogger(name)
+    logger.log_exception = lambda msg, exception: logger.exception(msg + " Exception: " + str(exception))
+
+    return logger
+
+__all__ = ['get_logger']
diff --git a/orm/services/image_manager/ims/logic/__init__.py b/orm/services/image_manager/ims/logic/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/logic/error_base.py b/orm/services/image_manager/ims/logic/error_base.py
new file mode 100755
index 00000000..7cc7e13c
--- /dev/null
+++ b/orm/services/image_manager/ims/logic/error_base.py
@@ -0,0 +1,38 @@
+
+class Error(Exception):
+    pass
+
+
+class ErrorStatus(Error):
+
+    def __init__(self, status_code, message=""):
+        self.status_code = status_code
+        self.message = message
+
+
+class NoContentError(ErrorStatus):
+
+    def __init__(self, message='', status_code=204):
+        self.status_code = status_code
+        self.message = message
+
+
+class NotFoundError(ErrorStatus):
+
+    def __init__(self, message='', status_code=404):
+        self.status_code = status_code
+        self.message = message
+
+
+class DuplicateEntityError(ErrorStatus):
+
+    def __init__(self, status_code=409, message="item already exist"):
+        self.status_code = status_code
+        self.message = message
+
+
+class ConflictError(ErrorStatus):
+
+    def __init__(self, status_code=409, message="conflict error"):
+        self.status_code = status_code
+        self.message = message
diff --git a/orm/services/image_manager/ims/logic/image_logic.py b/orm/services/image_manager/ims/logic/image_logic.py
new file mode 100755
index 00000000..f0429b9e
--- /dev/null
+++ b/orm/services/image_manager/ims/logic/image_logic.py
@@ -0,0 +1,551 @@
+from ims.logger import get_logger
+from ims.persistency.wsme.models import ImageWrapper, ImageSummaryResponse
+from ims.persistency.wsme.models import Region, ImageSummary, RegionWrapper
+from ims.persistency.sql_alchemy.db_models import ImageRegion, ImageCustomer
+from ims.logic.error_base import ErrorStatus, NotFoundError, NoContentError
+from ims.utils import utils as ImsUtils
+
+from orm_common.utils import utils
+from orm_common.injector import injector
+import time
+
+from pecan import request, conf
+
+LOG = get_logger(__name__)
+
+di = injector.get_di()
+
+
+@di.dependsOn('data_manager')
+def create_image(image_wrapper, image_uuid, transaction_id):
+    DataManager = di.resolver.unpack(create_image)
+    datamanager = DataManager()
+
+    image_wrapper.image.id = image_uuid
+
+    image_wrapper.image.created_at = str(int(time.time()))
+    image_wrapper.image.updated_at = image_wrapper.image.created_at
+
+    try:
+        image_wrapper.handle_region_group()
+        image_wrapper.validate_model()
+        sql_image = image_wrapper.to_db_model()
+
+        image_rec = datamanager.get_record('image')
+
+        datamanager.begin_transaction()
+        image_rec.insert(sql_image)
+        datamanager.flush()  # i want to get any exception created by this
+        # insert
+        existing_region_names = []
+        send_to_rds_if_needed(sql_image, existing_region_names, "post",
+                              transaction_id)
+
+        datamanager.commit()
+
+        ret_image = get_image_by_uuid(image_uuid)
+        return ret_image
+
+    except Exception as exp:
+        LOG.log_exception("ImageLogic - Failed to CreateImage", exp)
+        datamanager.rollback()
+        raise
+
+
+@di.dependsOn('rds_proxy')
+def send_to_rds_if_needed(sql_image, existing_region_names, http_action,
+                          transaction_id):
+    rds_proxy = di.resolver.unpack(send_to_rds_if_needed)
+    if (sql_image.regions and len(sql_image.regions) > 0) or len(
+            existing_region_names) > 0:
+        image_dict = sql_image.get_proxy_dict()
+        update_region_actions(image_dict, existing_region_names, http_action)
+        if image_dict['regions'] or len(existing_region_names) > 0:
+            LOG.debug("Image is valid to send to RDS - sending to RDS Proxy ")
+            rds_proxy.send_image(image_dict, transaction_id, http_action)
+        else:
+            LOG.debug("Group with no regions - wasn't send to RDS Proxy " + str(
+                sql_image))
+    else:
+        LOG.debug("Image with no regions - wasn't send to RDS Proxy " + str(
+            sql_image))
+
+
+@di.dependsOn('data_manager')
+def update_image(image_wrapper, image_uuid, transaction_id, http_action="put"):
+    DataManager = di.resolver.unpack(update_image)
+    datamanager = DataManager()
+
+    try:
+        image_wrapper.validate_model('update')
+        new_image = image_wrapper.to_db_model()
+        new_image.id = image_uuid
+
+        datamanager.begin_transaction()
+
+        image_rec = datamanager.get_record('image')
+        sql_image = image_rec.get_image_by_id(image_uuid)
+
+        if sql_image is None:
+            raise NotFoundError(status_code=404,
+                                message="Image {0} does not exist for update".format(
+                                    image_uuid))
+
+        new_image.owner = sql_image.owner
+        existing_regions = sql_image.get_existing_region_names()
+        new_image.created_at = int(sql_image.created_at)
+        new_image.updated_at = int(time.time())
+        # result = image_rec.delete_image_by_id(image_uuid)
+        datamanager.get_session().delete(sql_image)
+        # del sql_image
+        image_rec.insert(new_image)
+        datamanager.flush()
+
+        send_to_rds_if_needed(new_image, existing_regions, http_action,
+                              transaction_id)
+
+        datamanager.commit()
+
+        ret_image = get_image_by_uuid(image_uuid)
+
+        return ret_image
+
+    except Exception as exp:
+        datamanager.rollback()
+        LOG.log_exception("ImageLogic - Failed to update image", exp)
+        raise
+
+
+@di.dependsOn('rds_proxy')
+@di.dependsOn('data_manager')
+def delete_image_by_uuid(image_uuid, transaction_id):
+    rds_proxy, DataManager = di.resolver.unpack(delete_image_by_uuid)
+    datamanager = DataManager()
+
+    try:
+
+        datamanager.begin_transaction()
+        image_rec = datamanager.get_record('image')
+
+        sql_image = image_rec.get_image_by_id(image_uuid)
+        if sql_image is None:
+            return
+
+        image_existing_region_names = sql_image.get_existing_region_names()
+        if len(image_existing_region_names) > 0:
+            # Do not delete a flavor that still has some regions
+            raise ErrorStatus(405,
+                              "Cannot delete a image with regions. "
+                              "Please delete the regions first and then "
+                              "delete the image. ")
+
+        # Get status from RDS
+        image_status = rds_proxy.get_status(sql_image.id, False)
+
+        status_resp = None
+
+        if image_status.status_code == 200:
+            status_resp = image_status.json()['status']
+            LOG.debug('RDS returned status: {}'.format(status_resp))
+
+        elif image_status.status_code == 404:
+            status_resp = 'Success'
+
+        else:
+            # fail to get status from rds
+            raise ErrorStatus(500, "fail to get status for this resource "
+                                   "deleting image not allowed ")
+
+        if status_resp != 'Success':
+            raise ErrorStatus(405, "not allowed as aggregate status "
+                                   "have to be Success (either the deletion"
+                                   " failed on one of the regions or it is "
+                                   "still in progress)")
+
+        image_rec.delete_image_by_id(image_uuid)
+        datamanager.flush()  # i want to get any exception created by this
+
+        # delete
+        datamanager.commit()
+
+    except Exception as exp:
+        LOG.log_exception("ImageLogic - Failed to delete image", exp)
+        datamanager.rollback()
+        raise
+
+
+@di.dependsOn('data_manager')
+def add_regions(image_uuid, regions, transaction_id):
+    DataManager = di.resolver.unpack(add_regions)
+    datamanager = DataManager()
+
+    try:
+        image_rec = datamanager.get_record('image')
+        sql_image = image_rec.get_image_by_id(image_uuid)
+        if not sql_image:
+            raise ErrorStatus(404, 'image with id: {0} not found'.format(
+                image_uuid))
+
+        existing_region_names = sql_image.get_existing_region_names()
+
+        for region in regions.regions:
+            db_region = ImageRegion(region_name=region.name, region_type=region.type)
+            sql_image.add_region(db_region)
+
+        datamanager.flush()  # i want to get any exception created by
+        # previous actions against the database
+
+        send_to_rds_if_needed(sql_image, existing_region_names, "put",
+                              transaction_id)
+
+        datamanager.commit()
+
+        image_wrapper = get_image_by_uuid(image_uuid)
+        ret = RegionWrapper(regions=image_wrapper.image.regions)
+        return ret
+
+    except ErrorStatus as exp:
+        LOG.log_exception("ImageLogic - Failed to add regions", exp)
+        datamanager.rollback()
+        raise exp
+    except Exception as exp:
+        LOG.log_exception("ImageLogic - Failed to add regions", exp)
+        datamanager.rollback()
+        raise exp
+
+
+@di.dependsOn('data_manager')
+def replace_regions(image_uuid, regions, transaction_id):
+    DataManager = di.resolver.unpack(replace_regions)
+    datamanager = DataManager()
+
+    try:
+        image_rec = datamanager.get_record('image')
+        sql_image = image_rec.get_image_by_id(image_uuid)
+        if not sql_image:
+            raise ErrorStatus(404, 'image with id: {0} not found'.format(
+                image_uuid))
+
+        existing_region_names = sql_image.get_existing_region_names()
+
+        sql_image.remove_all_regions()
+        datamanager.flush()
+
+        for region in regions.regions:
+            db_region = ImageRegion(region_name=region.name, region_type=region.type)
+            sql_image.add_region(db_region)
+        datamanager.flush()  # i want to get any exception created by
+        # previous actions against the database
+
+        send_to_rds_if_needed(sql_image, existing_region_names, "put",
+                              transaction_id)
+
+        datamanager.commit()
+
+        image_wrapper = get_image_by_uuid(image_uuid)
+        ret = RegionWrapper(regions=image_wrapper.image.regions)
+        return ret
+
+    except ErrorStatus as exp:
+        LOG.log_exception("ImageLogic - Failed to replace regions", exp)
+        datamanager.rollback()
+        raise exp
+    except Exception as exp:
+        LOG.log_exception("ImageLogic - Failed to repalce regions", exp)
+        datamanager.rollback()
+        raise exp
+
+
+@di.dependsOn('data_manager')
+def delete_region(image_uuid, region_name, transaction_id):
+    DataManager = di.resolver.unpack(delete_region)
+    datamanager = DataManager()
+
+    try:
+        image_rec = datamanager.get_record('image')
+        sql_image = image_rec.get_image_by_id(image_uuid)
+        if not sql_image:
+            raise ErrorStatus(404, 'image with id: {0} not found'.format(
+                image_uuid))
+
+        existing_region_names = sql_image.get_existing_region_names()
+
+        sql_image.remove_region(region_name)
+
+        datamanager.flush()  # i want to get any exception created by
+        # previous actions against the database
+        send_to_rds_if_needed(sql_image, existing_region_names, "put",
+                              transaction_id)
+
+        datamanager.commit()
+
+    except ErrorStatus as exp:
+        LOG.log_exception("ImageLogic - Failed to update image", exp)
+        datamanager.rollback()
+        raise
+
+    except Exception as exp:
+        LOG.log_exception("ImageLogic - Failed to delete region", exp)
+        datamanager.rollback()
+        raise
+
+
+@di.dependsOn('data_manager')
+def add_customers(image_uuid, customers, transaction_id):
+    DataManager = di.resolver.unpack(add_customers)
+    datamanager = DataManager()
+
+    try:
+        image_rec = datamanager.get_record('image')
+        sql_image = image_rec.get_image_by_id(image_uuid)
+        if not sql_image:
+            raise ErrorStatus(404, 'image with id: {0} not found'.format(
+                image_uuid))
+
+        if sql_image.visibility == "public":
+            raise ErrorStatus(400, 'Cannot add Customers to public Image')
+
+        existing_region_names = sql_image.get_existing_region_names()
+
+        for user in customers.customers:
+            db_Customer = ImageCustomer(customer_id=user)
+            sql_image.add_customer(db_Customer)
+
+        datamanager.flush()  # i want to get any exception created by
+        # previous actions against the database
+        send_to_rds_if_needed(sql_image, existing_region_names, "put",
+                              transaction_id)
+        datamanager.commit()
+
+        ret_image = get_image_by_uuid(image_uuid)
+        return ret_image
+
+    except Exception as exp:
+        if 'conflicts with persistent instance' in exp.message or 'Duplicate entry' in exp.message:
+            raise ErrorStatus(409, "Duplicate Customer for Image")
+        LOG.log_exception("ImageLogic - Failed to add Customers", exp)
+        datamanager.rollback()
+        raise
+
+
+@di.dependsOn('data_manager')
+def replace_customers(image_uuid, customers, transaction_id):
+    DataManager = di.resolver.unpack(replace_customers)
+    datamanager = DataManager()
+
+    try:
+        image_rec = datamanager.get_record('image')
+        sql_image = image_rec.get_image_by_id(image_uuid)
+        if not sql_image:
+            raise ErrorStatus(404, 'image {0} not found'.format(image_uuid))
+
+        if sql_image.visibility == "public":
+            raise ValueError('Cannot add Customers to public Image')
+
+        existing_region_names = sql_image.get_existing_region_names()
+        sql_image.remove_all_customers()
+        datamanager.flush()
+
+        for cust in customers.customers:
+            db_Customer = ImageCustomer(customer_id=cust)
+            sql_image.add_customer(db_Customer)
+
+        datamanager.flush()  # get exception created by previous db actions
+        send_to_rds_if_needed(sql_image, existing_region_names, "put",
+                              transaction_id)
+        datamanager.commit()
+
+        ret_image = get_image_by_uuid(image_uuid)
+        return ret_image
+
+    except Exception as exp:
+        if 'conflicts with persistent instance' in exp.message or 'Duplicate entry' in exp.message:
+            raise ErrorStatus(409, "Duplicate Customer for Image")
+        LOG.log_exception("ImageLogic - Failed to add Customers", exp)
+        datamanager.rollback()
+        raise
+
+
+@di.dependsOn('data_manager')
+def delete_customer(image_uuid, customer_id, transaction_id):
+    DataManager = di.resolver.unpack(delete_customer)
+    datamanager = DataManager()
+
+    try:
+        image_rec = datamanager.get_record('image')
+        sql_image = image_rec.get_image_by_id(image_uuid)
+        if not sql_image:
+            raise ErrorStatus(404, 'image {0} not found'.format(image_uuid))
+        # if trying to delete the only one Customer then return value error
+        if sql_image.visibility == "public":
+            raise ValueError("Image {} is public, no customers".format(image_uuid))
+
+        if len(sql_image.customers) == 1 and \
+                sql_image.customers[0].customer_id == customer_id:
+            raise ValueError('Private Image must have at least one Customer - '
+                             'You are trying to delete the only one Customer')
+
+        existing_region_names = sql_image.get_existing_region_names()
+        sql_image.remove_customer(customer_id)
+
+        datamanager.flush()  # i want to get any exception created by
+        # previous actions against the database
+        send_to_rds_if_needed(sql_image, existing_region_names, "put",
+                              transaction_id)
+        datamanager.commit()
+
+    except Exception as exp:
+        LOG.log_exception("ImageLogic - Failed to delete Customer", exp)
+        datamanager.rollback()
+        raise
+
+
+@di.dependsOn('data_manager')
+@di.dependsOn('rds_proxy')
+def get_image_by_uuid(image_uuid):
+    DataManager, rds_proxy = di.resolver.unpack(get_image_by_uuid)
+    datamanager = DataManager()
+
+    LOG.debug("Get image by uuid : {}".format(image_uuid))
+    try:
+
+        datamanager.begin_transaction()
+
+        image_rec = datamanager.get_record('image')
+        sql_image = image_rec.get_image_by_id(image_uuid)
+
+        if not sql_image:
+            raise NotFoundError(status_code=404,
+                                message="Image {0} not found ".format(
+                                    image_uuid))
+
+        image_wrapper = ImageWrapper.from_db_model(sql_image)
+
+        # get image own link
+        image_wrapper.image.links, image_wrapper.image.self_link = ImsUtils.get_server_links(image_uuid)
+        # convert time stamp format to human readable time
+        image_wrapper.image.created_at = ImsUtils.convert_time_human(
+            image_wrapper.image.created_at)
+        image_wrapper.image.updated_at = ImsUtils.convert_time_human(
+            image_wrapper.image.updated_at)
+        # Get the status from RDS
+        image_status = rds_proxy.get_status(image_wrapper.image.id, False)
+
+        if image_status.status_code != 200:
+            return image_wrapper
+        image_status = image_status.json()
+        image_wrapper.image.status = image_status['status']
+        # update status for all regions
+        for result_regions in image_wrapper.image.regions:
+            for status_region in image_status['regions']:
+                if result_regions.name == status_region['region']:
+                    result_regions.status = status_region['status']
+
+    except NotFoundError as exp:
+        datamanager.rollback()
+        LOG.log_exception("ImageLogic - Failed to update image", exp)
+        raise exp
+
+    except Exception as exp:
+        datamanager.rollback()
+        LOG.log_exception("ImageLogic - Failed to delete Customer", exp)
+        raise
+
+    return image_wrapper
+
+
+@di.dependsOn('data_manager')
+def get_image_list_by_params(visibility, region, Customer):
+    DataManager = di.resolver.unpack(get_image_list_by_params)
+
+    datamanager = DataManager()
+    try:
+        image_record = datamanager.get_record('image')
+        sql_images = image_record.get_images_by_criteria(visibility=visibility,
+                                                         region=region,
+                                                         Customer=Customer)
+
+        response = ImageSummaryResponse()
+        for sql_image in sql_images:
+            image = ImageSummary.from_db_model(sql_image)
+            response.images.append(image)
+
+        return response
+
+    except ErrorStatus as exp:
+        LOG.log_exception("ImageLogic - Failed to get list", exp)
+        raise
+    except Exception as exp:
+        LOG.log_exception("ImageLogic - Failed to get list", exp)
+        raise
+
+
+def update_region_actions(image_dict, existing_region_names, action="put"):
+    if action == "delete":
+        set_regions_action(image_dict, "delete")
+    elif action == "post":
+        set_regions_action(image_dict, "create")
+    else:  # put
+        for region in image_dict["regions"]:
+            if region["name"] in existing_region_names:
+                region["action"] = "modify"
+            else:
+                region["action"] = "create"
+
+        # add deleted regions
+        for exist_region_name in existing_region_names:
+            if region_name_exist_in_regions(exist_region_name,
+                                            image_dict["regions"]):
+                continue
+            else:
+                image_dict["regions"].append(
+                    {"name": exist_region_name, "action": "delete"})
+
+
+def region_name_exist_in_regions(region_name, regions):
+    for region in regions:
+        if region["name"] == region_name:
+            return True
+    return False
+
+
+def set_regions_action(image_dict, action):
+    for region in image_dict["regions"]:
+        region["action"] = action
+
+
+@di.dependsOn('data_manager')
+def enable_image(image_uuid, int_enabled, transaction_id):
+    DataManager = di.resolver.unpack(enable_image)
+    datamanager = DataManager()
+
+    try:
+        image_rec = datamanager.get_record('image')
+        sql_image = image_rec.get_image(image_uuid)
+        if not sql_image:
+            raise ErrorStatus(404, 'Image with id: {0} not found'.format(
+                image_uuid))
+
+        sql_image.enabled = int_enabled
+
+        existing_region_names = sql_image.get_existing_region_names()
+
+        datamanager.flush()  # i want to get any exception created by this
+        # insert method
+
+        send_to_rds_if_needed(sql_image, existing_region_names, "put",
+                              transaction_id)
+
+        datamanager.commit()
+
+        ret_image = get_image_by_uuid(image_uuid)
+        return ret_image
+
+    except ErrorStatus as exp:
+        LOG.log_exception("ImageLogic - Failed to change image activation value", exp)
+        datamanager.rollback()
+        raise exp
+    except Exception as exp:
+        LOG.log_exception("ImageLogic - Failed to change image activation value", exp)
+        datamanager.rollback()
+        raise exp
diff --git a/orm/services/image_manager/ims/logic/metadata_logic.py b/orm/services/image_manager/ims/logic/metadata_logic.py
new file mode 100644
index 00000000..5b42f958
--- /dev/null
+++ b/orm/services/image_manager/ims/logic/metadata_logic.py
@@ -0,0 +1,33 @@
+from ims.logger import get_logger
+from ims.logic.error_base import ErrorStatus
+from orm_common.injector import injector
+
+LOG = get_logger(__name__)
+
+di = injector.get_di()
+
+
+@di.dependsOn('data_manager')
+def add_metadata(image_id, region_name, metadata_wrapper):
+    DataManager = di.resolver.unpack(add_metadata)
+    datamanager = DataManager()
+
+    try:
+        image_rec = datamanager.get_record('image')
+        sql_image = image_rec.get_image_by_id(image_id)
+        if not sql_image:
+            raise ErrorStatus(404, 'image {0} not found'.format(image_id))
+
+        for region in sql_image.regions:
+            if region.region_name == region_name:
+                region.checksum = metadata_wrapper.metadata.checksum
+                region.size = metadata_wrapper.metadata.size
+                region.virtual_size = metadata_wrapper.metadata.virtual_size
+
+        datamanager.flush()
+        datamanager.commit()
+
+    except Exception as exp:
+        LOG.log_exception("ImageLogic - Failed to add regions", exp)
+        datamanager.rollback()
+        raise
diff --git a/orm/services/image_manager/ims/persistency/__init__.py b/orm/services/image_manager/ims/persistency/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/persistency/sql_alchemy/__init__.py b/orm/services/image_manager/ims/persistency/sql_alchemy/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/persistency/sql_alchemy/data_manager.py b/orm/services/image_manager/ims/persistency/sql_alchemy/data_manager.py
new file mode 100755
index 00000000..c3a69f3e
--- /dev/null
+++ b/orm/services/image_manager/ims/persistency/sql_alchemy/data_manager.py
@@ -0,0 +1,89 @@
+from sqlalchemy import create_engine
+from sqlalchemy.orm import sessionmaker
+from sqlalchemy.event import listen
+from sqlalchemy import exc
+from pecan import conf
+from oslo_db.sqlalchemy import session as db_session
+from ims.logger import get_logger
+
+from ims.persistency.sql_alchemy.image.image_record import ImageRecord
+from ims.logic.error_base import DuplicateEntityError
+
+
+LOG = get_logger(__name__)
+
+
+# event handling
+def on_before_flush(session, flush_context, instances):
+    print("on_before_flush:", str(flush_context))
+    for model in session.new:
+        if hasattr(model, "validate"):
+            model.validate("new")
+
+    for model in session.dirty:
+        if hasattr(model, "validate"):
+            model.validate("dirty")
+
+
+class DataManager(object):
+
+    def __init__(self, connection_string=None):
+
+        if not connection_string:
+            connection_string = conf.database.connection_string
+
+        self._engine_facade = db_session.EngineFacade(connection_string, autocommit=False)
+        self._session = None
+        listen(self.session, 'before_flush', on_before_flush)
+        self.image_record = None
+
+    def get_engine(self):
+        return self._engine_facade.get_engine()
+
+    @property
+    def engine(self):
+        return self.get_engine()
+
+    def get_session(self):
+        if not self._session:
+            self._session = self._engine_facade.get_session()
+        return self._session
+
+    @property
+    def session(self):
+        return self.get_session()
+
+    def flush(self):
+        try:
+            self.session.flush()
+        except Exception as exp:
+            raise
+
+    def commit(self):
+        self.session.commit()
+
+    def expire_all(self):
+        self.session.expire_all()
+
+    def close(self):
+        self.session.close()
+
+    def rollback(self):
+        self.session.rollback()
+
+    def close(self):
+        self.session.close()
+        self.engine.dispose()
+
+    def begin_transaction(self):
+        pass
+        # no need to begin transaction - the transaction is open automatically
+
+    def get_record(self, record_name):
+        if record_name == "Image" or record_name == "image":
+            if not self.image_record:
+                self.image_record = ImageRecord(self.session)
+            return self.image_record
+        return None
+
+#      7540 ProCG uses this line - don't edit it
diff --git a/orm/services/image_manager/ims/persistency/sql_alchemy/db_models.py b/orm/services/image_manager/ims/persistency/sql_alchemy/db_models.py
new file mode 100755
index 00000000..64d991f2
--- /dev/null
+++ b/orm/services/image_manager/ims/persistency/sql_alchemy/db_models.py
@@ -0,0 +1,408 @@
+###
+# This file was generated by ProCG version 2.0
+#
+# File name:   ims\persitency\sql_alchemy\db_models.py
+# Language:    Python 2.7
+# Database:    My Sql
+#
+# Copyright (c) 2002-2016 iGenXSoft.
+# For more information visit http://www.igenxsoft.com
+###
+
+from sqlalchemy import (Column, Integer, SmallInteger, String,
+                        ForeignKeyConstraint)
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.orm import relationship
+from oslo_db.sqlalchemy import models
+
+from ims.logger import get_logger
+from orm_common.utils.cross_api_utils import get_regions_of_group, set_utils_conf
+from pecan import conf
+from ims.logic.error_base import NotFoundError
+from ims.logic.error_base import ErrorStatus
+Base = declarative_base()
+
+LOG = get_logger(__name__)
+
+
+class IMSBaseModel(models.ModelBase):
+
+    """Base class from IMS Models."""
+
+    __table_args__ = {'mysql_engine': 'InnoDB'}
+
+
+class Image(Base, IMSBaseModel):
+    ###
+    # Image is a DataObject and contains all the fields defined in Image table
+    # record. Defined as SqlAlchemy model map to a table
+    ###
+    __tablename__ = "image"
+
+    def __init__(self,
+                 id=None,
+                 name=None,
+                 enabled=None,
+                 url=None,
+                 protected=None,
+                 visibility=None,
+                 disk_format=None,
+                 container_format=None,
+                 min_disk=None,
+                 min_ram=None,
+                 owner=None,
+                 schema=None,
+                 created_at=None,
+                 updated_at=None):
+
+        self.id = id
+        self.name = name
+        self.enabled = enabled
+        self.url = url
+        self.protected = protected
+        self.visibility = visibility
+        self.disk_format = disk_format
+        self.container_format = container_format
+        self.min_disk = min_disk
+        self.min_ram = min_ram
+        self.owner = owner
+        self.schema = schema
+        self.created_at = created_at
+        self.updated_at = updated_at
+
+    id = Column(String, primary_key=True)
+    name = Column(String)
+    enabled = Column(SmallInteger)
+    url = Column(String)
+    protected = Column(SmallInteger)
+    visibility = Column(String)
+    disk_format = Column(String)
+    container_format = Column(String)
+    min_disk = Column(Integer)
+    min_ram = Column(Integer)
+    owner = Column(String)
+    schema = Column(String)
+    created_at = Column(Integer)
+    updated_at = Column(Integer)
+    properties = relationship("ImageProperty", uselist=True,
+                              cascade="all, delete, delete-orphan",
+                              primaryjoin="and_(Image.id==ImageProperty.image_id)")
+    regions = relationship("ImageRegion", uselist=True,
+                           cascade="all, delete, delete-orphan",
+                           primaryjoin="and_(Image.id==ImageRegion.image_id)")
+    tags = relationship("ImageTag", uselist=True,
+                        cascade="all, delete, delete-orphan",
+                        primaryjoin="and_(Image.id==ImageTag.image_id)")
+    customers = relationship("ImageCustomer",
+                             uselist=True,
+                             cascade="all, delete, delete-orphan",
+                             primaryjoin="and_(Image.id==ImageCustomer.image_id)")
+
+    def __json__(self):
+        properties = {}
+        # don't send tags to rds server
+        # tags = {}
+
+        for prop in self.properties:
+            properties[prop.key_name] = prop.key_value
+
+        return dict(
+            id=self.id,
+            name=self.name,
+            enabled=self.enabled * 1,
+            url=self.url,
+            protected=self.protected * 1,
+            visibility=self.visibility,
+            disk_format=self.disk_format,
+            container_format=self.container_format,
+            min_disk=self.min_disk,
+            min_ram=self.min_ram,
+            owner=self.owner,
+            schema=self.schema,
+            created_at=self.created_at,
+            updated_at=self.updated_at,
+            properties=properties,
+            regions=self.get_regions_json(),
+            customers=[customer.__json__() for customer in self.customers]
+        )
+
+    def get_proxy_dict(self):
+        proxy_dict = self.__json__()
+
+        return proxy_dict
+
+    def get_regions_json(self):
+        regions_json = []
+        for region in self.regions:
+            region_json = region.__json__()
+            regions_json.append(region_json)
+        return regions_json
+
+    def get_existing_region_names(self):
+        existing_region_names = []
+        for region in self.get_proxy_dict()['regions']:
+            existing_region_names.append(region['name'])
+        return existing_region_names
+
+    def add_region(self, image_region):
+        assert isinstance(image_region, ImageRegion)
+        try:
+            LOG.debug("add region {0} to image {1}".format(str(image_region),
+                                                           str(self)))
+            region_list = filter(lambda region: region.region_name == image_region.region_name, self.regions)
+            if len(region_list) > 0:
+                raise ErrorStatus(409, "Region {} already exist in Image {}".format(image_region.region_name, self.name))
+            self.regions.append(image_region)
+
+        except Exception as exception:
+            LOG.log_exception("Failed to add region {0} to image {1}".format(
+                str(image_region), str(self)), exception)
+            raise
+
+    def remove_region(self, region_name):
+        assert isinstance(region_name, basestring)
+        try:
+            LOG.debug("remove regions {0} from image {1}".format(region_name,
+                                                                 str(self)))
+            region_found = False
+            for region in reversed(self.regions):
+                if region.region_name == region_name:
+                    self.regions.remove(region)
+                    region_found = True
+
+            if not region_found:
+                raise NotFoundError("Region {} not found in Image {} (name - {}) ".format(region_name, self.id, self.name))
+
+        except Exception as exception:
+            LOG.log_exception(
+                "Failed to remove region {0} from image {1}".format(
+                    region_name, str(self)), exception)
+            raise
+
+    def remove_all_regions(self):
+        try:
+            LOG.debug("remove regions from image {0}".format(str(self)))
+            for region in reversed(self.regions):
+                    self.regions.remove(region)
+
+        except Exception as exception:
+            LOG.log_exception("Failed to remove regions from image {0}".format(str(self)), exception)
+            raise
+
+    def add_customer(self, image_customer):
+        assert isinstance(image_customer, ImageCustomer)
+        try:
+            LOG.debug("add customer {0} to image {1}".format(str(image_customer), str(self)))
+            self.customers.append(image_customer)
+
+        except Exception as exception:
+            LOG.log_exception("Failed to add customer {0} from image {1}".format(str(image_customer), str(self)), exception)
+
+    def remove_customer(self, customer_id):
+        assert isinstance(customer_id, basestring)
+        try:
+            LOG.debug("remove customers {0} from image {1}".format(customer_id,
+                                                                   str(self)))
+
+            for customer in reversed(self.customers):
+                if customer.customer_id == customer_id:
+                    self.customers.remove(customer)
+
+        except Exception as exception:
+            LOG.log_exception(
+                "Failed to remove customer {0} from image {1}".format(
+                    customer_id, str(self)), exception)
+
+    def remove_all_customers(self):
+        try:
+            LOG.debug("remove customers from image {0}".format(str(self)))
+
+            for customer in reversed(self.customers):
+                    self.customers.remove(customer)
+
+        except Exception as exception:
+            LOG.log_exception("Failed to remove customers from image"
+                              " {0}".format(str(self)), exception)
+
+    def __repr__(self):
+        text = "Image(id='{}', name='{}', enabled={}, url='{}', " \
+               "protected='{}', visibility='{}', disk_format='{}', " \
+               "container_format='{}', min_disk={}, min_ram={}, owner='{}', " \
+               "schema='{}', created_at='{}', updated_at='{}')"\
+            .format(self.id, self.name, self.enabled, self.url, self.protected,
+                    self.visibility, self.disk_format, self.container_format,
+                    self.min_disk, self.min_ram, self.owner, self.schema,
+                    self.created_at, self.updated_at)
+        return text
+
+
+class ImageProperty(Base, IMSBaseModel):
+    ###
+    # ImageProperty is a DataObject and contains all the fields defined in
+    # ImageProperty table record. Defined as SqlAlchemy model map to a table
+    ###
+    __tablename__ = "image_property"
+
+    def __init__(self,
+                 image_id=None,
+                 key_name=None,
+                 key_value=None):
+
+        self.image_id = image_id
+        self.key_name = key_name
+        self.key_value = key_value
+
+    image_id = Column(String, primary_key=True)
+    key_name = Column(String, primary_key=True)
+    key_value = Column(String)
+    image = relationship("Image", uselist=False,
+                         primaryjoin="and_(ImageProperty.image_id==Image.id)")
+    __table_args__ = (
+        ForeignKeyConstraint(
+            ["image_id"],
+            ["image.id"],
+            name="image_properties_ibfk_1"
+        ),
+    )
+
+    def __json__(self):
+        return dict(
+            image_id=self.image_id,
+            key_name=self.key_name,
+            key_value=self.key_value
+        )
+
+    def __repr__(self):
+        text = "ImageProperty(image_id='{}', key_name='{}'," \
+               " key_value='{}')".format(self.image_id, self.key_name,
+                                         self.key_value)
+        return text
+
+
+class ImageRegion(Base, IMSBaseModel):
+    ###
+    # ImageRegion is a DataObject and contains all the fields defined in
+    # ImageRegion table record. Defined as SqlAlchemy model map to a table
+    ###
+    def __init__(self, region_name=None, region_type=None,
+                 checksum="", size="", virtual_size=""):
+        Base.__init__(self)
+        self.region_name = region_name
+        self.region_type = region_type
+        self.checksum = checksum
+        self.size = size
+        self.virtual_size = virtual_size
+
+    __tablename__ = "image_region"
+
+    image_id = Column(String, primary_key=True)
+    region_name = Column(String, primary_key=True)
+    region_type = Column(String)
+    checksum = Column(String)
+    size = Column(String)
+    virtual_size = Column(String)
+    image = relationship("Image", uselist=False,
+                         primaryjoin="and_(ImageRegion.image_id==Image.id)")
+    __table_args__ = (
+        ForeignKeyConstraint(
+            ["image_id"],
+            ["image.id"],
+            name="image_region_ibfk_1"
+        ),
+    )
+
+    def __json__(self):
+        return dict(
+            image_id=self.image_id,
+            name=self.region_name,
+            type=self.region_type,
+            checksum=self.checksum,
+            size=self.size,
+            virtual_size=self.virtual_size
+        )
+
+    @staticmethod
+    def get_group_regions(group_name):
+        set_utils_conf(conf)
+        regions = get_regions_of_group(group_name)
+        return regions
+
+    def __repr__(self):
+        text = "ImageRegion(image_id='{}', region_name='{}'," \
+               "region_type='{}', checksum='{}', size='{}'," \
+               "virtual_size='{}')".format(self.image_id, self.region_name,
+                                           self.region_type, self.checksum,
+                                           self.size, self.virtual_size)
+        return text
+
+
+class ImageTag(Base, IMSBaseModel):
+    ###
+    # ImageTag is a DataObject and contains all the fields defined in ImageTag
+    # table record. Defined as SqlAlchemy model map to a table
+    ###
+    __tablename__ = "image_tag"
+
+    def __init__(self,
+                 image_id=None,
+                 tag=None):
+
+        self.image_id = image_id
+        self.tag = tag
+
+    image_id = Column(String, primary_key=True)
+    tag = Column(String, primary_key=True)
+    __table_args__ = (
+        ForeignKeyConstraint(
+            ["image_id"],
+            ["image.id"],
+            name="image_tags_ibfk_1"
+        ),
+    )
+
+    def __json__(self):
+        return dict(
+            image_id=self.image_id,
+            tag=self.tag
+        )
+
+    def __repr__(self):
+        text = "ImageTag(image_id='{}', tag='{}')".format(
+            self.image_id, self.tag)
+        return text
+
+
+class ImageCustomer(Base, IMSBaseModel):
+    ###
+    # ImageCustomer is a DataObject and contains all the fields defined in
+    # ImageCustomer table record. Defined as SqlAlchemy model map to a table
+    ###
+    __tablename__ = "image_customer"
+
+    def __init__(self,
+                 image_id=None,
+                 customer_id=None):
+
+        self.image_id = image_id
+        self.customer_id = customer_id
+
+    image_id = Column(String, primary_key=True)
+    customer_id = Column(String, primary_key=True)
+    __table_args__ = (
+        ForeignKeyConstraint(
+            ["image_id"],
+            ["image.id"],
+            name="image_customer_ibfk_1"
+        ),
+    )
+
+    def __json__(self):
+        return dict(
+            image_id=self.image_id,
+            customer_id=self.customer_id
+        )
+
+    def __repr__(self):
+        text = "ImageCustomer(image_id='{}', customer_id='{}')".format(
+            self.image_id, self.customer_id)
+        return text
diff --git a/orm/services/image_manager/ims/persistency/sql_alchemy/image/__init__.py b/orm/services/image_manager/ims/persistency/sql_alchemy/image/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/persistency/sql_alchemy/image/image_record.py b/orm/services/image_manager/ims/persistency/sql_alchemy/image/image_record.py
new file mode 100755
index 00000000..4b35d8c3
--- /dev/null
+++ b/orm/services/image_manager/ims/persistency/sql_alchemy/image/image_record.py
@@ -0,0 +1,181 @@
+from ims.persistency.sql_alchemy.db_models import Image
+from ims.persistency.sql_alchemy.db_models import ImageRegion
+from ims.persistency.sql_alchemy.db_models import ImageCustomer
+from ims.persistency.sql_alchemy.infra.record import Record
+from ims.logger import get_logger
+
+LOG = get_logger(__name__)
+
+
+class ImageRecord(Record):
+    def __init__(self, session):
+
+        # this model is uses only for the parameters of access mothods, not an instance of model in the database
+        self.__image = Image()
+        # self.set_record_data(self.__image)
+        # self.__image.clear()
+        Record.__init__(self)
+        self.__image = None
+        self.__TableName = "image"
+
+        if session:
+            self.set_db_session(session)
+
+    @property
+    def image(self):
+        return self.__image
+
+    @image.setter
+    def image(self, image):
+        self.__image = image
+
+    def insert(self, image):
+        try:
+            self.session.add(image)
+        except Exception as exception:
+            LOG.log_exception("Failed to insert image" + str(image), exception)
+            # LOG.error("Failed to insert image" + str(image) + " Exception:" + str(exception))
+            raise
+
+    def get_image(self, id):
+        try:
+            query = self.session.query(Image).filter(Image.id == id)
+            return query.first()
+        except Exception as exception:
+            message = "Failed to read_image:  id: {0}".format(id)
+            LOG.log_exception(message, exception)
+            raise
+
+    def delete_image_by_id(self, id):
+        try:
+            result = self.session.connection().execute("delete from image where id = '{0}'".format(id))
+            return result
+
+        except Exception as exception:
+            message = "Failed to delete_by_internal_id: internal_id: {0}".format(id)
+            LOG.log_exception(message, exception)
+            raise
+
+    def create_images_by_name_query(self, name):
+        try:
+            query = self.session.query(Image).filter(Image.name == name)
+            return query
+        except Exception as exception:
+            message = "Failed to create_images_by_name_query:  name: {0}".format(name)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_images_by_name(self, name, **kw):
+        try:
+            query = self.create_images_by_name_query(name)
+            query = self.customise_query(query, kw)
+            return query.all()
+        except Exception as exception:
+            message = "Failed to get_images_by_name:  name: {0}".format(name)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_image_by_id(self, id):
+        try:
+            image = self.session.query(Image).filter(Image.id == id)
+            return image.first()
+
+        except Exception as exception:
+            message = "Failed to get_image_by_id: id: {0}".format(id)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_count_of_images_by_name(self, name):
+        try:
+            query = self.create_images_by_name_query(name)
+            return query.count()
+        except Exception as exception:
+            message = "Failed to get_images_by_name_count:  name: {0}".format(name)
+            LOG.log_exception(message, exception)
+            raise
+
+    def create_images_by_visibility_query(self, visibility):
+        try:
+            query = self.session.query(Image).filter(Image.visibility == visibility)
+            return query
+        except Exception as exception:
+            message = "Failed to create_images_by_visibility_query:  visibility: {0}".format(visibility)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_images_by_visibility(self, visibility, **kw):
+        try:
+            query = self.create_images_by_visibility_query(visibility)
+            query = self.customise_query(query, kw)
+            return query.all()
+        except Exception as exception:
+            message = "Failed to get_images_by_visibility:  visibility: {0}".format(visibility)
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_count_of_images_by_visibility(self, visibility):
+        try:
+            query = self.create_images_by_visibility_query(visibility)
+            return query.count()
+        except Exception as exception:
+            message = "Failed to get_images_by_visibility_count:  visibility: {0}".format(visibility)
+            LOG.log_exception(message, exception)
+            raise
+
+    def create_all_images_query(self):
+        try:
+            query = self.session.query(Image).filter()
+            return query
+        except Exception as exception:
+            message = "Failed to create_all_images_query: ".format()
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_all_images(self, **kw):
+        try:
+            query = self.create_all_images_query()
+            query = self.customise_query(query, kw)
+            return query.all()
+        except Exception as exception:
+            message = "Failed to get_all_images: ".format()
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_count_of_all_images(self):
+        try:
+            query = self.create_all_images_query()
+            return query.count()
+        except Exception as exception:
+            message = "Failed to get_all_images_count: ".format()
+            LOG.log_exception(message, exception)
+            raise
+
+    def get_images_by_criteria(self, **criteria):
+        try:
+            LOG.debug("get_images_by_criteria: criteria: {0}".format(criteria))
+            visibility = criteria[
+                'visibility'] if 'visibility' in criteria else None
+            region = criteria['region'] if 'region' in criteria else None
+            Customer = criteria['Customer'] if 'Customer' in criteria else None
+
+            query = self.session.query(Image)
+
+            if region:
+                query = query.join(ImageRegion).filter(
+                    ImageRegion.image_id == Image.id,
+                    ImageRegion.region_name == region)
+            if Customer:
+                query = query.join(ImageCustomer).filter(
+                    ImageCustomer.image_id == Image.id,
+                    ImageCustomer.customer_id == Customer)
+            if visibility:
+                query = query.filter(Image.visibility == visibility)
+
+            query = self.customise_query(query, criteria)
+            return query.all()
+
+        except Exception as exception:
+            message = "Failed to get_images_by_criteria: criteria: {0}".format(
+                criteria)
+            LOG.log_exception(message, exception)
+            raise
diff --git a/orm/services/image_manager/ims/persistency/sql_alchemy/infra/__init__.py b/orm/services/image_manager/ims/persistency/sql_alchemy/infra/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/persistency/sql_alchemy/infra/record.py b/orm/services/image_manager/ims/persistency/sql_alchemy/infra/record.py
new file mode 100755
index 00000000..69327707
--- /dev/null
+++ b/orm/services/image_manager/ims/persistency/sql_alchemy/infra/record.py
@@ -0,0 +1,28 @@
+from ims.logger import get_logger
+
+LOG = get_logger(__name__)
+
+
+class Record(object):
+
+    def __init__(self):
+        self.session = None
+
+    def set_db_session(self, session):
+        self.session = session
+
+    @staticmethod
+    def customise_query(query, kw):
+        start = int(kw['start']) if 'start' in kw else 0
+        limit = int(kw['limit']) if 'limit' in kw else 0
+
+        if start > 0:
+            query = query.offset(start)
+
+        if limit > 0:
+            query = query.limit(limit)
+
+        print str(query)
+        return query
+
+#   5644 ProCG uses this line - don't edit it
diff --git a/orm/services/image_manager/ims/persistency/wsme/__init__.py b/orm/services/image_manager/ims/persistency/wsme/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/persistency/wsme/base.py b/orm/services/image_manager/ims/persistency/wsme/base.py
new file mode 100755
index 00000000..e15d05c1
--- /dev/null
+++ b/orm/services/image_manager/ims/persistency/wsme/base.py
@@ -0,0 +1,15 @@
+"""Base model module."""
+from wsme.rest.json import tojson
+from wsme import types as wtypes
+
+
+class Model(wtypes.DynamicBase):
+    """Base class for IMS models."""
+
+    def to_db_model(self):
+        """Get the object's DB model."""
+        raise NotImplementedError("This function was not implemented")
+
+    def tojson(self):
+        """Get the object's JSON representation."""
+        return tojson(type(self), self)
diff --git a/orm/services/image_manager/ims/persistency/wsme/models.py b/orm/services/image_manager/ims/persistency/wsme/models.py
new file mode 100755
index 00000000..3e3488ab
--- /dev/null
+++ b/orm/services/image_manager/ims/persistency/wsme/models.py
@@ -0,0 +1,463 @@
+"""Image model module."""
+import wsme
+from pecan import conf
+from pecan import request
+
+from ims.logic.error_base import ErrorStatus
+from ims.persistency.wsme.base import Model
+from ims.persistency.sql_alchemy import db_models
+from orm_common.utils.cross_api_utils import set_utils_conf, get_regions_of_group
+
+
+class Metadata(Model):
+    """region metadata model
+    """
+    checksum = wsme.wsattr(wsme.types.text, mandatory=False)
+    size = wsme.wsattr(wsme.types.text, mandatory=False)
+    virtual_size = wsme.wsattr(wsme.types.text, mandatory=False)
+
+    def __init__(self, checksum='', size='', virtual_size=''):
+        """region metadata model
+
+        :param checksum:  image checksum
+        :param size:  image size
+        :param virtual_size: image virtual size in lcp
+        """
+
+        self.checksum = checksum
+        self.size = size
+        self.virtual_size = virtual_size
+
+
+class MetadataWrapper(Model):
+    """region metadata model
+    """
+    metadata = wsme.wsattr(Metadata, mandatory=False)
+
+    def __init__(self, metadata=Metadata()):
+        """region metadata model
+
+        :param metadata:  metadata class
+        """
+
+        self.metadata = metadata
+
+
+class Region(Model):
+
+    name = wsme.wsattr(str, mandatory=True)
+    type = wsme.wsattr(str, default="single", mandatory=False)
+
+    # Output-only fields
+    status = wsme.wsattr(str, mandatory=False)
+    checksum = wsme.wsattr(wsme.types.text, mandatory=False)
+    size = wsme.wsattr(wsme.types.text, mandatory=False)
+    virtual_size = wsme.wsattr(wsme.types.text, mandatory=False)
+
+    def __init__(self, name="", type="single", status="", checksum='',
+                 size='', virtual_size=''):
+        """region array
+
+        :param name:  region names
+        :param type:  region type single/group
+        :param status:  region creation status
+        :param checksum:  image checksum
+        :param size:  image size
+        :param virtual_size: image virtual size in lcp
+        """
+
+        self.name = name
+        self.type = type
+        self.status = status
+        self.checksum = checksum
+        self.size = size
+        self.virtual_size = virtual_size
+
+    def to_db_model(self):
+        region_rec = db_models.ImageRegion()
+        region_rec.region_name = self.name
+        region_rec.region_type = self.type
+        region_rec.checksum = self.checksum
+        region_rec.size = self.size
+        region_rec.virtual_size = self.virtual_size
+
+        return region_rec
+
+
+class RegionWrapper(Model):  # pragma: no cover
+    """regions model
+    """
+    regions = wsme.wsattr([Region], mandatory=False)
+
+    def __init__(self, regions=[]):
+        """
+        :param regions: array of regions
+        """
+        self.regions = regions
+
+
+class CustomerWrapper(Model):  # pragma: no cover
+    """customers model
+    """
+    customers = wsme.wsattr(wsme.types.ArrayType(str), mandatory=False)
+
+    def __init__(self, customers=[]):
+        """
+        :param regions: array of regions
+        """
+        self.customers = customers
+
+
+class Image(Model):
+    """Image entity with all its related data."""
+
+    default_min_ram = 1024
+    default_min_disk = 1
+    default_protected = False
+
+    name = wsme.wsattr(wsme.types.text, mandatory=True)
+    enabled = wsme.wsattr(bool, mandatory=False)
+    url = wsme.wsattr(wsme.types.text, mandatory=True)
+    visibility = wsme.wsattr(wsme.types.text, mandatory=True)
+    disk_format = wsme.wsattr(wsme.types.text, mandatory=True,
+                              name='disk-format')
+    container_format = wsme.wsattr(wsme.types.text, mandatory=True,
+                                   name='container-format')
+    min_disk = wsme.wsattr(wsme.types.IntegerType(minimum=0), mandatory=False,
+                           default=default_min_disk, name='min-disk')
+    min_ram = wsme.wsattr(wsme.types.IntegerType(minimum=0), mandatory=False,
+                          default=default_min_ram, name='min-ram')
+    tags = wsme.wsattr(wsme.types.ArrayType(str), mandatory=False)
+    properties = wsme.wsattr(wsme.types.DictType(str, str), mandatory=False)
+    regions = wsme.wsattr(wsme.types.ArrayType(Region), mandatory=False)
+    customers = wsme.wsattr(wsme.types.ArrayType(str), mandatory=False)
+    owner = wsme.wsattr(wsme.types.text, mandatory=False)
+    schema = wsme.wsattr(wsme.types.text, mandatory=False)
+    protected = wsme.wsattr(bool, mandatory=False, default=default_protected)
+
+    # Output-only fields
+    id = wsme.wsattr(wsme.types.text, mandatory=False)
+    status = wsme.wsattr(wsme.types.text, mandatory=False)
+    created_at = wsme.wsattr(wsme.types.IntegerType(minimum=0),
+                             mandatory=False, name='created-at')
+    updated_at = wsme.wsattr(wsme.types.IntegerType(minimum=0),
+                             mandatory=False, name='updated-at')
+    locations = wsme.wsattr(wsme.types.ArrayType(str), mandatory=False)
+    self_link = wsme.wsattr(wsme.types.text, mandatory=False, name='self')
+    file = wsme.wsattr(wsme.types.text, mandatory=False)
+    links = wsme.wsattr(wsme.types.DictType(str, str), mandatory=False)
+
+    def __init__(self,
+                 id='',
+                 name='',
+                 enabled=True,
+                 url='',
+                 visibility='',
+                 disk_format='',
+                 container_format='',
+                 min_disk=default_min_disk,
+                 min_ram=default_min_ram,
+                 tags=[],
+                 properties={},
+                 regions=[],
+                 customers=[],
+                 status='',
+                 created_at=0,
+                 updated_at=0,
+                 locations=[],
+                 self_link='',
+                 protected=default_protected,
+                 file='',
+                 owner='',
+                 schema='',
+                 links={}):
+        """Create a new Image.
+
+        :param id: Image UUID
+        :param name: Image name
+        :param url: Image URL
+        :param visibility: Image visibility (public | private)
+        :param disk_format: Image file format
+        :param container_format: Image container format
+        :param min_disk: Minimum disk size required
+        :param min_ram: Minimum RAM required
+        :param tags: Image tags
+        :param properties: Image properties
+        :param regions: Regions to use the image
+        :param customers: Customers to use the image
+        :param owner: Image owner
+        :param schema: Image schema
+        :param protected: Is the image protected from deletion
+        """
+        self.id = id
+        self.name = name
+        self.enabled = enabled
+        self.url = url
+        self.visibility = visibility
+        self.disk_format = disk_format
+        self.container_format = container_format
+        self.min_disk = min_disk
+        self.min_ram = min_ram
+        self.tags = tags
+        self.properties = properties
+        self.regions = regions
+        self.customers = customers
+
+        self.status = status
+        self.created_at = created_at
+        self.updated_at = updated_at
+        self.locations = locations
+        self.self_link = self_link
+        self.protected = protected
+        self.file = file
+        self.owner = owner
+        self.schema = schema
+        self.links = links
+
+    def validate_model(self, context=None):
+        # Validate visibility
+        if self.visibility == 'public' and self.customers:
+            raise ErrorStatus(400,
+                              'Visibility is public but some customers were'
+                              ' specified!')
+        elif self.visibility == 'private' and not self.customers:
+            raise ErrorStatus(400,
+                              'Visibility is private but no customers were'
+                              ' specified!')
+
+        # Validate disk format
+        valid_disk_formats = ('ami', 'ari', 'aki', 'vhd', 'vmdk', 'raw',
+                              'qcow2', 'vdi', 'iso',)
+        if self.disk_format not in valid_disk_formats:
+            raise ErrorStatus(400, 'Invalid disk format!')
+
+        # validate customer input unique
+        customer_input = set()
+        for customer in self.customers:
+            if customer in customer_input:
+                raise ErrorStatus(400, "customer {} exist more than one".format(customer))
+            customer_input.add(customer)
+        # Validate container format
+        valid_container_formats = ('ami', 'ari', 'aki', 'bare', 'ovf', 'ova',
+                                   'docker')
+        if self.container_format not in valid_container_formats:
+            raise ErrorStatus(400, 'Invalid container format! {}'.format(self.container_format))
+
+        # Validate min-disk and min-ram (wsme automatically converts booleans
+        # to int, and isinstance(False, int) returns True, so that is how we
+        # validate the type)
+        if 'min-disk' in request.json['image'] and not type(
+                request.json['image']['min-disk']) == int:
+            raise ErrorStatus(400, 'min-disk must be an integer!')
+        if 'min-ram' in request.json['image'] and not type(
+                request.json['image']['min-ram']) == int:
+            raise ErrorStatus(400, 'min-ram must be an integer!')
+
+        if self.min_disk != wsme.Unset and int(self.min_disk) > 2147483646 or int(self.min_disk) < 0:
+            raise ErrorStatus(400,
+                              'value must be positive less than 2147483646')
+        if self.min_ram != wsme.Unset and int(self.min_ram) > 2147483646 or int(self.min_ram) < 0:
+            raise ErrorStatus(400,
+                              'value must be positive less than 2147483646')
+        if context == "update":
+            for region in self.regions:
+                if region.type == "group":
+                    raise ErrorStatus(400, "region {} type is invalid for update, \'group\' can be only in create".format(region.name))
+
+    def to_db_model(self):
+        image = db_models.Image()
+        tags = []
+        properties = []
+        customers = []
+        regions = []
+
+        for tag in self.tags:
+            tag_rec = db_models.ImageTag()
+            tag_rec.tag = tag
+            tags.append(tag_rec)
+
+        for key, value in self.properties.iteritems():
+            prop = db_models.ImageProperty()
+            prop.key_name = key
+            prop.key_value = value
+            properties.append(prop)
+
+        for region in self.regions:
+            regions.append(region.to_db_model())
+
+        for customer in self.customers:
+            customer_rec = db_models.ImageCustomer()
+            customer_rec.customer_id = customer
+            customers.append(customer_rec)
+
+        image.id = self.id
+        image.name = self.name
+        image.enabled = self.enabled
+        image.url = self.url
+        image.visibility = self.visibility
+        image.disk_format = self.disk_format
+        image.container_format = self.container_format
+        image.min_disk = self.min_disk
+        image.min_ram = self.min_ram
+        image.status = self.status
+        image.created_at = self.created_at
+        image.updated_at = self.updated_at
+        image.locations = self.locations
+        image.self_link = self.self_link
+        image.protected = self.protected
+        image.file = self.file
+        image.owner = self.owner
+        image.schema = self.schema
+        image.links = self.links
+
+        image.tags = tags
+        image.properties = properties
+        image.regions = regions
+        image.customers = customers
+
+        return image
+
+    @staticmethod
+    def from_db_model(sql_image):
+        image = Image()
+        image.id = sql_image.id
+        image.name = sql_image.name
+        image.enabled = sql_image.enabled == 1
+        image.url = sql_image.url
+        image.visibility = sql_image.visibility
+        image.disk_format = sql_image.disk_format
+        image.container_format = sql_image.container_format
+        image.min_disk = sql_image.min_disk
+        image.min_ram = sql_image.min_ram
+        image.protected = sql_image.protected == 1
+        image.owner = sql_image.owner
+        image.schema = sql_image.schema
+        image.created_at = sql_image.created_at
+        image.updated_at = sql_image.updated_at
+
+        for attribute in ('status', 'self_link', 'file'):
+            setattr(image, attribute, getattr(sql_image, attribute, ''))
+
+        for attribute in ('created_at', 'updated_at'):
+            setattr(image, attribute, getattr(sql_image, attribute, 0))
+
+        setattr(image, 'locations', getattr(sql_image, 'locations', []))
+        setattr(image, 'links', getattr(sql_image, 'links', {}))
+
+        image.customers = []
+        for customer in sql_image.customers:
+            image.customers.append(customer.customer_id)
+
+        image.regions = []
+        for sql_region in sql_image.regions:
+            region = Region()
+            region.name = sql_region.region_name
+            region.type = sql_region.region_type
+            region.checksum = sql_region.checksum
+            region.size = sql_region.size
+            region.virtual_size = sql_region.virtual_size
+            image.regions.append(region)
+
+        image.tags = []
+        for tag in sql_image.tags:
+            image.tags.append(tag.tag)
+
+        image.properties = {}
+        for prop in sql_image.properties:
+            image.properties[prop.key_name] = prop.key_value
+
+        return image
+
+    def handle_region_group(self):
+        regions_to_add = []
+        for region in self.regions[:]:  # get copy of it to be able to delete from the origin
+            if region.type == "group":
+                group_regions = self.get_regions_for_group(region.name)
+                if group_regions is None:
+                    raise ErrorStatus(404, "Group {} does not exist".format(region.name))
+                for group_region in group_regions:
+                    regions_to_add.append(Region(name=group_region, type='single'))
+                self.regions.remove(region)
+
+        self.regions.extend(set(regions_to_add))  # remove duplicates if exist
+
+    def get_regions_for_group(self, group_name):
+        set_utils_conf(conf)
+        regions = get_regions_of_group(group_name)
+        return regions
+
+
+class ImageWrapper(Model):
+    """image model
+
+    """
+    image = wsme.wsattr(Image, mandatory=True, name='image')
+
+    def __init__(self, image=Image()):
+        """
+
+        :param image: image dict
+        """
+
+        self.image = image
+
+    def to_db_model(self):
+        return self.image.to_db_model()
+
+    def validate_model(self, context=None):
+        return self.image.validate_model(context)
+
+    def handle_region_group(self):
+        return self.image.handle_region_group()
+
+    def get_extra_spec_needed(self):
+        return self.image.get_extra_spec_needed()
+
+    @staticmethod
+    def from_db_model(sql_image):
+        image = ImageWrapper()
+        image.image = Image.from_db_model(sql_image)
+        return image
+
+
+'''
+' ImageSummary a DataObject contains all the fields defined in ImageSummary.
+'''
+
+
+class ImageSummary(Model):
+    name = wsme.wsattr(wsme.types.text)
+    id = wsme.wsattr(wsme.types.text)
+    visibility = wsme.wsattr(wsme.types.text)
+
+    def __init__(self, name='', id='', visibility=''):
+        Model.__init__(self)
+
+        self.name = name
+        self.id = id
+        self.visibility = visibility
+
+    @staticmethod
+    def from_db_model(sql_image):
+        image = ImageSummary()
+        image.id = sql_image.id
+        image.name = sql_image.name
+        image.visibility = sql_image.visibility
+
+        return image
+
+
+class ImageSummaryResponse(Model):
+    images = wsme.wsattr([ImageSummary], mandatory=True)
+
+    def __init__(self):  # pragma: no cover
+        Model.__init__(self)
+        self.images = []
+
+
+class Enabled(Model):
+    enabled = wsme.wsattr(bool, mandatory=True)
+
+    def __init__(self, enabled=None):  # pragma: no cover
+        Model.__init__(self)
+        self.enabled = enabled
diff --git a/orm/services/image_manager/ims/proxies/__init__.py b/orm/services/image_manager/ims/proxies/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/proxies/rds_proxy.py b/orm/services/image_manager/ims/proxies/rds_proxy.py
new file mode 100755
index 00000000..969c3ac8
--- /dev/null
+++ b/orm/services/image_manager/ims/proxies/rds_proxy.py
@@ -0,0 +1,104 @@
+import json
+import pprint
+from pecan import conf
+from pecan import request
+from ims.logger import get_logger
+from orm_common.injector import injector
+from ims.logic.error_base import ErrorStatus
+di = injector.get_di()
+
+LOG = get_logger(__name__)
+
+headers = {'content-type': 'application/json'}
+
+
+@di.dependsOn('requests')
+def send_image(image_dict, transaction_id, action="put"):
+        # action can be "post" for creating image or "delete" for deleting image
+        requests = di.resolver.unpack(send_image)
+
+        data = {
+            "service_template":
+                {
+                    "resource": {
+                        "resource_type": "image"
+                    },
+                    "model": str(json.dumps(image_dict)),
+                    "tracking": {
+                        "external_id": "",
+                        "tracking_id": transaction_id
+                    }
+                }
+        }
+
+        data_to_display = {
+            "service_template":
+                {
+                    "resource": {
+                        "resource_type": "image"
+                    },
+                    "model": image_dict,
+                    "tracking": {
+                        "external_id": "",
+                        "tracking_id": transaction_id
+                    }
+                }
+        }
+        try:
+            pp = pprint.PrettyPrinter(width=30)
+            pretty_text = pp.pformat(data_to_display)
+            wrapper_json = json.dumps(data)
+
+            headers['X-RANGER-Client'] = request.headers[
+                'X-RANGER-Client'] if 'X-RANGER-Client' in request.headers else \
+                'NA'
+            headers['X-RANGER-Requester'] = request.headers[
+                'X-RANGER-Requester'] if 'X-RANGER-Requester' in request.headers else \
+                ''
+
+            LOG.debug("Wrapper JSON before sending action: {0} to Rds Proxy {1}".format(action, pretty_text))
+            LOG.info("Sending to RDS Server: " + conf.api.rds_server.base + conf.api.rds_server.resources)
+            if action == "post":
+                resp = requests.post(conf.api.rds_server.base + conf.api.rds_server.resources,
+                                     data=wrapper_json,
+                                     headers=headers, verify=conf.verify)
+            elif action == "put":
+                resp = requests.put(conf.api.rds_server.base + conf.api.rds_server.resources,
+                                    data=wrapper_json,
+                                    headers=headers, verify=conf.verify)
+            elif action == "delete":
+                resp = requests.delete(conf.api.rds_server.base + conf.api.rds_server.resources,
+                                       data=wrapper_json,
+                                       headers=headers, verify=conf.verify)
+            else:
+                raise Exception("Invalid action in RdxProxy.send_image("
+                                "image_dict, transaction_id, action) "
+                                "action can be post or delete, "
+                                "got {0}".format(action))
+
+            content = resp.content
+            LOG.debug("return from rds server status code: {0} "
+                      "content: {1}".format(resp.status_code, resp.content))
+            if resp.content and 200 <= resp.status_code < 300:
+                content = resp.json()
+            else:
+                # In case of error from rds, the response is WSME format response.
+                # the error message is within the 'faultstring'
+                raise ErrorStatus(resp.status_code,
+                                  json.loads(content)["faultstring"])
+
+        except Exception as exp:
+            LOG.log_exception("ImageLogic - Failed to update image", exp)
+            raise exp
+
+        return content
+
+
+@di.dependsOn('requests')
+def get_status(resource_id, json_convert=True):
+    requests = di.resolver.unpack(send_image)
+
+    resp = requests.get(conf.api.rds_server.base + conf.api.rds_server.status + resource_id, verify=conf.verify)
+    if json_convert:
+        resp = resp.json()
+    return resp
diff --git a/orm/services/image_manager/ims/tests/__init__.py b/orm/services/image_manager/ims/tests/__init__.py
new file mode 100755
index 00000000..d726c618
--- /dev/null
+++ b/orm/services/image_manager/ims/tests/__init__.py
@@ -0,0 +1,22 @@
+import os
+from pecan import set_config
+from pecan.testing import load_test_app
+from unittest import TestCase
+
+__all__ = ['FunctionalTest']
+
+
+class FunctionalTest(TestCase):
+    """Used for functional tests where you need to lcp_core your
+
+    literal application and its integration with the framework.
+    """
+
+    def setUp(self):
+        self.app = load_test_app(os.path.join(
+            os.path.dirname(__file__),
+            'config.py'
+        ))
+
+    def tearDown(self):
+        set_config({}, overwrite=True)
diff --git a/orm/services/image_manager/ims/tests/config.py b/orm/services/image_manager/ims/tests/config.py
new file mode 100755
index 00000000..21f0a721
--- /dev/null
+++ b/orm/services/image_manager/ims/tests/config.py
@@ -0,0 +1,107 @@
+from ims.tests.simple_hook_mock import SimpleHookMock
+
+global SimpleHookMock
+
+# Server Specific Configurations
+server = {
+    'port': '8084',
+    'host': '0.0.0.0',
+    'name': 'ims'
+}
+
+# Pecan Application Configurations
+app = {
+    'root': 'ims.controllers.root.RootController',
+    'modules': ['ims'],
+    'static_root': '%(confdir)s/public',
+    'template_path': '%(confdir)s/ims/templates',
+    'debug': True,
+    'errors': {
+        '__force_dict__': True
+    },
+    'hooks': lambda: [SimpleHookMock()]
+}
+
+logging = {
+    'root': {'level': 'INFO', 'handlers': ['console']},
+    'loggers': {
+        'ims': {'level': 'DEBUG', 'handlers': ['console'],
+                'propagate': False},
+        'pecan': {'level': 'DEBUG', 'handlers': ['console'],
+                  'propagate': False},
+        'py.warnings': {'handlers': ['console']},
+        '__force_dict__': True
+    },
+    'handlers': {
+        'console': {
+            'level': 'DEBUG',
+            'class': 'logging.StreamHandler',
+            'formatter': 'color'
+        }
+    },
+    'formatters': {
+        'simple': {
+            'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]'
+                       '[%(threadName)s] %(message)s')
+        },
+        'color': {
+            '()': 'pecan.log.ColorFormatter',
+            'format': ('%(asctime)s [%(padded_color_levelname)s] [%(name)s]'
+                       '[%(threadName)s] %(message)s'),
+            '__force_dict__': True
+        }
+    }
+}
+
+database = {
+    'host': 'localhost',
+    'username': 'root',
+    'password': 'stack',
+    'db_name': 'orm_ims_db',
+
+}
+
+database['connection_string'] = 'mysql://{0}:{1}@{2}:3306/{3}'.format(database['username'],
+                                                                      database['password'],
+                                                                      database['host'],
+                                                                      database['db_name'])
+
+application_root = 'http://localhost:{0}'.format(server['port'])
+
+api = {
+    'uuid_server': {
+        'base': 'http://127.0.0.1:8090/',
+        'uuids': 'v1/uuids'
+    },
+    'rds_server': {
+        # 'base': 'http://172.20.90.179:8777/',
+        'base': 'http://127.0.0.1:8777/',
+        'resources': 'v1/rds/resources',
+        'status': 'v1/rds/status/resource/'
+    },
+    'rms_server': {
+        'base': 'http://127.0.0.1:8080/',
+        # 'base': 'http://172.20.90.179:8080/',
+        'groups': 'v1/orm/groups',
+        'regions': 'v1/orm/regions',
+        'cache_seconds': 60
+    },
+    'audit_server': {
+        'base': 'http://127.0.0.1:8776/',
+        'trans': 'v1/audit/transaction'
+    }
+
+}
+
+verify = False
+
+authentication = {
+    "enabled": False,
+    "mech_id": "admin",
+    "mech_pass": "stack",
+    "rms_url": "http://172.20.90.174:8080",
+    "tenant_name": "admin",
+    "keystone_version": "2.0",
+    "token_role": "admin",
+    "policy_file": "/opt/app/orm/aic-orm-ims/ims/etc/policy.json"
+}
diff --git a/orm/services/image_manager/ims/tests/controllers/__init__.py b/orm/services/image_manager/ims/tests/controllers/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/tests/controllers/v1/__init__.py b/orm/services/image_manager/ims/tests/controllers/v1/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/tests/controllers/v1/orm/__init__.py b/orm/services/image_manager/ims/tests/controllers/v1/orm/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/tests/controllers/v1/orm/images/__init__.py b/orm/services/image_manager/ims/tests/controllers/v1/orm/images/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/tests/controllers/v1/orm/images/test_customers.py b/orm/services/image_manager/ims/tests/controllers/v1/orm/images/test_customers.py
new file mode 100755
index 00000000..6c9999a0
--- /dev/null
+++ b/orm/services/image_manager/ims/tests/controllers/v1/orm/images/test_customers.py
@@ -0,0 +1,186 @@
+import json
+from ims.tests import FunctionalTest
+from orm_common.injector import injector
+from ims.controllers.v1.orm.images import customers
+from ims.persistency.wsme.models import ImageWrapper
+
+import mock
+from ims.logic.error_base import ErrorStatus
+from wsme.exc import ClientSideError
+
+
+utils_mock = None
+image_logic_mock = None
+
+return_error = 0
+
+
+class TestTenantController(FunctionalTest):
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+        injector.override_injected_dependency(('utils', get_utils_mock()))
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_add_customers_sanity(self):
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+        response = self.app.post_json('/v1/orm/images/id/customers', CUSTOMERS)
+        self.assertEqual(ImageWrapper().tojson(), response.json)
+        self.assertEqual(201, response.status_int)
+
+    @mock.patch.object(customers, 'err_utils')
+    def test_add_customers_errorstatus_raised(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.post_json('/v1/orm/images/id/customers', CUSTOMERS,
+                                      expect_errors=True)
+
+        self.assertEqual(404, response.status_int)
+
+    @mock.patch.object(customers, 'err_utils')
+    def test_add_customers_other_error(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.post_json('/v1/orm/images/id/customers', CUSTOMERS,
+                                      expect_errors=True)
+
+        self.assertEqual(500, response.status_int)
+
+    def test_update_customers_success(self):
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+        response = self.app.put_json('/v1/orm/images/id/customers', CUSTOMERS)
+
+        self.assertEqual(ImageWrapper().tojson(), response.json)
+        self.assertEqual(200, response.status_code)
+
+    @mock.patch.object(customers, 'err_utils')
+    def test_update_customers_NotFound(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.put_json('/v1/orm/images/id/customers', CUSTOMERS,
+                                     expect_errors=True)
+
+        self.assertEqual(404, response.status_code)
+
+    @mock.patch.object(customers, 'err_utils')
+    def test_update_customers_error(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.put_json('/v1/orm/images/id/customers', CUSTOMERS,
+                                     expect_errors=True)
+        self.assertEqual(500, response.status_code)
+
+    def test_delete_success(self):
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.delete('/v1/orm/images/id/customers/1')
+        self.assertEqual(response.status_int, 204)
+
+    @mock.patch.object(customers, 'err_utils')
+    def test_delete_not_found_error(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.delete('/v1/orm/images/id/customers/1',
+                                   expect_errors=True)
+        self.assertEqual(response.status_int, 404)
+
+    @mock.patch.object(customers, 'err_utils')
+    def test_delete_general_error(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.delete('/v1/orm/images/id/customers/1',
+                                   expect_errors=True)
+        self.assertEqual(response.status_int, 500)
+
+
+class ResponseMock:
+    def __init__(self, status_code=200, message=""):
+        self.status_code = status_code
+        self.message = message
+
+
+def get_logic_mock():
+    global image_logic_mock
+    image_logic_mock = mock.MagicMock()
+
+    if return_error == 0:
+        image_logic_mock.add_customers.return_value = ImageWrapper()
+        image_logic_mock.replace_customers.return_value = ImageWrapper()
+    elif return_error == 1:
+        image_logic_mock.add_customers.side_effect = SystemError()
+        image_logic_mock.replace_customers.side_effect = SystemError()
+        image_logic_mock.delete_customer.side_effect = SystemError()
+    elif return_error == 2:
+        image_logic_mock.add_customers.side_effect = ErrorStatus(status_code=404)
+        image_logic_mock.replace_customers.side_effect = ErrorStatus(status_code=404)
+        image_logic_mock.delete_customer.side_effect = ErrorStatus(status_code=404)
+
+    return image_logic_mock
+
+
+def get_utils_mock():
+    global utils_mock
+    utils_mock = mock.MagicMock()
+
+    utils_mock.make_transid.return_value = 'some_trans_id'
+    utils_mock.audit_trail.return_value = None
+    utils_mock.make_uuid.return_value = 'some_uuid'
+
+    if return_error:
+        utils_mock.create_existing_uuid.side_effect = TypeError('test')
+    else:
+        utils_mock.create_existing_uuid.return_value = 'some_uuid'
+
+    return utils_mock
+
+
+def get_error(transaction_id, status_code, error_details=None,
+              message=None):
+    return ClientSideError(json.dumps({
+        'code': status_code,
+        'type': 'test',
+        'created': '0.0',
+        'transaction_id': transaction_id,
+        'message': message if message else error_details,
+        'details': 'test'
+    }), status_code=status_code)
+
+
+CUSTOMERS = {
+    "customers": [
+        "tenant1"
+    ]
+}
diff --git a/orm/services/image_manager/ims/tests/controllers/v1/orm/images/test_enabled.py b/orm/services/image_manager/ims/tests/controllers/v1/orm/images/test_enabled.py
new file mode 100755
index 00000000..bf1d897a
--- /dev/null
+++ b/orm/services/image_manager/ims/tests/controllers/v1/orm/images/test_enabled.py
@@ -0,0 +1,110 @@
+import mock
+import json
+from ims.controllers.v1.orm.images import enabled
+from ims.persistency.wsme.models import ImageWrapper
+
+from ims.logic.error_base import ErrorStatus
+
+from ims.tests import FunctionalTest
+from wsme.exc import ClientSideError
+from orm_common.injector import injector
+
+return_error = 0
+
+
+class TestGetImageDetails(FunctionalTest):
+    """Main put for image activate/deactivate test case."""
+
+    def setUp(self):
+        FunctionalTest.setUp(self)
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+        injector.override_injected_dependency(('utils', get_utils_mock()))
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_enabled_put_sanity(self):
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+        response = self.app.put_json('/v1/orm/images/a/enabled/', ENABLED_JSON)
+
+        self.assertEqual(ImageWrapper().tojson(), response.json)
+        self.assertEqual(200, response.status_code)
+
+    @mock.patch.object(enabled, 'err_utils')
+    def test_enabled_put_image_not_found(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.put_json('/v1/orm/images/a/enabled/', ENABLED_JSON,
+                                     expect_errors=True)
+
+        self.assertEqual(404, response.status_code)
+
+    @mock.patch.object(enabled, 'err_utils')
+    def test_enabled_put_other_error(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.put_json('/v1/orm/images/a/enabled/', ENABLED_JSON,
+                                     expect_errors=True)
+
+        self.assertEqual(500, response.status_code)
+
+
+def get_logic_mock():
+    global image_logic_mock
+    image_logic_mock = mock.MagicMock()
+
+    if return_error == 0:
+        image_logic_mock.enable_image.return_value = ImageWrapper()
+    elif return_error == 1:
+        image_logic_mock.enable_image.side_effect = SystemError()
+    elif return_error == 2:
+        image_logic_mock.enable_image.side_effect = ErrorStatus(
+            status_code=404)
+    elif return_error == 3:
+        image_logic_mock.enable_image.side_effect = ErrorStatus(
+            status_code=409)
+
+    return image_logic_mock
+
+
+def get_utils_mock():
+    global utils_mock
+    utils_mock = mock.MagicMock()
+
+    utils_mock.make_transid.return_value = 'some_trans_id'
+    utils_mock.audit_trail.return_value = None
+    utils_mock.make_uuid.return_value = 'some_uuid'
+
+    if return_error:
+        utils_mock.create_existing_uuid.side_effect = TypeError('test')
+    else:
+        utils_mock.create_existing_uuid.return_value = 'some_uuid'
+
+    return utils_mock
+
+
+def get_error(transaction_id, status_code, error_details=None,
+              message=None):
+    return ClientSideError(json.dumps({
+        'code': status_code,
+        'type': 'test',
+        'created': '0.0',
+        'transaction_id': transaction_id,
+        'message': message if message else error_details,
+        'details': 'test'
+    }), status_code=status_code)
+
+
+ENABLED_JSON = {
+    "enabled": False
+}
diff --git a/orm/services/image_manager/ims/tests/controllers/v1/orm/images/test_images.py b/orm/services/image_manager/ims/tests/controllers/v1/orm/images/test_images.py
new file mode 100755
index 00000000..126f3c7d
--- /dev/null
+++ b/orm/services/image_manager/ims/tests/controllers/v1/orm/images/test_images.py
@@ -0,0 +1,332 @@
+"""Images unittests module."""
+from ims.controllers.v1.orm.images import images
+from ims.persistency.wsme.models import ImageWrapper, ImageSummaryResponse
+from ims.tests import FunctionalTest
+from ims.logic.error_base import ErrorStatus
+import mock
+import json
+from wsme.exc import ClientSideError
+from orm_common.injector import injector
+
+
+utils_mock = None
+image_logic_mock = None
+
+return_error = 0
+
+
+class TestGetImageDetails(FunctionalTest):
+    """Main get_image_details test case."""
+
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+        injector.override_injected_dependency(('utils', get_utils_mock()))
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_get_sanity(self):
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.get('/v1/orm/images/test')
+        self.assertEqual(ImageWrapper().tojson(), response.json)
+
+    @mock.patch.object(images, 'err_utils')
+    def test_get_image_not_found(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.get('/v1/orm/images/test', expect_errors=True)
+        self.assertEqual(404, response.status_code)
+
+    @mock.patch.object(images, 'err_utils')
+    def test_get_image_other_error(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.get('/v1/orm/images/test', expect_errors=True)
+        self.assertEqual(500, response.status_int)
+
+
+class TestDeleteImage(FunctionalTest):
+    """main test delete image."""
+
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+        injector.override_injected_dependency(('utils', get_utils_mock()))
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_delete_success(self):
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.delete('/v1/orm/images/test')
+        self.assertEqual(response.status_int, 204)
+
+    @mock.patch.object(images, 'err_utils')
+    def test_delete_not_found_error(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.delete('/v1/orm/images/test', expect_errors=True)
+        self.assertEqual(response.status_int, 404)
+
+    @mock.patch.object(images, 'err_utils')
+    def test_delete_general_error(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.delete('/v1/orm/images/test', expect_errors=True)
+        self.assertEqual(response.status_int, 500)
+
+
+class TestUpdateImage(FunctionalTest):
+    """test update image."""
+
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+        injector.override_injected_dependency(('utils', get_utils_mock()))
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_update_image_success(self):
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+        response = self.app.put_json('/v1/orm/images/updatetest', image_json)
+
+        self.assertEqual(ImageWrapper().tojson(), response.json)
+        self.assertEqual(200, response.status_code)
+
+    @mock.patch.object(images, 'err_utils')
+    def test_update_image_NotFound(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.put_json('/v1/orm/images/updatetest', image_json,
+                                     expect_errors=True)
+
+        self.assertEqual(404, response.status_code)
+
+    @mock.patch.object(images, 'err_utils')
+    def test_update_image_error(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.put_json('/v1/orm/images/updatetest', image_json,
+                                     expect_errors=True)
+        self.assertEqual(500, response.status_code)
+
+
+class TestListImage(FunctionalTest):
+    """main test delete image."""
+
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+        injector.override_injected_dependency(('utils', get_utils_mock()))
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_list_success(self):
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.get('/v1/orm/images/?region=SAN1')
+
+        self.assertEqual(ImageSummaryResponse().tojson(), response.json)
+        self.assertEqual(response.status_int, 200)
+
+    @mock.patch.object(images, 'err_utils')
+    def test_list_not_found_error(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.get('/v1/orm/images/?region=rd', expect_errors=True)
+
+        self.assertEqual(404, response.status_int)
+
+    @mock.patch.object(images, 'err_utils')
+    def test_list_general_error(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.get('/v1/orm/images/?region=SAN1', expect_errors=True)
+
+        self.assertEqual(500, response.status_int)
+
+
+class TestCreateImage(FunctionalTest):
+    """Main create_image test case."""
+
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+        injector.override_injected_dependency(('utils', get_utils_mock()))
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_create_sanity(self):
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.post_json('/v1/orm/images', image_json)
+        self.assertEqual(ImageWrapper().tojson(), response.json)
+        self.assertEqual(201, response.status_int)
+
+    @mock.patch.object(images, 'err_utils')
+    def test_create_errorstatus_raised(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 3
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.post_json('/v1/orm/images', image_json,
+                                      expect_errors=True)
+
+        self.assertEqual(409, response.status_int)
+
+    @mock.patch.object(images, 'err_utils')
+    def test_create_other_error(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.post_json('/v1/orm/images', image_json,
+                                      expect_errors=True)
+
+        self.assertEqual(500, response.status_int)
+
+
+def get_logic_mock():
+    global image_logic_mock
+    image_logic_mock = mock.MagicMock()
+
+    if return_error == 0:
+        image_logic_mock.update_image.return_value = ImageWrapper()
+        image_logic_mock.create_image.return_value = ImageWrapper()
+        image_logic_mock.get_image_by_uuid.return_value = ImageWrapper()
+        image_logic_mock.get_image_list_by_params.return_value = ImageSummaryResponse()
+    elif return_error == 1:
+        image_logic_mock.update_image.side_effect = SystemError()
+        image_logic_mock.create_image.side_effect = SystemError()
+        image_logic_mock.get_image_by_uuid.side_effect = SystemError()
+        image_logic_mock.get_image_list_by_params.side_effect = SystemError()
+        image_logic_mock.delete_image_by_uuid.side_effect = SystemError()
+    elif return_error == 2:
+        image_logic_mock.update_image.side_effect = ErrorStatus(
+            status_code=404)
+        image_logic_mock.create_image.side_effect = ErrorStatus(
+            status_code=404)
+        image_logic_mock.get_image_by_uuid.side_effect = ErrorStatus(
+            status_code=404)
+        image_logic_mock.get_image_list_by_params.side_effect = ErrorStatus(
+            status_code=404)
+        image_logic_mock.delete_image_by_uuid.side_effect = ErrorStatus(
+            status_code=404)
+    elif return_error == 3:
+        image_logic_mock.create_image.side_effect = ErrorStatus(
+            status_code=409)
+        image_logic_mock.update_image.side_effect = ErrorStatus(
+            status_code=409)
+
+    return image_logic_mock
+
+
+def get_utils_mock():
+    global utils_mock
+    utils_mock = mock.MagicMock()
+
+    utils_mock.make_transid.return_value = 'some_trans_id'
+    utils_mock.audit_trail.return_value = None
+    utils_mock.make_uuid.return_value = 'some_uuid'
+
+    if return_error:
+        utils_mock.create_existing_uuid.side_effect = TypeError('test')
+    else:
+        utils_mock.create_existing_uuid.return_value = 'some_uuid'
+
+    return utils_mock
+
+
+def get_error(transaction_id, status_code, error_details=None,
+              message=None):
+    return ClientSideError(json.dumps({
+        'code': status_code,
+        'type': 'test',
+        'created': '0.0',
+        'transaction_id': transaction_id,
+        'message': message if message else error_details,
+        'details': 'test'
+    }), status_code=status_code)
+
+
+image_json = \
+    {
+        "image":
+        {
+            "name": "abcde1e236",
+            "url": "https://mirrors.it.att.com/images/image-name",
+            "visibility": "private",
+            "disk-format": "raw",
+            "container-format": "bare",
+            "min-disk": 1,
+            "min-ram": 1,
+            "tags": ["tag"],
+            "properties": {
+                "property1": "value1"
+            },
+            "regions": [{
+                "name": "rdm1",
+                "type": "single"
+            }],
+            "customers": [
+                "da3b75d9-3f4a-40e7-8a2c-bfab23927dea"
+            ]
+        }
+    }
diff --git a/orm/services/image_manager/ims/tests/controllers/v1/orm/images/test_metadata.py b/orm/services/image_manager/ims/tests/controllers/v1/orm/images/test_metadata.py
new file mode 100755
index 00000000..df7186d1
--- /dev/null
+++ b/orm/services/image_manager/ims/tests/controllers/v1/orm/images/test_metadata.py
@@ -0,0 +1,77 @@
+import mock
+import json
+from wsme.exc import ClientSideError
+from ims.tests import FunctionalTest
+
+from ims.controllers.v1.orm.images import metadata
+
+
+metadata_input = {
+    "metadata": {
+        "checksum": "1",
+        "virtual_size": "@",
+        "size": "3"
+    }
+}
+
+
+class TestMetaDataController(FunctionalTest):
+    """metadata controller(api) unittests."""
+
+    @staticmethod
+    def get_error(transaction_id, status_code, error_details=None,
+                  message=None):
+        return ClientSideError(json.dumps(
+            {'code': status_code, 'type': 'test', 'created': '0.0',
+             'transaction_id': transaction_id,
+             'message': message if message else error_details,
+             'details': 'test'}), status_code=status_code)
+
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    @mock.patch.object(metadata, 'di')
+    def test_post_metadata_success(self, mock_di):
+        mock_di.resolver.unpack.return_value = get_mocks()
+        response = self.app.post_json(
+            '/v1/orm/images/image_id/regions/region_name/metadata',
+            metadata_input)
+        self.assertEqual(200, response.status_code)
+
+    @mock.patch.object(metadata, 'err_utils')
+    @mock.patch.object(metadata, 'di')
+    def test_post_metadata_not_found(self, mock_di, mock_error_utils):
+        mock_error_utils.get_error = self.get_error
+        mock_di.resolver.unpack.return_value = get_mocks(error=404)
+        response = self.app.post_json(
+            '/v1/orm/images/image_id/regions/region_name/metadata',
+            metadata_input, expect_errors=True)
+        self.assertEqual(404, response.status_code)
+        self.assertEqual(json.loads(response.json['faultstring'])['message'],
+                         'not found')
+
+    @mock.patch.object(metadata, 'err_utils')
+    @mock.patch.object(metadata, 'di')
+    def test_post_metadata_error(self, mock_di, mock_error_utils):
+        mock_error_utils.get_error = self.get_error
+        mock_di.resolver.unpack.return_value = get_mocks(error=500)
+        response = self.app.post_json(
+            '/v1/orm/images/image_id/regions/region_name/metadata',
+            metadata_input, expect_errors=True)
+        self.assertEqual(500, response.status_code)
+        self.assertEqual(json.loads(response.json['faultstring'])['message'],
+                         'unknown error')
+
+
+def get_mocks(error=None):
+
+    metadata_logic = mock.MagicMock()
+    utils = mock.MagicMock()
+    metadata_logic.add_metadata.return_value = mock.MagicMock()
+    if error:
+        metadata_logic.add_metadata.side_effect = {404: metadata.ErrorStatus(error, 'not found'),
+                                                   500: Exception("unknown error")}[error]
+    return metadata_logic, utils
diff --git a/orm/services/image_manager/ims/tests/controllers/v1/orm/images/test_regions.py b/orm/services/image_manager/ims/tests/controllers/v1/orm/images/test_regions.py
new file mode 100755
index 00000000..3d204ba1
--- /dev/null
+++ b/orm/services/image_manager/ims/tests/controllers/v1/orm/images/test_regions.py
@@ -0,0 +1,188 @@
+import json
+from ims.tests import FunctionalTest
+from orm_common.injector import injector
+from ims.controllers.v1.orm.images import regions
+from ims.persistency.wsme.models import RegionWrapper
+
+import mock
+from ims.logic.error_base import ErrorStatus
+from wsme.exc import ClientSideError
+
+
+utils_mock = None
+image_logic_mock = None
+
+return_error = 0
+
+
+class TestRegionController(FunctionalTest):
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+        injector.override_injected_dependency(('utils', get_utils_mock()))
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_add_regions_sanity(self):
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+        response = self.app.post_json('/v1/orm/images/id/regions', REGIONS)
+        self.assertEqual(RegionWrapper().tojson(), response.json)
+        self.assertEqual(201, response.status_int)
+
+    @mock.patch.object(regions, 'err_utils')
+    def test_add_regions_errorstatus_raised(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.post_json('/v1/orm/images/id/regions', REGIONS,
+                                      expect_errors=True)
+
+        self.assertEqual(404, response.status_int)
+
+    @mock.patch.object(regions, 'err_utils')
+    def test_add_regions_other_error(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.post_json('/v1/orm/images/id/regions', REGIONS,
+                                      expect_errors=True)
+
+        self.assertEqual(500, response.status_int)
+
+    def test_update_regions_success(self):
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+        response = self.app.put_json('/v1/orm/images/id/regions', REGIONS)
+
+        self.assertEqual(RegionWrapper().tojson(), response.json)
+        self.assertEqual(200, response.status_code)
+
+    @mock.patch.object(regions, 'err_utils')
+    def test_update_regions_NotFound(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.put_json('/v1/orm/images/id/regions', REGIONS,
+                                     expect_errors=True)
+
+        self.assertEqual(404, response.status_code)
+
+    @mock.patch.object(regions, 'err_utils')
+    def test_update_regions_error(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.put_json('/v1/orm/images/id/regions', REGIONS,
+                                     expect_errors=True)
+        self.assertEqual(500, response.status_code)
+
+    def test_delete_success(self):
+        global return_error
+        return_error = 0
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.delete('/v1/orm/images/id/regions/1')
+        self.assertEqual(response.status_int, 204)
+
+    @mock.patch.object(regions, 'err_utils')
+    def test_delete_not_found_error(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 2
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.delete('/v1/orm/images/id/regions/1',
+                                   expect_errors=True)
+        self.assertEqual(response.status_int, 404)
+
+    @mock.patch.object(regions, 'err_utils')
+    def test_delete_general_error(self, mock_err_utils):
+        mock_err_utils.get_error = get_error
+
+        global return_error
+        return_error = 1
+        injector.override_injected_dependency(('image_logic', get_logic_mock()))
+
+        response = self.app.delete('/v1/orm/images/id/regions/1',
+                                   expect_errors=True)
+        self.assertEqual(response.status_int, 500)
+
+
+class ResponseMock:
+    def __init__(self, status_code=200, message=""):
+        self.status_code = status_code
+        self.message = message
+
+
+def get_logic_mock():
+    global image_logic_mock
+    image_logic_mock = mock.MagicMock()
+
+    if return_error == 0:
+        image_logic_mock.add_regions.return_value = RegionWrapper()
+        image_logic_mock.replace_regions.return_value = RegionWrapper()
+    elif return_error == 1:
+        image_logic_mock.add_regions.side_effect = SystemError()
+        image_logic_mock.replace_regions.side_effect = SystemError()
+        image_logic_mock.delete_region.side_effect = SystemError()
+    elif return_error == 2:
+        image_logic_mock.add_regions.side_effect = ErrorStatus(status_code=404)
+        image_logic_mock.replace_regions.side_effect = ErrorStatus(status_code=404)
+        image_logic_mock.delete_region.side_effect = ErrorStatus(status_code=404)
+
+    return image_logic_mock
+
+
+def get_utils_mock():
+    global utils_mock
+    utils_mock = mock.MagicMock()
+
+    utils_mock.make_transid.return_value = 'some_trans_id'
+    utils_mock.audit_trail.return_value = None
+    utils_mock.make_uuid.return_value = 'some_uuid'
+
+    if return_error:
+        utils_mock.create_existing_uuid.side_effect = TypeError('test')
+    else:
+        utils_mock.create_existing_uuid.return_value = 'some_uuid'
+
+    return utils_mock
+
+
+def get_error(transaction_id, status_code, error_details=None, message=None):
+    return ClientSideError(json.dumps({
+        'code': status_code,
+        'type': 'test',
+        'created': '0.0',
+        'transaction_id': transaction_id,
+        'message': message if message else error_details,
+        'details': 'test'
+    }), status_code=status_code)
+
+
+REGIONS = {
+    "regions": [
+        {
+            "name": "rdm1",
+            "type": "single"
+        }
+    ]
+}
diff --git a/orm/services/image_manager/ims/tests/controllers/v1/orm/test_logs.py b/orm/services/image_manager/ims/tests/controllers/v1/orm/test_logs.py
new file mode 100755
index 00000000..30799d77
--- /dev/null
+++ b/orm/services/image_manager/ims/tests/controllers/v1/orm/test_logs.py
@@ -0,0 +1,42 @@
+from ims.tests import FunctionalTest
+
+
+class TestLogsController(FunctionalTest):
+    """logs controller unittests."""
+
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    def test_logs_api_put_success(self):
+        level = 'info'
+        response = self.app.put('/v1/orm/logs/{}'.format(level))
+        self.assertEqual(response.json,
+                         {"result": "Log level changed to {}.".format(level)})
+        self.assertEqual(201, response.status_code)
+
+    def test_logs_api_put_level_none(self):
+        response = self.app.put('/v1/orm/logs/', expect_errors=True)
+        self.assertEqual(response.status_code, 400)
+
+    def test_logs_api_put_level_bad(self):
+        level = "not_valid_level"
+        response = self.app.put('/v1/orm/logs/{}'.format(level),
+                                expect_errors=True)
+        print response
+        self.assertEqual(response.status_code, 400)
+        self.assertEqual(response.json['faultstring'],
+                         "The given log level [{}] doesn't exist.".format(
+                             level))
+
+    def test_logs_api_put_level_bad(self):
+        level = "not_valid_level"
+        response = self.app.put('/v1/orm/logs/{}'.format(level),
+                                expect_errors=True)
+        print response
+        self.assertEqual(response.status_code, 400)
+        self.assertEqual(response.json['faultstring'],
+                         "The given log level [{}] doesn't exist.".format(
+                             level))
diff --git a/orm/services/image_manager/ims/tests/logic/__init__.py b/orm/services/image_manager/ims/tests/logic/__init__.py
new file mode 100755
index 00000000..d726c618
--- /dev/null
+++ b/orm/services/image_manager/ims/tests/logic/__init__.py
@@ -0,0 +1,22 @@
+import os
+from pecan import set_config
+from pecan.testing import load_test_app
+from unittest import TestCase
+
+__all__ = ['FunctionalTest']
+
+
+class FunctionalTest(TestCase):
+    """Used for functional tests where you need to lcp_core your
+
+    literal application and its integration with the framework.
+    """
+
+    def setUp(self):
+        self.app = load_test_app(os.path.join(
+            os.path.dirname(__file__),
+            'config.py'
+        ))
+
+    def tearDown(self):
+        set_config({}, overwrite=True)
diff --git a/orm/services/image_manager/ims/tests/logic/test_image_logic.py b/orm/services/image_manager/ims/tests/logic/test_image_logic.py
new file mode 100755
index 00000000..f95d90bd
--- /dev/null
+++ b/orm/services/image_manager/ims/tests/logic/test_image_logic.py
@@ -0,0 +1,704 @@
+import mock
+from ims.logic import image_logic
+from ims.tests import FunctionalTest
+from ims.persistency.sql_alchemy.db_models import Image
+from ims.persistency.wsme import models
+
+
+class RDSGetStatus():
+    def __init__(self, status_code=200):
+        self.status_code = status_code
+
+    def json(self):
+        return {'status': 'Success'}
+
+
+class ImageTest():
+    def __init__(self, id=None, status=None, regions=[], min_ram=None,
+                 customers=[]):
+        self.id = id
+        self.status = status
+        self.regions = regions
+        self.min_ram = min_ram
+        self.created_at = "12345678"
+        self.updated_at = "12345678"
+        self.customers = customers
+
+    def to_db_model(self):
+        return ImageTest()
+
+    def validate_model(self, context=None):
+        pass
+
+
+class ImageWrapperTest():
+    def __init__(self, image=ImageTest(id=1, status='')):
+        self.image = image
+
+    def to_db_model(self):
+        return ImageWrapperTest()
+
+    def validate_model(self, context=None):
+        pass
+
+
+class MyError(Exception):
+    def __init__(self, message=None):
+        self.message = message
+
+
+class RdsResponse(object):
+    """class."""
+
+    def __init__(self):
+        self.status_code = 200
+
+    def json(self):
+        return {'status': 'Success'}
+
+
+resolved_regions = [{'type': 'single', 'name': 'rdm1'}]
+
+visibility = "private"
+regions = []
+image_status_dict = {u'regions': [{u'status': u'Submitted',
+                                   u'resource_id':
+                                       u'edf1a8152b974eb28a6f4aa3dee3190d',
+                                   u'timestamp': 1471954276950,
+                                   u'region': u'rdm1',
+                                   u'ord_notifier_id': u'',
+                                   u'ord_transaction_id':
+                                       u'b18836a0-692a-11e6-82f3-005056a5129b',
+                                   u'error_code': u'', u'error_msg': u''}],
+                     u'status': u'Pending'}
+
+
+class TestImageLogic(FunctionalTest):
+    @mock.patch.object(image_logic, 'di')
+    def test_get_image_by_uuid_image_not_found(self, mock_di):
+        mock_rds_proxy = mock.MagicMock()
+        my_get_image = mock.MagicMock()
+        my_get_image.get_image_by_id.return_value = None
+        my_get_record = mock.MagicMock()
+        my_get_record.get_record.return_value = my_get_image
+        my_dm = mock.MagicMock(return_value=my_get_record)
+
+        mock_di.resolver.unpack.return_value = my_dm, mock_rds_proxy
+        try:
+            image_logic.get_image_by_uuid('te')
+        except image_logic.ErrorStatus as e:
+            self.assertEqual(e.status_code, 404)
+
+    @mock.patch.object(image_logic.ImsUtils, 'get_server_links',
+                       return_value=["ip", "path"])
+    @mock.patch.object(image_logic, 'di')
+    @mock.patch.object(image_logic, 'utils')
+    @mock.patch.object(image_logic, 'ImageWrapper')
+    def test_get_image_by_uuid_image_no_status(self, mock_image,
+                                               mock_utils, mock_di, mock_links):
+        mock_rds_proxy = mock.MagicMock()
+        mock_rds_proxy.get_status.return_value = RDSGetStatus(status_code=404)
+        mock_image.from_db_model.return_value = ImageWrapperTest()
+        my_get_image = mock.MagicMock()
+        my_get_record = mock.MagicMock()
+        my_get_record.get_record.return_value = my_get_image
+        my_dm = mock.MagicMock(return_value=my_get_record)
+
+        mock_di.resolver.unpack.return_value = my_dm, mock_rds_proxy
+        result = image_logic.get_image_by_uuid('test')
+        self.assertEqual(result.image.status, '')
+
+    @mock.patch.object(image_logic.ImsUtils, 'get_server_links',
+                       return_value=["ip", "path"])
+    @mock.patch.object(image_logic, 'di')
+    @mock.patch.object(image_logic, 'utils')
+    @mock.patch.object(image_logic, 'ImageWrapper')
+    def test_get_image_by_uuid_image_sanity(self, mock_image,
+                                            mock_utils, mock_di, mock_links):
+        mock_rds_proxy = mock.MagicMock()
+        mock_rds_proxy.get_status.return_value = RDSGetStatus()
+        mock_utils.get_resource_status.return_value = {'status': 'Success'}
+        my_get_image = mock.MagicMock()
+        my_get_record = mock.MagicMock()
+        my_get_record.get_record.return_value = my_get_image
+        my_dm = mock.MagicMock(return_value=my_get_record)
+
+        mock_di.resolver.unpack.return_value = my_dm, mock_rds_proxy
+        result = image_logic.get_image_by_uuid('test')
+        self.assertEqual(result.image.status, 'Success')
+
+
+class TestDeleteImageLogic(FunctionalTest):
+    """test delete image."""
+
+    @mock.patch.object(image_logic, 'update_region_actions', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_delete_image_success(self, mock_di, mock_update_region):
+        mock_rds_proxy, mock_data_manager = get_data_manager_mock(
+            get_existing_region_names=[])
+        mock_rds_proxy.get_status.return_value = RdsResponse()
+        mock_di.resolver.unpack.return_value = (mock_rds_proxy,
+                                                mock_data_manager)
+        global regions
+        regions = []
+        image_logic.delete_image_by_uuid("image_uuid", "transaction_id")
+
+        regions = []
+        image_logic.delete_image_by_uuid("image_uuid", "transaction_id")
+
+    @mock.patch.object(image_logic, 'update_region_actions', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_delete_image_success_nords(self, mock_di, mock_update_region):
+        mock_rds_proxy, mock_data_manager = \
+            get_data_manager_mock(imagejson={"regions": {}},
+                                  get_existing_region_names=[])
+        mock_rds_proxy.get_status.return_value = RdsResponse()
+        mock_di.resolver.unpack.return_value = (mock_rds_proxy,
+                                                mock_data_manager)
+        image_logic.delete_image_by_uuid("image_uuid", "transaction_id")
+
+    @mock.patch.object(image_logic, 'update_region_actions', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_delete_image_notfound_error(self, mock_di, mock_update_region):
+        mock_rds_proxy, mock_data_manager = \
+            get_data_manager_mock(mock_sql_image=None)
+        mock_di.resolver.unpack.return_value = (mock_rds_proxy,
+                                                mock_data_manager)
+        try:
+            image_logic.delete_image_by_uuid("image_uuid", "transaction_id")
+        except Exception as e:
+            self.assertEqual(204, e.status_code)
+
+    @mock.patch.object(image_logic, 'update_region_actions',
+                       side_effect=ValueError('test'))
+    @mock.patch.object(image_logic, 'di')
+    def test_delete_image_other_error(self, mock_di, mock_update_region):
+        mock_rds_proxy, mock_data_manager = get_data_manager_mock()
+        mock_di.resolver.unpack.return_value = (mock_rds_proxy,
+                                                mock_data_manager)
+        self.assertRaises(image_logic.ErrorStatus, image_logic.delete_image_by_uuid,
+                          "image_uuid", "transaction_id")
+
+
+class TestUpdateImage(FunctionalTest):
+    """tests for update image."""
+
+    @mock.patch.object(image_logic, 'request')
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       return_value=ImageTest(id="image_id"))
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_update_image_success(self, mock_di, mock_send_to_rds_if_needed,
+                                  mock_get_image_by_uuid, request):
+        request.headers = {'X-RANGER-Requester': "orm_orm"}
+        rds_proxy, mock_data_manager = get_data_manager_mock()
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        result = image_logic.update_image(ImageTest(), "imgae_id",
+                                          "transaction_id")
+
+        self.assertEqual("image_id", result.id)
+
+    @mock.patch.object(image_logic, 'request')
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       return_value=ImageTest(id="image_id"))
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_update_image_notfound(self, mock_di, mock_send_to_rds_if_needed,
+                                   mock_get_image_by_uuid, request):
+        rds_proxy, mock_data_manager = get_data_manager_mock(
+            mock_sql_image=None)
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        try:
+            result = image_logic.update_image(ImageTest(), "image_id",
+                                              "transaction_id")
+        except Exception as e:
+            self.assertEqual(404, e.status_code)
+
+    @mock.patch.object(image_logic, 'request')
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       return_value=ImageTest(id="image_id"))
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed',
+                       side_effect=Exception("rds not found"))
+    @mock.patch.object(image_logic, 'di')
+    def test_update_image_anyerror(self, mock_di, mock_send_to_rds_if_needed,
+                                   mock_get_image_by_uuid, request):
+        rds_proxy, mock_data_manager = get_data_manager_mock()
+        mock_di.resolver.unpack.return_value = mock_data_manager
+
+        self.assertRaises(Exception, image_logic.update_image, ImageTest(),
+                          "imgae_id", "transaction_id")
+
+
+class TestActivateImageLogic(FunctionalTest):
+    """test activate/deactivate image."""
+
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       return_value=ImageTest(**{'status': 'Success'}))
+    @mock.patch.object(image_logic, 'di')
+    @mock.patch.object(image_logic, 'utils')
+    @mock.patch.object(image_logic, 'ImageWrapper')
+    def test_activate_image_activate_no_activated_image(self,
+                                                        mock_image,
+                                                        mock_utils,
+                                                        mock_di,
+                                                        mock_by_uuid):
+        mock_utils.get_resource_status.return_value = {'status': 'Success'}
+
+        my_enabled = mock.MagicMock()
+        my_enabled.enabled = 0
+
+        my_get_image = mock.MagicMock()
+        my_get_image.get_image = mock.MagicMock(return_value=my_enabled)
+
+        my_get_record = mock.MagicMock()
+        my_get_record.get_record.return_value = my_get_image
+        my_dm = mock.MagicMock(return_value=my_get_record)
+
+        mock_di.resolver.unpack.return_value = my_dm
+        result = image_logic.enable_image("test_id", 1, "transaction_id")
+        self.assertEqual(result.status, 'Success')
+
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       return_value=ImageTest(**{'status': 'Success'}))
+    @mock.patch.object(image_logic, 'di')
+    @mock.patch.object(image_logic, 'utils')
+    @mock.patch.object(image_logic, 'ImageWrapper')
+    def test_activate_image_already_activated(self, mock_image, mock_utils,
+                                              mock_di,
+                                              mock_get_image_by_uuid):
+
+        mock_utils.get_resource_status.return_value = {'status': 'Success'}
+        my_enabled = mock.MagicMock()
+        my_enabled.enabled = 1
+
+        my_get_image = mock.MagicMock()
+        my_get_image.get_image = mock.MagicMock(return_value=my_enabled)
+
+        my_get_record = mock.MagicMock()
+        my_get_record.get_record.return_value = my_get_image
+        my_dm = mock.MagicMock(return_value=my_get_record)
+
+        mock_di.resolver.unpack.return_value = my_dm
+        result = image_logic.enable_image("test_id", 1, "transaction_id")
+        self.assertEqual(result.status, 'Success')
+
+    @mock.patch.object(image_logic, 'di')
+    @mock.patch.object(image_logic, 'utils')
+    @mock.patch.object(image_logic, 'ImageWrapper')
+    def test_activate_image_image_not_found(self, mock_image,
+                                            mock_utils,
+                                            mock_di):
+        mock_utils.get_resource_status.return_value = {'status': 'Success'}
+        my_get_image = mock.MagicMock()
+        my_get_image.get_image.return_value = None
+        my_get_record = mock.MagicMock()
+        my_get_record.get_record.return_value = my_get_image
+        my_dm = mock.MagicMock(return_value=my_get_record)
+
+        mock_di.resolver.unpack.return_value = my_dm
+        try:
+            image_logic.enable_image("test_id", 1, "transaction_id")
+        except image_logic.ErrorStatus as e:
+            self.assertEqual(e.status_code, 404)
+
+    @mock.patch.object(image_logic, 'LOG')
+    @mock.patch.object(image_logic, 'di')
+    @mock.patch.object(image_logic, 'utils')
+    @mock.patch.object(image_logic, 'ImageWrapper')
+    def test_activate_image_image_other_exception(self,
+                                                  mock_image,
+                                                  mock_utils,
+                                                  mock_di,
+                                                  log_moc):
+        my_get_image = mock.MagicMock()
+        my_get_image.get_image = mock.MagicMock(side_effect=MyError("activate_test"))
+
+        my_get_record = mock.MagicMock()
+        my_get_record.get_record.return_value = my_get_image
+        my_dm = mock.MagicMock(return_value=my_get_record)
+
+        mock_di.resolver.unpack.return_value = my_dm
+        try:
+            image_logic.enable_image("test_id", 1, "transaction_id")
+        except Exception as e:
+            self.assertEqual(e.message, 'activate_test')
+
+
+class TestListImageLogic(FunctionalTest):
+    @mock.patch.object(image_logic, 'di')
+    def test_list_image_not_found(self, mock_di):
+        my_get_image = mock.MagicMock()
+        my_get_image.get_image.return_value = None
+        my_get_record = mock.MagicMock()
+        my_get_record.get_record.side_effect = image_logic.ErrorStatus(404, 'a')
+        my_dm = mock.MagicMock(return_value=my_get_record)
+
+        mock_di.resolver.unpack.return_value = my_dm
+        try:
+            image_logic.get_image_list_by_params('a', 'b', 'c')
+        except image_logic.ErrorStatus as e:
+            self.assertEqual(e.status_code, 404)
+
+    @mock.patch.object(image_logic, 'di')
+    @mock.patch.object(image_logic, 'ImageWrapper')
+    def test_list_image_error(self, mock_image, mock_di):
+        my_get_image = mock.MagicMock()
+        my_get_record = mock.MagicMock()
+        my_get_record.get_record.side_effect = SystemError()
+        my_dm = mock.MagicMock(return_value=my_get_record)
+
+        mock_di.resolver.unpack.return_value = my_dm
+        try:
+            image_logic.get_image_list_by_params('a', 'b', 'c')
+        except Exception as e:
+            self.assertEqual(e.message, '')
+
+    @mock.patch.object(image_logic, 'di')
+    @mock.patch.object(image_logic, 'ImageWrapper')
+    def test_list_image_sanity(self, mock_image, mock_di):
+        imagejson = [{"regions": {"name": "mdt1"}}]
+        mock_data_manager = mock.MagicMock()
+        mock_image_rec = mock.MagicMock()
+        image_json = mock.MagicMock()
+        image_json.return_value = imagejson
+
+        mock_image_rec.get_images_by_criteria.return_value = Image()
+        my_dm = mock.MagicMock(mock_data_manager)
+
+        mock_di.resolver.unpack.return_value = my_dm
+        result = image_logic.get_image_list_by_params('a', 'b', 'c')
+        self.assertEqual(len(result.images), 0)
+
+
+class TestCreateImage(FunctionalTest):
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    @mock.patch.object(image_logic, 'request')
+    @mock.patch.object(image_logic, 'di')
+    @mock.patch.object(image_logic, 'ImageWrapper')
+    @mock.patch.object(image_logic, 'get_image_by_uuid', return_value='test')
+    def test_create_image_sanity(self, mock_image, mock_di, mock_req, mock_get):
+        my_image = mock.MagicMock()
+        my_dm = mock.MagicMock()
+        my_dm.get_record.return_value = my_image
+        my_mock = mock.MagicMock(return_value=my_dm)
+        mock_di.resolver.unpack.return_value = my_mock
+
+        result = image_logic.create_image(mock.MagicMock(), 'test1', 'test2')
+        self.assertEqual('test', result)
+
+    @mock.patch.object(image_logic, 'request')
+    @mock.patch.object(image_logic, 'di')
+    @mock.patch.object(image_logic, 'ImageWrapper')
+    def test_create_image_validate_model_failure(self, mock_image, mock_di,
+                                                 mock_request):
+        image = mock.MagicMock()
+        image.validate_model.side_effect = ValueError('test')
+
+        self.assertRaises(ValueError, image_logic.create_image, image,
+                          'test1', 'test2')
+
+
+class TestAddRegions(FunctionalTest):
+    """tests for add regions."""
+
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       return_value=ImageWrapperTest(
+                           image=ImageTest(regions=[models.Region('region')])))
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_add_regions_success(self, mock_di, mock_send_to_rds_if_needed,
+                                 mock_get_image_by_uuid):
+        rds_proxy, mock_data_manager = get_data_manager_mock()
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        regions_wrapper = mock.MagicMock()
+        regions_wrapper.regions = [mock.MagicMock()]
+        result = image_logic.add_regions('uuid', regions_wrapper,
+                                         'transaction')
+
+        self.assertEqual(len(result.regions), 1)
+        self.assertEqual('region', result.regions[0].name)
+
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_add_regions_image_not_found(self, mock_di, mock_send_to_rds_if_needed):
+        rds_proxy, mock_data_manager = get_data_manager_mock(mock_sql_image=None)
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        regions_wrapper = mock.MagicMock()
+        regions_wrapper.regions = [mock.MagicMock()]
+        self.assertRaises(image_logic.ErrorStatus, image_logic.add_regions,
+                          'uuid', regions_wrapper, 'transaction')
+
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       side_effect=ValueError('test'))
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_add_regions_other_error(self, mock_di, mock_send_to_rds_if_needed,
+                                     mock_get_image_by_uuid):
+        rds_proxy, mock_data_manager = get_data_manager_mock()
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        regions_wrapper = mock.MagicMock()
+        regions_wrapper.regions = [mock.MagicMock()]
+        self.assertRaises(ValueError, image_logic.add_regions,
+                          'uuid', regions_wrapper, 'transaction')
+
+
+class TestReplaceRegions(FunctionalTest):
+    """tests for replace regions."""
+
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       return_value=ImageWrapperTest(
+                           image=ImageTest(regions=[models.Region('region')])))
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_replace_regions_success(self, mock_di, mock_send_to_rds_if_needed,
+                                     mock_get_image_by_uuid):
+        rds_proxy, mock_data_manager = get_data_manager_mock()
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        regions_wrapper = mock.MagicMock()
+        regions_wrapper.regions = [mock.MagicMock()]
+        result = image_logic.replace_regions('uuid', regions_wrapper,
+                                             'transaction')
+
+        self.assertEqual(len(result.regions), 1)
+        self.assertEqual('region', result.regions[0].name)
+
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_replace_regions_image_not_found(self, mock_di, mock_send_to_rds_if_needed):
+        rds_proxy, mock_data_manager = get_data_manager_mock(mock_sql_image=None)
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        regions_wrapper = mock.MagicMock()
+        regions_wrapper.regions = [mock.MagicMock()]
+        self.assertRaises(image_logic.ErrorStatus, image_logic.replace_regions,
+                          'uuid', regions_wrapper, 'transaction')
+
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       side_effect=ValueError('test'))
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_replace_regions_other_error(self, mock_di,
+                                         mock_send_to_rds_if_needed,
+                                         mock_get_image_by_uuid):
+        rds_proxy, mock_data_manager = get_data_manager_mock()
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        regions_wrapper = mock.MagicMock()
+        regions_wrapper.regions = [mock.MagicMock()]
+        self.assertRaises(ValueError, image_logic.replace_regions,
+                          'uuid', regions_wrapper, 'transaction')
+
+
+class TestDeleteRegion(FunctionalTest):
+    """tests for delete region."""
+
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_delete_region_success(self, mock_di, mock_send_to_rds_if_needed):
+        rds_proxy, mock_data_manager = get_data_manager_mock()
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        result = image_logic.delete_region('uuid', mock.MagicMock(),
+                                           'transaction')
+
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_delete_region_image_not_found(self, mock_di,
+                                           mock_send_to_rds_if_needed):
+        rds_proxy, mock_data_manager = get_data_manager_mock(
+            mock_sql_image=None)
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        self.assertRaises(image_logic.ErrorStatus, image_logic.delete_region,
+                          'uuid', mock.MagicMock(), 'transaction')
+
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       side_effect=ValueError('test'))
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed',
+                       side_effect=ValueError)
+    @mock.patch.object(image_logic, 'di')
+    def test_delete_region_other_error(self, mock_di,
+                                       mock_send_to_rds_if_needed,
+                                       mock_get_image_by_uuid):
+        rds_proxy, mock_data_manager = get_data_manager_mock()
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        self.assertRaises(ValueError, image_logic.delete_region,
+                          'uuid', mock.MagicMock(), 'transaction')
+
+
+class TestAddCustomers(FunctionalTest):
+    """tests for add customers."""
+
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       return_value=ImageWrapperTest(
+                           image=ImageTest(
+                               customers=models.CustomerWrapper(['customer']))))
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_add_customers_success(self, mock_di, mock_send_to_rds_if_needed,
+                                   mock_get_image_by_uuid):
+        rds_proxy, mock_data_manager = get_data_manager_mock()
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        customers_wrapper = models.CustomerWrapper(['customer'])
+        result = image_logic.add_customers('uuid', customers_wrapper,
+                                           'transaction')
+        self.assertEqual(result.image.customers.customers, ['customer'])
+
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       return_value=ImageWrapperTest(
+                           image=ImageTest(
+                               customers=models.CustomerWrapper(['customer']))))
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_add_customers_image_not_found(self, mock_di,
+                                           mock_send_to_rds_if_needed,
+                                           mock_get_image_by_uuid):
+        rds_proxy, mock_data_manager = get_data_manager_mock(
+            mock_sql_image=None)
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        self.assertRaises(image_logic.ErrorStatus, image_logic.add_customers,
+                          'uuid', mock.MagicMock(),
+                          'transaction')
+
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       return_value=ImageWrapperTest(
+                           image=ImageTest(
+                               customers=models.CustomerWrapper(['customer']))))
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_add_customers_public_image(self, mock_di,
+                                        mock_send_to_rds_if_needed,
+                                        mock_get_image_by_uuid):
+        global visibility
+        visibility = 'public'
+        rds_proxy, mock_data_manager = get_data_manager_mock()
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        self.assertRaises(image_logic.ErrorStatus, image_logic.add_customers,
+                          'uuid', mock.MagicMock(),
+                          'transaction')
+        visibility = 'private'
+
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       return_value=ImageWrapperTest(
+                           image=ImageTest(
+                               customers=models.CustomerWrapper(['customer']))))
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed',
+                       side_effect=ValueError('Duplicate entry'))
+    @mock.patch.object(image_logic, 'di')
+    def test_add_customers_duplicate_entry(self, mock_di,
+                                           mock_send_to_rds_if_needed,
+                                           mock_get_image_by_uuid):
+        rds_proxy, mock_data_manager = get_data_manager_mock()
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        self.assertRaises(image_logic.ErrorStatus, image_logic.add_customers,
+                          'uuid', mock.MagicMock(),
+                          'transaction')
+
+
+class TestReplaceCustomers(FunctionalTest):
+    """tests for replace customers."""
+
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       return_value=ImageWrapperTest(
+                           image=ImageTest(
+                               customers=models.CustomerWrapper(['customer']))))
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_replace_customers_success(self, mock_di,
+                                       mock_send_to_rds_if_needed,
+                                       mock_get_image_by_uuid):
+        global visibility
+        visibility = 'private'
+        rds_proxy, mock_data_manager = get_data_manager_mock()
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        customers_wrapper = models.CustomerWrapper(['customer'])
+        result = image_logic.replace_customers('uuid', customers_wrapper,
+                                               'transaction')
+        self.assertEqual(result.image.customers.customers, ['customer'])
+
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       return_value=ImageWrapperTest(
+                           image=ImageTest(
+                               customers=models.CustomerWrapper(['customer']))))
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_replace_customers_image_not_found(self, mock_di,
+                                               mock_send_to_rds_if_needed,
+                                               mock_get_image_by_uuid):
+        rds_proxy, mock_data_manager = get_data_manager_mock(
+            mock_sql_image=None)
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        self.assertRaises(image_logic.ErrorStatus,
+                          image_logic.replace_customers,
+                          'uuid', mock.MagicMock(),
+                          'transaction')
+
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       return_value=ImageWrapperTest(
+                           image=ImageTest(
+                               customers=models.CustomerWrapper(['customer']))))
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed', return_value=True)
+    @mock.patch.object(image_logic, 'di')
+    def test_replace_customers_public_image(self, mock_di,
+                                            mock_send_to_rds_if_needed,
+                                            mock_get_image_by_uuid):
+        global visibility
+        visibility = 'public'
+        rds_proxy, mock_data_manager = get_data_manager_mock()
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        self.assertRaises(ValueError,
+                          image_logic.replace_customers,
+                          'uuid', mock.MagicMock(),
+                          'transaction')
+        visibility = 'private'
+
+    @mock.patch.object(image_logic, 'get_image_by_uuid',
+                       return_value=ImageWrapperTest(
+                           image=ImageTest(
+                               customers=models.CustomerWrapper(['customer']))))
+    @mock.patch.object(image_logic, 'send_to_rds_if_needed',
+                       side_effect=ValueError('Duplicate entry'))
+    @mock.patch.object(image_logic, 'di')
+    def test_replace_customers_duplicate_entry(self, mock_di,
+                                               mock_send_to_rds_if_needed,
+                                               mock_get_image_by_uuid):
+        rds_proxy, mock_data_manager = get_data_manager_mock()
+        mock_di.resolver.unpack.return_value = mock_data_manager
+        self.assertRaises(image_logic.ErrorStatus,
+                          image_logic.replace_customers,
+                          'uuid', mock.MagicMock(),
+                          'transaction')
+
+
+def get_data_manager_mock(get_existing_region_names={"name": "mdt1"},
+                          imagejson={"regions": {"name": "mdt1"}},
+                          delete_image_by_id=True,
+                          begin_transaction=True,
+                          flush=True,
+                          send_image=True,
+                          mock_sql_image=True):
+    mock_rds_proxy = mock.MagicMock()
+    mock_data_manager = mock.MagicMock()
+    mock_data_manager_return_value = mock.MagicMock()
+    mock_image_rec = mock.MagicMock()
+    image_json = mock.MagicMock()
+    image_json.return_value = imagejson
+    if mock_sql_image:
+        mock_sql_image = mock.MagicMock()
+        mock_sql_image.__json__ = image_json
+        mock_sql_image.visibility = visibility
+        mock_sql_image.get_proxy_dict = mock.MagicMock(return_value={'regions': regions})
+        mock_sql_image.get_existing_region_names.return_value = \
+            get_existing_region_names
+    mock_image_rec.get_image_by_id.return_value = mock_sql_image
+    mock_image_rec.delete_image_by_id.return_value = delete_image_by_id
+    mock_image_rec.insert.return_value = True
+    mock_data_manager_return_value.begin_transaction.return_value = \
+        begin_transaction
+    mock_data_manager_return_value.flush.return_value = flush
+    mock_data_manager_return_value.get_record.return_value = mock_image_rec
+    mock_rds_proxy.send_image.return_value = send_image
+    mock_data_manager.return_value = mock_data_manager_return_value
+
+    return mock_rds_proxy, mock_data_manager
diff --git a/orm/services/image_manager/ims/tests/logic/test_meta_data.py b/orm/services/image_manager/ims/tests/logic/test_meta_data.py
new file mode 100755
index 00000000..97558e7d
--- /dev/null
+++ b/orm/services/image_manager/ims/tests/logic/test_meta_data.py
@@ -0,0 +1,54 @@
+from ims.logic import metadata_logic
+from ims.tests import FunctionalTest
+from ims.persistency.sql_alchemy.db_models import ImageRegion
+from ims.persistency.wsme.models import MetadataWrapper, Metadata
+from ims.persistency.wsme import models
+import mock
+
+
+class TestMetaData(FunctionalTest):
+    """metadata uni tests."""
+
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    @mock.patch.object(metadata_logic, 'di')
+    def test_add_metadtat_sucess(self, metadta_mock):
+        data_manager = get_data_maneger_mock_metadata(image_rec=True)
+        metadta_mock.resolver.unpack.return_value = data_manager
+        result = metadata_logic.add_metadata("id", "region", {})
+
+    @mock.patch.object(metadata_logic, 'di')
+    def test_add_metadtat_notfound(self, metadta_mock):
+        data_manager = get_data_maneger_mock_metadata()
+        metadta_mock.resolver.unpack.return_value = data_manager
+        with self.assertRaises(metadata_logic.ErrorStatus):
+            metadata_logic.add_metadata("id", "region", {})
+
+    @mock.patch.object(metadata_logic, 'di')
+    def test_add_metadtat_with_regions_success(self, metadta_mock):
+        data_manager = get_data_maneger_mock_metadata(image_rec=True,
+                                                      regions=[ImageRegion(region_name="region")])
+        metadta_mock.resolver.unpack.return_value = data_manager
+        metadata_logic.add_metadata("id", "region",
+                                    MetadataWrapper(Metadata("1", "2", "3")))
+
+
+def get_data_maneger_mock_metadata(image_rec=None, regions=[]):
+    data_manager = mock.MagicMock()
+
+    DataManager = mock.MagicMock()
+    db_record = mock.MagicMock()
+    sql_record = mock.MagicMock()
+
+    sql_record.regions = regions
+    db_record.get_image_by_id.return_value = None
+    if image_rec:
+        db_record.get_image_by_id.return_value = sql_record
+
+    DataManager.get_record.return_value = db_record
+    data_manager.return_value = DataManager
+    return data_manager
diff --git a/orm/services/image_manager/ims/tests/persistency/__init__.py b/orm/services/image_manager/ims/tests/persistency/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/tests/persistency/sql_alchemy/__init__.py b/orm/services/image_manager/ims/tests/persistency/sql_alchemy/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/tests/persistency/sql_alchemy/images/__init__.py b/orm/services/image_manager/ims/tests/persistency/sql_alchemy/images/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/tests/persistency/sql_alchemy/images/test_image_record.py b/orm/services/image_manager/ims/tests/persistency/sql_alchemy/images/test_image_record.py
new file mode 100755
index 00000000..58661cc3
--- /dev/null
+++ b/orm/services/image_manager/ims/tests/persistency/sql_alchemy/images/test_image_record.py
@@ -0,0 +1,166 @@
+from ims.persistency.sql_alchemy import data_manager
+from ims.tests import FunctionalTest
+from ims.persistency.sql_alchemy.db_models import Image
+
+import mock
+
+
+class MyError(Exception):
+    def __init__(self, message=None):
+        self.message = message
+
+
+class TestImageRecord(FunctionalTest):
+    def test_insert_sanity(self):
+        session = mock.MagicMock()
+        session.add = mock.MagicMock()
+
+        dm = data_manager.ImageRecord(session)
+
+        dm.insert(Image())
+
+        assert session.add.called
+
+    def test_insert_error(self):
+        add = mock.MagicMock(return_value=SystemError())
+        session = mock.MagicMock(return_value=add)
+
+        dm = data_manager.ImageRecord(session)
+
+        self.assertRaises(Exception, dm.insert)
+
+    def test_get_images_by_name_sanity(self):
+        session = mock.MagicMock()
+        all = mock.MagicMock()
+        query = mock.MagicMock(return_value=all)
+
+        dm = data_manager.ImageRecord(session)
+
+        dm.create_images_by_name_query = mock.MagicMock()
+        dm.customise_query = mock.MagicMock(return_value=query)
+
+        dm.get_images_by_name('a')
+
+        assert query.all.called
+
+    def test_get_images_by_name_error(self):
+        session = mock.MagicMock()
+        all = mock.MagicMock()
+        query = mock.MagicMock(return_value=SystemError())
+
+        dm = data_manager.ImageRecord(session)
+
+        dm.create_images_by_name_query = mock.MagicMock(query)
+        dm.customise_query = mock.MagicMock(return_value=SystemError())
+
+        self.assertRaises(Exception, dm.get_images_by_name)
+
+        self.assertRaises(Exception, dm.insert)
+
+    def test_get_images_by_criteria_sanity(self):
+        join = mock.MagicMock()
+        filter = mock.MagicMock(return_value=[Image()])
+        query = mock.MagicMock()
+        query.join = mock.MagicMock(return_value=join)
+        query.filter = mock.MagicMock(return_value=filter)
+        query.all = mock.MagicMock(return_value=[Image()])
+        join.filter = mock.MagicMock(return_value=filter)
+
+        session = mock.MagicMock()
+        session.query = mock.MagicMock(return_value=query)
+
+        dm = data_manager.ImageRecord(session)
+        dm.customise_query = mock.MagicMock()
+
+        r = dm.get_images_by_criteria(visibility='a', region='b', Customer='c')
+
+        self.assertEqual(len(r), 0)
+
+    def test_get_images_by_criteria_error(self):
+        join = mock.MagicMock()
+        filter = mock.MagicMock(return_value=[Image()])
+        query = mock.MagicMock()
+        query.join = mock.MagicMock(return_value=join)
+        query.filter = mock.MagicMock(return_value=filter)
+        query.all = mock.MagicMock(return_value=SystemError())
+        join.filter = mock.MagicMock(return_value=filter)
+
+        session = mock.MagicMock()
+        session.query = mock.MagicMock(return_value=query)
+
+        dm = data_manager.ImageRecord(session)
+        dm.customise_query = mock.MagicMock(return_value=SystemError())
+
+        self.assertRaises(Exception, dm.get_images_by_criteria)
+
+    def test_create_images_by_name_query_sanity(self):
+        filter = mock.MagicMock(return_value=[Image()])
+        query = mock.MagicMock()
+        query.filter = mock.MagicMock(filter)
+
+        session = mock.MagicMock()
+        session.query = mock.MagicMock(query)
+
+        dm = data_manager.ImageRecord(session)
+
+        r = dm.create_images_by_name_query('a')
+
+        self.assertEqual(len(r), 0)
+
+    def test_create_images_by_name_query_error(self):
+        query = mock.MagicMock()
+        query.filter = mock.MagicMock(return_value=SystemError())
+
+        session = mock.MagicMock()
+        session.query = mock.MagicMock(return_value=SystemError())
+
+        dm = data_manager.ImageRecord(session)
+
+        self.assertRaises(Exception, dm.create_images_by_name_query, 'a')
+
+    def test_get_image_sanity(self):
+        query = mock.MagicMock()
+        query.first = mock.MagicMock(Image())
+
+        session = mock.MagicMock()
+        session.query = mock.MagicMock(query)
+
+        dm = data_manager.ImageRecord(session)
+
+        r = dm.get_image('a')
+
+        self.assertEqual(len(r), 0)
+
+    def test_get_image_query_error(self):
+        query = mock.MagicMock()
+        query.first = mock.MagicMock(return_value=SystemError())
+
+        session = mock.MagicMock()
+        session.query = mock.MagicMock(return_value=SystemError())
+
+        dm = data_manager.ImageRecord(session)
+
+        self.assertRaises(Exception, dm.get_image, 'a')
+
+    def test_delete_image_by_id_sanity(self):
+        format = mock.MagicMock()
+        execute = mock.MagicMock(return_value=format)
+
+        session = mock.MagicMock()
+        session.connection = mock.MagicMock(return_value=execute)
+
+        dm = data_manager.ImageRecord(session)
+        dm.customise_query = mock.MagicMock()
+
+        dm.delete_image_by_id('a')
+
+        assert session.connection.called
+
+    def test_delete_image_by_id_error(self):
+        session = mock.MagicMock()
+        session.connection = mock.MagicMock(return_value=SystemError())
+
+        dm = data_manager.ImageRecord(session)
+        dm.customise_query = mock.MagicMock()
+
+        self.assertRaises(Exception, dm.delete_image_by_id, 'a')
diff --git a/orm/services/image_manager/ims/tests/proxies/__init__.py b/orm/services/image_manager/ims/tests/proxies/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/tests/proxies/rds_proxy.py b/orm/services/image_manager/ims/tests/proxies/rds_proxy.py
new file mode 100755
index 00000000..8dce962b
--- /dev/null
+++ b/orm/services/image_manager/ims/tests/proxies/rds_proxy.py
@@ -0,0 +1,86 @@
+import mock
+from ims.proxies import rds_proxy
+from ims.tests import FunctionalTest
+
+
+class Response:
+    def __init__(self, status_code, content):
+        self.status_code = status_code
+        self.content = content
+
+    def json(self):
+        return {"res": self.content}
+
+
+class TestRdsProxy(FunctionalTest):
+    """rds proxy unittests."""
+
+    def setUp(self):
+        FunctionalTest.setUp(self)
+
+    def tearDown(self):
+        FunctionalTest.tearDown(self)
+
+    @mock.patch.object(rds_proxy, 'di')
+    @mock.patch.object(rds_proxy, 'request')
+    def test_send_post_rds_success(self, mock_request, mock_di):
+        req = mock.MagicMock()
+        req.post.return_value = Response(201, "any cont")
+        mock_di.resolver.unpack.return_value = req
+        result = rds_proxy.send_image({"not real": "only for test"}, "tran_id",
+                                      "post")
+        self.assertEqual(result, {'res': 'any cont'})
+
+    @mock.patch.object(rds_proxy, 'di')
+    @mock.patch.object(rds_proxy, 'request')
+    def test_send_put_rds_success(self, mock_request, mock_di):
+        req = mock.MagicMock()
+        req.put.return_value = Response(200, "any cont")
+        mock_di.resolver.unpack.return_value = req
+        result = rds_proxy.send_image({"not real": "only for test"}, "tran_id",
+                                      "put")
+        self.assertEqual(result, {'res': 'any cont'})
+
+    @mock.patch.object(rds_proxy, 'di')
+    @mock.patch.object(rds_proxy, 'request')
+    def test_send_delete_rds_success(self, mock_request, mock_di):
+        req = mock.MagicMock()
+        req.delete.return_value = Response(204, "any cont")
+        mock_di.resolver.unpack.return_value = req
+        result = rds_proxy.send_image({"not real": "only for test"}, "tran_id",
+                                      "delete")
+        self.assertEqual(result, {'res': 'any cont'})
+
+    @mock.patch.object(rds_proxy, 'di')
+    def test_send_bad_rds_bad(self, mock_di):
+        req = mock.MagicMock()
+        req.post.return_value = Response(204, "any cont")
+        mock_di.resolver.unpack.return_value = req
+        with self.assertRaises(Exception) as exp:
+            rds_proxy.send_image({"not real": "only for test"}, "tran_id",
+                                 "any")
+
+    @mock.patch.object(rds_proxy, 'di')
+    @mock.patch.object(rds_proxy, 'request')
+    def test_send_rds_req_bad_resp(self, mock_request, mock_di):
+        req = mock.MagicMock()
+        req.post.return_value = Response(301, '{"faultstring": ":("}')
+        mock_di.resolver.unpack.return_value = req
+        with self.assertRaises(rds_proxy.ErrorStatus):
+            rds_proxy.send_image({"not real": "only for test"}, "tran_id",
+                                 "post")
+
+    @mock.patch.object(rds_proxy, 'di')
+    def test_get_rsource_status_rds(self, mock_di):
+        req = mock.MagicMock()
+        req.get.return_value = Response(200, "any cont")
+        mock_di.resolver.unpack.return_value = req
+        result = rds_proxy.get_status(resource_id="123abc", json_convert=True)
+        self.assertEqual(result, {'res': 'any cont'})
+
+    @mock.patch.object(rds_proxy, 'di')
+    def test_get_rsource_status_rds_nojson(self, mock_di):
+        req = mock.MagicMock()
+        req.get.return_value = Response(200, "any cont")
+        mock_di.resolver.unpack.return_value = req
+        rds_proxy.get_status(resource_id="123abc", json_convert=False)
diff --git a/orm/services/image_manager/ims/tests/simple_hook_mock.py b/orm/services/image_manager/ims/tests/simple_hook_mock.py
new file mode 100755
index 00000000..73b98ed1
--- /dev/null
+++ b/orm/services/image_manager/ims/tests/simple_hook_mock.py
@@ -0,0 +1,6 @@
+from pecan.hooks import PecanHook
+
+
+class SimpleHookMock(PecanHook):
+    def before(self, state):
+        setattr(state.request, 'transaction_id', 'some_id')
diff --git a/orm/services/image_manager/ims/tests/test_models.py b/orm/services/image_manager/ims/tests/test_models.py
new file mode 100644
index 00000000..9df3f2db
--- /dev/null
+++ b/orm/services/image_manager/ims/tests/test_models.py
@@ -0,0 +1,41 @@
+import mock
+from ims.tests import FunctionalTest
+
+from ims.persistency.wsme import models
+
+GROUP_REGIONS = [
+    "DPK",
+    "SNA1",
+    "SNA2"
+]
+
+
+class TestModels(FunctionalTest):
+
+    def setUp(self):
+        FunctionalTest.setUp(self)
+        models.get_regions_of_group = mock.MagicMock(return_value=GROUP_REGIONS)
+        models.set_utils_conf = mock.MagicMock()
+
+    def test_handle_group_success(self):
+        image = get_image_model()
+        image.handle_region_group()
+
+        self.assertEqual(len(image.regions), 3)
+
+    def test_handle_group_not_found(self):
+        models.get_regions_of_group = mock.MagicMock(return_value=None)
+        image = get_image_model()
+
+        self.assertRaises(models.ErrorStatus, image.handle_region_group,)
+
+
+def get_image_model():
+    """
+    this function create a customer model object for testing
+    :return: new customer object
+    """
+
+    image = models.Image(id='a', regions=[models.Region(name='r1', type='group')])
+
+    return image
diff --git a/orm/services/image_manager/ims/utils/__init__.py b/orm/services/image_manager/ims/utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/image_manager/ims/utils/authentication.py b/orm/services/image_manager/ims/utils/authentication.py
new file mode 100755
index 00000000..3104b391
--- /dev/null
+++ b/orm/services/image_manager/ims/utils/authentication.py
@@ -0,0 +1,61 @@
+import logging
+from keystone_utils import tokens
+from orm_common.utils import api_error_utils as err_utils
+from pecan import conf
+from orm_common.policy import policy
+
+logger = logging.getLogger(__name__)
+
+
+def _is_authorization_enabled(app_conf):
+    return app_conf.authentication.enabled
+
+
+def _get_token_conf(app_conf):
+    mech_id = app_conf.authentication.mech_id
+    mech_password = app_conf.authentication.mech_pass
+    rms_url = app_conf.authentication.rms_url
+    tenant_name = app_conf.authentication.tenant_name
+    keystone_version = app_conf.authentication.keystone_version
+    conf = tokens.TokenConf(mech_id, mech_password, rms_url, tenant_name,
+                            keystone_version)
+    return conf
+
+
+def check_permissions(app_conf, token_to_validate, lcp_id):
+    logger.debug("Check permissions...start")
+    try:
+        if _is_authorization_enabled(app_conf):
+            if token_to_validate is not None and lcp_id is not None and str(token_to_validate).strip() != '' and str(lcp_id).strip() != '':
+                token_conf = _get_token_conf(app_conf)
+                logger.debug("Authorization: validating token=[{}] on lcp_id=[{}]".format(token_to_validate, lcp_id))
+                is_permitted = tokens.is_token_valid(token_to_validate, lcp_id, token_conf)
+                logger.debug("Authorization: The token=[{}] on lcp_id=[{}] is [{}]"
+                             .format(token_to_validate, lcp_id, "valid" if is_permitted else "invalid"))
+            else:
+                raise Exception("Token=[{}] and/or Region=[{}] are empty/none.".format(token_to_validate, lcp_id))
+        else:
+            logger.debug("The authentication service is disabled. No authentication is needed.")
+            is_permitted = True
+    except Exception as e:
+        msg = "Fail to validate request. due to {}.".format(e.message)
+        logger.error(msg)
+        logger.exception(e)
+        is_permitted = False
+    logger.debug("Check permissions...end")
+    return is_permitted
+
+
+def authorize(request, action):
+    if not _is_authorization_enabled(conf):
+        return
+
+    auth_region = request.headers.get('X-Auth-Region')
+    auth_token = request.headers.get('X-Auth-Token')
+    message = "missing header {}".format(
+        'X-Auth-Region' if auth_region is None else 'X-Auth-Token')
+    if auth_region is None or auth_token is None:
+        raise err_utils.get_error(request.transaction_id,
+                                  message="missing header {}".format(message),
+                                  status_code=400)
+    policy.authorize(action, request, conf)
diff --git a/orm/services/image_manager/ims/utils/utils.py b/orm/services/image_manager/ims/utils/utils.py
new file mode 100755
index 00000000..ce9a953f
--- /dev/null
+++ b/orm/services/image_manager/ims/utils/utils.py
@@ -0,0 +1,16 @@
+from pecan import conf, request
+import time
+
+
+def convert_time_human(time_stamp):
+    return time.ctime(int(time_stamp))
+
+
+def get_server_links(id=None):
+    links = {'self': '{}'.format(request.url)}
+    self_links = '{}'.format(request.upath_info)
+    if id and id not in request.path:
+        links['self'] += '{}{}'.format('' if request.path[-1] == '/' else '/',
+                                       id)
+        self_links += '{}{}'.format('' if request.path[-1] == '/' else '/', id)
+    return links, self_links
diff --git a/orm/services/image_manager/pycharm_init.py b/orm/services/image_manager/pycharm_init.py
new file mode 100644
index 00000000..469a65d9
--- /dev/null
+++ b/orm/services/image_manager/pycharm_init.py
@@ -0,0 +1,3 @@
+from pecan.commands import CommandRunner
+runner = CommandRunner()
+runner.run(['serve', 'config.py'])
diff --git a/orm/services/image_manager/scripts/db_scripts/create_db.sql b/orm/services/image_manager/scripts/db_scripts/create_db.sql
new file mode 100755
index 00000000..df1384a7
--- /dev/null
+++ b/orm/services/image_manager/scripts/db_scripts/create_db.sql
@@ -0,0 +1,86 @@
+create database if not exists orm_ims_db DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+use orm_ims_db;
+
+#***** 
+#* MySql script for Creating Table image
+#*****
+
+create table if not exists image
+   (
+	 id varchar(64) not null,
+	 name varchar(64) not null,
+	 enabled smallint not null,
+	 url varchar(250) not null,
+	 protected smallint not null,
+	 visibility varchar(10) not null,
+	 disk_format varchar(64) not null,
+	 container_format varchar(64) not null,
+	 min_disk integer not null,
+	 min_ram integer not null,
+	 owner varchar(128) not null,
+	 `schema` varchar(128) not null,
+	 created_at integer not null,
+	 updated_at integer not null,
+	 primary key (id),
+	 unique name (name),
+	 index visibility (visibility)
+   );
+#
+
+#***** 
+#* MySql script for Creating Table image_property
+#*****
+
+create table if not exists image_property
+   (
+	 image_id varchar(64) not null,
+	 key_name varchar(64) not null,
+	 key_value varchar(64) not null,
+	 primary key (image_id,key_name),
+	 foreign key (image_id) references image(id) ON DELETE CASCADE ON UPDATE NO ACTION
+   );
+#
+
+#***** 
+#* MySql script for Creating Table image_region
+#*****
+
+create table if not exists image_region
+   (
+	 image_id varchar(64) not null,
+	 region_name varchar(64) not null,
+	 region_type varchar(32) not null,
+	 checksum varchar(64) not null,
+	 size varchar(64) not null,
+	 virtual_size varchar(64) not null,
+	 primary key (image_id,region_name),
+	 foreign key (image_id) references image(id) ON DELETE CASCADE ON UPDATE NO ACTION
+   );
+#
+
+#***** 
+#* MySql script for Creating Table image_tag
+#*****
+
+create table if not exists image_tag
+   (
+	 image_id varchar(64) not null,
+	 tag varchar(64) not null,
+	 primary key (image_id,tag),
+	 foreign key (image_id) references image(id) ON DELETE CASCADE ON UPDATE NO ACTION
+   );
+#
+
+
+#***** 
+#* MySql script for Creating Table image_customer
+#*****
+
+create table if not exists image_customer
+   (
+	 image_id varchar(64) not null,
+	 customer_id varchar(64) not null,
+	 primary key (image_id,customer_id),
+	 foreign key (image_id) references image(id) ON DELETE CASCADE ON UPDATE NO ACTION
+   );
+#
diff --git a/orm/services/image_manager/scripts/db_scripts/update_db.sql b/orm/services/image_manager/scripts/db_scripts/update_db.sql
new file mode 100755
index 00000000..abec7984
--- /dev/null
+++ b/orm/services/image_manager/scripts/db_scripts/update_db.sql
@@ -0,0 +1,29 @@
+USE orm_ims_db;
+
+DELIMITER ;;
+
+DROP PROCEDURE IF EXISTS add_region_properies;
+CREATE PROCEDURE add_region_properies()
+BEGIN
+
+        -- add a column safely
+        IF NOT EXISTS( (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE()
+                        AND COLUMN_NAME='checksum' AND TABLE_NAME='image_region') ) THEN
+                ALTER TABLE image_region ADD checksum varchar(64) NOT NULL;
+        END IF;
+
+        IF NOT EXISTS( (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE()
+                        AND COLUMN_NAME='size' AND TABLE_NAME='image_region') ) THEN
+                ALTER TABLE image_region ADD size varchar(64) NOT NULL;
+        END IF;
+
+        IF NOT EXISTS( (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE()
+                        AND COLUMN_NAME='virtual_size' AND TABLE_NAME='image_region') ) THEN
+                ALTER TABLE image_region ADD virtual_size varchar(64) NOT NULL;
+        END IF;
+END ;;
+
+CALL add_region_properies() ;;
+
+DELIMITER ;
+
diff --git a/orm/services/image_manager/scripts/shell_scripts/create_db.sh b/orm/services/image_manager/scripts/shell_scripts/create_db.sh
new file mode 100644
index 00000000..4f93fc8c
--- /dev/null
+++ b/orm/services/image_manager/scripts/shell_scripts/create_db.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+echo Creating database: orm_ims_db
+
+mysql -uroot -pstack < ../db_scripts/create_db.sql
+
+echo Done !
diff --git a/orm/services/image_manager/scripts/shell_scripts/update_db.sh b/orm/services/image_manager/scripts/shell_scripts/update_db.sh
new file mode 100755
index 00000000..79ca5c57
--- /dev/null
+++ b/orm/services/image_manager/scripts/shell_scripts/update_db.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+echo Creating database: orm_ims_db
+
+mysql -uroot -pstack < ../db_scripts/update_db.sql
+
+echo Done !
diff --git a/orm/services/image_manager/swagger/swagger.yaml b/orm/services/image_manager/swagger/swagger.yaml
new file mode 100755
index 00000000..87bb21f1
--- /dev/null
+++ b/orm/services/image_manager/swagger/swagger.yaml
@@ -0,0 +1,751 @@
+# this is an example of the Uber API
+# as a demonstration of an API spec in YAML
+swagger: '2.0'
+info:
+  version: 3.5.0
+  title: Image API'S
+  description: Image api's
+    		All api's should supply two header parameters
+    		X-Auth-Token - Token received from keystone
+    		X-Auth-Region - The region
+        There is an optional header parameter X-RANGER-Client which tells who is the client for the api's
+
+# the domain of the service
+host: 135.76.2.229
+# array of all schemes that your API supports
+schemes:
+  - https
+  
+# will be prefixed to all paths
+basePath: /v1/orm
+produces:
+  - application/json
+
+paths:
+  /image:
+    parameters:
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+      - $ref: "#/parameters/Client"
+    post:
+      summary: create image
+      description: |
+        The post image endpoint create a new image and send it to the Heat to create this image in each region needed
+        Return all data of the new image
+      parameters:
+        - name: full image
+          in: body
+          description: input body to create full image
+          schema:
+            $ref: '#/definitions/Image'
+          required: true
+
+      tags:
+        - Image
+            
+      responses:
+        201:
+          description: image is created
+          schema:
+              $ref: '#/definitions/Image'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        409:
+          description: Duplicate Error
+          schema:
+            $ref: '#/definitions/409'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    get:
+      summary: get a list of imagess by criteria (visibility, region, tenant)
+      description: |
+        The get images retrieve all imagess matched to the above criterias
+      parameters:
+        - name: visibility
+          in: query
+          type: "string"
+          enum: [
+            "public",
+            "private"
+          ]
+          required: false
+          description: public or private image
+        - name: region
+          in: query
+          type: "string"
+          description: region name
+          required: false
+        - name: tenant
+          in: query
+          type: "string"
+          description: tenant name.
+          required: false
+      tags:
+        - Image
+      responses:
+        200:
+          description: list of images by criteria
+          schema:
+              $ref: '#/definitions/Images'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /images/{image_uuid_or_name}:
+    parameters:
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+      - $ref: "#/parameters/Client"
+    get:
+      summary: get image (one) by id or name
+      description: retrieve image has this param if not found get image by name that maches this param
+      parameters:
+        - name: image_uuid_or_name
+          in: path
+          type: string
+          description: uuid or name of the requested image.
+          required: true
+      tags:
+        - Image
+      responses:
+        200:
+          description: the requested image 
+          schema:
+            $ref: '#/definitions/Image'
+        404:
+          description: image not found
+          schema:
+            $ref: '#/definitions/404'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+    
+    delete:
+      summary: delete image (one) by id or name
+      description: delete image need to remove all regions one by one before deleting the image other wise will fail to delete
+      parameters:
+      - name: image_uuid_or_name
+        in: path
+        type: string
+        description: uuid or name of the image to delete.
+        required: true
+      tags:
+        - Image
+      responses:
+        405:
+          description: metod not allowed
+          schema:
+            $ref: '#/definitions/Error'
+        204:
+          description: no content
+          
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+    
+    put:
+      summary: get image (one) by id or name
+      description: retrieve image has this param if not found get image by name that maches this param
+      parameters:
+        - name: image_uuid_or_name
+          in: path
+          type: string
+          description: uuid or name of the requested image.
+          required: true
+        - name: full image
+          in: body
+          description: input body to create full image
+          schema:
+            $ref: '#/definitions/Image'
+          required: true
+      tags:
+        - Image
+      responses:
+        201:
+          description: image is created
+          schema:
+              $ref: '#/definitions/Image'
+        404:
+          description: image not found
+          schema:
+            $ref: '#/definitions/404'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+  
+  /image/{image_uuid}/regions:
+    parameters:
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+      - $ref: "#/parameters/Client"
+    post:
+      summary: add region to an image
+      description: |
+        it will add the regions in the body to the image and send them to heat to be created
+      parameters:
+        - name: image_uuid
+          in: path
+          type: string
+          description: uuid of the requested image.
+          required: true
+        - name: regions
+          in: body
+          description: list of full regions
+          schema:
+            $ref: '#/definitions/Regions'
+          required: true
+      tags:
+        - Regions
+      responses:
+        201:
+          description: regions added to image
+          schema:
+              $ref: '#/definitions/Regions'
+        404:
+          description: image not found
+          schema:
+            $ref: '#/definitions/404'
+        409:
+          description: Duplicate Error
+          schema:
+            $ref: '#/definitions/409'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+    put:
+      summary: replace region in an image
+      description: |
+        it will remove all existing regions in the image and replace them in the regions in request body and the old regions will be sent to be removed from heat and the new ones will be sent as created 
+      parameters:
+        - name: image_uuid
+          in: path
+          type: string
+          description: uuid of the requested image.
+          required: true
+        - name: regions
+          in: body
+          description: list of full regions
+          schema:
+            $ref: '#/definitions/Regions'
+          required: true
+      tags:
+        - Regions
+      responses:
+        201:
+          description: regions added to image
+          schema:
+              $ref: '#/definitions/Regions'
+        404:
+          description: image not found
+          schema:
+            $ref: '#/definitions/404'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+  /image/{image_uuid}/regions/{region_name}:
+    parameters:
+        - $ref: "#/parameters/Token"
+        - $ref: "#/parameters/Region"
+        - $ref: "#/parameters/Client"
+    delete:
+      summary: delete region from image by region name name
+      description: delete region from image by region name name and send it to heat to be removed
+      parameters:
+        - name: image_uuid
+          in: path
+          type: string
+          description: uuid of the requested image.
+          required: true
+        - name: region_name
+          in: path
+          type: string
+          description: name of the region need to delete
+          required: true
+      tags:
+        - Regions
+      responses:
+        204:
+          description: no content
+        404:
+          description: image not found
+          schema:
+            $ref: '#/definitions/404'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+            
+  /image/{image_uuid}/enabled/:
+    parameters:
+        - $ref: "#/parameters/Token"
+        - $ref: "#/parameters/Region"
+        - $ref: "#/parameters/Client"
+    put:
+      summary: enable and disable image
+      description: got in all regions related to this image and set them to enable/disable and send them to head to be modified 
+      parameters:
+        - name: image_uuid
+          in: path
+          type: string
+          description: uuid of the requested image.
+          required: true
+        - name: enabled input json
+          in: body
+          description: input body enable/disable image
+          schema:
+            $ref: '#/definitions/Enable'
+          required: true
+      tags:
+        - Enabled
+      responses:
+        200:
+          description: image is created
+          schema:
+              $ref: '#/definitions/Image'
+        404:
+          description: image not found
+          schema:
+            $ref: '#/definitions/404'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /images/{image_uuid}/regions/{region_name}/metadata:
+    parameters:
+        - $ref: "#/parameters/Token"
+        - $ref: "#/parameters/Region"
+        - $ref: "#/parameters/Client"
+    post:
+      summary: add metadata to region in an image
+      description: add metadata to specified region related to image this operation does not require send this region to heat its only in the ims db (it will replace existing ones) 
+      parameters:
+        - name: image_uuid
+          in: path
+          type: string
+          description: uuid of the requested image.
+          required: true
+        - name: region_name
+          in: path
+          type: string
+          description: region name of requested region
+          required: true
+        - name: metadata input json
+          in: body
+          description: the metadata json that need to be added to the region
+          schema:
+            $ref: '#/definitions/MetaDataWrapper'
+          required: true
+      tags:
+        - Metadata
+      
+      responses:
+        201:
+          description: added metadata to region
+          schema:
+            type: string
+        404:
+          description: image not found
+          schema:
+            $ref: '#/definitions/404'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+  
+  /images/{image_uuid}/customers/:
+    parameters:
+        - $ref: "#/parameters/Token"
+        - $ref: "#/parameters/Region"
+        - $ref: "#/parameters/Client"
+    post:
+      summary: add customer to an image
+      description: add customer to private image
+      parameters:
+        - name: image_uuid
+          in: path
+          type: string
+          description: uuid of the requested image.
+          required: true
+        - name: customer input json
+          in: body
+          description: input body customer
+          schema:
+            $ref: '#/definitions/Customer'
+          required: true
+      tags:
+        - Customers
+      responses:
+        200:
+          description: customers added to image
+          schema:
+              $ref: '#/definitions/Image'
+        404:
+          description: image not found
+          schema:
+            $ref: '#/definitions/404'
+        409:
+          description: Duplicate Error
+          schema:
+            $ref: '#/definitions/409'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+      
+    put:
+      summary: replace image customers
+      description: replace all customers to specific image
+      parameters:
+        - name: image_uuid
+          in: path
+          type: string
+          description: uuid of the requested image.
+          required: true
+        - name: customer input json
+          in: body
+          description: input body customer
+          schema:
+            $ref: '#/definitions/Customer'
+          required: true
+      tags:
+        - Customers
+      responses:
+        200:
+          description: customers added to image
+          schema:
+              $ref: '#/definitions/Image'
+        404:
+          description: image not found
+          schema:
+            $ref: '#/definitions/404'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+      
+
+definitions:
+  Image:
+    type: object
+    required:
+      - name
+      - url
+      - visibility
+      - disk-format
+      - container-format
+    properties:
+      name:
+        type: string
+        description: name
+        example: Ubuntu
+      enabled:
+        type: boolean
+        description: tells if image enabled
+        example: true
+      url:
+        type: string
+        description: url
+        example: /v1/images/b2173dd3-7ad6-4362-baa6-a68bce3565cb/file
+      visibility:
+        type: string
+        description: if image visable
+        example: private
+      disk-format:
+        type: string
+        description:  disk-format
+        example: raw
+      container-format:
+        type: string
+        description:  container-format
+        example: bare
+      min-disk:
+        type: integer
+        description: int32
+        example: 0
+      min-ram:
+        type: integer
+        description: int32
+        example: 1024
+      tags:
+        type: array
+        items:
+          type: string
+          example: tag1
+      properties:
+        $ref: '#/definitions/Dictionary'
+      regions:
+        type: array
+        items:
+          $ref: '#/definitions/Region'
+      customers:
+        type: array
+        items:
+          type: string
+          example: 1a15e3ea-bc4f-4aec-8a98-8feb2537a354
+      owner:
+        type: string
+        description: owner
+        example: bab7d5c60cd041a0a36f7c4b6e1dd978
+      schema:
+        type: string
+        description: schema
+        example: /v2/schemas/image
+      protected:
+        type: boolean
+        description: if image is protected
+        example: true
+        
+  Enable:
+    type: object
+    properties:
+      enabled:
+        type: boolean
+        description: can be true or false
+        example: true
+        
+  Customer:
+    type: object
+    properties:
+      customers:
+        type: array
+        items:
+          type: string
+  
+  Images:
+    type: array
+    items: 
+      properties:
+        name:
+          type: string
+          description: name
+        visibility:
+          type: string
+          description: name
+        id:
+          type: string
+          description: name
+
+  MetaDataWrapper:
+    type: object
+    properties:
+      metadata: 
+        $ref: '#/definitions/MetaData'
+
+  MetaData:
+    type: object
+    properties:
+      checksum:
+        type: string
+        example: '1024'
+      size:
+        type: string
+        example: '123'
+      virtual_size:
+        type: string
+        example: '123'
+
+  Region:
+    type: object
+    required:
+      - name
+      - type
+    properties:
+      name:
+        type: string
+        example: tn17
+      type:
+        type: string
+        description: single or group
+        example: single
+      status:
+        type: string
+        readOnly: true
+        example: error
+      error_message:
+        type: string
+        readOnly: true
+        example: fail to create
+
+  OutputRegion:
+    type: object
+    properties:
+      name:
+        type: string
+        example: tn17
+      type:
+        type: string
+        description: single or group
+        example: single
+      status:
+        type: string
+      error_message:
+        type: string
+      checksum:
+        type: string
+        example: '1024'
+      size:
+        type: string
+        example: '123'
+      virtual_size:
+        type: string
+        example: '123'
+  
+  OutputRegions:
+    type: array
+    items: 
+      $ref: '#/definitions/OutputRegion'
+  
+  Regions:
+    type: array
+    items: 
+      $ref: '#/definitions/Region'
+  
+  200:
+    type: object
+    properties:
+      name:
+        type: string
+        description: name
+      visibility:
+        type: string
+        description: name
+      id:
+        type: string
+        description: name
+
+  Error:
+    type: object
+    properties:
+      code:
+        type: integer
+        format: int32
+      type:
+        type: string
+      transaction_id:
+        type: string
+      message:
+        type: string
+      details:
+        type: string
+        
+  409:
+    type: object
+    properties:
+      code:
+        type: integer
+        format: int32
+      type:
+        type: string
+      transaction_id:
+        type: string
+      message:
+        type: string
+      details:
+        type: string
+        
+  400:
+    type: object
+    properties:
+      code:
+        type: integer
+        format: int32
+      type:
+        type: string
+      transaction_id:
+        type: string
+      message:
+        type: string
+      details:
+        type: string
+  
+  404:
+    type: object
+    properties:
+      code:
+        type: integer
+        format: int32
+      type:
+        type: string
+      transaction_id:
+        type: string
+      message:
+        type: string
+      details:
+        type: string
+
+  Dictionary:
+    type: object
+    additionalProperties: 
+      type: "string"
+    example: {"property1": "value1"}
+
+
+parameters:
+  Token:
+    name: X-Auth-Token
+    in: header
+    description: Token from keystone
+    required: true
+    type: string
+    
+  Region:
+    name: X-Auth-Region
+    in: header
+    description: Region
+    required: true
+    type: string
+    
+  Client:
+    name: X-Auth-Client
+    in: header
+    description: Client name
+    required: false
+    type: string
diff --git a/orm/services/image_manager/tox.ini b/orm/services/image_manager/tox.ini
new file mode 100755
index 00000000..0b65030e
--- /dev/null
+++ b/orm/services/image_manager/tox.ini
@@ -0,0 +1,29 @@
+[tox]
+envlist=py27,pep8,cover
+
+[testenv]
+setenv= PYTHONPATH={toxinidir}:{toxinidir}/ims/external_mock/
+deps= -r{toxinidir}/requirements.txt
+      -r{toxinidir}/test-requirements.txt
+
+;commands=
+;    pip install git+ssh://jenkins@gerrit.mtn5.cci.att.com:29418/aic-orm-common@dev
+;#    pip install ../aic-orm-common/
+;
+;    python setup.py testr --coverage --slowest
+;    coverage report --omit=ims/persistency/sql_alchemy/*,ims/persistency/wsme/*
+;    coverage html  --omit=ims/persistency/sql_alchemy/*,ims/persistency/wsme/*
+
+[testenv:pep8]
+commands=
+#    pip install git+ssh://jenkins@gerrit.mtn5.cci.att.com:29418/aic-orm-common@master
+#    pip install ../aic-orm-common/
+    py.test --pep8 -m pep8
+
+[testenv:cover]
+commands=
+#    pip install git+ssh://jenkins@gerrit.mtn5.cci.att.com:29418/aic-orm-common@master
+#    pip install ../aic-orm-common/
+    coverage run setup.py test
+    coverage report
+    coverage html
diff --git a/orm/services/region_manager/MANIFEST.in b/orm/services/region_manager/MANIFEST.in
new file mode 100755
index 00000000..c922f11a
--- /dev/null
+++ b/orm/services/region_manager/MANIFEST.in
@@ -0,0 +1 @@
+recursive-include public *
diff --git a/orm/services/region_manager/__init__.py b/orm/services/region_manager/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/config.py b/orm/services/region_manager/config.py
new file mode 100755
index 00000000..4474beac
--- /dev/null
+++ b/orm/services/region_manager/config.py
@@ -0,0 +1,119 @@
+from orm_common.hooks.api_error_hook import APIErrorHook
+from orm_common.hooks.security_headers_hook import SecurityHeadersHook
+from orm_common.hooks.transaction_id_hook import TransactionIdHook
+
+global TransactionIdHook
+global APIErrorHook
+global SecurityHeadersHook
+
+# Server Specific Configurations
+server = {
+    'port': '8080',
+    'host': '0.0.0.0',
+    'name': 'rms'
+}
+
+# Pecan Application Configurations
+app = {
+    'root': 'rms.controllers.root.RootController',
+    'modules': ['rms'],
+    'static_root': '%(confdir)s/public',
+    'template_path': '%(confdir)s/rms/templates',
+    'debug': True,
+    'hooks': lambda: [TransactionIdHook(), APIErrorHook(), SecurityHeadersHook()]
+}
+
+logging = {
+    'root': {'level': 'INFO', 'handlers': ['console']},
+    'loggers': {
+        'rms': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'],
+                'propagate': False},
+        'pecan': {'level': 'DEBUG', 'handlers': ['console'],
+                  'propagate': False},
+        'audit_client': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'],
+                         'propagate': False},
+        'orm_common': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'],
+                       'propagate': False},
+        'keystone_utils': {'level': 'DEBUG',
+                           'handlers': ['console', 'Logfile'],
+                           'propagate': False},
+        'py.warnings': {'handlers': ['console']},
+        '__force_dict__': True
+    },
+    'handlers': {
+        'console': {
+            'level': 'DEBUG',
+            'class': 'logging.StreamHandler',
+            'formatter': 'color'
+        },
+        'Logfile': {
+            'level': 'DEBUG',
+            'class': 'logging.handlers.RotatingFileHandler',
+            'maxBytes': 50000000,
+            'backupCount': 10,
+            'filename': '/opt/app/orm/rms/rms.log',
+            'formatter': 'simple'
+        }
+    },
+    'formatters': {
+        'simple': {
+            'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]'
+                       '[%(threadName)s] %(message)s')
+        },
+        'color': {
+            '()': 'pecan.log.ColorFormatter',
+            'format': ('%(asctime)s [%(padded_color_levelname)s] [%(name)s]'
+                       '[%(threadName)s] %(message)s'),
+            '__force_dict__': True
+        }
+    }
+}
+
+# user input validations
+region_options = {
+    'allowed_status_values': [
+        'functional',
+        'maintenance',
+        'down',
+        'building'
+    ],
+    'endpoints_types_must_have': [
+        'dashboard',
+        'identity',
+        'ord'
+    ]
+}
+
+# DB configurations
+database = {
+    'url': 'mysql://root:stack@127.0.0.1/orm_rms_db?charset=utf8',
+    'max_retries': 3,
+    'retries_interval': 10
+}
+
+endpoints = {
+    'lcp': 'http://127.0.0.1:8082/lcp'
+}
+
+api = {
+    'uuid_server': {
+        'base': 'http://127.0.0.1:8090/',
+        'uuids': 'v1/uuids'
+    },
+    'audit_server': {
+        'base': 'http://127.0.0.1:8776/',
+        'trans': 'v1/audit/transaction'
+    }
+}
+
+verify = False
+
+authentication = {
+    "enabled": True,
+    "mech_id": "admin",
+    "mech_pass": "stack",
+    "tenant_name": "admin",
+    # The Keystone version currently in use. Can be either "2.0" or "3"
+    "keystone_version": "2.0",
+    "policy_file": "/opt/app/orm/rms/rms/etc/policy.json"
+}
diff --git a/orm/services/region_manager/cover/coverage_html.js b/orm/services/region_manager/cover/coverage_html.js
new file mode 100644
index 00000000..f6f5de20
--- /dev/null
+++ b/orm/services/region_manager/cover/coverage_html.js
@@ -0,0 +1,584 @@
+// Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
+// For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt
+
+// Coverage.py HTML report browser code.
+/*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */
+/*global coverage: true, document, window, $ */
+
+coverage = {};
+
+// Find all the elements with shortkey_* class, and use them to assign a shortcut key.
+coverage.assign_shortkeys = function () {
+    $("*[class*='shortkey_']").each(function (i, e) {
+        $.each($(e).attr("class").split(" "), function (i, c) {
+            if (/^shortkey_/.test(c)) {
+                $(document).bind('keydown', c.substr(9), function () {
+                    $(e).click();
+                });
+            }
+        });
+    });
+};
+
+// Create the events for the help panel.
+coverage.wire_up_help_panel = function () {
+    $("#keyboard_icon").click(function () {
+        // Show the help panel, and position it so the keyboard icon in the
+        // panel is in the same place as the keyboard icon in the header.
+        $(".help_panel").show();
+        var koff = $("#keyboard_icon").offset();
+        var poff = $("#panel_icon").position();
+        $(".help_panel").offset({
+            top: koff.top-poff.top,
+            left: koff.left-poff.left
+        });
+    });
+    $("#panel_icon").click(function () {
+        $(".help_panel").hide();
+    });
+};
+
+// Create the events for the filter box.
+coverage.wire_up_filter = function () {
+    // Cache elements.
+    var table = $("table.index");
+    var table_rows = table.find("tbody tr");
+    var table_row_names = table_rows.find("td.name a");
+    var no_rows = $("#no_rows");
+
+    // Create a duplicate table footer that we can modify with dynamic summed values.
+    var table_footer = $("table.index tfoot tr");
+    var table_dynamic_footer = table_footer.clone();
+    table_dynamic_footer.attr('class', 'total_dynamic hidden');
+    table_footer.after(table_dynamic_footer);
+
+    // Observe filter keyevents.
+    $("#filter").on("keyup change", $.debounce(150, function (event) {
+        var filter_value = $(this).val();
+
+        if (filter_value === "") {
+            // Filter box is empty, remove all filtering.
+            table_rows.removeClass("hidden");
+
+            // Show standard footer, hide dynamic footer.
+            table_footer.removeClass("hidden");
+            table_dynamic_footer.addClass("hidden");
+
+            // Hide placeholder, show table.
+            if (no_rows.length > 0) {
+                no_rows.hide();
+            }
+            table.show();
+
+        }
+        else {
+            // Filter table items by value.
+            var hidden = 0;
+            var shown = 0;
+
+            // Hide / show elements.
+            $.each(table_row_names, function () {
+                var element = $(this).parents("tr");
+
+                if ($(this).text().indexOf(filter_value) === -1) {
+                    // hide
+                    element.addClass("hidden");
+                    hidden++;
+                }
+                else {
+                    // show
+                    element.removeClass("hidden");
+                    shown++;
+                }
+            });
+
+            // Show placeholder if no rows will be displayed.
+            if (no_rows.length > 0) {
+                if (shown === 0) {
+                    // Show placeholder, hide table.
+                    no_rows.show();
+                    table.hide();
+                }
+                else {
+                    // Hide placeholder, show table.
+                    no_rows.hide();
+                    table.show();
+                }
+            }
+
+            // Manage dynamic header:
+            if (hidden > 0) {
+                // Calculate new dynamic sum values based on visible rows.
+                for (var column = 2; column < 20; column++) {
+                    // Calculate summed value.
+                    var cells = table_rows.find('td:nth-child(' + column + ')');
+                    if (!cells.length) {
+                        // No more columns...!
+                        break;
+                    }
+
+                    var sum = 0, numer = 0, denom = 0;
+                    $.each(cells.filter(':visible'), function () {
+                        var ratio = $(this).data("ratio");
+                        if (ratio) {
+                            var splitted = ratio.split(" ");
+                            numer += parseInt(splitted[0], 10);
+                            denom += parseInt(splitted[1], 10);
+                        }
+                        else {
+                            sum += parseInt(this.innerHTML, 10);
+                        }
+                    });
+
+                    // Get footer cell element.
+                    var footer_cell = table_dynamic_footer.find('td:nth-child(' + column + ')');
+
+                    // Set value into dynamic footer cell element.
+                    if (cells[0].innerHTML.indexOf('%') > -1) {
+                        // Percentage columns use the numerator and denominator,
+                        // and adapt to the number of decimal places.
+                        var match = /\.([0-9]+)/.exec(cells[0].innerHTML);
+                        var places = 0;
+                        if (match) {
+                            places = match[1].length;
+                        }
+                        var pct = numer * 100 / denom;
+                        footer_cell.text(pct.toFixed(places) + '%');
+                    }
+                    else {
+                        footer_cell.text(sum);
+                    }
+                }
+
+                // Hide standard footer, show dynamic footer.
+                table_footer.addClass("hidden");
+                table_dynamic_footer.removeClass("hidden");
+            }
+            else {
+                // Show standard footer, hide dynamic footer.
+                table_footer.removeClass("hidden");
+                table_dynamic_footer.addClass("hidden");
+            }
+        }
+    }));
+
+    // Trigger change event on setup, to force filter on page refresh
+    // (filter value may still be present).
+    $("#filter").trigger("change");
+};
+
+// Loaded on index.html
+coverage.index_ready = function ($) {
+    // Look for a cookie containing previous sort settings:
+    var sort_list = [];
+    var cookie_name = "COVERAGE_INDEX_SORT";
+    var i;
+
+    // This almost makes it worth installing the jQuery cookie plugin:
+    if (document.cookie.indexOf(cookie_name) > -1) {
+        var cookies = document.cookie.split(";");
+        for (i = 0; i < cookies.length; i++) {
+            var parts = cookies[i].split("=");
+
+            if ($.trim(parts[0]) === cookie_name && parts[1]) {
+                sort_list = eval("[[" + parts[1] + "]]");
+                break;
+            }
+        }
+    }
+
+    // Create a new widget which exists only to save and restore
+    // the sort order:
+    $.tablesorter.addWidget({
+        id: "persistentSort",
+
+        // Format is called by the widget before displaying:
+        format: function (table) {
+            if (table.config.sortList.length === 0 && sort_list.length > 0) {
+                // This table hasn't been sorted before - we'll use
+                // our stored settings:
+                $(table).trigger('sorton', [sort_list]);
+            }
+            else {
+                // This is not the first load - something has
+                // already defined sorting so we'll just update
+                // our stored value to match:
+                sort_list = table.config.sortList;
+            }
+        }
+    });
+
+    // Configure our tablesorter to handle the variable number of
+    // columns produced depending on report options:
+    var headers = [];
+    var col_count = $("table.index > thead > tr > th").length;
+
+    headers[0] = { sorter: 'text' };
+    for (i = 1; i < col_count-1; i++) {
+        headers[i] = { sorter: 'digit' };
+    }
+    headers[col_count-1] = { sorter: 'percent' };
+
+    // Enable the table sorter:
+    $("table.index").tablesorter({
+        widgets: ['persistentSort'],
+        headers: headers
+    });
+
+    coverage.assign_shortkeys();
+    coverage.wire_up_help_panel();
+    coverage.wire_up_filter();
+
+    // Watch for page unload events so we can save the final sort settings:
+    $(window).unload(function () {
+        document.cookie = cookie_name + "=" + sort_list.toString() + "; path=/";
+    });
+};
+
+// -- pyfile stuff --
+
+coverage.pyfile_ready = function ($) {
+    // If we're directed to a particular line number, highlight the line.
+    var frag = location.hash;
+    if (frag.length > 2 && frag[1] === 'n') {
+        $(frag).addClass('highlight');
+        coverage.set_sel(parseInt(frag.substr(2), 10));
+    }
+    else {
+        coverage.set_sel(0);
+    }
+
+    $(document)
+        .bind('keydown', 'j', coverage.to_next_chunk_nicely)
+        .bind('keydown', 'k', coverage.to_prev_chunk_nicely)
+        .bind('keydown', '0', coverage.to_top)
+        .bind('keydown', '1', coverage.to_first_chunk)
+        ;
+
+    $(".button_toggle_run").click(function (evt) {coverage.toggle_lines(evt.target, "run");});
+    $(".button_toggle_exc").click(function (evt) {coverage.toggle_lines(evt.target, "exc");});
+    $(".button_toggle_mis").click(function (evt) {coverage.toggle_lines(evt.target, "mis");});
+    $(".button_toggle_par").click(function (evt) {coverage.toggle_lines(evt.target, "par");});
+
+    coverage.assign_shortkeys();
+    coverage.wire_up_help_panel();
+
+    coverage.init_scroll_markers();
+
+    // Rebuild scroll markers after window high changing
+    $(window).resize(coverage.resize_scroll_markers);
+};
+
+coverage.toggle_lines = function (btn, cls) {
+    btn = $(btn);
+    var hide = "hide_"+cls;
+    if (btn.hasClass(hide)) {
+        $("#source ."+cls).removeClass(hide);
+        btn.removeClass(hide);
+    }
+    else {
+        $("#source ."+cls).addClass(hide);
+        btn.addClass(hide);
+    }
+};
+
+// Return the nth line div.
+coverage.line_elt = function (n) {
+    return $("#t" + n);
+};
+
+// Return the nth line number div.
+coverage.num_elt = function (n) {
+    return $("#n" + n);
+};
+
+// Return the container of all the code.
+coverage.code_container = function () {
+    return $(".linenos");
+};
+
+// Set the selection.  b and e are line numbers.
+coverage.set_sel = function (b, e) {
+    // The first line selected.
+    coverage.sel_begin = b;
+    // The next line not selected.
+    coverage.sel_end = (e === undefined) ? b+1 : e;
+};
+
+coverage.to_top = function () {
+    coverage.set_sel(0, 1);
+    coverage.scroll_window(0);
+};
+
+coverage.to_first_chunk = function () {
+    coverage.set_sel(0, 1);
+    coverage.to_next_chunk();
+};
+
+coverage.is_transparent = function (color) {
+    // Different browsers return different colors for "none".
+    return color === "transparent" || color === "rgba(0, 0, 0, 0)";
+};
+
+coverage.to_next_chunk = function () {
+    var c = coverage;
+
+    // Find the start of the next colored chunk.
+    var probe = c.sel_end;
+    var color, probe_line;
+    while (true) {
+        probe_line = c.line_elt(probe);
+        if (probe_line.length === 0) {
+            return;
+        }
+        color = probe_line.css("background-color");
+        if (!c.is_transparent(color)) {
+            break;
+        }
+        probe++;
+    }
+
+    // There's a next chunk, `probe` points to it.
+    var begin = probe;
+
+    // Find the end of this chunk.
+    var next_color = color;
+    while (next_color === color) {
+        probe++;
+        probe_line = c.line_elt(probe);
+        next_color = probe_line.css("background-color");
+    }
+    c.set_sel(begin, probe);
+    c.show_selection();
+};
+
+coverage.to_prev_chunk = function () {
+    var c = coverage;
+
+    // Find the end of the prev colored chunk.
+    var probe = c.sel_begin-1;
+    var probe_line = c.line_elt(probe);
+    if (probe_line.length === 0) {
+        return;
+    }
+    var color = probe_line.css("background-color");
+    while (probe > 0 && c.is_transparent(color)) {
+        probe--;
+        probe_line = c.line_elt(probe);
+        if (probe_line.length === 0) {
+            return;
+        }
+        color = probe_line.css("background-color");
+    }
+
+    // There's a prev chunk, `probe` points to its last line.
+    var end = probe+1;
+
+    // Find the beginning of this chunk.
+    var prev_color = color;
+    while (prev_color === color) {
+        probe--;
+        probe_line = c.line_elt(probe);
+        prev_color = probe_line.css("background-color");
+    }
+    c.set_sel(probe+1, end);
+    c.show_selection();
+};
+
+// Return the line number of the line nearest pixel position pos
+coverage.line_at_pos = function (pos) {
+    var l1 = coverage.line_elt(1),
+        l2 = coverage.line_elt(2),
+        result;
+    if (l1.length && l2.length) {
+        var l1_top = l1.offset().top,
+            line_height = l2.offset().top - l1_top,
+            nlines = (pos - l1_top) / line_height;
+        if (nlines < 1) {
+            result = 1;
+        }
+        else {
+            result = Math.ceil(nlines);
+        }
+    }
+    else {
+        result = 1;
+    }
+    return result;
+};
+
+// Returns 0, 1, or 2: how many of the two ends of the selection are on
+// the screen right now?
+coverage.selection_ends_on_screen = function () {
+    if (coverage.sel_begin === 0) {
+        return 0;
+    }
+
+    var top = coverage.line_elt(coverage.sel_begin);
+    var next = coverage.line_elt(coverage.sel_end-1);
+
+    return (
+        (top.isOnScreen() ? 1 : 0) +
+        (next.isOnScreen() ? 1 : 0)
+    );
+};
+
+coverage.to_next_chunk_nicely = function () {
+    coverage.finish_scrolling();
+    if (coverage.selection_ends_on_screen() === 0) {
+        // The selection is entirely off the screen: select the top line on
+        // the screen.
+        var win = $(window);
+        coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop()));
+    }
+    coverage.to_next_chunk();
+};
+
+coverage.to_prev_chunk_nicely = function () {
+    coverage.finish_scrolling();
+    if (coverage.selection_ends_on_screen() === 0) {
+        var win = $(window);
+        coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop() + win.height()));
+    }
+    coverage.to_prev_chunk();
+};
+
+// Select line number lineno, or if it is in a colored chunk, select the
+// entire chunk
+coverage.select_line_or_chunk = function (lineno) {
+    var c = coverage;
+    var probe_line = c.line_elt(lineno);
+    if (probe_line.length === 0) {
+        return;
+    }
+    var the_color = probe_line.css("background-color");
+    if (!c.is_transparent(the_color)) {
+        // The line is in a highlighted chunk.
+        // Search backward for the first line.
+        var probe = lineno;
+        var color = the_color;
+        while (probe > 0 && color === the_color) {
+            probe--;
+            probe_line = c.line_elt(probe);
+            if (probe_line.length === 0) {
+                break;
+            }
+            color = probe_line.css("background-color");
+        }
+        var begin = probe + 1;
+
+        // Search forward for the last line.
+        probe = lineno;
+        color = the_color;
+        while (color === the_color) {
+            probe++;
+            probe_line = c.line_elt(probe);
+            color = probe_line.css("background-color");
+        }
+
+        coverage.set_sel(begin, probe);
+    }
+    else {
+        coverage.set_sel(lineno);
+    }
+};
+
+coverage.show_selection = function () {
+    var c = coverage;
+
+    // Highlight the lines in the chunk
+    c.code_container().find(".highlight").removeClass("highlight");
+    for (var probe = c.sel_begin; probe > 0 && probe < c.sel_end; probe++) {
+        c.num_elt(probe).addClass("highlight");
+    }
+
+    c.scroll_to_selection();
+};
+
+coverage.scroll_to_selection = function () {
+    // Scroll the page if the chunk isn't fully visible.
+    if (coverage.selection_ends_on_screen() < 2) {
+        // Need to move the page. The html,body trick makes it scroll in all
+        // browsers, got it from http://stackoverflow.com/questions/3042651
+        var top = coverage.line_elt(coverage.sel_begin);
+        var top_pos = parseInt(top.offset().top, 10);
+        coverage.scroll_window(top_pos - 30);
+    }
+};
+
+coverage.scroll_window = function (to_pos) {
+    $("html,body").animate({scrollTop: to_pos}, 200);
+};
+
+coverage.finish_scrolling = function () {
+    $("html,body").stop(true, true);
+};
+
+coverage.init_scroll_markers = function () {
+    var c = coverage;
+    // Init some variables
+    c.lines_len = $('td.text p').length;
+    c.body_h = $('body').height();
+    c.header_h = $('div#header').height();
+    c.missed_lines = $('td.text p.mis, td.text p.par');
+
+    // Build html
+    c.resize_scroll_markers();
+};
+
+coverage.resize_scroll_markers = function () {
+    var c = coverage,
+        min_line_height = 3,
+        max_line_height = 10,
+        visible_window_h = $(window).height();
+
+    $('#scroll_marker').remove();
+    // Don't build markers if the window has no scroll bar.
+    if (c.body_h <= visible_window_h) {
+        return;
+    }
+
+    $("body").append("<div id='scroll_marker'>&nbsp;</div>");
+    var scroll_marker = $('#scroll_marker'),
+        marker_scale = scroll_marker.height() / c.body_h,
+        line_height = scroll_marker.height() / c.lines_len;
+
+    // Line height must be between the extremes.
+    if (line_height > min_line_height) {
+        if (line_height > max_line_height) {
+            line_height = max_line_height;
+        }
+    }
+    else {
+        line_height = min_line_height;
+    }
+
+    var previous_line = -99,
+        last_mark,
+        last_top;
+
+    c.missed_lines.each(function () {
+        var line_top = Math.round($(this).offset().top * marker_scale),
+            id_name = $(this).attr('id'),
+            line_number = parseInt(id_name.substring(1, id_name.length));
+
+        if (line_number === previous_line + 1) {
+            // If this solid missed block just make previous mark higher.
+            last_mark.css({
+                'height': line_top + line_height - last_top
+            });
+        }
+        else {
+            // Add colored line in scroll_marker block.
+            scroll_marker.append('<div id="m' + line_number + '" class="marker"></div>');
+            last_mark = $('#m' + line_number);
+            last_mark.css({
+                'height': line_height,
+                'top': line_top
+            });
+            last_top = line_top;
+        }
+
+        previous_line = line_number;
+    });
+};
diff --git a/orm/services/region_manager/cover/index.html b/orm/services/region_manager/cover/index.html
new file mode 100644
index 00000000..672002e7
--- /dev/null
+++ b/orm/services/region_manager/cover/index.html
@@ -0,0 +1,455 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Coverage report</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.ba-throttle-debounce.min.js"></script>
+    <script type="text/javascript" src="jquery.tablesorter.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.index_ready);
+    </script>
+</head>
+<body class="indexfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage report:
+            <span class="pc_cov">88%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <form id="filter_container">
+            <input id="filter" type="text" value="" placeholder="filter..." />
+        </form>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">n</span>
+        <span class="key">s</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        
+        <span class="key">c</span> &nbsp; change column sorting
+    </p>
+    </div>
+</div>
+
+<div id="index">
+    <table class="index">
+        <thead>
+            
+            <tr class="tablehead" title="Click to sort">
+                <th class="name left headerSortDown shortkey_n">Module</th>
+                <th class="shortkey_s">statements</th>
+                <th class="shortkey_m">missing</th>
+                <th class="shortkey_x">excluded</th>
+                
+                <th class="right shortkey_c">coverage</th>
+            </tr>
+        </thead>
+        
+        <tfoot>
+            <tr class="total">
+                <td class="name left">Total</td>
+                <td>1287</td>
+                <td>160</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="1127 1287">88%</td>
+            </tr>
+        </tfoot>
+        <tbody>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms___init___py.html">rms/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers___init___py.html">rms/controllers/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_configuration_py.html">rms/controllers/configuration.py</a></td>
+                <td>17</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="17 17">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_lcp_controller_py.html">rms/controllers/lcp_controller.py</a></td>
+                <td>56</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="56 56">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_logs_py.html">rms/controllers/logs.py</a></td>
+                <td>36</td>
+                <td>2</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="34 36">94%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_root_py.html">rms/controllers/root.py</a></td>
+                <td>12</td>
+                <td>1</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="11 12">92%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2___init___py.html">rms/controllers/v2/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2_orm___init___py.html">rms/controllers/v2/orm/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2_orm_resources___init___py.html">rms/controllers/v2/orm/resources/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2_orm_resources_groups_py.html">rms/controllers/v2/orm/resources/groups.py</a></td>
+                <td>124</td>
+                <td>22</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="102 124">82%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2_orm_resources_metadata_py.html">rms/controllers/v2/orm/resources/metadata.py</a></td>
+                <td>85</td>
+                <td>19</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="66 85">78%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2_orm_resources_regions_py.html">rms/controllers/v2/orm/resources/regions.py</a></td>
+                <td>187</td>
+                <td>5</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="182 187">97%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2_orm_resources_status_py.html">rms/controllers/v2/orm/resources/status.py</a></td>
+                <td>47</td>
+                <td>3</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="44 47">94%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2_orm_root_py.html">rms/controllers/v2/orm/root.py</a></td>
+                <td>5</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="5 5">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2_root_py.html">rms/controllers/v2/root.py</a></td>
+                <td>3</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="3 3">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock___init___py.html">rms/external_mock/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_audit_client___init___py.html">rms/external_mock/audit_client/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_audit_client_api___init___py.html">rms/external_mock/audit_client/api/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_audit_client_api_audit_py.html">rms/external_mock/audit_client/api/audit.py</a></td>
+                <td>4</td>
+                <td>4</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 4">0%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_keystone_utils___init___py.html">rms/external_mock/keystone_utils/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_keystone_utils_tokens_py.html">rms/external_mock/keystone_utils/tokens.py</a></td>
+                <td>5</td>
+                <td>1</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="4 5">80%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_orm_common___init___py.html">rms/external_mock/orm_common/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_orm_common_policy___init___py.html">rms/external_mock/orm_common/policy/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_orm_common_policy_policy_py.html">rms/external_mock/orm_common/policy/policy.py</a></td>
+                <td>6</td>
+                <td>2</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="4 6">67%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_orm_common_utils___init___py.html">rms/external_mock/orm_common/utils/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_orm_common_utils_api_error_utils_py.html">rms/external_mock/orm_common/utils/api_error_utils.py</a></td>
+                <td>2</td>
+                <td>1</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="1 2">50%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_orm_common_utils_utils_py.html">rms/external_mock/orm_common/utils/utils.py</a></td>
+                <td>6</td>
+                <td>1</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="5 6">83%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_model___init___py.html">rms/model/__init__.py</a></td>
+                <td>3</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="3 3">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_model_model_py.html">rms/model/model.py</a></td>
+                <td>100</td>
+                <td>7</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="93 100">93%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_model_url_parm_py.html">rms/model/url_parm.py</a></td>
+                <td>63</td>
+                <td>4</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="59 63">94%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_services___init___py.html">rms/services/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_services_error_base_py.html">rms/services/error_base.py</a></td>
+                <td>18</td>
+                <td>2</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="16 18">89%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_services_services_py.html">rms/services/services.py</a></td>
+                <td>170</td>
+                <td>55</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="115 170">68%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_storage___init___py.html">rms/storage/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_storage_base_data_manager_py.html">rms/storage/base_data_manager.py</a></td>
+                <td>24</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="24 24">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_storage_data_manager_factory_py.html">rms/storage/data_manager_factory.py</a></td>
+                <td>12</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="12 12">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_storage_my_sql___init___py.html">rms/storage/my_sql/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_storage_my_sql_data_manager_py.html">rms/storage/my_sql/data_manager.py</a></td>
+                <td>270</td>
+                <td>31</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="239 270">89%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_utils___init___py.html">rms/utils/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_utils_authentication_py.html">rms/utils/authentication.py</a></td>
+                <td>32</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="32 32">100%</td>
+            </tr>
+            
+        </tbody>
+    </table>
+
+    <p id="no_rows">
+        No items found using the specified filter.
+    </p>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-13 02:18
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/jquery.ba-throttle-debounce.min.js b/orm/services/region_manager/cover/jquery.ba-throttle-debounce.min.js
new file mode 100644
index 00000000..648fe5d3
--- /dev/null
+++ b/orm/services/region_manager/cover/jquery.ba-throttle-debounce.min.js
@@ -0,0 +1,9 @@
+/*
+ * jQuery throttle / debounce - v1.1 - 3/7/2010
+ * http://benalman.com/projects/jquery-throttle-debounce-plugin/
+ *
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function(b,c){var $=b.jQuery||b.Cowboy||(b.Cowboy={}),a;$.throttle=a=function(e,f,j,i){var h,d=0;if(typeof f!=="boolean"){i=j;j=f;f=c}function g(){var o=this,m=+new Date()-d,n=arguments;function l(){d=+new Date();j.apply(o,n)}function k(){h=c}if(i&&!h){l()}h&&clearTimeout(h);if(i===c&&m>e){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this);
diff --git a/orm/services/region_manager/cover/jquery.hotkeys.js b/orm/services/region_manager/cover/jquery.hotkeys.js
new file mode 100644
index 00000000..09b21e03
--- /dev/null
+++ b/orm/services/region_manager/cover/jquery.hotkeys.js
@@ -0,0 +1,99 @@
+/*
+ * jQuery Hotkeys Plugin
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ * Based upon the plugin by Tzury Bar Yochay:
+ * http://github.com/tzuryby/hotkeys
+ *
+ * Original idea by:
+ * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
+*/
+
+(function(jQuery){
+
+	jQuery.hotkeys = {
+		version: "0.8",
+
+		specialKeys: {
+			8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause",
+			20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home",
+			37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del",
+			96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7",
+			104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/",
+			112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8",
+			120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 191: "/", 224: "meta"
+		},
+
+		shiftNums: {
+			"`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&",
+			"8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<",
+			".": ">",  "/": "?",  "\\": "|"
+		}
+	};
+
+	function keyHandler( handleObj ) {
+		// Only care when a possible input has been specified
+		if ( typeof handleObj.data !== "string" ) {
+			return;
+		}
+
+		var origHandler = handleObj.handler,
+			keys = handleObj.data.toLowerCase().split(" ");
+
+		handleObj.handler = function( event ) {
+			// Don't fire in text-accepting inputs that we didn't directly bind to
+			if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) ||
+				 event.target.type === "text") ) {
+				return;
+			}
+
+			// Keypress represents characters, not special keys
+			var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ],
+				character = String.fromCharCode( event.which ).toLowerCase(),
+				key, modif = "", possible = {};
+
+			// check combinations (alt|ctrl|shift+anything)
+			if ( event.altKey && special !== "alt" ) {
+				modif += "alt+";
+			}
+
+			if ( event.ctrlKey && special !== "ctrl" ) {
+				modif += "ctrl+";
+			}
+
+			// TODO: Need to make sure this works consistently across platforms
+			if ( event.metaKey && !event.ctrlKey && special !== "meta" ) {
+				modif += "meta+";
+			}
+
+			if ( event.shiftKey && special !== "shift" ) {
+				modif += "shift+";
+			}
+
+			if ( special ) {
+				possible[ modif + special ] = true;
+
+			} else {
+				possible[ modif + character ] = true;
+				possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true;
+
+				// "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
+				if ( modif === "shift+" ) {
+					possible[ jQuery.hotkeys.shiftNums[ character ] ] = true;
+				}
+			}
+
+			for ( var i = 0, l = keys.length; i < l; i++ ) {
+				if ( possible[ keys[i] ] ) {
+					return origHandler.apply( this, arguments );
+				}
+			}
+		};
+	}
+
+	jQuery.each([ "keydown", "keyup", "keypress" ], function() {
+		jQuery.event.special[ this ] = { add: keyHandler };
+	});
+
+})( jQuery );
diff --git a/orm/services/region_manager/cover/jquery.isonscreen.js b/orm/services/region_manager/cover/jquery.isonscreen.js
new file mode 100644
index 00000000..0182ebd2
--- /dev/null
+++ b/orm/services/region_manager/cover/jquery.isonscreen.js
@@ -0,0 +1,53 @@
+/* Copyright (c) 2010
+ * @author Laurence Wheway
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
+ * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
+ *
+ * @version 1.2.0
+ */
+(function($) {
+	jQuery.extend({
+		isOnScreen: function(box, container) {
+			//ensure numbers come in as intgers (not strings) and remove 'px' is it's there
+			for(var i in box){box[i] = parseFloat(box[i])};
+			for(var i in container){container[i] = parseFloat(container[i])};
+
+			if(!container){
+				container = {
+					left: $(window).scrollLeft(),
+					top: $(window).scrollTop(),
+					width: $(window).width(),
+					height: $(window).height()
+				}
+			}
+
+			if(	box.left+box.width-container.left > 0 &&
+				box.left < container.width+container.left &&
+				box.top+box.height-container.top > 0 &&
+				box.top < container.height+container.top
+			) return true;
+			return false;
+		}
+	})
+
+
+	jQuery.fn.isOnScreen = function (container) {
+		for(var i in container){container[i] = parseFloat(container[i])};
+
+		if(!container){
+			container = {
+				left: $(window).scrollLeft(),
+				top: $(window).scrollTop(),
+				width: $(window).width(),
+				height: $(window).height()
+			}
+		}
+
+		if(	$(this).offset().left+$(this).width()-container.left > 0 &&
+			$(this).offset().left < container.width+container.left &&
+			$(this).offset().top+$(this).height()-container.top > 0 &&
+			$(this).offset().top < container.height+container.top
+		) return true;
+		return false;
+	}
+})(jQuery);
diff --git a/orm/services/region_manager/cover/jquery.min.js b/orm/services/region_manager/cover/jquery.min.js
new file mode 100644
index 00000000..e2efc335
--- /dev/null
+++ b/orm/services/region_manager/cover/jquery.min.js
@@ -0,0 +1,9404 @@
+/*!
+ * jQuery JavaScript Library v1.7.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Fri Jul  5 14:07:58 UTC 2013
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+	navigator = window.navigator,
+	location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// A simple way to check for HTML strings or ID strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Check if a string has a non-whitespace character in it
+	rnotwhite = /\S/,
+
+	// Used for trimming whitespace
+	trimLeft = /^\s+/,
+	trimRight = /\s+$/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+	// Useragent RegExp
+	rwebkit = /(webkit)[ \/]([\w.]+)/,
+	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+	rmsie = /(msie) ([\w.]+)/,
+	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+	// Matches dashed string for camelizing
+	rdashAlpha = /-([a-z]|[0-9])/ig,
+	rmsPrefix = /^-ms-/,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// Keep a UserAgent string for use with jQuery.browser
+	userAgent = navigator.userAgent,
+
+	// For matching the engine and version of the browser
+	browserMatch,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// The ready event handler
+	DOMContentLoaded,
+
+	// Save a reference to some core methods
+	toString = Object.prototype.toString,
+	hasOwn = Object.prototype.hasOwnProperty,
+	push = Array.prototype.push,
+	slice = Array.prototype.slice,
+	trim = String.prototype.trim,
+	indexOf = Array.prototype.indexOf,
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), or $(undefined)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// The body element only exists once, optimize finding it
+		if ( selector === "body" && !context && document.body ) {
+			this.context = document;
+			this[0] = document.body;
+			this.selector = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = quickExpr.exec( selector );
+			}
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = ( context ? context.ownerDocument || context : document );
+
+					// If a single string is passed in and it's a single tag
+					// just do a createElement and skip the rest
+					ret = rsingleTag.exec( selector );
+
+					if ( ret ) {
+						if ( jQuery.isPlainObject( context ) ) {
+							selector = [ document.createElement( ret[1] ) ];
+							jQuery.fn.attr.call( selector, context, true );
+
+						} else {
+							selector = [ doc.createElement( ret[1] ) ];
+						}
+
+					} else {
+						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+						selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
+					}
+
+					return jQuery.merge( this, selector );
+
+				// HANDLE: $("#id")
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || rootjQuery ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if ( selector.selector !== undefined ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.7.2",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return slice.call( this, 0 );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = this.constructor();
+
+		if ( jQuery.isArray( elems ) ) {
+			push.apply( ret, elems );
+
+		} else {
+			jQuery.merge( ret, elems );
+		}
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Attach the listeners
+		jQuery.bindReady();
+
+		// Add the callback
+		readyList.add( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		i = +i;
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ),
+			"slice", slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+		// Either a released hold or an DOMready/load event and not yet ready
+		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+			if ( !document.body ) {
+				return setTimeout( jQuery.ready, 1 );
+			}
+
+			// Remember that the DOM is ready
+			jQuery.isReady = true;
+
+			// If a normal DOM Ready event fired, decrement, and wait if need be
+			if ( wait !== true && --jQuery.readyWait > 0 ) {
+				return;
+			}
+
+			// If there are functions bound, to execute
+			readyList.fireWith( document, [ jQuery ] );
+
+			// Trigger any bound ready events
+			if ( jQuery.fn.trigger ) {
+				jQuery( document ).trigger( "ready" ).off( "ready" );
+			}
+		}
+	},
+
+	bindReady: function() {
+		if ( readyList ) {
+			return;
+		}
+
+		readyList = jQuery.Callbacks( "once memory" );
+
+		// Catch cases where $(document).ready() is called after the
+		// browser event has already occurred.
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Mozilla, Opera and webkit nightlies currently support this event
+		if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else if ( document.attachEvent ) {
+			// ensure firing before onload,
+			// maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var toplevel = false;
+
+			try {
+				toplevel = window.frameElement == null;
+			} catch(e) {}
+
+			if ( document.documentElement.doScroll && toplevel ) {
+				doScrollCheck();
+			}
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	isWindow: function( obj ) {
+		return obj != null && obj == obj.window;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!hasOwn.call(obj, "constructor") &&
+				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		for ( var name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	parseJSON: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+			.replace( rvalidtokens, "]" )
+			.replace( rvalidbraces, "")) ) {
+
+			return ( new Function( "return " + data ) )();
+
+		}
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+		var xml, tmp;
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && rnotwhite.test( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0,
+			length = object.length,
+			isObj = length === undefined || jQuery.isFunction( object );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.apply( object[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( object[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return object;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: trim ?
+		function( text ) {
+			return text == null ?
+				"" :
+				trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( array, results ) {
+		var ret = results || [];
+
+		if ( array != null ) {
+			// The window, strings (and functions) also have 'length'
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			var type = jQuery.type( array );
+
+			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+				push.call( ret, array );
+			} else {
+				jQuery.merge( ret, array );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array, i ) {
+		var len;
+
+		if ( array ) {
+			if ( indexOf ) {
+				return indexOf.call( array, elem, i );
+			}
+
+			len = array.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in array && array[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var i = first.length,
+			j = 0;
+
+		if ( typeof second.length === "number" ) {
+			for ( var l = second.length; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var ret = [], retVal;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value, key, ret = [],
+			i = 0,
+			length = elems.length,
+			// jquery objects are treated as arrays
+			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( key in elems ) {
+				value = callback( elems[ key ], key, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		if ( typeof context === "string" ) {
+			var tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		var args = slice.call( arguments, 2 ),
+			proxy = function() {
+				return fn.apply( context, args.concat( slice.call( arguments ) ) );
+			};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Mutifunctional method to get and set values to a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
+		var exec,
+			bulk = key == null,
+			i = 0,
+			length = elems.length;
+
+		// Sets many values
+		if ( key && typeof key === "object" ) {
+			for ( i in key ) {
+				jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
+			}
+			chainable = 1;
+
+		// Sets one value
+		} else if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = pass === undefined && jQuery.isFunction( value );
+
+			if ( bulk ) {
+				// Bulk operations only iterate when executing function values
+				if ( exec ) {
+					exec = fn;
+					fn = function( elem, key, value ) {
+						return exec.call( jQuery( elem ), value );
+					};
+
+				// Otherwise they run against the entire set
+				} else {
+					fn.call( elems, value );
+					fn = null;
+				}
+			}
+
+			if ( fn ) {
+				for (; i < length; i++ ) {
+					fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+				}
+			}
+
+			chainable = 1;
+		}
+
+		return chainable ?
+			elems :
+
+			// Gets
+			bulk ?
+				fn.call( elems ) :
+				length ? fn( elems[0], key ) : emptyGet;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	},
+
+	// Use of jQuery.browser is frowned upon.
+	// More details: http://docs.jquery.com/Utilities/jQuery.browser
+	uaMatch: function( ua ) {
+		ua = ua.toLowerCase();
+
+		var match = rwebkit.exec( ua ) ||
+			ropera.exec( ua ) ||
+			rmsie.exec( ua ) ||
+			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+			[];
+
+		return { browser: match[1] || "", version: match[2] || "0" };
+	},
+
+	sub: function() {
+		function jQuerySub( selector, context ) {
+			return new jQuerySub.fn.init( selector, context );
+		}
+		jQuery.extend( true, jQuerySub, this );
+		jQuerySub.superclass = this;
+		jQuerySub.fn = jQuerySub.prototype = this();
+		jQuerySub.fn.constructor = jQuerySub;
+		jQuerySub.sub = this.sub;
+		jQuerySub.fn.init = function init( selector, context ) {
+			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+				context = jQuerySub( context );
+			}
+
+			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+		};
+		jQuerySub.fn.init.prototype = jQuerySub.fn;
+		var rootjQuerySub = jQuerySub(document);
+		return jQuerySub;
+	},
+
+	browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+	jQuery.browser[ browserMatch.browser ] = true;
+	jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+	jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+	trimLeft = /^[\s\xA0]+/;
+	trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+	DOMContentLoaded = function() {
+		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+		jQuery.ready();
+	};
+
+} else if ( document.attachEvent ) {
+	DOMContentLoaded = function() {
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	};
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+	if ( jQuery.isReady ) {
+		return;
+	}
+
+	try {
+		// If IE is used, use the trick by Diego Perini
+		// http://javascript.nwbox.com/IEContentLoaded/
+		document.documentElement.doScroll("left");
+	} catch(e) {
+		setTimeout( doScrollCheck, 1 );
+		return;
+	}
+
+	// and execute any waiting functions
+	jQuery.ready();
+}
+
+return jQuery;
+
+})();
+
+
+// String to Object flags format cache
+var flagsCache = {};
+
+// Convert String-formatted flags into Object-formatted ones and store in cache
+function createFlags( flags ) {
+	var object = flagsCache[ flags ] = {},
+		i, length;
+	flags = flags.split( /\s+/ );
+	for ( i = 0, length = flags.length; i < length; i++ ) {
+		object[ flags[i] ] = true;
+	}
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	flags:	an optional list of space-separated flags that will change how
+ *			the callback list behaves
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible flags:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( flags ) {
+
+	// Convert flags from String-formatted to Object-formatted
+	// (we check in cache first)
+	flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+
+	var // Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = [],
+		// Last fire value (for non-forgettable lists)
+		memory,
+		// Flag to know if list was already fired
+		fired,
+		// Flag to know if list is currently firing
+		firing,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// Add one or several callbacks to the list
+		add = function( args ) {
+			var i,
+				length,
+				elem,
+				type,
+				actual;
+			for ( i = 0, length = args.length; i < length; i++ ) {
+				elem = args[ i ];
+				type = jQuery.type( elem );
+				if ( type === "array" ) {
+					// Inspect recursively
+					add( elem );
+				} else if ( type === "function" ) {
+					// Add if not in unique mode and callback is not in
+					if ( !flags.unique || !self.has( elem ) ) {
+						list.push( elem );
+					}
+				}
+			}
+		},
+		// Fire callbacks
+		fire = function( context, args ) {
+			args = args || [];
+			memory = !flags.memory || [ context, args ];
+			fired = true;
+			firing = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
+					memory = true; // Mark as halted
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( !flags.once ) {
+					if ( stack && stack.length ) {
+						memory = stack.shift();
+						self.fireWith( memory[ 0 ], memory[ 1 ] );
+					}
+				} else if ( memory === true ) {
+					self.disable();
+				} else {
+					list = [];
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					var length = list.length;
+					add( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away, unless previous
+					// firing was halted (stopOnFalse)
+					} else if ( memory && memory !== true ) {
+						firingStart = length;
+						fire( memory[ 0 ], memory[ 1 ] );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					var args = arguments,
+						argIndex = 0,
+						argLength = args.length;
+					for ( ; argIndex < argLength ; argIndex++ ) {
+						for ( var i = 0; i < list.length; i++ ) {
+							if ( args[ argIndex ] === list[ i ] ) {
+								// Handle firingIndex and firingLength
+								if ( firing ) {
+									if ( i <= firingLength ) {
+										firingLength--;
+										if ( i <= firingIndex ) {
+											firingIndex--;
+										}
+									}
+								}
+								// Remove the element
+								list.splice( i--, 1 );
+								// If we have some unicity property then
+								// we only need to do this once
+								if ( flags.unique ) {
+									break;
+								}
+							}
+						}
+					}
+				}
+				return this;
+			},
+			// Control if a given callback is in the list
+			has: function( fn ) {
+				if ( list ) {
+					var i = 0,
+						length = list.length;
+					for ( ; i < length; i++ ) {
+						if ( fn === list[ i ] ) {
+							return true;
+						}
+					}
+				}
+				return false;
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory || memory === true ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( stack ) {
+					if ( firing ) {
+						if ( !flags.once ) {
+							stack.push( [ context, args ] );
+						}
+					} else if ( !( flags.once && memory ) ) {
+						fire( context, args );
+					}
+				}
+				return this;
+			},
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+
+
+
+
+var // Static reference to slice
+	sliceDeferred = [].slice;
+
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var doneList = jQuery.Callbacks( "once memory" ),
+			failList = jQuery.Callbacks( "once memory" ),
+			progressList = jQuery.Callbacks( "memory" ),
+			state = "pending",
+			lists = {
+				resolve: doneList,
+				reject: failList,
+				notify: progressList
+			},
+			promise = {
+				done: doneList.add,
+				fail: failList.add,
+				progress: progressList.add,
+
+				state: function() {
+					return state;
+				},
+
+				// Deprecated
+				isResolved: doneList.fired,
+				isRejected: failList.fired,
+
+				then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
+					deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
+					return this;
+				},
+				always: function() {
+					deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+					return this;
+				},
+				pipe: function( fnDone, fnFail, fnProgress ) {
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( {
+							done: [ fnDone, "resolve" ],
+							fail: [ fnFail, "reject" ],
+							progress: [ fnProgress, "notify" ]
+						}, function( handler, data ) {
+							var fn = data[ 0 ],
+								action = data[ 1 ],
+								returned;
+							if ( jQuery.isFunction( fn ) ) {
+								deferred[ handler ](function() {
+									returned = fn.apply( this, arguments );
+									if ( returned && jQuery.isFunction( returned.promise ) ) {
+										returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
+									} else {
+										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+									}
+								});
+							} else {
+								deferred[ handler ]( newDefer[ action ] );
+							}
+						});
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					if ( obj == null ) {
+						obj = promise;
+					} else {
+						for ( var key in promise ) {
+							obj[ key ] = promise[ key ];
+						}
+					}
+					return obj;
+				}
+			},
+			deferred = promise.promise({}),
+			key;
+
+		for ( key in lists ) {
+			deferred[ key ] = lists[ key ].fire;
+			deferred[ key + "With" ] = lists[ key ].fireWith;
+		}
+
+		// Handle state
+		deferred.done( function() {
+			state = "resolved";
+		}, failList.disable, progressList.lock ).fail( function() {
+			state = "rejected";
+		}, doneList.disable, progressList.lock );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( firstParam ) {
+		var args = sliceDeferred.call( arguments, 0 ),
+			i = 0,
+			length = args.length,
+			pValues = new Array( length ),
+			count = length,
+			pCount = length,
+			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+				firstParam :
+				jQuery.Deferred(),
+			promise = deferred.promise();
+		function resolveFunc( i ) {
+			return function( value ) {
+				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				if ( !( --count ) ) {
+					deferred.resolveWith( deferred, args );
+				}
+			};
+		}
+		function progressFunc( i ) {
+			return function( value ) {
+				pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				deferred.notifyWith( promise, pValues );
+			};
+		}
+		if ( length > 1 ) {
+			for ( ; i < length; i++ ) {
+				if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
+					args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
+				} else {
+					--count;
+				}
+			}
+			if ( !count ) {
+				deferred.resolveWith( deferred, args );
+			}
+		} else if ( deferred !== firstParam ) {
+			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+		}
+		return promise;
+	}
+});
+
+
+
+
+jQuery.support = (function() {
+
+	var support,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		fragment,
+		tds,
+		events,
+		eventName,
+		i,
+		isSupported,
+		div = document.createElement( "div" ),
+		documentElement = document.documentElement;
+
+	// Preliminary tests
+	div.setAttribute("className", "t");
+	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+	all = div.getElementsByTagName( "*" );
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return {};
+	}
+
+	// First batch of supports tests
+	select = document.createElement( "select" );
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName( "input" )[ 0 ];
+
+	support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.55/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: ( input.value === "on" ),
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// Tests for enctype support on a form(#6743)
+		enctype: !!document.createElement("form").enctype,
+
+		// Makes sure cloning an html5 element does not cause problems
+		// Where outerHTML is undefined, this still works
+		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true,
+		pixelMargin: true
+	};
+
+	// jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead
+	jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");
+
+	// Make sure checked status is properly cloned
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent( "onclick", function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent( "onclick" );
+	}
+
+	// Check if a radio maintains its value
+	// after being appended to the DOM
+	input = document.createElement("input");
+	input.value = "t";
+	input.setAttribute("type", "radio");
+	support.radioValue = input.value === "t";
+
+	input.setAttribute("checked", "checked");
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.lastChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	fragment.removeChild( input );
+	fragment.appendChild( div );
+
+	// Technique from Juriy Zaytsev
+	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+	// We only care about the case where non-standard event systems
+	// are used, namely in IE. Short-circuiting here helps us to
+	// avoid an eval call (in setAttribute) which can cause CSP
+	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+	if ( div.attachEvent ) {
+		for ( i in {
+			submit: 1,
+			change: 1,
+			focusin: 1
+		}) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	fragment.removeChild( div );
+
+	// Null elements to avoid leaks in IE
+	fragment = select = opt = div = input = null;
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, outer, inner, table, td, offsetSupport,
+			marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,
+			paddingMarginBorderVisibility, paddingMarginBorder,
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		conMarginTop = 1;
+		paddingMarginBorder = "padding:0;margin:0;border:";
+		positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";
+		paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";
+		style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";
+		html = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +
+			"<table " + style + "' cellpadding='0' cellspacing='0'>" +
+			"<tr><td></td></tr></table>";
+
+		container = document.createElement("div");
+		container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
+		body.insertBefore( container, body.firstChild );
+
+		// Construct the test element
+		div = document.createElement("div");
+		container.appendChild( div );
+
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		// (only IE 8 fails this test)
+		div.innerHTML = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName( "td" );
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Check if empty table cells still have offsetWidth/Height
+		// (IE <= 8 fail this test)
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Check if div with explicit width and no margin-right incorrectly
+		// gets computed margin-right based on width of container. For more
+		// info see bug #3333
+		// Fails in WebKit before Feb 2011 nightlies
+		// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+		if ( window.getComputedStyle ) {
+			div.innerHTML = "";
+			marginDiv = document.createElement( "div" );
+			marginDiv.style.width = "0";
+			marginDiv.style.marginRight = "0";
+			div.style.width = "2px";
+			div.appendChild( marginDiv );
+			support.reliableMarginRight =
+				( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+		}
+
+		if ( typeof div.style.zoom !== "undefined" ) {
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			// (IE < 8 does this)
+			div.innerHTML = "";
+			div.style.width = div.style.padding = "1px";
+			div.style.border = 0;
+			div.style.overflow = "hidden";
+			div.style.display = "inline";
+			div.style.zoom = 1;
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "block";
+			div.style.overflow = "visible";
+			div.innerHTML = "<div style='width:5px;'></div>";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+		}
+
+		div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;
+		div.innerHTML = html;
+
+		outer = div.firstChild;
+		inner = outer.firstChild;
+		td = outer.nextSibling.firstChild.firstChild;
+
+		offsetSupport = {
+			doesNotAddBorder: ( inner.offsetTop !== 5 ),
+			doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
+		};
+
+		inner.style.position = "fixed";
+		inner.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
+		inner.style.position = inner.style.top = "";
+
+		outer.style.overflow = "hidden";
+		outer.style.position = "relative";
+
+		offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
+		offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
+
+		if ( window.getComputedStyle ) {
+			div.style.marginTop = "1%";
+			support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%";
+		}
+
+		if ( typeof container.style.zoom !== "undefined" ) {
+			container.style.zoom = 1;
+		}
+
+		body.removeChild( container );
+		marginDiv = div = container = null;
+
+		jQuery.extend( support, offsetSupport );
+	});
+
+	return support;
+})();
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	// Please use with caution
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var privateCache, thisCache, ret,
+			internalKey = jQuery.expando,
+			getByName = typeof name === "string",
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
+			isEvents = name === "events";
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ internalKey ] = id = ++jQuery.uuid;
+			} else {
+				id = internalKey;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// Avoids exposing jQuery metadata on plain JS objects when the object
+			// is serialized using JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ] = jQuery.extend( cache[ id ], name );
+			} else {
+				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+			}
+		}
+
+		privateCache = thisCache = cache[ id ];
+
+		// jQuery data() is stored in a separate object inside the object's internal data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data.
+		if ( !pvt ) {
+			if ( !thisCache.data ) {
+				thisCache.data = {};
+			}
+
+			thisCache = thisCache.data;
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// Users should not attempt to inspect the internal events object using jQuery.data,
+		// it is undocumented and subject to change. But does anyone listen? No.
+		if ( isEvents && !thisCache[ name ] ) {
+			return privateCache.events;
+		}
+
+		// Check for both converted-to-camel and non-converted data property names
+		// If a data property was specified
+		if ( getByName ) {
+
+			// First Try to find as-is property data
+			ret = thisCache[ name ];
+
+			// Test for null|undefined property data
+			if ( ret == null ) {
+
+				// Try to find the camelCased property
+				ret = thisCache[ jQuery.camelCase( name ) ];
+			}
+		} else {
+			ret = thisCache;
+		}
+
+		return ret;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, i, l,
+
+			// Reference to internal data cache key
+			internalKey = jQuery.expando,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+
+			// See jQuery.data for more information
+			id = isNode ? elem[ internalKey ] : internalKey;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+
+			thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+			if ( thisCache ) {
+
+				// Support array or space separated string names for data keys
+				if ( !jQuery.isArray( name ) ) {
+
+					// try the string as a key before any manipulation
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+
+						// split the camel cased version by spaces unless a key with the spaces exists
+						name = jQuery.camelCase( name );
+						if ( name in thisCache ) {
+							name = [ name ];
+						} else {
+							name = name.split( " " );
+						}
+					}
+				}
+
+				for ( i = 0, l = name.length; i < l; i++ ) {
+					delete thisCache[ name[i] ];
+				}
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( !pvt ) {
+			delete cache[ id ].data;
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject(cache[ id ]) ) {
+				return;
+			}
+		}
+
+		// Browsers that fail expando deletion also refuse to delete expandos on
+		// the window, but it will allow it on all other JS objects; other browsers
+		// don't care
+		// Ensure that `cache` is not a window object #10080
+		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+			delete cache[ id ];
+		} else {
+			cache[ id ] = null;
+		}
+
+		// We destroyed the cache and need to eliminate the expando on the node to avoid
+		// false lookups in the cache for entries that no longer exist
+		if ( isNode ) {
+			// IE does not allow us to delete expando properties from nodes,
+			// nor does it have a removeAttribute function on Document nodes;
+			// we must handle all of these cases
+			if ( jQuery.support.deleteExpando ) {
+				delete elem[ internalKey ];
+			} else if ( elem.removeAttribute ) {
+				elem.removeAttribute( internalKey );
+			} else {
+				elem[ internalKey ] = null;
+			}
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		if ( elem.nodeName ) {
+			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+			if ( match ) {
+				return !(match === true || elem.getAttribute("classid") !== match);
+			}
+		}
+
+		return true;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var parts, part, attr, name, l,
+			elem = this[0],
+			i = 0,
+			data = null;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = jQuery.data( elem );
+
+				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+					attr = elem.attributes;
+					for ( l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( elem, name, data[ name ] );
+						}
+					}
+					jQuery._data( elem, "parsedAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		parts = key.split( ".", 2 );
+		parts[1] = parts[1] ? "." + parts[1] : "";
+		part = parts[1] + "!";
+
+		return jQuery.access( this, function( value ) {
+
+			if ( value === undefined ) {
+				data = this.triggerHandler( "getData" + part, [ parts[0] ] );
+
+				// Try to fetch any internally stored data first
+				if ( data === undefined && elem ) {
+					data = jQuery.data( elem, key );
+					data = dataAttr( elem, key, data );
+				}
+
+				return data === undefined && parts[1] ?
+					this.data( parts[0] ) :
+					data;
+			}
+
+			parts[1] = value;
+			this.each(function() {
+				var self = jQuery( this );
+
+				self.triggerHandler( "setData" + part, parts );
+				jQuery.data( this, key, value );
+				self.triggerHandler( "changeData" + part, parts );
+			});
+		}, null, value, arguments.length > 1, null, false );
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+				data === "false" ? false :
+				data === "null" ? null :
+				jQuery.isNumeric( data ) ? +data :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	for ( var name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+	var deferDataKey = type + "defer",
+		queueDataKey = type + "queue",
+		markDataKey = type + "mark",
+		defer = jQuery._data( elem, deferDataKey );
+	if ( defer &&
+		( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
+		( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
+		// Give room for hard-coded callbacks to fire first
+		// and eventually mark/queue something else on the element
+		setTimeout( function() {
+			if ( !jQuery._data( elem, queueDataKey ) &&
+				!jQuery._data( elem, markDataKey ) ) {
+				jQuery.removeData( elem, deferDataKey, true );
+				defer.fire();
+			}
+		}, 0 );
+	}
+}
+
+jQuery.extend({
+
+	_mark: function( elem, type ) {
+		if ( elem ) {
+			type = ( type || "fx" ) + "mark";
+			jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
+		}
+	},
+
+	_unmark: function( force, elem, type ) {
+		if ( force !== true ) {
+			type = elem;
+			elem = force;
+			force = false;
+		}
+		if ( elem ) {
+			type = type || "fx";
+			var key = type + "mark",
+				count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
+			if ( count ) {
+				jQuery._data( elem, key, count );
+			} else {
+				jQuery.removeData( elem, key, true );
+				handleQueueMarkDefer( elem, type, "mark" );
+			}
+		}
+	},
+
+	queue: function( elem, type, data ) {
+		var q;
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			q = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !q || jQuery.isArray(data) ) {
+					q = jQuery._data( elem, type, jQuery.makeArray(data) );
+				} else {
+					q.push( data );
+				}
+			}
+			return q || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift(),
+			hooks = {};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+		}
+
+		if ( fn ) {
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			jQuery._data( elem, type + ".run", hooks );
+			fn.call( elem, function() {
+				jQuery.dequeue( elem, type );
+			}, hooks );
+		}
+
+		if ( !queue.length ) {
+			jQuery.removeData( elem, type + "queue " + type + ".run", true );
+			handleQueueMarkDefer( elem, type, "queue" );
+		}
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[0], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each(function() {
+				var queue = jQuery.queue( this, type, data );
+
+				if ( type === "fx" && queue[0] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function( next, hooks ) {
+			var timeout = setTimeout( next, time );
+			hooks.stop = function() {
+				clearTimeout( timeout );
+			};
+		});
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, object ) {
+		if ( typeof type !== "string" ) {
+			object = type;
+			type = undefined;
+		}
+		type = type || "fx";
+		var defer = jQuery.Deferred(),
+			elements = this,
+			i = elements.length,
+			count = 1,
+			deferDataKey = type + "defer",
+			queueDataKey = type + "queue",
+			markDataKey = type + "mark",
+			tmp;
+		function resolve() {
+			if ( !( --count ) ) {
+				defer.resolveWith( elements, [ elements ] );
+			}
+		}
+		while( i-- ) {
+			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+					jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
+				count++;
+				tmp.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( object );
+	}
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+	rspace = /\s+/,
+	rreturn = /\r/g,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea)?$/i,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute,
+	nodeHook, boolHook, fixSpecified;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classNames, i, l, elem,
+			setClass, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			classNames = value.split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className && classNames.length === 1 ) {
+						elem.className = value;
+
+					} else {
+						setClass = " " + elem.className + " ";
+
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classNames, i, l, elem, className, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( (value && typeof value === "string") || value === undefined ) {
+			classNames = ( value || "" ).split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 && elem.className ) {
+					if ( value ) {
+						className = (" " + elem.className + " ").replace( rclass, " " );
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							className = className.replace(" " + classNames[ c ] + " ", " ");
+						}
+						elem.className = jQuery.trim( className );
+
+					} else {
+						elem.className = "";
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.split( rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space seperated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ?
+					// handle most common string cases
+					ret.replace(rreturn, "") :
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var self = jQuery(this), val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map(val, function ( value ) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				// attributes.value is undefined in Blackberry 4.7 but
+				// uses .value. See #6932
+				var val = elem.attributes.value;
+				return !val || val.specified ? elem.value : elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, i, max, option,
+					index = elem.selectedIndex,
+					values = [],
+					options = elem.options,
+					one = elem.type === "select-one";
+
+				// Nothing was selected
+				if ( index < 0 ) {
+					return null;
+				}
+
+				// Loop through all the selected options
+				i = one ? index : 0;
+				max = one ? index + 1 : options.length;
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// Don't return options that are disabled or in a disabled optgroup
+					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+				if ( one && !values.length && options.length ) {
+					return jQuery( options[ index ] ).val();
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attrFn: {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true
+	},
+
+	attr: function( elem, name, value, pass ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( pass && name in jQuery.attrFn ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( notxml ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+
+			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, "" + value );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			ret = elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret === null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var propName, attrNames, name, l, isBool,
+			i = 0;
+
+		if ( value && elem.nodeType === 1 ) {
+			attrNames = value.toLowerCase().split( rspace );
+			l = attrNames.length;
+
+			for ( ; i < l; i++ ) {
+				name = attrNames[ i ];
+
+				if ( name ) {
+					propName = jQuery.propFix[ name ] || name;
+					isBool = rboolean.test( name );
+
+					// See #9699 for explanation of this approach (setting first, then removal)
+					// Do not do this for boolean attributes (see #10870)
+					if ( !isBool ) {
+						jQuery.attr( elem, name, "" );
+					}
+					elem.removeAttribute( getSetAttribute ? name : propName );
+
+					// Set corresponding property to false for boolean attributes
+					if ( isBool && propName in elem ) {
+						elem[ propName ] = false;
+					}
+				}
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				// We can't allow the type property to be changed (since it causes problems in IE)
+				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+					jQuery.error( "type property can't be changed" );
+				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to it's default in case type is set after value
+					// This is for element creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		},
+		// Use the value property for back compat
+		// Use the nodeHook for button elements in IE6/7 (#1954)
+		value: {
+			get: function( elem, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.get( elem, name );
+				}
+				return name in elem ?
+					elem.value :
+					null;
+			},
+			set: function( elem, value, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.set( elem, value, name );
+				}
+				// Does not return so that setAttribute is also used
+				elem.value = value;
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+
+	prop: function( elem, name, value ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return ( elem[ name ] = value );
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		// Align boolean attributes with corresponding properties
+		// Fall back to attribute presence where some booleans are not supported
+		var attrNode,
+			property = jQuery.prop( elem, name );
+		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		var propName;
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			// value is true since we know at this point it's type boolean and not false
+			// Set boolean attributes to the same name and set the DOM property
+			propName = jQuery.propFix[ name ] || name;
+			if ( propName in elem ) {
+				// Only set the IDL specifically if it already exists on the element
+				elem[ propName ] = true;
+			}
+
+			elem.setAttribute( name, name.toLowerCase() );
+		}
+		return name;
+	}
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	fixSpecified = {
+		name: true,
+		id: true,
+		coords: true
+	};
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret;
+			ret = elem.getAttributeNode( name );
+			return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
+				ret.nodeValue :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				ret = document.createAttribute( name );
+				elem.setAttributeNode( ret );
+			}
+			return ( ret.nodeValue = value + "" );
+		}
+	};
+
+	// Apply the nodeHook to tabindex
+	jQuery.attrHooks.tabindex.set = nodeHook.set;
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		get: nodeHook.get,
+		set: function( elem, value, name ) {
+			if ( value === "" ) {
+				value = "false";
+			}
+			nodeHook.set( elem, value, name );
+		}
+	};
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret === null ? undefined : ret;
+			}
+		});
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Normalize to lowercase since IE uppercases css property names
+			return elem.style.cssText.toLowerCase() || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = "" + value );
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	});
+});
+
+
+
+
+var rformElems = /^(?:textarea|input|select)$/i,
+	rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
+	rhoverHack = /(?:^|\s)hover(\.\S+)?\b/,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
+	quickParse = function( selector ) {
+		var quick = rquickIs.exec( selector );
+		if ( quick ) {
+			//   0  1    2   3
+			// [ _, tag, id, class ]
+			quick[1] = ( quick[1] || "" ).toLowerCase();
+			quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
+		}
+		return quick;
+	},
+	quickIs = function( elem, m ) {
+		var attrs = elem.attributes || {};
+		return (
+			(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
+			(!m[2] || (attrs.id || {}).value === m[2]) &&
+			(!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
+		);
+	},
+	hoverHack = function( events ) {
+		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+	};
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var elemData, eventHandle, events,
+			t, tns, type, namespaces, handleObj,
+			handleObjIn, quick, handlers, special;
+
+		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
+		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		events = elemData.events;
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+		eventHandle = elemData.handle;
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = function( e ) {
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = jQuery.trim( hoverHack(types) ).split( " " );
+		for ( t = 0; t < types.length; t++ ) {
+
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = tns[1];
+			namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend({
+				type: type,
+				origType: tns[1],
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				quick: selector && quickParse( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			handlers = events[ type ];
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+			t, tns, type, origType, namespaces, origCount,
+			j, events, special, handle, eventType, handleObj;
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+		for ( t = 0; t < types.length; t++ ) {
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tns[1];
+			namespaces = tns[2];
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector? special.delegateType : special.bindType ) || type;
+			eventType = events[ type ] || [];
+			origCount = eventType.length;
+			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+
+			// Remove matching events
+			for ( j = 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					 ( !handler || handler.guid === handleObj.guid ) &&
+					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					eventType.splice( j--, 1 );
+
+					if ( handleObj.selector ) {
+						eventType.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( eventType.length === 0 && origCount !== eventType.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			handle = elemData.handle;
+			if ( handle ) {
+				handle.elem = null;
+			}
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery.removeData( elem, [ "events", "handle" ], true );
+		}
+	},
+
+	// Events that are safe to short-circuit if no handlers are attached.
+	// Native DOM events should not be added, they may have inline handlers.
+	customEvent: {
+		"getData": true,
+		"setData": true,
+		"changeData": true
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		// Don't do events on text and comment nodes
+		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+			return;
+		}
+
+		// Event object or event type
+		var type = event.type || event,
+			namespaces = [],
+			cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "!" ) >= 0 ) {
+			// Exclusive events trigger only for the exact event (no namespaces)
+			type = type.slice(0, -1);
+			exclusive = true;
+		}
+
+		if ( type.indexOf( "." ) >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+
+		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+			// No jQuery handlers for this event type, and it can't have inline handlers
+			return;
+		}
+
+		// Caller can pass in an Event, Object, or just an event type string
+		event = typeof event === "object" ?
+			// jQuery.Event object
+			event[ jQuery.expando ] ? event :
+			// Object literal
+			new jQuery.Event( type, event ) :
+			// Just the event type (string)
+			new jQuery.Event( type );
+
+		event.type = type;
+		event.isTrigger = true;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join( "." );
+		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+		// Handle a global trigger
+		if ( !elem ) {
+
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			cache = jQuery.cache;
+			for ( i in cache ) {
+				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+				}
+			}
+			return;
+		}
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data != null ? jQuery.makeArray( data ) : [];
+		data.unshift( event );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		eventPath = [[ elem, special.bindType || type ]];
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+			old = null;
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push([ cur, bubbleType ]);
+				old = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( old && old === elem.ownerDocument ) {
+				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+			}
+		}
+
+		// Fire handlers on the event path
+		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+			cur = eventPath[i][0];
+			event.type = eventPath[i][1];
+
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+			// Note that this is a bare JS function and not a jQuery handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
+				event.preventDefault();
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				// IE<9 dies on focus/blur to hidden element (#1486)
+				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					old = elem[ ontype ];
+
+					if ( old ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					elem[ type ]();
+					jQuery.event.triggered = undefined;
+
+					if ( old ) {
+						elem[ ontype ] = old;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event || window.event );
+
+		var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+			delegateCount = handlers.delegateCount,
+			args = [].slice.call( arguments, 0 ),
+			run_all = !event.exclusive && !event.namespace,
+			special = jQuery.event.special[ event.type ] || {},
+			handlerQueue = [],
+			i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers that should run if there are delegated events
+		// Avoid non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && !(event.button && event.type === "click") ) {
+
+			// Pregenerate a single jQuery object for reuse with .is()
+			jqcur = jQuery(this);
+			jqcur.context = this.ownerDocument || this;
+
+			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+
+				// Don't process events on disabled elements (#6911, #8165)
+				if ( cur.disabled !== true ) {
+					selMatch = {};
+					matches = [];
+					jqcur[0] = cur;
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+						sel = handleObj.selector;
+
+						if ( selMatch[ sel ] === undefined ) {
+							selMatch[ sel ] = (
+								handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
+							);
+						}
+						if ( selMatch[ sel ] ) {
+							matches.push( handleObj );
+						}
+					}
+					if ( matches.length ) {
+						handlerQueue.push({ elem: cur, matches: matches });
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( handlers.length > delegateCount ) {
+			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+		}
+
+		// Run delegates first; they may want to stop propagation beneath us
+		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+			matched = handlerQueue[ i ];
+			event.currentTarget = matched.elem;
+
+			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+				handleObj = matched.matches[ j ];
+
+				// Triggered event must either 1) be non-exclusive and have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+	fixHooks: {},
+
+	keyHooks: {
+		props: "char charCode key keyCode".split(" "),
+		filter: function( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var eventDoc, doc, body,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop,
+			originalEvent = event,
+			fixHook = jQuery.event.fixHooks[ event.type ] || {},
+			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = jQuery.Event( originalEvent );
+
+		for ( i = copy.length; i; ) {
+			prop = copy[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Target should not be a text node (#504, Safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
+		if ( event.metaKey === undefined ) {
+			event.metaKey = event.ctrlKey;
+		}
+
+		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: jQuery.bindReady
+		},
+
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+
+		focus: {
+			delegateType: "focusin"
+		},
+		blur: {
+			delegateType: "focusout"
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// Piggyback on a donor event to simulate a different one.
+		// Fake originalEvent to avoid donor's stopPropagation, but if the
+		// simulated event prevents default then we do the same on the donor.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{ type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		if ( elem.detachEvent ) {
+			elem.detachEvent( "on" + type, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !(this instanceof jQuery.Event) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj,
+				selector = handleObj.selector,
+				ret;
+
+			// For mousenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !form._submit_attached ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submit_bubble = true;
+					});
+					form._submit_attached = true;
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+		
+		postDispatch: function( event ) {
+			// If form was submitted by the user, bubble the event up the tree
+			if ( event._submit_bubble ) {
+				delete event._submit_bubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event, true );
+				}
+			}
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+							jQuery.event.simulate( "change", this, event, true );
+						}
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					elem._change_attached = true;
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0,
+			handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var origFn, type;
+
+		// Types can be a map of types/handlers
+		if ( typeof types === "object" ) {
+			// ( types-Object, selector, data )
+			if ( typeof selector !== "string" ) { // && selector != null
+				// ( types-Object, data )
+				data = data || selector;
+				selector = undefined;
+			}
+			for ( type in types ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		if ( data == null && fn == null ) {
+			// ( types, fn )
+			fn = selector;
+			data = selector = undefined;
+		} else if ( fn == null ) {
+			if ( typeof selector === "string" ) {
+				// ( types, selector, fn )
+				fn = data;
+				data = undefined;
+			} else {
+				// ( types, data, fn )
+				fn = data;
+				data = selector;
+				selector = undefined;
+			}
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		} else if ( !fn ) {
+			return this;
+		}
+
+		if ( one === 1 ) {
+			origFn = fn;
+			fn = function( event ) {
+				// Can use an empty set, since event contains the info
+				jQuery().off( event );
+				return origFn.apply( this, arguments );
+			};
+			// Use same guid so caller can remove using origFn
+			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+		}
+		return this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on( types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			var handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( var type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each(function() {
+			jQuery.event.remove( this, types, fn, selector );
+		});
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	live: function( types, data, fn ) {
+		jQuery( this.context ).on( types, this.selector, data, fn );
+		return this;
+	},
+	die: function( types, fn ) {
+		jQuery( this.context ).off( types, this.selector || "**", fn );
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			return jQuery.event.trigger( type, data, this[0], true );
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			guid = fn.guid || jQuery.guid++,
+			i = 0,
+			toggler = function( event ) {
+				// Figure out which function to execute
+				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+				// Make sure that clicks stop
+				event.preventDefault();
+
+				// and execute the function
+				return args[ lastToggle ].apply( this, arguments ) || false;
+			};
+
+		// link all the functions, so any of them can unbind this click handler
+		toggler.guid = guid;
+		while ( i < args.length ) {
+			args[ i++ ].guid = guid;
+		}
+
+		return this.click( toggler );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( jQuery.attrFn ) {
+		jQuery.attrFn[ name ] = true;
+	}
+
+	if ( rkeyEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+	}
+
+	if ( rmouseEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+	}
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+	expando = "sizcache" + (Math.random() + '').replace('.', ''),
+	done = 0,
+	toString = Object.prototype.toString,
+	hasDuplicate = false,
+	baseHasDuplicate = true,
+	rBackslash = /\\/g,
+	rReturn = /\r\n/g,
+	rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+	baseHasDuplicate = false;
+	return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+
+	var origContext = context;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+		return [];
+	}
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var m, set, checkSet, extra, ret, cur, pop, i,
+		prune = true,
+		contextXML = Sizzle.isXML( context ),
+		parts = [],
+		soFar = selector;
+
+	// Reset the position of the chunker regexp (start from head)
+	do {
+		chunker.exec( "" );
+		m = chunker.exec( soFar );
+
+		if ( m ) {
+			soFar = m[3];
+
+			parts.push( m[1] );
+
+			if ( m[2] ) {
+				extra = m[3];
+				break;
+			}
+		}
+	} while ( m );
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context, seed );
+
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] ) {
+					selector += parts.shift();
+				}
+
+				set = posProcess( selector, set, seed );
+			}
+		}
+
+	} else {
+		// Take a shortcut and set the context if the root selector is an ID
+		// (but not if it'll be faster if the inner selector is an ID)
+		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+			ret = Sizzle.find( parts.shift(), context, contextXML );
+			context = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set )[0] :
+				ret.set[0];
+		}
+
+		if ( context ) {
+			ret = seed ?
+				{ expr: parts.pop(), set: makeArray(seed) } :
+				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+			set = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set ) :
+				ret.set;
+
+			if ( parts.length > 0 ) {
+				checkSet = makeArray( set );
+
+			} else {
+				prune = false;
+			}
+
+			while ( parts.length ) {
+				cur = parts.pop();
+				pop = cur;
+
+				if ( !Expr.relative[ cur ] ) {
+					cur = "";
+				} else {
+					pop = parts.pop();
+				}
+
+				if ( pop == null ) {
+					pop = context;
+				}
+
+				Expr.relative[ cur ]( checkSet, pop, contextXML );
+			}
+
+		} else {
+			checkSet = parts = [];
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		Sizzle.error( cur || selector );
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+
+		} else if ( context && context.nodeType === 1 ) {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+
+		} else {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, origContext, results, seed );
+		Sizzle.uniqueSort( results );
+	}
+
+	return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+	if ( sortOrder ) {
+		hasDuplicate = baseHasDuplicate;
+		results.sort( sortOrder );
+
+		if ( hasDuplicate ) {
+			for ( var i = 1; i < results.length; i++ ) {
+				if ( results[i] === results[ i - 1 ] ) {
+					results.splice( i--, 1 );
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+	return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+	return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+	var set, i, len, match, type, left;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( i = 0, len = Expr.order.length; i < len; i++ ) {
+		type = Expr.order[i];
+
+		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+			left = match[1];
+			match.splice( 1, 1 );
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace( rBackslash, "" );
+				set = Expr.find[ type ]( match, context, isXML );
+
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( "*" ) :
+			[];
+	}
+
+	return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+	var match, anyFound,
+		type, found, item, filter, left,
+		i, pass,
+		old = expr,
+		result = [],
+		curLoop = set,
+		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+	while ( expr && set.length ) {
+		for ( type in Expr.filter ) {
+			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+				filter = Expr.filter[ type ];
+				left = match[1];
+
+				anyFound = false;
+
+				match.splice(1,1);
+
+				if ( left.substr( left.length - 1 ) === "\\" ) {
+					continue;
+				}
+
+				if ( curLoop === result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							pass = not ^ found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+
+								} else {
+									curLoop[i] = false;
+								}
+
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr === old ) {
+			if ( anyFound == null ) {
+				Sizzle.error( expr );
+
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Utility function for retreiving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+var getText = Sizzle.getText = function( elem ) {
+    var i, node,
+		nodeType = elem.nodeType,
+		ret = "";
+
+	if ( nodeType ) {
+		if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+			// Use textContent || innerText for elements
+			if ( typeof elem.textContent === 'string' ) {
+				return elem.textContent;
+			} else if ( typeof elem.innerText === 'string' ) {
+				// Replace IE's carriage returns
+				return elem.innerText.replace( rReturn, '' );
+			} else {
+				// Traverse it's children
+				for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
+					ret += getText( elem );
+				}
+			}
+		} else if ( nodeType === 3 || nodeType === 4 ) {
+			return elem.nodeValue;
+		}
+	} else {
+
+		// If no nodeType, this is expected to be an array
+		for ( i = 0; (node = elem[i]); i++ ) {
+			// Do not traverse comment nodes
+			if ( node.nodeType !== 8 ) {
+				ret += getText( node );
+			}
+		}
+	}
+	return ret;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+	},
+
+	leftMatch: {},
+
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+
+	attrHandle: {
+		href: function( elem ) {
+			return elem.getAttribute( "href" );
+		},
+		type: function( elem ) {
+			return elem.getAttribute( "type" );
+		}
+	},
+
+	relative: {
+		"+": function(checkSet, part){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !rNonWord.test( part ),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag ) {
+				part = part.toLowerCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+
+		">": function( checkSet, part ) {
+			var elem,
+				isPartStr = typeof part === "string",
+				i = 0,
+				l = checkSet.length;
+
+			if ( isPartStr && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+					}
+				}
+
+			} else {
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+
+		"": function(checkSet, part, isXML){
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+		},
+
+		"~": function( checkSet, part, isXML ) {
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+		}
+	},
+
+	find: {
+		ID: function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		},
+
+		NAME: function( match, context ) {
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [],
+					results = context.getElementsByName( match[1] );
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+
+		TAG: function( match, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( match[1] );
+			}
+		}
+	},
+	preFilter: {
+		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+			match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+						if ( !inplace ) {
+							result.push( elem );
+						}
+
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+
+		ID: function( match ) {
+			return match[1].replace( rBackslash, "" );
+		},
+
+		TAG: function( match, curLoop ) {
+			return match[1].replace( rBackslash, "" ).toLowerCase();
+		},
+
+		CHILD: function( match ) {
+			if ( match[1] === "nth" ) {
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				match[2] = match[2].replace(/^\+|\s*/g, '');
+
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+			else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+
+		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+			var name = match[1] = match[1].replace( rBackslash, "" );
+
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			// Handle if an un-quoted value was used
+			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+
+		PSEUDO: function( match, curLoop, inplace, result, not ) {
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+
+					return false;
+				}
+
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+
+			return match;
+		},
+
+		POS: function( match ) {
+			match.unshift( true );
+
+			return match;
+		}
+	},
+
+	filters: {
+		enabled: function( elem ) {
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+
+		disabled: function( elem ) {
+			return elem.disabled === true;
+		},
+
+		checked: function( elem ) {
+			return elem.checked === true;
+		},
+
+		selected: function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		parent: function( elem ) {
+			return !!elem.firstChild;
+		},
+
+		empty: function( elem ) {
+			return !elem.firstChild;
+		},
+
+		has: function( elem, i, match ) {
+			return !!Sizzle( match[3], elem ).length;
+		},
+
+		header: function( elem ) {
+			return (/h\d/i).test( elem.nodeName );
+		},
+
+		text: function( elem ) {
+			var attr = elem.getAttribute( "type" ), type = elem.type;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
+		},
+
+		radio: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+		},
+
+		checkbox: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+		},
+
+		file: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+		},
+
+		password: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+		},
+
+		submit: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "submit" === elem.type;
+		},
+
+		image: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+		},
+
+		reset: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "reset" === elem.type;
+		},
+
+		button: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && "button" === elem.type || name === "button";
+		},
+
+		input: function( elem ) {
+			return (/input|select|textarea|button/i).test( elem.nodeName );
+		},
+
+		focus: function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		}
+	},
+	setFilters: {
+		first: function( elem, i ) {
+			return i === 0;
+		},
+
+		last: function( elem, i, match, array ) {
+			return i === array.length - 1;
+		},
+
+		even: function( elem, i ) {
+			return i % 2 === 0;
+		},
+
+		odd: function( elem, i ) {
+			return i % 2 === 1;
+		},
+
+		lt: function( elem, i, match ) {
+			return i < match[3] - 0;
+		},
+
+		gt: function( elem, i, match ) {
+			return i > match[3] - 0;
+		},
+
+		nth: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		},
+
+		eq: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		}
+	},
+	filter: {
+		PSEUDO: function( elem, match, i, array ) {
+			var name = match[1],
+				filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var j = 0, l = not.length; j < l; j++ ) {
+					if ( not[j] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+
+			} else {
+				Sizzle.error( name );
+			}
+		},
+
+		CHILD: function( elem, match ) {
+			var first, last,
+				doneName, parent, cache,
+				count, diff,
+				type = match[1],
+				node = elem;
+
+			switch ( type ) {
+				case "only":
+				case "first":
+					while ( (node = node.previousSibling) ) {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					if ( type === "first" ) {
+						return true;
+					}
+
+					node = elem;
+
+					/* falls through */
+				case "last":
+					while ( (node = node.nextSibling) ) {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					return true;
+
+				case "nth":
+					first = match[2];
+					last = match[3];
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+
+					doneName = match[0];
+					parent = elem.parentNode;
+
+					if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
+						count = 0;
+
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						}
+
+						parent[ expando ] = doneName;
+					}
+
+					diff = elem.nodeIndex - last;
+
+					if ( first === 0 ) {
+						return diff === 0;
+
+					} else {
+						return ( diff % first === 0 && diff / first >= 0 );
+					}
+			}
+		},
+
+		ID: function( elem, match ) {
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+
+		TAG: function( elem, match ) {
+			return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
+		},
+
+		CLASS: function( elem, match ) {
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+
+		ATTR: function( elem, match ) {
+			var name = match[1],
+				result = Sizzle.attr ?
+					Sizzle.attr( elem, name ) :
+					Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				!type && Sizzle.attr ?
+				result != null :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value !== check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+
+		POS: function( elem, match, i, array ) {
+			var name = match[2],
+				filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS,
+	fescape = function(all, num){
+		return "\\" + (num - 0 + 1);
+	};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+// Expose origPOS
+// "global" as in regardless of relation to brackets/parens
+Expr.match.globalPOS = origPOS;
+
+var makeArray = function( array, results ) {
+	array = Array.prototype.slice.call( array, 0 );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+	makeArray = function( array, results ) {
+		var i = 0,
+			ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+
+			} else {
+				for ( ; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+			return a.compareDocumentPosition ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+	};
+
+} else {
+	sortOrder = function( a, b ) {
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Fallback to using sourceIndex (in IE) if it's available on both nodes
+		} else if ( a.sourceIndex && b.sourceIndex ) {
+			return a.sourceIndex - b.sourceIndex;
+		}
+
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+	siblingCheck = function( a, b, ret ) {
+		if ( a === b ) {
+			return ret;
+		}
+
+		var cur = a.nextSibling;
+
+		while ( cur ) {
+			if ( cur === b ) {
+				return -1;
+			}
+
+			cur = cur.nextSibling;
+		}
+
+		return 1;
+	};
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("div"),
+		id = "script" + (new Date()).getTime(),
+		root = document.documentElement;
+
+	form.innerHTML = "<a name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( document.getElementById( id ) ) {
+		Expr.find.ID = function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+
+				return m ?
+					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+
+		Expr.filter.ID = function( elem, match ) {
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+
+	// release memory in IE
+	root = form = null;
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function( match, context ) {
+			var results = context.getElementsByTagName( match[1] );
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+
+		Expr.attrHandle.href = function( elem ) {
+			return elem.getAttribute( "href", 2 );
+		};
+	}
+
+	// release memory in IE
+	div = null;
+})();
+
+if ( document.querySelectorAll ) {
+	(function(){
+		var oldSizzle = Sizzle,
+			div = document.createElement("div"),
+			id = "__sizzle__";
+
+		div.innerHTML = "<p class='TEST'></p>";
+
+		// Safari can't handle uppercase or unicode characters when
+		// in quirks mode.
+		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+			return;
+		}
+
+		Sizzle = function( query, context, extra, seed ) {
+			context = context || document;
+
+			// Only use querySelectorAll on non-XML documents
+			// (ID selectors don't work in non-HTML documents)
+			if ( !seed && !Sizzle.isXML(context) ) {
+				// See if we find a selector to speed up
+				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+
+				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+					// Speed-up: Sizzle("TAG")
+					if ( match[1] ) {
+						return makeArray( context.getElementsByTagName( query ), extra );
+
+					// Speed-up: Sizzle(".CLASS")
+					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+						return makeArray( context.getElementsByClassName( match[2] ), extra );
+					}
+				}
+
+				if ( context.nodeType === 9 ) {
+					// Speed-up: Sizzle("body")
+					// The body element only exists once, optimize finding it
+					if ( query === "body" && context.body ) {
+						return makeArray( [ context.body ], extra );
+
+					// Speed-up: Sizzle("#ID")
+					} else if ( match && match[3] ) {
+						var elem = context.getElementById( match[3] );
+
+						// Check parentNode to catch when Blackberry 4.6 returns
+						// nodes that are no longer in the document #6963
+						if ( elem && elem.parentNode ) {
+							// Handle the case where IE and Opera return items
+							// by name instead of ID
+							if ( elem.id === match[3] ) {
+								return makeArray( [ elem ], extra );
+							}
+
+						} else {
+							return makeArray( [], extra );
+						}
+					}
+
+					try {
+						return makeArray( context.querySelectorAll(query), extra );
+					} catch(qsaError) {}
+
+				// qSA works strangely on Element-rooted queries
+				// We can work around this by specifying an extra ID on the root
+				// and working up from there (Thanks to Andrew Dupont for the technique)
+				// IE 8 doesn't work on object elements
+				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					var oldContext = context,
+						old = context.getAttribute( "id" ),
+						nid = old || id,
+						hasParent = context.parentNode,
+						relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+					if ( !old ) {
+						context.setAttribute( "id", nid );
+					} else {
+						nid = nid.replace( /'/g, "\\$&" );
+					}
+					if ( relativeHierarchySelector && hasParent ) {
+						context = context.parentNode;
+					}
+
+					try {
+						if ( !relativeHierarchySelector || hasParent ) {
+							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+						}
+
+					} catch(pseudoError) {
+					} finally {
+						if ( !old ) {
+							oldContext.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+
+			return oldSizzle(query, context, extra, seed);
+		};
+
+		for ( var prop in oldSizzle ) {
+			Sizzle[ prop ] = oldSizzle[ prop ];
+		}
+
+		// release memory in IE
+		div = null;
+	})();
+}
+
+(function(){
+	var html = document.documentElement,
+		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+	if ( matches ) {
+		// Check to see if it's possible to do matchesSelector
+		// on a disconnected node (IE 9 fails this)
+		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+			pseudoWorks = false;
+
+		try {
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( document.documentElement, "[test!='']:sizzle" );
+
+		} catch( pseudoError ) {
+			pseudoWorks = true;
+		}
+
+		Sizzle.matchesSelector = function( node, expr ) {
+			// Make sure that attribute selectors are quoted
+			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+			if ( !Sizzle.isXML( node ) ) {
+				try {
+					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+						var ret = matches.call( node, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || !disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9, so check for that
+								node.document && node.document.nodeType !== 11 ) {
+							return ret;
+						}
+					}
+				} catch(e) {}
+			}
+
+			return Sizzle(expr, null, null, [node]).length > 0;
+		};
+	}
+})();
+
+(function(){
+	var div = document.createElement("div");
+
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	// Also, make sure that getElementsByClassName actually exists
+	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+		return;
+	}
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 ) {
+		return;
+	}
+
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function( match, context, isXML ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+
+	// release memory in IE
+	div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem[ expando ] = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName.toLowerCase() === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem[ expando ] = doneName;
+						elem.sizset = i;
+					}
+
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+if ( document.documentElement.contains ) {
+	Sizzle.contains = function( a, b ) {
+		return a !== b && (a.contains ? a.contains(b) : true);
+	};
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+	Sizzle.contains = function( a, b ) {
+		return !!(a.compareDocumentPosition(b) & 16);
+	};
+
+} else {
+	Sizzle.contains = function() {
+		return false;
+	};
+}
+
+Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833)
+	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context, seed ) {
+	var match,
+		tmpSet = [],
+		later = "",
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet, seed );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+Sizzle.selectors.attrMap = {};
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+	// Note: This RegExp should be improved, or likely pulled from Sizzle
+	rmultiselector = /,/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	slice = Array.prototype.slice,
+	POS = jQuery.expr.match.globalPOS,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var self = this,
+			i, l;
+
+		if ( typeof selector !== "string" ) {
+			return jQuery( selector ).filter(function() {
+				for ( i = 0, l = self.length; i < l; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			});
+		}
+
+		var ret = this.pushStack( "", "find", selector ),
+			length, n, r;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( n = length; n < ret.length; n++ ) {
+					for ( r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target );
+		return this.filter(function() {
+			for ( var i = 0, l = targets.length; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && (
+			typeof selector === "string" ?
+				// If this is a positional selector, check membership in the returned set
+				// so $("p:first").is("p:last") won't return true for a doc with two "p".
+				POS.test( selector ) ?
+					jQuery( selector, this.context ).index( this[0] ) >= 0 :
+					jQuery.filter( selector, this ).length > 0 :
+				this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var ret = [], i, l, cur = this[0];
+
+		// Array (deprecated as of jQuery 1.7)
+		if ( jQuery.isArray( selectors ) ) {
+			var level = 1;
+
+			while ( cur && cur.ownerDocument && cur !== context ) {
+				for ( i = 0; i < selectors.length; i++ ) {
+
+					if ( jQuery( cur ).is( selectors[ i ] ) ) {
+						ret.push({ selector: selectors[ i ], elem: cur, level: level });
+					}
+				}
+
+				cur = cur.parentNode;
+				level++;
+			}
+
+			return ret;
+		}
+
+		// String
+		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+
+				} else {
+					cur = cur.parentNode;
+					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+						break;
+					}
+				}
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	}
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return jQuery.nth( elem, 2, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return jQuery.nth( elem, 2, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.makeArray( elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, slice.call( arguments ).join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	nth: function( cur, result, dir, elem ) {
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] ) {
+			if ( cur.nodeType === 1 && ++num === result ) {
+				break;
+			}
+		}
+
+		return cur;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return ( elem === qualifier ) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+	});
+}
+
+
+
+
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+	safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style)/i,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	},
+	safeFragment = createSafeFragment( document );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( value ) {
+		return jQuery.access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+		}, null, value, arguments.length );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each(function(i) {
+			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery.clean(arguments) );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		return jQuery.access( this, function( value ) {
+			var elem = this[0] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined ) {
+				return elem.nodeType === 1 ?
+					elem.innerHTML.replace( rinlinejQuery, "" ) :
+					null;
+			}
+
+
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+				value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+				try {
+					for (; i < l; i++ ) {
+						// Remove element nodes and prevent memory leaks
+						elem = this[i] || {};
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( elem.getElementsByTagName( "*" ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch(e) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.length ?
+				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+				this;
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || ( l > 1 && i < lastIndex ) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, function( i, elem ) {
+					if ( elem.src ) {
+						jQuery.ajax({
+							type: "GET",
+							global: false,
+							url: elem.src,
+							async: false,
+							dataType: "script"
+						});
+					} else {
+						jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+					}
+
+					if ( elem.parentNode ) {
+						elem.parentNode.removeChild( elem );
+					}
+				});
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type, events[ type ][ i ] );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+
+	// IE blanks contents when cloning scripts
+	} else if ( nodeName === "script" && dest.text !== src.text ) {
+		dest.text = src.text;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+
+	// Clear flags for bubbling special change/submit events, they must
+	// be reattached when the newly cloned events are first activated
+	dest.removeAttribute( "_submit_attached" );
+	dest.removeAttribute( "_change_attached" );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults, doc,
+	first = args[ 0 ];
+
+	// nodes may contain either an explicit document object,
+	// a jQuery collection or context object.
+	// If nodes[0] contains a valid object to assign to doc
+	if ( nodes && nodes[0] ) {
+		doc = nodes[0].ownerDocument || nodes[0];
+	}
+
+	// Ensure that an attr object doesn't incorrectly stand in as a document object
+	// Chrome and Firefox seem to allow this to occur and will throw exception
+	// Fixes #8950
+	if ( !doc.createDocumentFragment ) {
+		doc = document;
+	}
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+	if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
+		first.charAt(0) === "<" && !rnocache.test( first ) &&
+		(jQuery.support.checkClone || !rchecked.test( first )) &&
+		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+		cacheable = true;
+
+		cacheresults = jQuery.fragments[ first ];
+		if ( cacheresults && cacheresults !== 1 ) {
+			fragment = cacheresults;
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = ( i > 0 ? this.clone(true) : this ).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( typeof elem.getElementsByTagName !== "undefined" ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( elem.type === "checkbox" || elem.type === "radio" ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+	var nodeName = ( elem.nodeName || "" ).toLowerCase();
+	if ( nodeName === "input" ) {
+		fixDefaultChecked( elem );
+	// Skip scripts, get other children
+	} else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
+		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+	}
+}
+
+// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
+function shimCloneNode( elem ) {
+	var div = document.createElement( "div" );
+	safeFragment.appendChild( div );
+
+	div.innerHTML = elem.outerHTML;
+	return div.firstChild;
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var srcElements,
+			destElements,
+			i,
+			// IE<=8 does not properly clone detached, unknown element nodes
+			clone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ?
+				elem.cloneNode( true ) :
+				shimCloneNode( elem );
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					cloneFixAttributes( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var checkScriptType, script, j,
+				ret = [];
+
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Trim whitespace, otherwise indexOf won't work as expected
+					var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
+						wrap = wrapMap[ tag ] || wrapMap._default,
+						depth = wrap[0],
+						div = context.createElement("div"),
+						safeChildNodes = safeFragment.childNodes,
+						remove;
+
+					// Append wrapper element to unknown element safe doc fragment
+					if ( context === document ) {
+						// Use the fragment we've already created for this document
+						safeFragment.appendChild( div );
+					} else {
+						// Use a fragment created with the owner document
+						createSafeFragment( context ).appendChild( div );
+					}
+
+					// Go to html and back, then peel off extra wrappers
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						var hasBody = rtbody.test(elem),
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+
+					// Clear elements from DocumentFragment (safeFragment or otherwise)
+					// to avoid hoarding elements. Fixes #11356
+					if ( div ) {
+						div.parentNode.removeChild( div );
+
+						// Guard against -1 index exceptions in FF3.6
+						if ( safeChildNodes.length > 0 ) {
+							remove = safeChildNodes[ safeChildNodes.length - 1 ];
+
+							if ( remove && remove.parentNode ) {
+								remove.parentNode.removeChild( remove );
+							}
+						}
+					}
+				}
+			}
+
+			// Resets defaultChecked for any radios and checkboxes
+			// about to be appended to the DOM in IE 6/7 (#8060)
+			var len;
+			if ( !jQuery.support.appendChecked ) {
+				if ( elem[0] && typeof (len = elem.length) === "number" ) {
+					for ( j = 0; j < len; j++ ) {
+						findInputs( elem[j] );
+					}
+				} else {
+					findInputs( elem );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			checkScriptType = function( elem ) {
+				return !elem.type || rscriptType.test( elem.type );
+			};
+			for ( i = 0; ret[i]; i++ ) {
+				script = ret[i];
+				if ( scripts && jQuery.nodeName( script, "script" ) && (!script.type || rscriptType.test( script.type )) ) {
+					scripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );
+
+				} else {
+					if ( script.nodeType === 1 ) {
+						var jsTags = jQuery.grep( script.getElementsByTagName( "script" ), checkScriptType );
+
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+					}
+					fragment.appendChild( script );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id,
+			cache = jQuery.cache,
+			special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						if ( special[ type ] ) {
+							jQuery.event.remove( elem, type );
+
+						// This is a shortcut to avoid jQuery.event.remove's overhead
+						} else {
+							jQuery.removeEvent( elem, type, data.handle );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	// fixed for IE9, see #8346
+	rupper = /([A-Z]|^ms)/g,
+	rnum = /^[\-+]?(?:\d*\.)?\d+$/i,
+	rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,
+	rrelNum = /^([\-+])=([\-+.\de]+)/,
+	rmargin = /^margin/,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+
+	// order is important!
+	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+
+	curCSS,
+
+	getComputedStyle,
+	currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+	return jQuery.access( this, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	}, name, value, arguments.length > 1 );
+};
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra ) {
+		var ret, hooks;
+
+		// Make sure that we're working with the right name
+		name = jQuery.camelCase( name );
+		hooks = jQuery.cssHooks[ name ];
+		name = jQuery.cssProps[ name ] || name;
+
+		// cssFloat needs a special treatment
+		if ( name === "cssFloat" ) {
+			name = "float";
+		}
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {},
+			ret, name;
+
+		// Remember the old values, and insert the new ones
+		for ( name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		ret = callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+
+		return ret;
+	}
+});
+
+// DEPRECATED in 1.3, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, name ) {
+		var ret, defaultView, computedStyle, width,
+			style = elem.style;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( (defaultView = elem.ownerDocument.defaultView) &&
+				(computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		// A tribute to the "awesome hack by Dean Edwards"
+		// WebKit uses "computed value (percentage if specified)" instead of "used value" for margins
+		// which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+		if ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {
+			width = style.width;
+			style.width = ret;
+			ret = computedStyle.width;
+			style.width = width;
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left, rsLeft, uncomputed,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret == null && style && (uncomputed = style[ name ]) ) {
+			ret = uncomputed;
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( rnumnonpx.test( ret ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ret;
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with offset property
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		i = name === "width" ? 1 : 0,
+		len = 4;
+
+	if ( val > 0 ) {
+		if ( extra !== "border" ) {
+			for ( ; i < len; i += 2 ) {
+				if ( !extra ) {
+					val -= parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
+				}
+				if ( extra === "margin" ) {
+					val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;
+				} else {
+					val -= parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+				}
+			}
+		}
+
+		return val + "px";
+	}
+
+	// Fall back to computed then uncomputed css if necessary
+	val = curCSS( elem, name );
+	if ( val < 0 || val == null ) {
+		val = elem.style[ name ];
+	}
+
+	// Computed unit is not pixels. Stop here and return.
+	if ( rnumnonpx.test(val) ) {
+		return val;
+	}
+
+	// Normalize "", auto, and prepare for extra
+	val = parseFloat( val ) || 0;
+
+	// Add padding, border, margin
+	if ( extra ) {
+		for ( ; i < len; i += 2 ) {
+			val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
+			if ( extra !== "padding" ) {
+				val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+			}
+			if ( extra === "margin" ) {
+				val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;
+			}
+		}
+	}
+
+	return val + "px";
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					return getWidthOrHeight( elem, name, extra );
+				} else {
+					return jQuery.swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, name, extra );
+					});
+				}
+			}
+		},
+
+		set: function( elem, value ) {
+			return rnum.test( value ) ?
+				value + "px" :
+				value;
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( parseFloat( RegExp.$1 ) / 100 ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there there is no filter style applied in a css rule, we are done
+				if ( currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery(function() {
+	// This hook cannot be added until DOM ready because the support test
+	// for it is not run until after DOM ready
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				return jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						return curCSS( elem, "margin-right" );
+					} else {
+						return elem.style.marginRight;
+					}
+				});
+			}
+		};
+	}
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i,
+
+				// assumes a single number if not a string
+				parts = typeof value === "string" ? value.split(" ") : [ value ],
+				expanded = {};
+
+			for ( i = 0; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+});
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts,
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for ( ; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = undefined;
+
+			// Otherwise, build a param string
+			} else if ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.on( o, f );
+	};
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		if ( settings ) {
+			// Building a settings object
+			ajaxExtend( target, jQuery.ajaxSettings );
+		} else {
+			// Extending ajaxSettings
+			settings = target;
+			target = jQuery.ajaxSettings;
+		}
+		ajaxExtend( target, settings );
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": allTypes
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			context: true,
+			url: true
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, nativeStatusText, responses, headers ) {
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			var isSuccess,
+				success,
+				error,
+				statusText = nativeStatusText,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = "" + ( nativeStatusText || statusText );
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.add;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for ( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					throw e;
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = jQuery.ajaxSettings.traditional;
+		}
+
+		// If an array was passed in, assume that it is an array of form elements.
+		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+			// Serialize the form elements
+			jQuery.each( a, function() {
+				add( this.name, this.value );
+			});
+
+		} else {
+			// If traditional, encode the "old" way (the way 1.3.2 or older
+			// did it), otherwise encode params recursively.
+			for ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+		// Serialize object item.
+		for ( var name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for ( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for ( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for ( key in s.converters ) {
+				if ( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if ( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for ( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var inspectData = ( typeof s.data === "string" ) && /^application\/x\-www\-form\-urlencoded/.test( s.contentType );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				inspectData && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2";
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( inspectData ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Clean-up function
+		jqXHR.always(function() {
+			// Set callback back to previous value
+			window[ jsonpCallback ] = previous;
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( previous ) ) {
+				window[ jsonpCallback ]( responseContainer[ 0 ] );
+			}
+		});
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0,
+	xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+
+									// When requesting binary data, IE6-9 will throw an exception
+									// on any attempt to access responseText (#11426)
+									try {
+										responses.text = xhr.responseText;
+									} catch( _ ) {
+									}
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	iframe, iframeDoc,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	],
+	fxNow;
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback );
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					// Reset the inline display of this element to learn if it is
+					// being hidden by cascaded rules or not
+					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+						display = elem.style.display = "";
+					}
+
+					// Set elements which have been overridden with display: none
+					// in a stylesheet to whatever the default browser style is
+					// for such an element
+					if ( (display === "" && jQuery.css(elem, "display") === "none") ||
+						!jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+						jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+					}
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					if ( display === "" || display === "none" ) {
+						elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
+					}
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			var elem, display,
+				i = 0,
+				j = this.length;
+
+			for ( ; i < j; i++ ) {
+				elem = this[i];
+				if ( elem.style ) {
+					display = jQuery.css( elem, "display" );
+
+					if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
+						jQuery._data( elem, "olddisplay", display );
+					}
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				if ( this[i].style ) {
+					this[i].style.display = "none";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed( speed, easing, callback );
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete, [ false ] );
+		}
+
+		// Do not change referenced properties as per-property easing will be lost
+		prop = jQuery.extend( {}, prop );
+
+		function doAnimation() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			if ( optall.queue === false ) {
+				jQuery._mark( this );
+			}
+
+			var opt = jQuery.extend( {}, optall ),
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				name, val, p, e, hooks, replace,
+				parts, start, end, unit,
+				method;
+
+			// will store per property easing and be used to determine when an animation is complete
+			opt.animatedProperties = {};
+
+			// first pass over propertys to expand / normalize
+			for ( p in prop ) {
+				name = jQuery.camelCase( p );
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+				}
+
+				if ( ( hooks = jQuery.cssHooks[ name ] ) && "expand" in hooks ) {
+					replace = hooks.expand( prop[ name ] );
+					delete prop[ name ];
+
+					// not quite $.extend, this wont overwrite keys already present.
+					// also - reusing 'p' from above because we have the correct "name"
+					for ( p in replace ) {
+						if ( ! ( p in prop ) ) {
+							prop[ p ] = replace[ p ];
+						}
+					}
+				}
+			}
+
+			for ( name in prop ) {
+				val = prop[ name ];
+				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+				if ( jQuery.isArray( val ) ) {
+					opt.animatedProperties[ name ] = val[ 1 ];
+					val = prop[ name ] = val[ 0 ];
+				} else {
+					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+				}
+
+				if ( val === "hide" && hidden || val === "show" && !hidden ) {
+					return opt.complete.call( this );
+				}
+
+				if ( isElement && ( name === "height" || name === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+
+						// inline-level elements accept inline-block;
+						// block-level elements need to be inline with layout
+						if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
+							this.style.display = "inline-block";
+
+						} else {
+							this.style.zoom = 1;
+						}
+					}
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			for ( p in prop ) {
+				e = new jQuery.fx( this, opt, p );
+				val = prop[ p ];
+
+				if ( rfxtypes.test( val ) ) {
+
+					// Tracks whether to show or hide based on private
+					// data attached to the element
+					method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
+					if ( method ) {
+						jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
+						e[ method ]();
+					} else {
+						e[ val ]();
+					}
+
+				} else {
+					parts = rfxnum.exec( val );
+					start = e.cur();
+
+					if ( parts ) {
+						end = parseFloat( parts[2] );
+						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( this, p, (end || 1) + unit);
+							start = ( (end || 1) / e.cur() ) * start;
+							jQuery.style( this, p, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			}
+
+			// For JS strict compliance
+			return true;
+		}
+
+		return optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+
+	stop: function( type, clearQueue, gotoEnd ) {
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var index,
+				hadTimers = false,
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			// clear marker counters if we know they won't be
+			if ( !gotoEnd ) {
+				jQuery._unmark( true, this );
+			}
+
+			function stopQueue( elem, data, index ) {
+				var hooks = data[ index ];
+				jQuery.removeData( elem, index, true );
+				hooks.stop( gotoEnd );
+			}
+
+			if ( type == null ) {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
+						stopQueue( this, data, index );
+					}
+				}
+			} else if ( data[ index = type + ".run" ] && data[ index ].stop ){
+				stopQueue( this, data, index );
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					if ( gotoEnd ) {
+
+						// force the next step to be the last
+						timers[ index ]( true );
+					} else {
+						timers[ index ].saveState();
+					}
+					hadTimers = true;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// start the next in the queue if the last step wasn't forced
+			// timers currently will call their complete callbacks, which will dequeue
+			// but only if they were gotoEnd
+			if ( !( gotoEnd && hadTimers ) ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	}
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout( clearFxNow, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+	fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx( "show", 1 ),
+	slideUp: genFx( "hide", 1 ),
+	slideToggle: genFx( "toggle", 1 ),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.extend({
+	speed: function( speed, easing, fn ) {
+		var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+		};
+
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+		// normalize opt.queue - true/undefined/null -> "fx"
+		if ( opt.queue == null || opt.queue === true ) {
+			opt.queue = "fx";
+		}
+
+		// Queueing
+		opt.old = opt.complete;
+
+		opt.complete = function( noUnmark ) {
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+
+			if ( opt.queue ) {
+				jQuery.dequeue( this, opt.queue );
+			} else if ( noUnmark !== false ) {
+				jQuery._unmark( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p ) {
+			return p;
+		},
+		swing: function( p ) {
+			return ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		options.orig = options.orig || {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx;
+
+		this.startTime = fxNow || createFxNow();
+		this.end = to;
+		this.now = this.start = from;
+		this.pos = this.state = 0;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+
+		function t( gotoEnd ) {
+			return self.step( gotoEnd );
+		}
+
+		t.queue = this.options.queue;
+		t.elem = this.elem;
+		t.saveState = function() {
+			if ( jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
+				if ( self.options.hide ) {
+					jQuery._data( self.elem, "fxshow" + self.prop, self.start );
+				} else if ( self.options.show ) {
+					jQuery._data( self.elem, "fxshow" + self.prop, self.end );
+				}
+			}
+		};
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval( fx.tick, fx.interval );
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
+
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any flash of content
+		if ( dataShow !== undefined ) {
+			// This show is picking up where a previous hide or show left off
+			this.custom( this.cur(), dataShow );
+		} else {
+			this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+		}
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom( this.cur(), 0 );
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var p, n, complete,
+			t = fxNow || createFxNow(),
+			done = true,
+			elem = this.elem,
+			options = this.options;
+
+		if ( gotoEnd || t >= options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			options.animatedProperties[ this.prop ] = true;
+
+			for ( p in options.animatedProperties ) {
+				if ( options.animatedProperties[ p ] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+					jQuery.each( [ "", "X", "Y" ], function( index, value ) {
+						elem.style[ "overflow" + value ] = options.overflow[ index ];
+					});
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( options.hide ) {
+					jQuery( elem ).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( options.hide || options.show ) {
+					for ( p in options.animatedProperties ) {
+						jQuery.style( elem, p, options.orig[ p ] );
+						jQuery.removeData( elem, "fxshow" + p, true );
+						// Toggle data is no longer needed
+						jQuery.removeData( elem, "toggle" + p, true );
+					}
+				}
+
+				// Execute the complete function
+				// in the event that the complete function throws an exception
+				// we must ensure it won't be called twice. #5684
+
+				complete = options.complete;
+				if ( complete ) {
+
+					options.complete = false;
+					complete.call( elem );
+				}
+			}
+
+			return false;
+
+		} else {
+			// classical easing cannot be used with an Infinity duration
+			if ( options.duration == Infinity ) {
+				this.now = t;
+			} else {
+				n = t - this.startTime;
+				this.state = n / options.duration;
+
+				// Perform the easing function, defaults to swing
+				this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
+				this.now = this.start + ( (this.end - this.start) * this.pos );
+			}
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		var timer,
+			timers = jQuery.timers,
+			i = 0;
+
+		for ( ; i < timers.length; i++ ) {
+			timer = timers[ i ];
+			// Checks the timer has not already been removed
+			if ( !timer() && timers[ i ] === timer ) {
+				timers.splice( i--, 1 );
+			}
+		}
+
+		if ( !timers.length ) {
+			jQuery.fx.stop();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+// Ensure props that can't be negative don't go there on undershoot easing
+jQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {
+	// exclude marginTop, marginLeft, marginBottom and marginRight from this list
+	if ( prop.indexOf( "margin" ) ) {
+		jQuery.fx.step[ prop ] = function( fx ) {
+			jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
+		};
+	}
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+	if ( !elemdisplay[ nodeName ] ) {
+
+		var body = document.body,
+			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+			display = elem.css( "display" );
+		elem.remove();
+
+		// If the simple way fails,
+		// get element's real default display by attaching it to a temp iframe
+		if ( display === "none" || display === "" ) {
+			// No iframe to use yet, so create it
+			if ( !iframe ) {
+				iframe = document.createElement( "iframe" );
+				iframe.frameBorder = iframe.width = iframe.height = 0;
+			}
+
+			body.appendChild( iframe );
+
+			// Create a cacheable copy of the iframe document on first call.
+			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+			// document to it; WebKit & Firefox won't allow reusing the iframe document.
+			if ( !iframeDoc || !iframe.createElement ) {
+				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+				iframeDoc.write( ( jQuery.support.boxModel ? "<!doctype html>" : "" ) + "<html><body>" );
+				iframeDoc.close();
+			}
+
+			elem = iframeDoc.createElement( nodeName );
+
+			iframeDoc.body.appendChild( elem );
+
+			display = jQuery.css( elem, "display" );
+			body.removeChild( iframe );
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var getOffset,
+	rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	getOffset = function( elem, doc, docElem, box ) {
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow( doc ),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	getOffset = function( elem, doc, docElem ) {
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.fn.offset = function( options ) {
+	if ( arguments.length ) {
+		return options === undefined ?
+			this :
+			this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+	}
+
+	var elem = this[0],
+		doc = elem && elem.ownerDocument;
+
+	if ( !doc ) {
+		return null;
+	}
+
+	if ( elem === doc.body ) {
+		return jQuery.offset.bodyOffset( elem );
+	}
+
+	return getOffset( elem, doc, doc.documentElement );
+};
+
+jQuery.offset = {
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+
+	position: function() {
+		if ( !this[0] ) {
+			return null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+	var top = /Y/.test( prop );
+
+	jQuery.fn[ method ] = function( val ) {
+		return jQuery.access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? (prop in win) ? win[ prop ] :
+					jQuery.support.boxModel && win.document.documentElement[ method ] ||
+						win.document.body[ method ] :
+					elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : jQuery( win ).scrollLeft(),
+					 top ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	var clientProp = "client" + name,
+		scrollProp = "scroll" + name,
+		offsetProp = "offset" + name;
+
+	// innerHeight and innerWidth
+	jQuery.fn[ "inner" + name ] = function() {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, "padding" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn[ "outer" + name ] = function( margin ) {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( value ) {
+		return jQuery.access( this, function( elem, type, value ) {
+			var doc, docElemProp, orig, ret;
+
+			if ( jQuery.isWindow( elem ) ) {
+				// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+				doc = elem.document;
+				docElemProp = doc.documentElement[ clientProp ];
+				return jQuery.support.boxModel && docElemProp ||
+					doc.body && doc.body[ clientProp ] || docElemProp;
+			}
+
+			// Get document width or height
+			if ( elem.nodeType === 9 ) {
+				// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+				doc = elem.documentElement;
+
+				// when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]
+				// so we can't use max, as it'll choose the incorrect offset[Width/Height]
+				// instead we use the correct client[Width/Height]
+				// support:IE6
+				if ( doc[ clientProp ] >= doc[ scrollProp ] ) {
+					return doc[ clientProp ];
+				}
+
+				return Math.max(
+					elem.body[ scrollProp ], doc[ scrollProp ],
+					elem.body[ offsetProp ], doc[ offsetProp ]
+				);
+			}
+
+			// Get width or height on the element
+			if ( value === undefined ) {
+				orig = jQuery.css( elem, type );
+				ret = parseFloat( orig );
+				return jQuery.isNumeric( ret ) ? ret : orig;
+			}
+
+			// Set the width or height on the element
+			jQuery( elem ).css( type, value );
+		}, type, value, arguments.length, null );
+	};
+});
+
+
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+	define( "jquery", [], function () { return jQuery; } );
+}
+
+
+
+})( window );
diff --git a/orm/services/region_manager/cover/jquery.tablesorter.min.js b/orm/services/region_manager/cover/jquery.tablesorter.min.js
new file mode 100644
index 00000000..f11a3b96
--- /dev/null
+++ b/orm/services/region_manager/cover/jquery.tablesorter.min.js
@@ -0,0 +1 @@
+(function($){$.extend({tablesorter:new function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",cssChildRow:"expand-child",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,sortLocaleCompare:true,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:"/.|,/g",onRenderHeader:null,selectorHeaders:"thead th",debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms")}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s)}else{alert(s)}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug=""}if(table.tBodies.length==0){return}var rows=table.tBodies[0].rows;if(rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers[i]).metadata()&&$($headers[i]).metadata().sorter)){p=getParserById($($headers[i]).metadata().sorter)}else{if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter)}}if(!p){p=detectParserForColumn(table,rows,-1,i)}if(table.config.debug){parsersDebug+="column:"+i+" parser:"+p.id+"\n"}list.push(p)}}if(table.config.debug){log(parsersDebug)}return list}function detectParserForColumn(table,rows,rowIndex,cellIndex){var l=parsers.length,node=false,nodeValue=false,keepLooking=true;while(nodeValue==""&&keepLooking){rowIndex++;if(rows[rowIndex]){node=getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex);nodeValue=trimAndGetNodeText(table.config,node);if(table.config.debug){log("Checking if value was empty on row:"+rowIndex)}}else{keepLooking=false}}for(var i=1;i<l;i++){if(parsers[i].is(nodeValue,table,node)){return parsers[i]}}return parsers[0]}function getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex){return rows[rowIndex].cells[cellIndex]}function trimAndGetNodeText(config,node){return $.trim(getElementText(config,node))}function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==name.toLowerCase()){return parsers[i]}}return false}function buildCache(table){if(table.config.debug){var cacheTime=new Date()}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=$(table.tBodies[0].rows[i]),cols=[];if(c.hasClass(table.config.cssChildRow)){cache.row[cache.row.length-1]=cache.row[cache.row.length-1].add(c);continue}cache.row.push(c);for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c[0].cells[j]),table,c[0].cells[j]))}cols.push(cache.normalized.length);cache.normalized.push(cols);cols=null}if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime)}return cache}function getElementText(config,node){var text="";if(!node){return""}if(!config.supportsTextContent){config.supportsTextContent=node.textContent||false}if(config.textExtraction=="simple"){if(config.supportsTextContent){text=node.textContent}else{if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){text=node.childNodes[0].innerHTML}else{text=node.innerHTML}}}else{if(typeof(config.textExtraction)=="function"){text=config.textExtraction(node)}else{text=$(node).text()}}return text}function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){var pos=n[i][checkCell];rows.push(r[pos]);if(!table.config.appender){var l=r[pos].length;for(var j=0;j<l;j++){tableBody[0].appendChild(r[pos][j])}}}if(table.config.appender){table.config.appender(table,rows)}rows=null;if(table.config.debug){benchmark("Rebuilt table:",appendTime)}applyWidget(table);setTimeout(function(){$(table).trigger("sortEnd")},0)}function buildHeaders(table){if(table.config.debug){var time=new Date()}var meta=($.metadata)?true:false;var header_index=computeTableHeaderCellIndexes(table);$tableHeaders=$(table.config.selectorHeaders,table).each(function(index){this.column=header_index[this.parentNode.rowIndex+"-"+this.cellIndex];this.order=formatSortingOrder(table.config.sortInitialOrder);this.count=this.order;if(checkHeaderMetadata(this)||checkHeaderOptions(table,index)){this.sortDisabled=true}if(checkHeaderOptionsSortingLocked(table,index)){this.order=this.lockedOrder=checkHeaderOptionsSortingLocked(table,index)}if(!this.sortDisabled){var $th=$(this).addClass(table.config.cssHeader);if(table.config.onRenderHeader){table.config.onRenderHeader.apply($th)}}table.config.headerList[index]=this});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders)}return $tableHeaders}function computeTableHeaderCellIndexes(t){var matrix=[];var lookup={};var thead=t.getElementsByTagName("THEAD")[0];var trs=thead.getElementsByTagName("TR");for(var i=0;i<trs.length;i++){var cells=trs[i].cells;for(var j=0;j<cells.length;j++){var c=cells[j];var rowIndex=c.parentNode.rowIndex;var cellId=rowIndex+"-"+c.cellIndex;var rowSpan=c.rowSpan||1;var colSpan=c.colSpan||1;var firstAvailCol;if(typeof(matrix[rowIndex])=="undefined"){matrix[rowIndex]=[]}for(var k=0;k<matrix[rowIndex].length+1;k++){if(typeof(matrix[rowIndex][k])=="undefined"){firstAvailCol=k;break}}lookup[cellId]=firstAvailCol;for(var k=rowIndex;k<rowIndex+rowSpan;k++){if(typeof(matrix[k])=="undefined"){matrix[k]=[]}var matrixrow=matrix[k];for(var l=firstAvailCol;l<firstAvailCol+colSpan;l++){matrixrow[l]="x"}}}}return lookup}function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r[row].cells;for(var i=0;i<c.length;i++){var cell=c[i];if(cell.colSpan>1){arr=arr.concat(checkCellColSpan(table,headerArr,row++))}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell)}}}return arr}function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true}return false}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true}return false}function checkHeaderOptionsSortingLocked(table,i){if((table.config.headers[i])&&(table.config.headers[i].lockedOrder)){return table.config.headers[i].lockedOrder}return false}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i<l;i++){getWidgetById(c[i]).format(table)}}function getWidgetById(name){var l=widgets.length;for(var i=0;i<l;i++){if(widgets[i].id.toLowerCase()==name.toLowerCase()){return widgets[i]}}}function formatSortingOrder(v){if(typeof(v)!="Number"){return(v.toLowerCase()=="desc")?1:0}else{return(v==1)?1:0}}function isValueInArray(v,a){var l=a.length;for(var i=0;i<l;i++){if(a[i][0]==v){return true}}return false}function setHeadersCss(table,$headers,list,css){$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset){if(!this.sortDisabled){h[this.column]=$(this)}});var l=list.length;for(var i=0;i<l;i++){h[list[i][0]].addClass(css[list[i][1]])}}function fixColumnWidth(table,$headers){var c=table.config;if(c.widthFixed){var colgroup=$("<colgroup>");$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($("<col>").css("width",$(this).width()))});$(table).prepend(colgroup)}}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i<l;i++){var s=sortList[i],o=c.headerList[s[0]];o.count=s[1];o.count++}}function multisort(table,sortList,cache){if(table.config.debug){var sortTime=new Date()}var dynamicExp="var sortWrapper = function(a,b) {",l=sortList.length;for(var i=0;i<l;i++){var c=sortList[i][0];var order=sortList[i][1];var s=(table.config.parsers[c].type=="text")?((order==0)?makeSortFunction("text","asc",c):makeSortFunction("text","desc",c)):((order==0)?makeSortFunction("numeric","asc",c):makeSortFunction("numeric","desc",c));var e="e"+i;dynamicExp+="var "+e+" = "+s;dynamicExp+="if("+e+") { return "+e+"; } ";dynamicExp+="else { "}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+="return a["+orgOrderCol+"]-b["+orgOrderCol+"];";for(var i=0;i<l;i++){dynamicExp+="}; "}dynamicExp+="return 0; ";dynamicExp+="}; ";if(table.config.debug){benchmark("Evaling expression:"+dynamicExp,new Date())}eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time:",sortTime)}return cache}function makeSortFunction(type,direction,index){var a="a["+index+"]",b="b["+index+"]";if(type=="text"&&direction=="asc"){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+a+" < "+b+") ? -1 : 1 )));"}else{if(type=="text"&&direction=="desc"){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+b+" < "+a+") ? -1 : 1 )));"}else{if(type=="numeric"&&direction=="asc"){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+a+" - "+b+"));"}else{if(type=="numeric"&&direction=="desc"){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+b+" - "+a+"));"}}}}}function makeSortText(i){return"((a["+i+"] < b["+i+"]) ? -1 : ((a["+i+"] > b["+i+"]) ? 1 : 0));"}function makeSortTextDesc(i){return"((b["+i+"] < a["+i+"]) ? -1 : ((b["+i+"] > a["+i+"]) ? 1 : 0));"}function makeSortNumeric(i){return"a["+i+"]-b["+i+"];"}function makeSortNumericDesc(i){return"b["+i+"]-a["+i+"];"}function sortText(a,b){if(table.config.sortLocaleCompare){return a.localeCompare(b)}return((a<b)?-1:((a>b)?1:0))}function sortTextDesc(a,b){if(table.config.sortLocaleCompare){return b.localeCompare(a)}return((b<a)?-1:((b>a)?1:0))}function sortNumeric(a,b){return a-b}function sortNumericDesc(a,b){return b-a}function getCachedSortType(parsers,i){return parsers[i].type}this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies){return}var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$.data(this,"tablesorter",config);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){$this.trigger("sortStart");var $cell=$(this);var i=this.column;this.order=this.count++%2;if(this.lockedOrder){this.order=this.lockedOrder}if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j<a.length;j++){if(a[j][0]!=i){config.sortList.push(a[j])}}}config.sortList.push([i,this.order])}else{if(isValueInArray(i,config.sortList)){for(var j=0;j<config.sortList.length;j++){var s=config.sortList[j],o=config.headerList[s[0]];if(s[0]==i){o.count=s[1];o.count++;s[1]=o.count%2}}}else{config.sortList.push([i,this.order])}}setTimeout(function(){setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache))},1);return false}}).mousedown(function(){if(config.cancelSelection){this.onselectstart=function(){return false};return false}});$this.bind("update",function(){var me=this;setTimeout(function(){me.config.parsers=buildParserCache(me,$headers);cache=buildCache(me)},1)}).bind("updateCell",function(e,cell){var config=this.config;var pos=[(cell.parentNode.rowIndex-1),cell.cellIndex];cache.normalized[pos[0]][pos[1]]=config.parsers[pos[1]].format(getElementText(config,cell),cell)}).bind("sorton",function(e,list){$(this).trigger("sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache))}).bind("appendCache",function(){appendToTable(this,cache)}).bind("applyWidgetId",function(e,id){getWidgetById(id).format(this)}).bind("applyWidgets",function(){applyWidget(this)});if($.metadata&&($(this).metadata()&&$(this).metadata().sortlist)){config.sortList=$(this).metadata().sortlist}if(config.sortList.length>0){$this.trigger("sorton",[config.sortList])}applyWidget(this)})};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==parser.id.toLowerCase()){a=false}}if(a){parsers.push(parser)}};this.addWidget=function(widget){widgets.push(widget)};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i};this.isDigit=function(s,config){return/^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g,"")))};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild){this.removeChild(this.firstChild)}}empty.apply(table.tBodies[0])}else{table.tBodies[0].innerHTML=""}}}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true},format:function(s){return $.trim(s.toLocaleLowerCase())},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c)},format:function(s){return $.tablesorter.formatFloat(s)},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$€?.]/.test(s)},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g),""))},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s)},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a[i];if(item.length==2){r+="0"+item}else{r+=item}}return $.tablesorter.formatFloat(r)},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s)},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),""))},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s)},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0")},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s))},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""))},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/))},format:function(s){return $.tablesorter.formatFloat(new Date(s).getTime())},type:"numeric"});ts.addParser({id:"shortDate",is:function(s){return/\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s)},format:function(s,table){var c=table.config;s=s.replace(/\-/g,"/");if(c.dateFormat=="us"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$1/$2")}else{if(c.dateFormat=="uk"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$2/$1")}else{if(c.dateFormat=="dd/mm/yy"||c.dateFormat=="dd-mm-yy"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/,"$1/$2/$3")}}}return $.tablesorter.formatFloat(new Date(s).getTime())},type:"numeric"});ts.addParser({id:"time",is:function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s)},format:function(s){return $.tablesorter.formatFloat(new Date("2000/01/01 "+s).getTime())},type:"numeric"});ts.addParser({id:"metadata",is:function(s){return false},format:function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?"sortValue":c.parserMetadataName;return $(cell).metadata()[p]},type:"numeric"});ts.addWidget({id:"zebra",format:function(table){if(table.config.debug){var time=new Date()}var $tr,row=-1,odd;$("tr:visible",table.tBodies[0]).each(function(i){$tr=$(this);if(!$tr.hasClass(table.config.cssChildRow)){row++}odd=(row%2==0);$tr.removeClass(table.config.widgetZebra.css[odd?0:1]).addClass(table.config.widgetZebra.css[odd?1:0])});if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time)}}})})(jQuery);
\ No newline at end of file
diff --git a/orm/services/region_manager/cover/keybd_closed.png b/orm/services/region_manager/cover/keybd_closed.png
new file mode 100644
index 00000000..db114023
Binary files /dev/null and b/orm/services/region_manager/cover/keybd_closed.png differ
diff --git a/orm/services/region_manager/cover/keybd_open.png b/orm/services/region_manager/cover/keybd_open.png
new file mode 100644
index 00000000..db114023
Binary files /dev/null and b/orm/services/region_manager/cover/keybd_open.png differ
diff --git a/orm/services/region_manager/cover/rms___init___py.html b/orm/services/region_manager/cover/rms___init___py.html
new file mode 100644
index 00000000..64321698
--- /dev/null
+++ b/orm/services/region_manager/cover/rms___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_controllers___init___py.html b/orm/services/region_manager/cover/rms_controllers___init___py.html
new file mode 100644
index 00000000..e9a4bb7f
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_controllers___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_controllers_configuration_py.html b/orm/services/region_manager/cover/rms_controllers_configuration_py.html
new file mode 100644
index 00000000..5fd6bb6f
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_controllers_configuration_py.html
@@ -0,0 +1,157 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/configuration.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/configuration.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            17 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">17 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="stm run hide_run"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="stm run hide_run"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""Configuration rest API input module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm run hide_run"><span class="key">class</span> <span class="nam">ConfigurationController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln">    <span class="str">"""Configuration controller."""</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">dump_to_log</span><span class="op">=</span><span class="str">'false'</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">        <span class="str">"""get method.</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln"><span class="str">        :param dump_to_log: A boolean string that says whether the</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="str">        configuration should be written to log</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln"><span class="str">        :return: A pretty string that contains the service's configuration</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Get configuration..."</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'configuration:get'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">        <span class="nam">dump</span> <span class="op">=</span> <span class="nam">dump_to_log</span><span class="op">.</span><span class="nam">lower</span><span class="op">(</span><span class="op">)</span> <span class="op">==</span> <span class="str">'true'</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">        <span class="nam">utils</span><span class="op">.</span><span class="nam">set_utils_conf</span><span class="op">(</span><span class="nam">conf</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">        <span class="nam">result</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">report_config</span><span class="op">(</span><span class="nam">conf</span><span class="op">,</span> <span class="nam">dump</span><span class="op">,</span> <span class="nam">logger</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_controllers_lcp_controller_py.html b/orm/services/region_manager/cover/rms_controllers_lcp_controller_py.html
new file mode 100644
index 00000000..90c29c78
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_controllers_lcp_controller_py.html
@@ -0,0 +1,329 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/lcp_controller.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/lcp_controller.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            56 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">56 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="stm run hide_run"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="stm run hide_run"><a href="#n39">39</a></p>
+<p id="n40" class="stm run hide_run"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="pln"><a href="#n43">43</a></p>
+<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p>
+<p id="n45" class="pln"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="stm run hide_run"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="pln"><a href="#n49">49</a></p>
+<p id="n50" class="stm run hide_run"><a href="#n50">50</a></p>
+<p id="n51" class="stm run hide_run"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="pln"><a href="#n54">54</a></p>
+<p id="n55" class="stm run hide_run"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="pln"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="stm run hide_run"><a href="#n61">61</a></p>
+<p id="n62" class="stm run hide_run"><a href="#n62">62</a></p>
+<p id="n63" class="stm run hide_run"><a href="#n63">63</a></p>
+<p id="n64" class="stm run hide_run"><a href="#n64">64</a></p>
+<p id="n65" class="pln"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p>
+<p id="n69" class="pln"><a href="#n69">69</a></p>
+<p id="n70" class="pln"><a href="#n70">70</a></p>
+<p id="n71" class="pln"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="stm run hide_run"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="pln"><a href="#n77">77</a></p>
+<p id="n78" class="pln"><a href="#n78">78</a></p>
+<p id="n79" class="pln"><a href="#n79">79</a></p>
+<p id="n80" class="pln"><a href="#n80">80</a></p>
+<p id="n81" class="stm run hide_run"><a href="#n81">81</a></p>
+<p id="n82" class="stm run hide_run"><a href="#n82">82</a></p>
+<p id="n83" class="pln"><a href="#n83">83</a></p>
+<p id="n84" class="stm run hide_run"><a href="#n84">84</a></p>
+<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p>
+<p id="n87" class="pln"><a href="#n87">87</a></p>
+<p id="n88" class="stm run hide_run"><a href="#n88">88</a></p>
+<p id="n89" class="stm run hide_run"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="stm run hide_run"><a href="#n91">91</a></p>
+<p id="n92" class="pln"><a href="#n92">92</a></p>
+<p id="n93" class="pln"><a href="#n93">93</a></p>
+<p id="n94" class="stm run hide_run"><a href="#n94">94</a></p>
+<p id="n95" class="stm run hide_run"><a href="#n95">95</a></p>
+<p id="n96" class="pln"><a href="#n96">96</a></p>
+<p id="n97" class="stm run hide_run"><a href="#n97">97</a></p>
+<p id="n98" class="pln"><a href="#n98">98</a></p>
+<p id="n99" class="pln"><a href="#n99">99</a></p>
+<p id="n100" class="stm run hide_run"><a href="#n100">100</a></p>
+<p id="n101" class="pln"><a href="#n101">101</a></p>
+<p id="n102" class="stm run hide_run"><a href="#n102">102</a></p>
+<p id="n103" class="pln"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="stm run hide_run"><a href="#n105">105</a></p>
+<p id="n106" class="stm run hide_run"><a href="#n106">106</a></p>
+<p id="n107" class="pln"><a href="#n107">107</a></p>
+<p id="n108" class="stm run hide_run"><a href="#n108">108</a></p>
+<p id="n109" class="pln"><a href="#n109">109</a></p>
+<p id="n110" class="pln"><a href="#n110">110</a></p>
+<p id="n111" class="pln"><a href="#n111">111</a></p>
+<p id="n112" class="pln"><a href="#n112">112</a></p>
+<p id="n113" class="pln"><a href="#n113">113</a></p>
+<p id="n114" class="pln"><a href="#n114">114</a></p>
+<p id="n115" class="pln"><a href="#n115">115</a></p>
+<p id="n116" class="pln"><a href="#n116">116</a></p>
+<p id="n117" class="pln"><a href="#n117">117</a></p>
+<p id="n118" class="pln"><a href="#n118">118</a></p>
+<p id="n119" class="pln"><a href="#n119">119</a></p>
+<p id="n120" class="pln"><a href="#n120">120</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsme</span> <span class="key">import</span> <span class="nam">types</span> <span class="key">as</span> <span class="nam">wtypes</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">model</span> <span class="key">import</span> <span class="nam">url_parm</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span><span class="op">.</span><span class="nam">error_base</span> <span class="key">import</span> <span class="nam">ErrorStatus</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">services</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run"><span class="key">class</span> <span class="nam">LcpController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln">    <span class="key">def</span> <span class="nam">get_all</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="str">            This function is called when receiving /lcp without a parameter.</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln"><span class="str">            parameter:</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="str">                None.</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln"><span class="str">            return: entire list of lcp.</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">'Received a GET request for all LCPs'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'lcp:get_all'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">        <span class="nam">zones</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm run hide_run">            <span class="nam">zones</span> <span class="op">=</span> <span class="nam">get_zones</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">'Returning LCP list: %s'</span> <span class="op">%</span> <span class="op">(</span><span class="nam">zones</span><span class="op">,</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm run hide_run">            <span class="key">return</span> <span class="nam">zones</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="pln">    <span class="key">def</span> <span class="nam">get_one</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">lcp_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t47" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">'Received a GET request for LCP %s'</span> <span class="op">%</span> <span class="op">(</span><span class="nam">id</span><span class="op">,</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'lcp:get_one'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t50" class="stm run hide_run">        <span class="nam">zones</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">            <span class="nam">zones</span> <span class="op">=</span> <span class="nam">get_zones</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t55" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t61" class="stm run hide_run">        <span class="key">for</span> <span class="nam">zone</span> <span class="key">in</span> <span class="nam">zones</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="stm run hide_run">            <span class="key">if</span> <span class="nam">zone</span><span class="op">[</span><span class="str">"id"</span><span class="op">]</span> <span class="op">==</span> <span class="nam">lcp_id</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="stm run hide_run">                <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">'Returning: %s'</span> <span class="op">%</span> <span class="op">(</span><span class="nam">zone</span><span class="op">,</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="stm run hide_run">                <span class="key">return</span> <span class="nam">zone</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">        <span class="nam">error_msg</span> <span class="op">=</span> <span class="str">'LCP %s not found'</span> <span class="op">%</span> <span class="op">(</span><span class="nam">lcp_id</span><span class="op">,</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="nam">error_msg</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="pln">                                  <span class="nam">message</span><span class="op">=</span><span class="nam">error_msg</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="pln">                                  <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t73" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_zones</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln"><span class="str">    This function returns the lcp list from CSV file.</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln"><span class="str">    parameter:</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="pln"><span class="str">        None.</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="pln"><span class="str">    return:</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="pln"><span class="str">        zone list in json format.</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="stm run hide_run">    <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">'Enter get_zones function'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="stm run hide_run">    <span class="nam">result</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm run hide_run">        <span class="nam">url_args</span> <span class="op">=</span> <span class="nam">url_parm</span><span class="op">.</span><span class="nam">UrlParms</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm run hide_run">        <span class="nam">zones</span> <span class="op">=</span> <span class="nam">services</span><span class="op">.</span><span class="nam">get_regions_data</span><span class="op">(</span><span class="nam">url_args</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t88" class="stm run hide_run">        <span class="key">for</span> <span class="nam">zone</span> <span class="key">in</span> <span class="nam">zones</span><span class="op">.</span><span class="nam">regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="stm run hide_run">            <span class="nam">result</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">build_zone_response</span><span class="op">(</span><span class="nam">zone</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Available regions: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="str">', '</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="pln">            <span class="op">[</span><span class="nam">region</span><span class="op">[</span><span class="str">"zone_name"</span><span class="op">]</span> <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span> <span class="nam">result</span><span class="op">]</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t94" class="stm run hide_run">    <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="pln">    <span class="key">finally</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t99" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t100" class="stm run hide_run"><span class="key">def</span> <span class="nam">build_zone_response</span><span class="op">(</span><span class="nam">zone</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t102" class="stm run hide_run">    <span class="nam">end_points_dict</span> <span class="op">=</span> <span class="op">{</span><span class="str">"identity"</span><span class="op">:</span> <span class="str">""</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="pln">                       <span class="str">"dashboard"</span><span class="op">:</span> <span class="str">""</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln">                       <span class="str">"ord"</span><span class="op">:</span> <span class="str">""</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="stm run hide_run">    <span class="key">for</span> <span class="nam">end_point</span> <span class="key">in</span> <span class="nam">zone</span><span class="op">.</span><span class="nam">endpoints</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="stm run hide_run">        <span class="nam">end_points_dict</span><span class="op">[</span><span class="nam">end_point</span><span class="op">.</span><span class="nam">type</span><span class="op">]</span> <span class="op">=</span> <span class="nam">end_point</span><span class="op">.</span><span class="nam">publicurl</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t108" class="stm run hide_run">    <span class="key">return</span> <span class="nam">dict</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="pln">        <span class="nam">zone_name</span><span class="op">=</span><span class="nam">zone</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="pln">        <span class="nam">id</span><span class="op">=</span><span class="nam">zone</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="pln">        <span class="nam">status</span><span class="op">=</span><span class="str">"1"</span> <span class="key">if</span> <span class="nam">zone</span><span class="op">.</span><span class="nam">status</span> <span class="op">==</span> <span class="str">"functional"</span> <span class="key">else</span> <span class="str">"0"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t112" class="pln">        <span class="nam">design_type</span><span class="op">=</span><span class="nam">zone</span><span class="op">.</span><span class="nam">design_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="pln">        <span class="nam">location_type</span><span class="op">=</span><span class="nam">zone</span><span class="op">.</span><span class="nam">location_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="pln">        <span class="nam">vLCP_name</span><span class="op">=</span><span class="nam">zone</span><span class="op">.</span><span class="nam">vlcp_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="pln">        <span class="nam">AIC_version</span><span class="op">=</span><span class="nam">zone</span><span class="op">.</span><span class="nam">ranger_agent_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="pln">        <span class="nam">OS_version</span><span class="op">=</span><span class="nam">zone</span><span class="op">.</span><span class="nam">open_stack_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="pln">        <span class="nam">keystone_EP</span><span class="op">=</span><span class="nam">end_points_dict</span><span class="op">[</span><span class="str">"identity"</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t118" class="pln">        <span class="nam">horizon_EP</span><span class="op">=</span><span class="nam">end_points_dict</span><span class="op">[</span><span class="str">"dashboard"</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="pln">        <span class="nam">ORD_EP</span><span class="op">=</span><span class="nam">end_points_dict</span><span class="op">[</span><span class="str">"ord"</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="pln">    <span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_controllers_logs_py.html b/orm/services/region_manager/cover/rms_controllers_logs_py.html
new file mode 100644
index 00000000..51ddc2a1
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_controllers_logs_py.html
@@ -0,0 +1,237 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/logs.py: 94%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/logs.py</b> :
+            <span class="pc_cov">94%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            36 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">34 run</span>
+            <span class="mis shortkey_m button_toggle_mis">2 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="stm mis"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="stm run hide_run"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="stm run hide_run"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p>
+<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p>
+<p id="n45" class="pln"><a href="#n45">45</a></p>
+<p id="n46" class="stm run hide_run"><a href="#n46">46</a></p>
+<p id="n47" class="stm run hide_run"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="stm run hide_run"><a href="#n50">50</a></p>
+<p id="n51" class="stm run hide_run"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="pln"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="pln"><a href="#n57">57</a></p>
+<p id="n58" class="stm run hide_run"><a href="#n58">58</a></p>
+<p id="n59" class="stm run hide_run"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="stm run hide_run"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p>
+<p id="n66" class="pln"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p>
+<p id="n69" class="stm run hide_run"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="stm run hide_run"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="stm mis"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">import</span> <span class="nam">wsme</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">class</span> <span class="nam">LogChangeResultWSME</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln">    <span class="str">"""log change result wsme type."""</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm run hide_run">    <span class="nam">result</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">str</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">default</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln">        <span class="str">""""init method."""</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm mis">        <span class="nam">super</span><span class="op">(</span><span class="nam">LogChangeResult</span><span class="op">,</span> <span class="nam">self</span><span class="op">)</span><span class="op">.</span><span class="nam">__init__</span><span class="op">(</span><span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm run hide_run"><span class="key">class</span> <span class="nam">LogChangeResult</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln">    <span class="str">"""log change result type."""</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">result</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln">        <span class="str">""""init method."""</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">result</span> <span class="op">=</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run"><span class="key">class</span> <span class="nam">LogsController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln">    <span class="str">"""Logs Audit controller."""</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">LogChangeResultWSME</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">level</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln">        <span class="str">"""update log level.</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln"><span class="str">        :param level: the log level text name</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Changing log level to [{}]"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">level</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'log:update'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t46" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="stm run hide_run">            <span class="nam">log_level</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">_levelNames</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">level</span><span class="op">.</span><span class="nam">upper</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run">            <span class="key">if</span> <span class="nam">log_level</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run">                <span class="nam">self</span><span class="op">.</span><span class="nam">_change_log_level</span><span class="op">(</span><span class="nam">log_level</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="stm run hide_run">                <span class="nam">result</span> <span class="op">=</span> <span class="str">"Log level changed to {}."</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">level</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm run hide_run">                <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln">            <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">                <span class="key">raise</span> <span class="nam">Exception</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="pln">                    <span class="str">"The given log level [{}] doesn't exist."</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">level</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">            <span class="key">return</span> <span class="nam">LogChangeResult</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Fail to change log_level. Reason: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln">                <span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t65" class="stm run hide_run">    <span class="op">@</span><span class="nam">staticmethod</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="pln">    <span class="key">def</span> <span class="nam">_change_log_level</span><span class="op">(</span><span class="nam">log_level</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">        <span class="nam">path</span> <span class="op">=</span> <span class="nam">__name__</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">'.'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm run hide_run">        <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">path</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="stm run hide_run">            <span class="nam">root</span> <span class="op">=</span> <span class="nam">path</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">            <span class="nam">root_logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">root</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="stm run hide_run">            <span class="nam">root_logger</span><span class="op">.</span><span class="nam">setLevel</span><span class="op">(</span><span class="nam">log_level</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Fail to change log_level to [{}]. "</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln">                        <span class="str">"the given log level doesn't exist."</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">log_level</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_controllers_root_py.html b/orm/services/region_manager/cover/rms_controllers_root_py.html
new file mode 100644
index 00000000..9a9cdf4b
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_controllers_root_py.html
@@ -0,0 +1,159 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/root.py: 92%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/root.py</b> :
+            <span class="pc_cov">92%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            12 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">11 run</span>
+            <span class="mis shortkey_m button_toggle_mis">1 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="stm mis"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">expose</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">lcp_controller</span> <span class="key">import</span> <span class="nam">LcpController</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">logs</span> <span class="key">import</span> <span class="nam">LogsController</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">configuration</span> <span class="key">import</span> <span class="nam">ConfigurationController</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v2</span> <span class="key">import</span> <span class="nam">root</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">class</span> <span class="nam">RootController</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run">    <span class="nam">lcp</span> <span class="op">=</span> <span class="nam">LcpController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run">    <span class="nam">logs</span> <span class="op">=</span> <span class="nam">LogsController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run">    <span class="nam">configuration</span> <span class="op">=</span> <span class="nam">ConfigurationController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run">    <span class="nam">v2</span> <span class="op">=</span> <span class="nam">root</span><span class="op">.</span><span class="nam">V2Controller</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run">    <span class="op">@</span><span class="nam">expose</span><span class="op">(</span><span class="nam">template</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln">    <span class="key">def</span> <span class="nam">_default</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="str">            Method to handle GET /</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="str">            parameters: None</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="str">            return: dict describing lcp rest version information</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm mis">        <span class="key">return</span> <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">            <span class="str">"versions"</span><span class="op">:</span> <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln">                <span class="str">"values"</span><span class="op">:</span> <span class="op">[</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln">                    <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln">                        <span class="str">"status"</span><span class="op">:</span> <span class="str">"stable"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln">                        <span class="str">"id"</span><span class="op">:</span> <span class="str">"v2"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln">                        <span class="str">"links"</span><span class="op">:</span> <span class="op">[</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln">                            <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln">                                <span class="str">"href"</span><span class="op">:</span> <span class="str">"http://localhost:8789/"</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln">                            <span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln">                        <span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln">                    <span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln">                <span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln">            <span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln">        <span class="op">}</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_controllers_v2___init___py.html b/orm/services/region_manager/cover/rms_controllers_v2___init___py.html
new file mode 100644
index 00000000..bf5cfb53
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_controllers_v2___init___py.html
@@ -0,0 +1,91 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""orm package."""</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_controllers_v2_orm___init___py.html b/orm/services/region_manager/cover/rms_controllers_v2_orm___init___py.html
new file mode 100644
index 00000000..40a61780
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_controllers_v2_orm___init___py.html
@@ -0,0 +1,91 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/orm/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/orm/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""resource package."""</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_controllers_v2_orm_resources___init___py.html b/orm/services/region_manager/cover/rms_controllers_v2_orm_resources___init___py.html
new file mode 100644
index 00000000..80509395
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_controllers_v2_orm_resources___init___py.html
@@ -0,0 +1,91 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/orm/resources/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/orm/resources/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""orm package."""</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_controllers_v2_orm_resources_groups_py.html b/orm/services/region_manager/cover/rms_controllers_v2_orm_resources_groups_py.html
new file mode 100644
index 00000000..76366806
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_controllers_v2_orm_resources_groups_py.html
@@ -0,0 +1,597 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/orm/resources/groups.py: 82%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/orm/resources/groups.py</b> :
+            <span class="pc_cov">82%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            124 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">102 run</span>
+            <span class="mis shortkey_m button_toggle_mis">22 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p>
+<p id="n25" class="stm run hide_run"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="stm run hide_run"><a href="#n40">40</a></p>
+<p id="n41" class="stm mis"><a href="#n41">41</a></p>
+<p id="n42" class="stm mis"><a href="#n42">42</a></p>
+<p id="n43" class="stm mis"><a href="#n43">43</a></p>
+<p id="n44" class="stm mis"><a href="#n44">44</a></p>
+<p id="n45" class="stm mis"><a href="#n45">45</a></p>
+<p id="n46" class="stm mis"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="pln"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="stm run hide_run"><a href="#n52">52</a></p>
+<p id="n53" class="pln"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="pln"><a href="#n56">56</a></p>
+<p id="n57" class="pln"><a href="#n57">57</a></p>
+<p id="n58" class="pln"><a href="#n58">58</a></p>
+<p id="n59" class="stm mis"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="stm run hide_run"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p>
+<p id="n69" class="pln"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="pln"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="pln"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="stm run hide_run"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="stm run hide_run"><a href="#n79">79</a></p>
+<p id="n80" class="stm run hide_run"><a href="#n80">80</a></p>
+<p id="n81" class="pln"><a href="#n81">81</a></p>
+<p id="n82" class="pln"><a href="#n82">82</a></p>
+<p id="n83" class="stm run hide_run"><a href="#n83">83</a></p>
+<p id="n84" class="pln"><a href="#n84">84</a></p>
+<p id="n85" class="pln"><a href="#n85">85</a></p>
+<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p>
+<p id="n87" class="pln"><a href="#n87">87</a></p>
+<p id="n88" class="stm run hide_run"><a href="#n88">88</a></p>
+<p id="n89" class="pln"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="pln"><a href="#n91">91</a></p>
+<p id="n92" class="pln"><a href="#n92">92</a></p>
+<p id="n93" class="stm run hide_run"><a href="#n93">93</a></p>
+<p id="n94" class="pln"><a href="#n94">94</a></p>
+<p id="n95" class="pln"><a href="#n95">95</a></p>
+<p id="n96" class="stm run hide_run"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="pln"><a href="#n98">98</a></p>
+<p id="n99" class="stm run hide_run"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="stm run hide_run"><a href="#n101">101</a></p>
+<p id="n102" class="pln"><a href="#n102">102</a></p>
+<p id="n103" class="pln"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="pln"><a href="#n105">105</a></p>
+<p id="n106" class="pln"><a href="#n106">106</a></p>
+<p id="n107" class="stm run hide_run"><a href="#n107">107</a></p>
+<p id="n108" class="stm run hide_run"><a href="#n108">108</a></p>
+<p id="n109" class="pln"><a href="#n109">109</a></p>
+<p id="n110" class="stm run hide_run"><a href="#n110">110</a></p>
+<p id="n111" class="pln"><a href="#n111">111</a></p>
+<p id="n112" class="stm run hide_run"><a href="#n112">112</a></p>
+<p id="n113" class="stm run hide_run"><a href="#n113">113</a></p>
+<p id="n114" class="stm run hide_run"><a href="#n114">114</a></p>
+<p id="n115" class="pln"><a href="#n115">115</a></p>
+<p id="n116" class="stm run hide_run"><a href="#n116">116</a></p>
+<p id="n117" class="stm run hide_run"><a href="#n117">117</a></p>
+<p id="n118" class="stm run hide_run"><a href="#n118">118</a></p>
+<p id="n119" class="pln"><a href="#n119">119</a></p>
+<p id="n120" class="pln"><a href="#n120">120</a></p>
+<p id="n121" class="stm run hide_run"><a href="#n121">121</a></p>
+<p id="n122" class="stm run hide_run"><a href="#n122">122</a></p>
+<p id="n123" class="stm run hide_run"><a href="#n123">123</a></p>
+<p id="n124" class="pln"><a href="#n124">124</a></p>
+<p id="n125" class="pln"><a href="#n125">125</a></p>
+<p id="n126" class="pln"><a href="#n126">126</a></p>
+<p id="n127" class="stm run hide_run"><a href="#n127">127</a></p>
+<p id="n128" class="pln"><a href="#n128">128</a></p>
+<p id="n129" class="stm run hide_run"><a href="#n129">129</a></p>
+<p id="n130" class="stm run hide_run"><a href="#n130">130</a></p>
+<p id="n131" class="stm run hide_run"><a href="#n131">131</a></p>
+<p id="n132" class="pln"><a href="#n132">132</a></p>
+<p id="n133" class="stm run hide_run"><a href="#n133">133</a></p>
+<p id="n134" class="stm run hide_run"><a href="#n134">134</a></p>
+<p id="n135" class="stm run hide_run"><a href="#n135">135</a></p>
+<p id="n136" class="pln"><a href="#n136">136</a></p>
+<p id="n137" class="stm mis"><a href="#n137">137</a></p>
+<p id="n138" class="stm mis"><a href="#n138">138</a></p>
+<p id="n139" class="stm mis"><a href="#n139">139</a></p>
+<p id="n140" class="stm mis"><a href="#n140">140</a></p>
+<p id="n141" class="pln"><a href="#n141">141</a></p>
+<p id="n142" class="pln"><a href="#n142">142</a></p>
+<p id="n143" class="pln"><a href="#n143">143</a></p>
+<p id="n144" class="stm run hide_run"><a href="#n144">144</a></p>
+<p id="n145" class="pln"><a href="#n145">145</a></p>
+<p id="n146" class="stm run hide_run"><a href="#n146">146</a></p>
+<p id="n147" class="pln"><a href="#n147">147</a></p>
+<p id="n148" class="pln"><a href="#n148">148</a></p>
+<p id="n149" class="pln"><a href="#n149">149</a></p>
+<p id="n150" class="pln"><a href="#n150">150</a></p>
+<p id="n151" class="pln"><a href="#n151">151</a></p>
+<p id="n152" class="pln"><a href="#n152">152</a></p>
+<p id="n153" class="stm run hide_run"><a href="#n153">153</a></p>
+<p id="n154" class="stm run hide_run"><a href="#n154">154</a></p>
+<p id="n155" class="pln"><a href="#n155">155</a></p>
+<p id="n156" class="pln"><a href="#n156">156</a></p>
+<p id="n157" class="pln"><a href="#n157">157</a></p>
+<p id="n158" class="pln"><a href="#n158">158</a></p>
+<p id="n159" class="stm run hide_run"><a href="#n159">159</a></p>
+<p id="n160" class="pln"><a href="#n160">160</a></p>
+<p id="n161" class="stm run hide_run"><a href="#n161">161</a></p>
+<p id="n162" class="pln"><a href="#n162">162</a></p>
+<p id="n163" class="stm run hide_run"><a href="#n163">163</a></p>
+<p id="n164" class="pln"><a href="#n164">164</a></p>
+<p id="n165" class="pln"><a href="#n165">165</a></p>
+<p id="n166" class="pln"><a href="#n166">166</a></p>
+<p id="n167" class="stm run hide_run"><a href="#n167">167</a></p>
+<p id="n168" class="pln"><a href="#n168">168</a></p>
+<p id="n169" class="pln"><a href="#n169">169</a></p>
+<p id="n170" class="stm run hide_run"><a href="#n170">170</a></p>
+<p id="n171" class="pln"><a href="#n171">171</a></p>
+<p id="n172" class="pln"><a href="#n172">172</a></p>
+<p id="n173" class="pln"><a href="#n173">173</a></p>
+<p id="n174" class="pln"><a href="#n174">174</a></p>
+<p id="n175" class="pln"><a href="#n175">175</a></p>
+<p id="n176" class="pln"><a href="#n176">176</a></p>
+<p id="n177" class="stm run hide_run"><a href="#n177">177</a></p>
+<p id="n178" class="pln"><a href="#n178">178</a></p>
+<p id="n179" class="stm run hide_run"><a href="#n179">179</a></p>
+<p id="n180" class="pln"><a href="#n180">180</a></p>
+<p id="n181" class="pln"><a href="#n181">181</a></p>
+<p id="n182" class="stm run hide_run"><a href="#n182">182</a></p>
+<p id="n183" class="pln"><a href="#n183">183</a></p>
+<p id="n184" class="stm run hide_run"><a href="#n184">184</a></p>
+<p id="n185" class="stm run hide_run"><a href="#n185">185</a></p>
+<p id="n186" class="stm run hide_run"><a href="#n186">186</a></p>
+<p id="n187" class="pln"><a href="#n187">187</a></p>
+<p id="n188" class="pln"><a href="#n188">188</a></p>
+<p id="n189" class="stm mis"><a href="#n189">189</a></p>
+<p id="n190" class="stm mis"><a href="#n190">190</a></p>
+<p id="n191" class="stm mis"><a href="#n191">191</a></p>
+<p id="n192" class="pln"><a href="#n192">192</a></p>
+<p id="n193" class="pln"><a href="#n193">193</a></p>
+<p id="n194" class="pln"><a href="#n194">194</a></p>
+<p id="n195" class="stm run hide_run"><a href="#n195">195</a></p>
+<p id="n196" class="pln"><a href="#n196">196</a></p>
+<p id="n197" class="stm run hide_run"><a href="#n197">197</a></p>
+<p id="n198" class="stm run hide_run"><a href="#n198">198</a></p>
+<p id="n199" class="pln"><a href="#n199">199</a></p>
+<p id="n200" class="stm run hide_run"><a href="#n200">200</a></p>
+<p id="n201" class="pln"><a href="#n201">201</a></p>
+<p id="n202" class="stm run hide_run"><a href="#n202">202</a></p>
+<p id="n203" class="stm run hide_run"><a href="#n203">203</a></p>
+<p id="n204" class="stm run hide_run"><a href="#n204">204</a></p>
+<p id="n205" class="pln"><a href="#n205">205</a></p>
+<p id="n206" class="stm run hide_run"><a href="#n206">206</a></p>
+<p id="n207" class="stm run hide_run"><a href="#n207">207</a></p>
+<p id="n208" class="pln"><a href="#n208">208</a></p>
+<p id="n209" class="pln"><a href="#n209">209</a></p>
+<p id="n210" class="pln"><a href="#n210">210</a></p>
+<p id="n211" class="stm run hide_run"><a href="#n211">211</a></p>
+<p id="n212" class="pln"><a href="#n212">212</a></p>
+<p id="n213" class="stm run hide_run"><a href="#n213">213</a></p>
+<p id="n214" class="stm run hide_run"><a href="#n214">214</a></p>
+<p id="n215" class="pln"><a href="#n215">215</a></p>
+<p id="n216" class="pln"><a href="#n216">216</a></p>
+<p id="n217" class="stm run hide_run"><a href="#n217">217</a></p>
+<p id="n218" class="pln"><a href="#n218">218</a></p>
+<p id="n219" class="stm run hide_run"><a href="#n219">219</a></p>
+<p id="n220" class="pln"><a href="#n220">220</a></p>
+<p id="n221" class="pln"><a href="#n221">221</a></p>
+<p id="n222" class="stm run hide_run"><a href="#n222">222</a></p>
+<p id="n223" class="stm run hide_run"><a href="#n223">223</a></p>
+<p id="n224" class="pln"><a href="#n224">224</a></p>
+<p id="n225" class="stm run hide_run"><a href="#n225">225</a></p>
+<p id="n226" class="stm run hide_run"><a href="#n226">226</a></p>
+<p id="n227" class="stm run hide_run"><a href="#n227">227</a></p>
+<p id="n228" class="stm run hide_run"><a href="#n228">228</a></p>
+<p id="n229" class="pln"><a href="#n229">229</a></p>
+<p id="n230" class="pln"><a href="#n230">230</a></p>
+<p id="n231" class="stm run hide_run"><a href="#n231">231</a></p>
+<p id="n232" class="pln"><a href="#n232">232</a></p>
+<p id="n233" class="pln"><a href="#n233">233</a></p>
+<p id="n234" class="pln"><a href="#n234">234</a></p>
+<p id="n235" class="pln"><a href="#n235">235</a></p>
+<p id="n236" class="pln"><a href="#n236">236</a></p>
+<p id="n237" class="stm run hide_run"><a href="#n237">237</a></p>
+<p id="n238" class="pln"><a href="#n238">238</a></p>
+<p id="n239" class="stm run hide_run"><a href="#n239">239</a></p>
+<p id="n240" class="pln"><a href="#n240">240</a></p>
+<p id="n241" class="pln"><a href="#n241">241</a></p>
+<p id="n242" class="pln"><a href="#n242">242</a></p>
+<p id="n243" class="stm mis"><a href="#n243">243</a></p>
+<p id="n244" class="stm mis"><a href="#n244">244</a></p>
+<p id="n245" class="stm mis"><a href="#n245">245</a></p>
+<p id="n246" class="stm mis"><a href="#n246">246</a></p>
+<p id="n247" class="pln"><a href="#n247">247</a></p>
+<p id="n248" class="pln"><a href="#n248">248</a></p>
+<p id="n249" class="stm mis"><a href="#n249">249</a></p>
+<p id="n250" class="stm mis"><a href="#n250">250</a></p>
+<p id="n251" class="stm mis"><a href="#n251">251</a></p>
+<p id="n252" class="stm mis"><a href="#n252">252</a></p>
+<p id="n253" class="pln"><a href="#n253">253</a></p>
+<p id="n254" class="stm run hide_run"><a href="#n254">254</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""rest module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">import</span> <span class="nam">time</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">import</span> <span class="nam">wsme</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">error_base</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">services</span> <span class="key">as</span> <span class="nam">GroupService</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsme</span> <span class="key">import</span> <span class="nam">types</span> <span class="key">as</span> <span class="nam">wtypes</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">model</span> <span class="key">import</span> <span class="nam">model</span> <span class="key">as</span> <span class="nam">PythonModel</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run"><span class="key">class</span> <span class="nam">Groups</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">    <span class="str">"""main json header."""</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm run hide_run">    <span class="nam">id</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="stm run hide_run">    <span class="nam">name</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">    <span class="nam">description</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run">    <span class="nam">regions</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">description</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">regions</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln">        <span class="str">"""init function.</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln"><span class="str">        :param regions:</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">description</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span> <span class="op">=</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_to_python_obj</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="stm mis">        <span class="nam">obj</span> <span class="op">=</span> <span class="nam">PythonModel</span><span class="op">.</span><span class="nam">Groups</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="stm mis">        <span class="nam">obj</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm mis">        <span class="nam">obj</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm mis">        <span class="nam">obj</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">description</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm mis">        <span class="nam">obj</span><span class="op">.</span><span class="nam">regions</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="stm mis">        <span class="key">return</span> <span class="nam">obj</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t48" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run"><span class="key">class</span> <span class="nam">GroupWrapper</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln">    <span class="str">"""main cotain lis of groups."""</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t52" class="stm run hide_run">    <span class="nam">groups</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">Groups</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">groups</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t57" class="pln"><span class="str">        :param group:</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="stm mis">        <span class="nam">self</span><span class="op">.</span><span class="nam">groups</span> <span class="op">=</span> <span class="nam">groups</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t62" class="stm run hide_run"><span class="key">class</span> <span class="nam">OutputResource</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln">    <span class="str">"""class method returned json body."""</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t65" class="stm run hide_run">    <span class="nam">id</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">    <span class="nam">name</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">    <span class="nam">created</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm run hide_run">    <span class="nam">links</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">{</span><span class="nam">str</span><span class="op">:</span> <span class="nam">str</span><span class="op">}</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">created</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">links</span><span class="op">=</span><span class="op">{</span><span class="op">}</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="pln">        <span class="str">"""init function.</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t73" class="pln"><span class="str">        :param id:</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln"><span class="str">        :param created:</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln"><span class="str">        :param links:</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">created</span> <span class="op">=</span> <span class="nam">created</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">links</span> <span class="op">=</span> <span class="nam">links</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t82" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t83" class="stm run hide_run"><span class="key">class</span> <span class="nam">Result</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="pln">    <span class="str">"""class method json headers."""</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm run hide_run">    <span class="nam">group</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">OutputResource</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t88" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group</span><span class="op">=</span><span class="nam">OutputResource</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="pln">        <span class="str">"""init dunction.</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t91" class="pln"><span class="str">        :param group: The created group</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">group</span> <span class="op">=</span> <span class="nam">group</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t95" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t96" class="stm run hide_run"><span class="key">class</span> <span class="nam">GroupsController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln">    <span class="str">"""controller get resource."""</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t99" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">Groups</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="pln">        <span class="str">"""Handle get request.</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln"><span class="str">        :param id: Group ID</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="pln"><span class="str">        :return: 200 OK on success, 404 Not Found otherwise.</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Entered Get Group: id = {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'group:get_one'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t110" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t112" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">GroupService</span><span class="op">.</span><span class="nam">get_groups_data</span><span class="op">(</span><span class="nam">id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">'Returning group, regions: {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">result</span><span class="op">.</span><span class="nam">regions</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="stm run hide_run">            <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t116" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"GroupsController - Group not found"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t118" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t121" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t123" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t124" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t126" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t127" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">GroupWrapper</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t128" class="pln">    <span class="key">def</span> <span class="nam">get_all</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t129" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"gett all groups"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'group:get_all'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t131" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t132" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t133" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"api-get all groups"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t134" class="stm run hide_run">            <span class="nam">groups_wrraper</span> <span class="op">=</span> <span class="nam">GroupService</span><span class="op">.</span><span class="nam">get_all_groups</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t135" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"got groups {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">groups_wrraper</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t136" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t137" class="stm mis">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t138" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"api--fail to get all groups"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t139" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t140" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t141" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t142" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t143" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t144" class="stm run hide_run">        <span class="key">return</span> <span class="nam">groups_wrraper</span><span class="strut">&nbsp;</span></p>
+<p id="t145" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t146" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">Result</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">Groups</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t147" class="pln">    <span class="key">def</span> <span class="nam">post</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group_input</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t148" class="pln">        <span class="str">"""Handle post request.</span><span class="strut">&nbsp;</span></p>
+<p id="t149" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t150" class="pln"><span class="str">        :param group_input: json data</span><span class="strut">&nbsp;</span></p>
+<p id="t151" class="pln"><span class="str">        :return: 201 created on success, 409 otherwise.</span><span class="strut">&nbsp;</span></p>
+<p id="t152" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t153" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Entered Create Group"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t154" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"id = {}, name = {}, description = {}, regions = {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t155" class="pln">            <span class="nam">group_input</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t156" class="pln">            <span class="nam">group_input</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t157" class="pln">            <span class="nam">group_input</span><span class="op">.</span><span class="nam">description</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t158" class="pln">            <span class="nam">group_input</span><span class="op">.</span><span class="nam">regions</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t159" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'group:create'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t160" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t161" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t162" class="pln">            <span class="com"># May raise an exception which will return status code 400</span><span class="strut">&nbsp;</span></p>
+<p id="t163" class="stm run hide_run">            <span class="nam">GroupService</span><span class="op">.</span><span class="nam">create_group_in_db</span><span class="op">(</span><span class="nam">group_input</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t164" class="pln">                                            <span class="nam">group_input</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t165" class="pln">                                            <span class="nam">group_input</span><span class="op">.</span><span class="nam">description</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t166" class="pln">                                            <span class="nam">group_input</span><span class="op">.</span><span class="nam">regions</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t167" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Group created successfully in DB"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t168" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t169" class="pln">            <span class="com"># Create the group output data with the correct timestamp and link</span><span class="strut">&nbsp;</span></p>
+<p id="t170" class="stm run hide_run">            <span class="nam">group</span> <span class="op">=</span> <span class="nam">OutputResource</span><span class="op">(</span><span class="nam">group_input</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t171" class="pln">                                   <span class="nam">group_input</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t172" class="pln">                                   <span class="nam">repr</span><span class="op">(</span><span class="nam">int</span><span class="op">(</span><span class="nam">time</span><span class="op">.</span><span class="nam">time</span><span class="op">(</span><span class="op">)</span> <span class="op">*</span> <span class="num">1000</span><span class="op">)</span><span class="op">)</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t173" class="pln">                                   <span class="op">{</span><span class="str">'self'</span><span class="op">:</span> <span class="str">'{}/v2/orm/groups/{}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t174" class="pln">                                       <span class="nam">request</span><span class="op">.</span><span class="nam">application_url</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t175" class="pln">                                       <span class="nam">group_input</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span><span class="op">}</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t176" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t177" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region group {} {} created with regions: {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t178" class="pln">                <span class="nam">group_input</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span> <span class="nam">group_input</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span> <span class="nam">group_input</span><span class="op">.</span><span class="nam">regions</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t179" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'create group'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t180" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">group_input</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t181" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t182" class="stm run hide_run">            <span class="key">return</span> <span class="nam">Result</span><span class="op">(</span><span class="nam">group</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t183" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t184" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t185" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"GroupsController - {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t186" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t187" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t188" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t189" class="stm mis">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t190" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t191" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t192" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t193" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t194" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t195" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">None</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">204</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t196" class="pln">    <span class="key">def</span> <span class="nam">delete</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t197" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"delete group"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t198" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'group:delete'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t199" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t200" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t201" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t202" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"delete group with id {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t203" class="stm run hide_run">            <span class="nam">GroupService</span><span class="op">.</span><span class="nam">delete_group</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t204" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"done"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t205" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t206" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region group {} deleted'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t207" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'delete group'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t208" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t209" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t210" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t211" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t212" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t213" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"fail to delete group :- {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t214" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t215" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t216" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t217" class="stm run hide_run">        <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t218" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t219" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">Result</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">Groups</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t220" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t221" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">,</span> <span class="nam">group</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t222" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"update group"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t223" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'group:update'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t224" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t225" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t226" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"update group - id {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t227" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">GroupService</span><span class="op">.</span><span class="nam">update_group</span><span class="op">(</span><span class="nam">group</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t228" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"group updated to :- {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t229" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t230" class="pln">            <span class="com"># build result</span><span class="strut">&nbsp;</span></p>
+<p id="t231" class="stm run hide_run">            <span class="nam">group_result</span> <span class="op">=</span> <span class="nam">OutputResource</span><span class="op">(</span><span class="nam">result</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span> <span class="nam">result</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t232" class="pln">                                          <span class="nam">repr</span><span class="op">(</span><span class="nam">int</span><span class="op">(</span><span class="nam">time</span><span class="op">.</span><span class="nam">time</span><span class="op">(</span><span class="op">)</span> <span class="op">*</span> <span class="num">1000</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t233" class="pln">                                              <span class="str">'self'</span><span class="op">:</span> <span class="str">'{}/v2/orm/groups/{}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t234" class="pln">                                                  <span class="nam">request</span><span class="op">.</span><span class="nam">application_url</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t235" class="pln">                                                  <span class="nam">result</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span><span class="op">}</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t236" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t237" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region group {} {} updated with regions: {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t238" class="pln">                <span class="nam">group_id</span><span class="op">,</span> <span class="nam">group</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span> <span class="nam">group</span><span class="op">.</span><span class="nam">regions</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t239" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'update group'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t240" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t241" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t242" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t243" class="stm mis">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t244" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"group to update not found {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t245" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t246" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t247" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t248" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t249" class="stm mis">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t250" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"fail to update groupt -- id {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t251" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t252" class="stm mis">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t253" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t254" class="stm run hide_run">        <span class="key">return</span> <span class="nam">Result</span><span class="op">(</span><span class="nam">group_result</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_controllers_v2_orm_resources_metadata_py.html b/orm/services/region_manager/cover/rms_controllers_v2_orm_resources_metadata_py.html
new file mode 100644
index 00000000..fcb8e1ed
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_controllers_v2_orm_resources_metadata_py.html
@@ -0,0 +1,437 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/orm/resources/metadata.py: 78%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/orm/resources/metadata.py</b> :
+            <span class="pc_cov">78%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            85 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">66 run</span>
+            <span class="mis shortkey_m button_toggle_mis">19 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="stm run hide_run"><a href="#n39">39</a></p>
+<p id="n40" class="stm run hide_run"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="stm run hide_run"><a href="#n42">42</a></p>
+<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p>
+<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="stm run hide_run"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="stm run hide_run"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="pln"><a href="#n56">56</a></p>
+<p id="n57" class="pln"><a href="#n57">57</a></p>
+<p id="n58" class="stm run hide_run"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="pln"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p>
+<p id="n69" class="pln"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="stm run hide_run"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="stm mis"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+<p id="n75" class="stm mis"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="pln"><a href="#n77">77</a></p>
+<p id="n78" class="stm mis"><a href="#n78">78</a></p>
+<p id="n79" class="stm mis"><a href="#n79">79</a></p>
+<p id="n80" class="pln"><a href="#n80">80</a></p>
+<p id="n81" class="pln"><a href="#n81">81</a></p>
+<p id="n82" class="stm mis"><a href="#n82">82</a></p>
+<p id="n83" class="pln"><a href="#n83">83</a></p>
+<p id="n84" class="stm run hide_run"><a href="#n84">84</a></p>
+<p id="n85" class="stm mis"><a href="#n85">85</a></p>
+<p id="n86" class="stm mis"><a href="#n86">86</a></p>
+<p id="n87" class="pln"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="stm run hide_run"><a href="#n89">89</a></p>
+<p id="n90" class="stm run hide_run"><a href="#n90">90</a></p>
+<p id="n91" class="stm run hide_run"><a href="#n91">91</a></p>
+<p id="n92" class="pln"><a href="#n92">92</a></p>
+<p id="n93" class="pln"><a href="#n93">93</a></p>
+<p id="n94" class="pln"><a href="#n94">94</a></p>
+<p id="n95" class="stm run hide_run"><a href="#n95">95</a></p>
+<p id="n96" class="pln"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="pln"><a href="#n98">98</a></p>
+<p id="n99" class="pln"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="pln"><a href="#n101">101</a></p>
+<p id="n102" class="pln"><a href="#n102">102</a></p>
+<p id="n103" class="stm run hide_run"><a href="#n103">103</a></p>
+<p id="n104" class="stm run hide_run"><a href="#n104">104</a></p>
+<p id="n105" class="stm run hide_run"><a href="#n105">105</a></p>
+<p id="n106" class="pln"><a href="#n106">106</a></p>
+<p id="n107" class="stm run hide_run"><a href="#n107">107</a></p>
+<p id="n108" class="stm run hide_run"><a href="#n108">108</a></p>
+<p id="n109" class="pln"><a href="#n109">109</a></p>
+<p id="n110" class="stm mis"><a href="#n110">110</a></p>
+<p id="n111" class="pln"><a href="#n111">111</a></p>
+<p id="n112" class="stm mis"><a href="#n112">112</a></p>
+<p id="n113" class="pln"><a href="#n113">113</a></p>
+<p id="n114" class="pln"><a href="#n114">114</a></p>
+<p id="n115" class="stm mis"><a href="#n115">115</a></p>
+<p id="n116" class="stm mis"><a href="#n116">116</a></p>
+<p id="n117" class="pln"><a href="#n117">117</a></p>
+<p id="n118" class="pln"><a href="#n118">118</a></p>
+<p id="n119" class="stm mis"><a href="#n119">119</a></p>
+<p id="n120" class="pln"><a href="#n120">120</a></p>
+<p id="n121" class="stm run hide_run"><a href="#n121">121</a></p>
+<p id="n122" class="stm mis"><a href="#n122">122</a></p>
+<p id="n123" class="stm mis"><a href="#n123">123</a></p>
+<p id="n124" class="pln"><a href="#n124">124</a></p>
+<p id="n125" class="pln"><a href="#n125">125</a></p>
+<p id="n126" class="stm run hide_run"><a href="#n126">126</a></p>
+<p id="n127" class="stm run hide_run"><a href="#n127">127</a></p>
+<p id="n128" class="stm run hide_run"><a href="#n128">128</a></p>
+<p id="n129" class="pln"><a href="#n129">129</a></p>
+<p id="n130" class="pln"><a href="#n130">130</a></p>
+<p id="n131" class="pln"><a href="#n131">131</a></p>
+<p id="n132" class="stm run hide_run"><a href="#n132">132</a></p>
+<p id="n133" class="pln"><a href="#n133">133</a></p>
+<p id="n134" class="pln"><a href="#n134">134</a></p>
+<p id="n135" class="pln"><a href="#n135">135</a></p>
+<p id="n136" class="pln"><a href="#n136">136</a></p>
+<p id="n137" class="pln"><a href="#n137">137</a></p>
+<p id="n138" class="pln"><a href="#n138">138</a></p>
+<p id="n139" class="stm run hide_run"><a href="#n139">139</a></p>
+<p id="n140" class="pln"><a href="#n140">140</a></p>
+<p id="n141" class="stm run hide_run"><a href="#n141">141</a></p>
+<p id="n142" class="pln"><a href="#n142">142</a></p>
+<p id="n143" class="stm run hide_run"><a href="#n143">143</a></p>
+<p id="n144" class="pln"><a href="#n144">144</a></p>
+<p id="n145" class="stm run hide_run"><a href="#n145">145</a></p>
+<p id="n146" class="pln"><a href="#n146">146</a></p>
+<p id="n147" class="stm run hide_run"><a href="#n147">147</a></p>
+<p id="n148" class="pln"><a href="#n148">148</a></p>
+<p id="n149" class="stm run hide_run"><a href="#n149">149</a></p>
+<p id="n150" class="pln"><a href="#n150">150</a></p>
+<p id="n151" class="stm run hide_run"><a href="#n151">151</a></p>
+<p id="n152" class="pln"><a href="#n152">152</a></p>
+<p id="n153" class="pln"><a href="#n153">153</a></p>
+<p id="n154" class="pln"><a href="#n154">154</a></p>
+<p id="n155" class="stm run hide_run"><a href="#n155">155</a></p>
+<p id="n156" class="stm run hide_run"><a href="#n156">156</a></p>
+<p id="n157" class="stm run hide_run"><a href="#n157">157</a></p>
+<p id="n158" class="pln"><a href="#n158">158</a></p>
+<p id="n159" class="pln"><a href="#n159">159</a></p>
+<p id="n160" class="stm run hide_run"><a href="#n160">160</a></p>
+<p id="n161" class="stm run hide_run"><a href="#n161">161</a></p>
+<p id="n162" class="stm run hide_run"><a href="#n162">162</a></p>
+<p id="n163" class="pln"><a href="#n163">163</a></p>
+<p id="n164" class="pln"><a href="#n164">164</a></p>
+<p id="n165" class="pln"><a href="#n165">165</a></p>
+<p id="n166" class="stm run hide_run"><a href="#n166">166</a></p>
+<p id="n167" class="stm run hide_run"><a href="#n167">167</a></p>
+<p id="n168" class="stm mis"><a href="#n168">168</a></p>
+<p id="n169" class="stm mis"><a href="#n169">169</a></p>
+<p id="n170" class="stm mis"><a href="#n170">170</a></p>
+<p id="n171" class="stm mis"><a href="#n171">171</a></p>
+<p id="n172" class="pln"><a href="#n172">172</a></p>
+<p id="n173" class="stm mis"><a href="#n173">173</a></p>
+<p id="n174" class="pln"><a href="#n174">174</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">json</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">import</span> <span class="nam">wsme</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsme</span> <span class="key">import</span> <span class="nam">types</span> <span class="key">as</span> <span class="nam">wtypes</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">error_base</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">services</span> <span class="key">as</span> <span class="nam">RegionService</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run"><span class="key">class</span> <span class="nam">MetaData</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">    <span class="str">"""main json header."""</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm run hide_run">    <span class="nam">metadata</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">{</span><span class="nam">str</span><span class="op">:</span> <span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">}</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">=</span><span class="op">{</span><span class="op">}</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln">        <span class="str">"""init function.</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln"><span class="str">        :param regions:</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">metadata</span> <span class="op">=</span> <span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run"><span class="key">class</span> <span class="nam">RegionMetadataController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">MetaData</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln">    <span class="key">def</span> <span class="nam">get</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Get metadata for region id: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'metadata:get'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t42" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm run hide_run">            <span class="nam">region</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">get_region_by_id_or_name</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Got region metadata: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region</span><span class="op">.</span><span class="nam">metadata</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">            <span class="key">return</span> <span class="nam">MetaData</span><span class="op">(</span><span class="nam">region</span><span class="op">.</span><span class="nam">metadata</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t47" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"RegionsController - {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">MetaData</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">MetaData</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln">    <span class="key">def</span> <span class="nam">post</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_input</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln">        <span class="str">"""Handle post request.</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln"><span class="str">        :param region_id: region_id to add metadata to.</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln"><span class="str">        :param metadata_input: json data</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln"><span class="str">        :return: 201 created on success, 409 duplicate entry, 404 not found</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Entered Create region metadata"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Got metadata: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">metadata_input</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'metadata:create'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">_validate_request_input</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln">            <span class="com"># May raise an exception which will return status code 400</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="stm mis">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">add_region_metadata</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln">                                                       <span class="nam">metadata_input</span><span class="op">.</span><span class="nam">metadata</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Metadata was successfully added to "</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln">                         <span class="str">"region: {}. New metadata: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">result</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm mis">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region {} metadata added'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm mis">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'create metadata'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="stm mis">            <span class="key">return</span> <span class="nam">MetaData</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t95" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">MetaData</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">MetaData</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_input</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="pln">        <span class="str">"""Handle put request.</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="pln"><span class="str">        :param region_id: region_id to update metadata to.</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln"><span class="str">        :param metadata_input: json data</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="pln"><span class="str">        :return: 201 created on success, 404 not found</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Entered update region metadata"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Got metadata: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">metadata_input</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'metadata:update'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t107" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">_validate_request_input</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="pln">            <span class="com"># May raise an exception which will return status code 400</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="stm mis">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">update_region_metadata</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="pln">                                                          <span class="nam">metadata_input</span><span class="op">.</span><span class="nam">metadata</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t112" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Metadata was successfully added to "</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="pln">                         <span class="str">"region: {}. New metadata: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">result</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t115" class="stm mis">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region {} metadata updated'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="stm mis">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'update metadata'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t118" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="stm mis">            <span class="key">return</span> <span class="nam">MetaData</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t121" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t123" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t124" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t126" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t127" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t128" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t129" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t131" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t132" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">None</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">204</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t133" class="pln">    <span class="key">def</span> <span class="nam">delete</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_key</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t134" class="pln">        <span class="str">"""Handle delete request.</span><span class="strut">&nbsp;</span></p>
+<p id="t135" class="pln"><span class="str">        :param region_id: region_id to update metadata to.</span><span class="strut">&nbsp;</span></p>
+<p id="t136" class="pln"><span class="str">        :param metadata_key: metadata key to be deleted</span><span class="strut">&nbsp;</span></p>
+<p id="t137" class="pln"><span class="str">        :return: 204 deleted</span><span class="strut">&nbsp;</span></p>
+<p id="t138" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t139" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Entered delete region metadata with "</span><span class="strut">&nbsp;</span></p>
+<p id="t140" class="pln">                    <span class="str">"key: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">metadata_key</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t141" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'metadata:delete'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t142" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t143" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t144" class="pln">            <span class="com"># May raise an exception which will return status code 400</span><span class="strut">&nbsp;</span></p>
+<p id="t145" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">delete_metadata_from_region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t146" class="pln">                                                               <span class="nam">metadata_key</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t147" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Metadata was successfully deleted."</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t148" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t149" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region {} metadata {} deleted'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t150" class="pln">                <span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_key</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t151" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'delete metadata'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t152" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t153" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t154" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t155" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t156" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t157" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t158" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t159" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t160" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t161" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t162" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t163" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t164" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t165" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t166" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_validate_request_input</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t167" class="stm run hide_run">        <span class="nam">data_dict</span> <span class="op">=</span> <span class="nam">json</span><span class="op">.</span><span class="nam">loads</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">body</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t168" class="stm mis">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Got {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">data_dict</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t169" class="stm mis">        <span class="key">for</span> <span class="nam">k</span><span class="op">,</span> <span class="nam">v</span> <span class="key">in</span> <span class="nam">data_dict</span><span class="op">[</span><span class="str">'metadata'</span><span class="op">]</span><span class="op">.</span><span class="nam">iteritems</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t170" class="stm mis">            <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">v</span><span class="op">,</span> <span class="nam">basestring</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t171" class="stm mis">                <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Invalid json. value type list is expected, "</span><span class="strut">&nbsp;</span></p>
+<p id="t172" class="pln">                             <span class="str">"received string, for metadata key {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">k</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t173" class="stm mis">                <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">400</span><span class="op">,</span> <span class="str">"Invalid json. Expecting list "</span><span class="strut">&nbsp;</span></p>
+<p id="t174" class="pln">                                                  <span class="str">"of metadata values, got string"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_controllers_v2_orm_resources_regions_py.html b/orm/services/region_manager/cover/rms_controllers_v2_orm_resources_regions_py.html
new file mode 100644
index 00000000..02014699
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_controllers_v2_orm_resources_regions_py.html
@@ -0,0 +1,819 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/orm/resources/regions.py: 97%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/orm/resources/regions.py</b> :
+            <span class="pc_cov">97%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            187 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">182 run</span>
+            <span class="mis shortkey_m button_toggle_mis">5 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="stm run hide_run"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="stm run hide_run"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="stm run hide_run"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="pln"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="stm run hide_run"><a href="#n46">46</a></p>
+<p id="n47" class="stm run hide_run"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="stm run hide_run"><a href="#n51">51</a></p>
+<p id="n52" class="stm run hide_run"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="stm run hide_run"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="stm run hide_run"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="stm run hide_run"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="stm run hide_run"><a href="#n64">64</a></p>
+<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p>
+<p id="n66" class="pln"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="pln"><a href="#n68">68</a></p>
+<p id="n69" class="pln"><a href="#n69">69</a></p>
+<p id="n70" class="pln"><a href="#n70">70</a></p>
+<p id="n71" class="pln"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="pln"><a href="#n73">73</a></p>
+<p id="n74" class="stm run hide_run"><a href="#n74">74</a></p>
+<p id="n75" class="stm run hide_run"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="stm run hide_run"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="stm run hide_run"><a href="#n79">79</a></p>
+<p id="n80" class="stm run hide_run"><a href="#n80">80</a></p>
+<p id="n81" class="stm run hide_run"><a href="#n81">81</a></p>
+<p id="n82" class="pln"><a href="#n82">82</a></p>
+<p id="n83" class="pln"><a href="#n83">83</a></p>
+<p id="n84" class="stm run hide_run"><a href="#n84">84</a></p>
+<p id="n85" class="pln"><a href="#n85">85</a></p>
+<p id="n86" class="pln"><a href="#n86">86</a></p>
+<p id="n87" class="stm run hide_run"><a href="#n87">87</a></p>
+<p id="n88" class="stm run hide_run"><a href="#n88">88</a></p>
+<p id="n89" class="stm run hide_run"><a href="#n89">89</a></p>
+<p id="n90" class="stm run hide_run"><a href="#n90">90</a></p>
+<p id="n91" class="stm run hide_run"><a href="#n91">91</a></p>
+<p id="n92" class="stm run hide_run"><a href="#n92">92</a></p>
+<p id="n93" class="stm run hide_run"><a href="#n93">93</a></p>
+<p id="n94" class="stm run hide_run"><a href="#n94">94</a></p>
+<p id="n95" class="stm run hide_run"><a href="#n95">95</a></p>
+<p id="n96" class="stm run hide_run"><a href="#n96">96</a></p>
+<p id="n97" class="stm run hide_run"><a href="#n97">97</a></p>
+<p id="n98" class="stm run hide_run"><a href="#n98">98</a></p>
+<p id="n99" class="stm run hide_run"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="stm run hide_run"><a href="#n101">101</a></p>
+<p id="n102" class="pln"><a href="#n102">102</a></p>
+<p id="n103" class="stm run hide_run"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="stm run hide_run"><a href="#n105">105</a></p>
+<p id="n106" class="pln"><a href="#n106">106</a></p>
+<p id="n107" class="pln"><a href="#n107">107</a></p>
+<p id="n108" class="pln"><a href="#n108">108</a></p>
+<p id="n109" class="pln"><a href="#n109">109</a></p>
+<p id="n110" class="pln"><a href="#n110">110</a></p>
+<p id="n111" class="pln"><a href="#n111">111</a></p>
+<p id="n112" class="pln"><a href="#n112">112</a></p>
+<p id="n113" class="pln"><a href="#n113">113</a></p>
+<p id="n114" class="pln"><a href="#n114">114</a></p>
+<p id="n115" class="pln"><a href="#n115">115</a></p>
+<p id="n116" class="pln"><a href="#n116">116</a></p>
+<p id="n117" class="pln"><a href="#n117">117</a></p>
+<p id="n118" class="pln"><a href="#n118">118</a></p>
+<p id="n119" class="pln"><a href="#n119">119</a></p>
+<p id="n120" class="pln"><a href="#n120">120</a></p>
+<p id="n121" class="pln"><a href="#n121">121</a></p>
+<p id="n122" class="pln"><a href="#n122">122</a></p>
+<p id="n123" class="pln"><a href="#n123">123</a></p>
+<p id="n124" class="pln"><a href="#n124">124</a></p>
+<p id="n125" class="pln"><a href="#n125">125</a></p>
+<p id="n126" class="pln"><a href="#n126">126</a></p>
+<p id="n127" class="pln"><a href="#n127">127</a></p>
+<p id="n128" class="stm run hide_run"><a href="#n128">128</a></p>
+<p id="n129" class="stm run hide_run"><a href="#n129">129</a></p>
+<p id="n130" class="stm run hide_run"><a href="#n130">130</a></p>
+<p id="n131" class="stm run hide_run"><a href="#n131">131</a></p>
+<p id="n132" class="stm run hide_run"><a href="#n132">132</a></p>
+<p id="n133" class="stm run hide_run"><a href="#n133">133</a></p>
+<p id="n134" class="stm run hide_run"><a href="#n134">134</a></p>
+<p id="n135" class="stm run hide_run"><a href="#n135">135</a></p>
+<p id="n136" class="stm run hide_run"><a href="#n136">136</a></p>
+<p id="n137" class="stm run hide_run"><a href="#n137">137</a></p>
+<p id="n138" class="stm run hide_run"><a href="#n138">138</a></p>
+<p id="n139" class="stm run hide_run"><a href="#n139">139</a></p>
+<p id="n140" class="stm run hide_run"><a href="#n140">140</a></p>
+<p id="n141" class="stm run hide_run"><a href="#n141">141</a></p>
+<p id="n142" class="stm run hide_run"><a href="#n142">142</a></p>
+<p id="n143" class="pln"><a href="#n143">143</a></p>
+<p id="n144" class="stm run hide_run"><a href="#n144">144</a></p>
+<p id="n145" class="stm run hide_run"><a href="#n145">145</a></p>
+<p id="n146" class="stm run hide_run"><a href="#n146">146</a></p>
+<p id="n147" class="stm run hide_run"><a href="#n147">147</a></p>
+<p id="n148" class="stm run hide_run"><a href="#n148">148</a></p>
+<p id="n149" class="stm run hide_run"><a href="#n149">149</a></p>
+<p id="n150" class="stm run hide_run"><a href="#n150">150</a></p>
+<p id="n151" class="stm run hide_run"><a href="#n151">151</a></p>
+<p id="n152" class="stm run hide_run"><a href="#n152">152</a></p>
+<p id="n153" class="stm run hide_run"><a href="#n153">153</a></p>
+<p id="n154" class="stm run hide_run"><a href="#n154">154</a></p>
+<p id="n155" class="stm run hide_run"><a href="#n155">155</a></p>
+<p id="n156" class="stm run hide_run"><a href="#n156">156</a></p>
+<p id="n157" class="stm run hide_run"><a href="#n157">157</a></p>
+<p id="n158" class="stm run hide_run"><a href="#n158">158</a></p>
+<p id="n159" class="stm run hide_run"><a href="#n159">159</a></p>
+<p id="n160" class="stm run hide_run"><a href="#n160">160</a></p>
+<p id="n161" class="stm run hide_run"><a href="#n161">161</a></p>
+<p id="n162" class="stm run hide_run"><a href="#n162">162</a></p>
+<p id="n163" class="stm run hide_run"><a href="#n163">163</a></p>
+<p id="n164" class="pln"><a href="#n164">164</a></p>
+<p id="n165" class="pln"><a href="#n165">165</a></p>
+<p id="n166" class="stm run hide_run"><a href="#n166">166</a></p>
+<p id="n167" class="pln"><a href="#n167">167</a></p>
+<p id="n168" class="pln"><a href="#n168">168</a></p>
+<p id="n169" class="stm run hide_run"><a href="#n169">169</a></p>
+<p id="n170" class="pln"><a href="#n170">170</a></p>
+<p id="n171" class="stm run hide_run"><a href="#n171">171</a></p>
+<p id="n172" class="pln"><a href="#n172">172</a></p>
+<p id="n173" class="pln"><a href="#n173">173</a></p>
+<p id="n174" class="pln"><a href="#n174">174</a></p>
+<p id="n175" class="pln"><a href="#n175">175</a></p>
+<p id="n176" class="pln"><a href="#n176">176</a></p>
+<p id="n177" class="stm mis"><a href="#n177">177</a></p>
+<p id="n178" class="pln"><a href="#n178">178</a></p>
+<p id="n179" class="pln"><a href="#n179">179</a></p>
+<p id="n180" class="stm run hide_run"><a href="#n180">180</a></p>
+<p id="n181" class="pln"><a href="#n181">181</a></p>
+<p id="n182" class="stm run hide_run"><a href="#n182">182</a></p>
+<p id="n183" class="stm run hide_run"><a href="#n183">183</a></p>
+<p id="n184" class="pln"><a href="#n184">184</a></p>
+<p id="n185" class="stm run hide_run"><a href="#n185">185</a></p>
+<p id="n186" class="pln"><a href="#n186">186</a></p>
+<p id="n187" class="stm run hide_run"><a href="#n187">187</a></p>
+<p id="n188" class="pln"><a href="#n188">188</a></p>
+<p id="n189" class="pln"><a href="#n189">189</a></p>
+<p id="n190" class="pln"><a href="#n190">190</a></p>
+<p id="n191" class="pln"><a href="#n191">191</a></p>
+<p id="n192" class="pln"><a href="#n192">192</a></p>
+<p id="n193" class="pln"><a href="#n193">193</a></p>
+<p id="n194" class="pln"><a href="#n194">194</a></p>
+<p id="n195" class="pln"><a href="#n195">195</a></p>
+<p id="n196" class="pln"><a href="#n196">196</a></p>
+<p id="n197" class="pln"><a href="#n197">197</a></p>
+<p id="n198" class="pln"><a href="#n198">198</a></p>
+<p id="n199" class="pln"><a href="#n199">199</a></p>
+<p id="n200" class="pln"><a href="#n200">200</a></p>
+<p id="n201" class="pln"><a href="#n201">201</a></p>
+<p id="n202" class="pln"><a href="#n202">202</a></p>
+<p id="n203" class="pln"><a href="#n203">203</a></p>
+<p id="n204" class="pln"><a href="#n204">204</a></p>
+<p id="n205" class="pln"><a href="#n205">205</a></p>
+<p id="n206" class="pln"><a href="#n206">206</a></p>
+<p id="n207" class="pln"><a href="#n207">207</a></p>
+<p id="n208" class="pln"><a href="#n208">208</a></p>
+<p id="n209" class="pln"><a href="#n209">209</a></p>
+<p id="n210" class="pln"><a href="#n210">210</a></p>
+<p id="n211" class="pln"><a href="#n211">211</a></p>
+<p id="n212" class="stm run hide_run"><a href="#n212">212</a></p>
+<p id="n213" class="stm run hide_run"><a href="#n213">213</a></p>
+<p id="n214" class="pln"><a href="#n214">214</a></p>
+<p id="n215" class="stm run hide_run"><a href="#n215">215</a></p>
+<p id="n216" class="pln"><a href="#n216">216</a></p>
+<p id="n217" class="pln"><a href="#n217">217</a></p>
+<p id="n218" class="pln"><a href="#n218">218</a></p>
+<p id="n219" class="pln"><a href="#n219">219</a></p>
+<p id="n220" class="pln"><a href="#n220">220</a></p>
+<p id="n221" class="stm run hide_run"><a href="#n221">221</a></p>
+<p id="n222" class="pln"><a href="#n222">222</a></p>
+<p id="n223" class="stm run hide_run"><a href="#n223">223</a></p>
+<p id="n224" class="stm run hide_run"><a href="#n224">224</a></p>
+<p id="n225" class="pln"><a href="#n225">225</a></p>
+<p id="n226" class="stm run hide_run"><a href="#n226">226</a></p>
+<p id="n227" class="pln"><a href="#n227">227</a></p>
+<p id="n228" class="stm run hide_run"><a href="#n228">228</a></p>
+<p id="n229" class="pln"><a href="#n229">229</a></p>
+<p id="n230" class="pln"><a href="#n230">230</a></p>
+<p id="n231" class="stm run hide_run"><a href="#n231">231</a></p>
+<p id="n232" class="pln"><a href="#n232">232</a></p>
+<p id="n233" class="stm run hide_run"><a href="#n233">233</a></p>
+<p id="n234" class="stm run hide_run"><a href="#n234">234</a></p>
+<p id="n235" class="stm run hide_run"><a href="#n235">235</a></p>
+<p id="n236" class="pln"><a href="#n236">236</a></p>
+<p id="n237" class="pln"><a href="#n237">237</a></p>
+<p id="n238" class="pln"><a href="#n238">238</a></p>
+<p id="n239" class="stm run hide_run"><a href="#n239">239</a></p>
+<p id="n240" class="stm run hide_run"><a href="#n240">240</a></p>
+<p id="n241" class="stm run hide_run"><a href="#n241">241</a></p>
+<p id="n242" class="pln"><a href="#n242">242</a></p>
+<p id="n243" class="pln"><a href="#n243">243</a></p>
+<p id="n244" class="pln"><a href="#n244">244</a></p>
+<p id="n245" class="stm run hide_run"><a href="#n245">245</a></p>
+<p id="n246" class="pln"><a href="#n246">246</a></p>
+<p id="n247" class="stm run hide_run"><a href="#n247">247</a></p>
+<p id="n248" class="stm run hide_run"><a href="#n248">248</a></p>
+<p id="n249" class="pln"><a href="#n249">249</a></p>
+<p id="n250" class="stm run hide_run"><a href="#n250">250</a></p>
+<p id="n251" class="stm run hide_run"><a href="#n251">251</a></p>
+<p id="n252" class="stm run hide_run"><a href="#n252">252</a></p>
+<p id="n253" class="stm run hide_run"><a href="#n253">253</a></p>
+<p id="n254" class="stm run hide_run"><a href="#n254">254</a></p>
+<p id="n255" class="stm run hide_run"><a href="#n255">255</a></p>
+<p id="n256" class="pln"><a href="#n256">256</a></p>
+<p id="n257" class="pln"><a href="#n257">257</a></p>
+<p id="n258" class="stm run hide_run"><a href="#n258">258</a></p>
+<p id="n259" class="stm run hide_run"><a href="#n259">259</a></p>
+<p id="n260" class="stm run hide_run"><a href="#n260">260</a></p>
+<p id="n261" class="pln"><a href="#n261">261</a></p>
+<p id="n262" class="pln"><a href="#n262">262</a></p>
+<p id="n263" class="pln"><a href="#n263">263</a></p>
+<p id="n264" class="stm run hide_run"><a href="#n264">264</a></p>
+<p id="n265" class="pln"><a href="#n265">265</a></p>
+<p id="n266" class="stm run hide_run"><a href="#n266">266</a></p>
+<p id="n267" class="pln"><a href="#n267">267</a></p>
+<p id="n268" class="stm run hide_run"><a href="#n268">268</a></p>
+<p id="n269" class="stm run hide_run"><a href="#n269">269</a></p>
+<p id="n270" class="pln"><a href="#n270">270</a></p>
+<p id="n271" class="stm run hide_run"><a href="#n271">271</a></p>
+<p id="n272" class="stm run hide_run"><a href="#n272">272</a></p>
+<p id="n273" class="stm run hide_run"><a href="#n273">273</a></p>
+<p id="n274" class="stm run hide_run"><a href="#n274">274</a></p>
+<p id="n275" class="pln"><a href="#n275">275</a></p>
+<p id="n276" class="stm run hide_run"><a href="#n276">276</a></p>
+<p id="n277" class="pln"><a href="#n277">277</a></p>
+<p id="n278" class="pln"><a href="#n278">278</a></p>
+<p id="n279" class="pln"><a href="#n279">279</a></p>
+<p id="n280" class="stm run hide_run"><a href="#n280">280</a></p>
+<p id="n281" class="pln"><a href="#n281">281</a></p>
+<p id="n282" class="pln"><a href="#n282">282</a></p>
+<p id="n283" class="stm run hide_run"><a href="#n283">283</a></p>
+<p id="n284" class="stm run hide_run"><a href="#n284">284</a></p>
+<p id="n285" class="stm run hide_run"><a href="#n285">285</a></p>
+<p id="n286" class="pln"><a href="#n286">286</a></p>
+<p id="n287" class="pln"><a href="#n287">287</a></p>
+<p id="n288" class="pln"><a href="#n288">288</a></p>
+<p id="n289" class="stm run hide_run"><a href="#n289">289</a></p>
+<p id="n290" class="stm mis"><a href="#n290">290</a></p>
+<p id="n291" class="stm mis"><a href="#n291">291</a></p>
+<p id="n292" class="pln"><a href="#n292">292</a></p>
+<p id="n293" class="pln"><a href="#n293">293</a></p>
+<p id="n294" class="pln"><a href="#n294">294</a></p>
+<p id="n295" class="stm run hide_run"><a href="#n295">295</a></p>
+<p id="n296" class="stm run hide_run"><a href="#n296">296</a></p>
+<p id="n297" class="stm run hide_run"><a href="#n297">297</a></p>
+<p id="n298" class="pln"><a href="#n298">298</a></p>
+<p id="n299" class="pln"><a href="#n299">299</a></p>
+<p id="n300" class="pln"><a href="#n300">300</a></p>
+<p id="n301" class="stm run hide_run"><a href="#n301">301</a></p>
+<p id="n302" class="pln"><a href="#n302">302</a></p>
+<p id="n303" class="stm run hide_run"><a href="#n303">303</a></p>
+<p id="n304" class="pln"><a href="#n304">304</a></p>
+<p id="n305" class="stm run hide_run"><a href="#n305">305</a></p>
+<p id="n306" class="stm run hide_run"><a href="#n306">306</a></p>
+<p id="n307" class="pln"><a href="#n307">307</a></p>
+<p id="n308" class="stm run hide_run"><a href="#n308">308</a></p>
+<p id="n309" class="pln"><a href="#n309">309</a></p>
+<p id="n310" class="stm run hide_run"><a href="#n310">310</a></p>
+<p id="n311" class="stm run hide_run"><a href="#n311">311</a></p>
+<p id="n312" class="stm run hide_run"><a href="#n312">312</a></p>
+<p id="n313" class="pln"><a href="#n313">313</a></p>
+<p id="n314" class="stm run hide_run"><a href="#n314">314</a></p>
+<p id="n315" class="stm run hide_run"><a href="#n315">315</a></p>
+<p id="n316" class="pln"><a href="#n316">316</a></p>
+<p id="n317" class="pln"><a href="#n317">317</a></p>
+<p id="n318" class="pln"><a href="#n318">318</a></p>
+<p id="n319" class="stm run hide_run"><a href="#n319">319</a></p>
+<p id="n320" class="stm run hide_run"><a href="#n320">320</a></p>
+<p id="n321" class="pln"><a href="#n321">321</a></p>
+<p id="n322" class="stm run hide_run"><a href="#n322">322</a></p>
+<p id="n323" class="pln"><a href="#n323">323</a></p>
+<p id="n324" class="pln"><a href="#n324">324</a></p>
+<p id="n325" class="stm run hide_run"><a href="#n325">325</a></p>
+<p id="n326" class="pln"><a href="#n326">326</a></p>
+<p id="n327" class="stm run hide_run"><a href="#n327">327</a></p>
+<p id="n328" class="pln"><a href="#n328">328</a></p>
+<p id="n329" class="pln"><a href="#n329">329</a></p>
+<p id="n330" class="stm run hide_run"><a href="#n330">330</a></p>
+<p id="n331" class="stm run hide_run"><a href="#n331">331</a></p>
+<p id="n332" class="pln"><a href="#n332">332</a></p>
+<p id="n333" class="stm run hide_run"><a href="#n333">333</a></p>
+<p id="n334" class="pln"><a href="#n334">334</a></p>
+<p id="n335" class="stm run hide_run"><a href="#n335">335</a></p>
+<p id="n336" class="pln"><a href="#n336">336</a></p>
+<p id="n337" class="stm run hide_run"><a href="#n337">337</a></p>
+<p id="n338" class="stm run hide_run"><a href="#n338">338</a></p>
+<p id="n339" class="pln"><a href="#n339">339</a></p>
+<p id="n340" class="stm run hide_run"><a href="#n340">340</a></p>
+<p id="n341" class="pln"><a href="#n341">341</a></p>
+<p id="n342" class="pln"><a href="#n342">342</a></p>
+<p id="n343" class="stm run hide_run"><a href="#n343">343</a></p>
+<p id="n344" class="pln"><a href="#n344">344</a></p>
+<p id="n345" class="pln"><a href="#n345">345</a></p>
+<p id="n346" class="pln"><a href="#n346">346</a></p>
+<p id="n347" class="stm run hide_run"><a href="#n347">347</a></p>
+<p id="n348" class="stm run hide_run"><a href="#n348">348</a></p>
+<p id="n349" class="stm run hide_run"><a href="#n349">349</a></p>
+<p id="n350" class="pln"><a href="#n350">350</a></p>
+<p id="n351" class="pln"><a href="#n351">351</a></p>
+<p id="n352" class="pln"><a href="#n352">352</a></p>
+<p id="n353" class="stm run hide_run"><a href="#n353">353</a></p>
+<p id="n354" class="stm mis"><a href="#n354">354</a></p>
+<p id="n355" class="stm mis"><a href="#n355">355</a></p>
+<p id="n356" class="pln"><a href="#n356">356</a></p>
+<p id="n357" class="pln"><a href="#n357">357</a></p>
+<p id="n358" class="stm run hide_run"><a href="#n358">358</a></p>
+<p id="n359" class="stm run hide_run"><a href="#n359">359</a></p>
+<p id="n360" class="pln"><a href="#n360">360</a></p>
+<p id="n361" class="pln"><a href="#n361">361</a></p>
+<p id="n362" class="stm run hide_run"><a href="#n362">362</a></p>
+<p id="n363" class="pln"><a href="#n363">363</a></p>
+<p id="n364" class="pln"><a href="#n364">364</a></p>
+<p id="n365" class="stm run hide_run"><a href="#n365">365</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""rest module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">import</span> <span class="nam">wsme</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsme</span> <span class="key">import</span> <span class="nam">types</span> <span class="key">as</span> <span class="nam">wtypes</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">model</span> <span class="key">import</span> <span class="nam">url_parm</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">model</span> <span class="key">import</span> <span class="nam">model</span> <span class="key">as</span> <span class="nam">PythonModel</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">error_base</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">services</span> <span class="key">as</span> <span class="nam">RegionService</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v2</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">resources</span><span class="op">.</span><span class="nam">metadata</span> <span class="key">import</span> <span class="nam">RegionMetadataController</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v2</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">resources</span><span class="op">.</span><span class="nam">status</span> <span class="key">import</span> <span class="nam">RegionStatusController</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">policy</span> <span class="key">import</span> <span class="nam">policy</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run"><span class="key">class</span> <span class="nam">Address</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln">    <span class="str">"""wsme class for address json."""</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">    <span class="nam">country</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="stm run hide_run">    <span class="nam">state</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">    <span class="nam">city</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">    <span class="nam">street</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">    <span class="nam">zip</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">country</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">state</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">city</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln">                 <span class="nam">street</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">zip</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln"><span class="str">        :param country:</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln"><span class="str">        :param state:</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln"><span class="str">        :param city:</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln"><span class="str">        :param street:</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="pln"><span class="str">        :param zip:</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">country</span> <span class="op">=</span> <span class="nam">country</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">state</span> <span class="op">=</span> <span class="nam">state</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">city</span> <span class="op">=</span> <span class="nam">city</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">street</span> <span class="op">=</span> <span class="nam">street</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">zip</span> <span class="op">=</span> <span class="nam">zip</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_to_clean_python_obj</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="stm run hide_run">        <span class="nam">obj</span> <span class="op">=</span> <span class="nam">PythonModel</span><span class="op">.</span><span class="nam">Address</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">country</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">country</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">state</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">state</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">city</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">city</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">street</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">street</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">zip</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">zip</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm run hide_run">        <span class="key">return</span> <span class="nam">obj</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t61" class="stm run hide_run"><span class="key">class</span> <span class="nam">EndPoint</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln">    <span class="str">"""class method endpoints body."""</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t64" class="stm run hide_run">    <span class="nam">publicurl</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"publicURL"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="stm run hide_run">    <span class="nam">type</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">publicurl</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">type</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="pln">        <span class="str">"""init function.</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t70" class="pln"><span class="str">        :param publicURL: field</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="pln"><span class="str">        :param typee: field</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">type</span> <span class="op">=</span> <span class="nam">type</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">publicurl</span> <span class="op">=</span> <span class="nam">publicurl</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t77" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_to_clean_python_obj</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">        <span class="nam">obj</span> <span class="op">=</span> <span class="nam">PythonModel</span><span class="op">.</span><span class="nam">EndPoint</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">publicurl</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">publicurl</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">type</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">type</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="stm run hide_run">        <span class="key">return</span> <span class="nam">obj</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t83" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm run hide_run"><span class="key">class</span> <span class="nam">RegionsData</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="pln">    <span class="str">"""class method json header."""</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t87" class="stm run hide_run">    <span class="nam">status</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="stm run hide_run">    <span class="nam">id</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="stm run hide_run">    <span class="nam">name</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="stm run hide_run">    <span class="nam">ranger_agent_version</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"rangerAgentVersion"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm run hide_run">    <span class="nam">open_stack_version</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"OSVersion"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="stm run hide_run">    <span class="nam">clli</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"CLLI"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="stm run hide_run">    <span class="nam">metadata</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">{</span><span class="nam">str</span><span class="op">:</span> <span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">}</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="stm run hide_run">    <span class="nam">endpoints</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">EndPoint</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="stm run hide_run">    <span class="nam">address</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">Address</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="stm run hide_run">    <span class="nam">design_type</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"designType"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="stm run hide_run">    <span class="nam">location_type</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"locationType"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="stm run hide_run">    <span class="nam">vlcp_name</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"vlcpName"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="stm run hide_run">    <span class="nam">is_ecomp</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">bool</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"is_ecomp"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln">                           <span class="nam">default</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="stm run hide_run">    <span class="nam">is_ssp</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">bool</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"is_ssp"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="pln">                         <span class="nam">default</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="stm run hide_run">    <span class="nam">purpose_of_region</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"purpose_of_region"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t105" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">status</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">clli</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">design_type</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="pln">                 <span class="nam">location_type</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">vlcp_name</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">open_stack_version</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="pln">                 <span class="nam">address</span><span class="op">=</span><span class="nam">Address</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">ranger_agent_version</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">=</span><span class="op">{</span><span class="op">}</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="pln">                 <span class="nam">endpoint</span><span class="op">=</span><span class="op">[</span><span class="nam">EndPoint</span><span class="op">(</span><span class="op">)</span><span class="op">]</span><span class="op">,</span> <span class="nam">is_ecomp</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">is_ssp</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="pln">                 <span class="nam">purpose_of_region</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t112" class="pln"><span class="str">        :param status:</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="pln"><span class="str">        :param id:</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="pln"><span class="str">        :param name:</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="pln"><span class="str">        :param clli:</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="pln"><span class="str">        :param design_type:</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="pln"><span class="str">        :param location_type:</span><span class="strut">&nbsp;</span></p>
+<p id="t118" class="pln"><span class="str">        :param vlcp_name:</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="pln"><span class="str">        :param open_stack_version:</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="pln"><span class="str">        :param address:</span><span class="strut">&nbsp;</span></p>
+<p id="t121" class="pln"><span class="str">        :param ranger_agent_version:</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="pln"><span class="str">        :param metadata:</span><span class="strut">&nbsp;</span></p>
+<p id="t123" class="pln"><span class="str">        :param endpoint:</span><span class="strut">&nbsp;</span></p>
+<p id="t124" class="pln"><span class="str">        :param is_ecomp:</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="pln"><span class="str">        :param is_ssp:</span><span class="strut">&nbsp;</span></p>
+<p id="t126" class="pln"><span class="str">        :param purpose_of_region</span><span class="strut">&nbsp;</span></p>
+<p id="t127" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t128" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status</span> <span class="op">=</span> <span class="nam">status</span><span class="strut">&nbsp;</span></p>
+<p id="t129" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t131" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">clli</span> <span class="op">=</span> <span class="nam">clli</span><span class="strut">&nbsp;</span></p>
+<p id="t132" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">ranger_agent_version</span> <span class="op">=</span> <span class="nam">ranger_agent_version</span><span class="strut">&nbsp;</span></p>
+<p id="t133" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">metadata</span> <span class="op">=</span> <span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t134" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">endpoint</span> <span class="op">=</span> <span class="nam">endpoint</span><span class="strut">&nbsp;</span></p>
+<p id="t135" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">design_type</span> <span class="op">=</span> <span class="nam">design_type</span><span class="strut">&nbsp;</span></p>
+<p id="t136" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">location_type</span> <span class="op">=</span> <span class="nam">location_type</span><span class="strut">&nbsp;</span></p>
+<p id="t137" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">vlcp_name</span> <span class="op">=</span> <span class="nam">vlcp_name</span><span class="strut">&nbsp;</span></p>
+<p id="t138" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">address</span> <span class="op">=</span> <span class="nam">address</span><span class="strut">&nbsp;</span></p>
+<p id="t139" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">open_stack_version</span> <span class="op">=</span> <span class="nam">open_stack_version</span><span class="strut">&nbsp;</span></p>
+<p id="t140" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">is_ecomp</span> <span class="op">=</span> <span class="nam">is_ecomp</span><span class="strut">&nbsp;</span></p>
+<p id="t141" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">is_ssp</span> <span class="op">=</span> <span class="nam">is_ssp</span><span class="strut">&nbsp;</span></p>
+<p id="t142" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">purpose_of_region</span> <span class="op">=</span> <span class="nam">purpose_of_region</span><span class="strut">&nbsp;</span></p>
+<p id="t143" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t144" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_to_clean_python_obj</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t145" class="stm run hide_run">        <span class="nam">obj</span> <span class="op">=</span> <span class="nam">PythonModel</span><span class="op">.</span><span class="nam">RegionData</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t146" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">endpoints</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t147" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">status</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">status</span><span class="strut">&nbsp;</span></p>
+<p id="t148" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t149" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t150" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">ranger_agent_version</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">ranger_agent_version</span><span class="strut">&nbsp;</span></p>
+<p id="t151" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">clli</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">clli</span><span class="strut">&nbsp;</span></p>
+<p id="t152" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">metadata</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t153" class="stm run hide_run">        <span class="key">for</span> <span class="nam">endpoint</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">endpoints</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t154" class="stm run hide_run">            <span class="nam">obj</span><span class="op">.</span><span class="nam">endpoints</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">endpoint</span><span class="op">.</span><span class="nam">_to_clean_python_obj</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t155" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">address</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">address</span><span class="op">.</span><span class="nam">_to_clean_python_obj</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t156" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">design_type</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">design_type</span><span class="strut">&nbsp;</span></p>
+<p id="t157" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">location_type</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">location_type</span><span class="strut">&nbsp;</span></p>
+<p id="t158" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">vlcp_name</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">vlcp_name</span><span class="strut">&nbsp;</span></p>
+<p id="t159" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">open_stack_version</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">open_stack_version</span><span class="strut">&nbsp;</span></p>
+<p id="t160" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">is_ecomp</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">is_ecomp</span><span class="strut">&nbsp;</span></p>
+<p id="t161" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">is_ssp</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">is_ssp</span><span class="strut">&nbsp;</span></p>
+<p id="t162" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">purpose_of_region</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">purpose_of_region</span><span class="strut">&nbsp;</span></p>
+<p id="t163" class="stm run hide_run">        <span class="key">return</span> <span class="nam">obj</span><span class="strut">&nbsp;</span></p>
+<p id="t164" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t165" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t166" class="stm run hide_run"><span class="key">class</span> <span class="nam">Regions</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t167" class="pln">    <span class="str">"""main json header."""</span><span class="strut">&nbsp;</span></p>
+<p id="t168" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t169" class="stm run hide_run">    <span class="nam">regions</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">RegionsData</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t170" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t171" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">regions</span><span class="op">=</span><span class="op">[</span><span class="nam">RegionsData</span><span class="op">(</span><span class="op">)</span><span class="op">]</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t172" class="pln">        <span class="str">"""init function.</span><span class="strut">&nbsp;</span></p>
+<p id="t173" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t174" class="pln"><span class="str">        :param regions:</span><span class="strut">&nbsp;</span></p>
+<p id="t175" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t176" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t177" class="stm mis">        <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span> <span class="op">=</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t178" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t179" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t180" class="stm run hide_run"><span class="key">class</span> <span class="nam">RegionsController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t181" class="pln">    <span class="str">"""controller get resource."""</span><span class="strut">&nbsp;</span></p>
+<p id="t182" class="stm run hide_run">    <span class="nam">metadata</span> <span class="op">=</span> <span class="nam">RegionMetadataController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t183" class="stm run hide_run">    <span class="nam">status</span> <span class="op">=</span> <span class="nam">RegionStatusController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t184" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t185" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">Regions</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t186" class="pln">              <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t187" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_all</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">type</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">status</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">rangerAgentVersion</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t188" class="pln">                <span class="nam">clli</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">regionname</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">osversion</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">valet</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t189" class="pln">                <span class="nam">state</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">country</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">city</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">street</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">zip</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t190" class="pln">                <span class="nam">is_ecomp</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">is_ssp</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">purpose_of_region</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t191" class="pln">        <span class="str">"""get regions.</span><span class="strut">&nbsp;</span></p>
+<p id="t192" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t193" class="pln"><span class="str">        :param type: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t194" class="pln"><span class="str">        :param status: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t195" class="pln"><span class="str">        :param metadata: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t196" class="pln"><span class="str">        :param rangerAgentVersion: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t197" class="pln"><span class="str">        :param clli: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t198" class="pln"><span class="str">        :param regionname: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t199" class="pln"><span class="str">        :param osversion: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t200" class="pln"><span class="str">        :param valet: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t201" class="pln"><span class="str">        :param state: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t202" class="pln"><span class="str">        :param country: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t203" class="pln"><span class="str">        :param city: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t204" class="pln"><span class="str">        :param street: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t205" class="pln"><span class="str">        :param zip: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t206" class="pln"><span class="str">        :param is_ecomp: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t207" class="pln"><span class="str">        :param is_ssp: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t208" class="pln"><span class="str">        :param purpose_of_region: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t209" class="pln"><span class="str">        :return: json from db</span><span class="strut">&nbsp;</span></p>
+<p id="t210" class="pln"><span class="str">        :exception: EntityNotFoundError 404</span><span class="strut">&nbsp;</span></p>
+<p id="t211" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t212" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Entered Get Regions"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t213" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'region:get_all'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t214" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t215" class="stm run hide_run">        <span class="nam">url_args</span> <span class="op">=</span> <span class="op">{</span><span class="str">'type'</span><span class="op">:</span> <span class="nam">type</span><span class="op">,</span> <span class="str">'status'</span><span class="op">:</span> <span class="nam">status</span><span class="op">,</span> <span class="str">'metadata'</span><span class="op">:</span> <span class="nam">metadata</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t216" class="pln">                    <span class="str">'rangerAgentVersion'</span><span class="op">:</span> <span class="nam">rangerAgentVersion</span><span class="op">,</span> <span class="str">'clli'</span><span class="op">:</span> <span class="nam">clli</span><span class="op">,</span> <span class="str">'regionname'</span><span class="op">:</span> <span class="nam">regionname</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t217" class="pln">                    <span class="str">'osversion'</span><span class="op">:</span> <span class="nam">osversion</span><span class="op">,</span> <span class="str">'valet'</span><span class="op">:</span> <span class="nam">valet</span><span class="op">,</span> <span class="str">'state'</span><span class="op">:</span> <span class="nam">state</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t218" class="pln">                    <span class="str">'country'</span><span class="op">:</span> <span class="nam">country</span><span class="op">,</span> <span class="str">'city'</span><span class="op">:</span> <span class="nam">city</span><span class="op">,</span> <span class="str">'street'</span><span class="op">:</span> <span class="nam">street</span><span class="op">,</span> <span class="str">'zip'</span><span class="op">:</span> <span class="nam">zip</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t219" class="pln">                    <span class="str">'is_ecomp'</span><span class="op">:</span> <span class="nam">is_ecomp</span><span class="op">,</span> <span class="str">'is_ssp'</span><span class="op">:</span> <span class="nam">is_ssp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t220" class="pln">                    <span class="str">'purpose_of_region'</span><span class="op">:</span> <span class="nam">purpose_of_region</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t221" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Parameters: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">url_args</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t222" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t223" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t224" class="stm run hide_run">            <span class="nam">url_args</span> <span class="op">=</span> <span class="nam">url_parm</span><span class="op">.</span><span class="nam">UrlParms</span><span class="op">(</span><span class="op">**</span><span class="nam">url_args</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t225" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t226" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">get_regions_data</span><span class="op">(</span><span class="nam">url_args</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t227" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t228" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Returning regions: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="str">', '</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t229" class="pln">                <span class="op">[</span><span class="nam">region</span><span class="op">.</span><span class="nam">name</span> <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span> <span class="nam">result</span><span class="op">.</span><span class="nam">regions</span><span class="op">]</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t230" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t231" class="stm run hide_run">            <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t232" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t233" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t234" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"RegionsController {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t235" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t236" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t237" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t238" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t239" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t240" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t241" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t242" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t243" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t244" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t245" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">RegionsData</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t246" class="pln">    <span class="key">def</span> <span class="nam">get_one</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">id_or_name</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t247" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"API: Entered get region by id or name: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">id_or_name</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t248" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'region:get_one'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t249" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t250" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t251" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">get_region_by_id_or_name</span><span class="op">(</span><span class="nam">id_or_name</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t252" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"API: Got region {} success: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">id_or_name</span><span class="op">,</span> <span class="nam">result</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t253" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t254" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"RegionsController {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t255" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t256" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t257" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t258" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t259" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t260" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t261" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t262" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t263" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t264" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t265" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t266" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">RegionsData</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">RegionsData</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t267" class="pln">    <span class="key">def</span> <span class="nam">post</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">full_region_input</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t268" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"API: CreateRegion"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t269" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'region:create'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t270" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t271" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t272" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"API: create region .. data = : {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">full_region_input</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t273" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">create_full_region</span><span class="op">(</span><span class="nam">full_region_input</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t274" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"API: region created : {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t275" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t276" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region {} {} created: AICversion {}, OSversion {}, CLLI {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t277" class="pln">                <span class="nam">full_region_input</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span> <span class="nam">full_region_input</span><span class="op">.</span><span class="nam">design_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t278" class="pln">                <span class="nam">full_region_input</span><span class="op">.</span><span class="nam">ranger_agent_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t279" class="pln">                <span class="nam">full_region_input</span><span class="op">.</span><span class="nam">open_stack_version</span><span class="op">,</span> <span class="nam">full_region_input</span><span class="op">.</span><span class="nam">clli</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t280" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'create region'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t281" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">full_region_input</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t282" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t283" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t284" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Error in save region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t285" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t286" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">status_code</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t287" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t288" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t289" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ConflictError</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t290" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Conflict error {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t291" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t292" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t293" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t294" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t295" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t296" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Error in creating region .. reason:- {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t297" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t298" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t299" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t300" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t301" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t302" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t303" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">None</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">204</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t304" class="pln">    <span class="key">def</span> <span class="nam">delete</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t305" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Delete Region"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t306" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'region:delete'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t307" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t308" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t309" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t310" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"delete region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t311" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">delete_region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t312" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"region deleted"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t313" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t314" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region {} deleted'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t315" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'delete region'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t316" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t317" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t318" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t319" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t320" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t321" class="pln">                <span class="str">"error in deleting region .. reason:- {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t322" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t323" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t324" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t325" class="stm run hide_run">        <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t326" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t327" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">RegionsData</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">RegionsData</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t328" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t329" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">region</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t330" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"API: update region"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t331" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'region:update'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t332" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t333" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t334" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t335" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t336" class="pln">                <span class="str">"region to update {} with{}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">region</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t337" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">update_region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t338" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"API: region {} updated"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t339" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t340" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region {} {} modified: AICversion {}, OSversion {}, CLLI {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t341" class="pln">                <span class="nam">region</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span> <span class="nam">region</span><span class="op">.</span><span class="nam">design_type</span><span class="op">,</span> <span class="nam">region</span><span class="op">.</span><span class="nam">ranger_agent_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t342" class="pln">                <span class="nam">region</span><span class="op">.</span><span class="nam">open_stack_version</span><span class="op">,</span> <span class="nam">region</span><span class="op">.</span><span class="nam">clli</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t343" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'update region'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t344" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t345" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t346" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t347" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t348" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"region {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t349" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t350" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">status_code</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t351" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t352" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t353" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t354" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"not valid input {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t355" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t356" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">status_code</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t357" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t358" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t359" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t360" class="pln">                <span class="str">"API: error in updating region {}.. reason:- {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t361" class="pln">                                                                        <span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t362" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t363" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t364" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t365" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-13 01:58
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_controllers_v2_orm_resources_status_py.html b/orm/services/region_manager/cover/rms_controllers_v2_orm_resources_status_py.html
new file mode 100644
index 00000000..f719798a
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_controllers_v2_orm_resources_status_py.html
@@ -0,0 +1,299 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/orm/resources/status.py: 94%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/orm/resources/status.py</b> :
+            <span class="pc_cov">94%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            47 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">44 run</span>
+            <span class="mis shortkey_m button_toggle_mis">3 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p>
+<p id="n25" class="stm run hide_run"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="pln"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="pln"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="stm run hide_run"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="pln"><a href="#n58">58</a></p>
+<p id="n59" class="stm run hide_run"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="stm run hide_run"><a href="#n64">64</a></p>
+<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p>
+<p id="n66" class="pln"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="pln"><a href="#n68">68</a></p>
+<p id="n69" class="stm run hide_run"><a href="#n69">69</a></p>
+<p id="n70" class="pln"><a href="#n70">70</a></p>
+<p id="n71" class="pln"><a href="#n71">71</a></p>
+<p id="n72" class="stm run hide_run"><a href="#n72">72</a></p>
+<p id="n73" class="pln"><a href="#n73">73</a></p>
+<p id="n74" class="stm run hide_run"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="pln"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="pln"><a href="#n79">79</a></p>
+<p id="n80" class="stm run hide_run"><a href="#n80">80</a></p>
+<p id="n81" class="stm run hide_run"><a href="#n81">81</a></p>
+<p id="n82" class="stm run hide_run"><a href="#n82">82</a></p>
+<p id="n83" class="pln"><a href="#n83">83</a></p>
+<p id="n84" class="pln"><a href="#n84">84</a></p>
+<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p>
+<p id="n87" class="stm run hide_run"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="pln"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="stm run hide_run"><a href="#n91">91</a></p>
+<p id="n92" class="pln"><a href="#n92">92</a></p>
+<p id="n93" class="stm mis"><a href="#n93">93</a></p>
+<p id="n94" class="pln"><a href="#n94">94</a></p>
+<p id="n95" class="pln"><a href="#n95">95</a></p>
+<p id="n96" class="stm run hide_run"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="pln"><a href="#n98">98</a></p>
+<p id="n99" class="stm mis"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="pln"><a href="#n101">101</a></p>
+<p id="n102" class="stm run hide_run"><a href="#n102">102</a></p>
+<p id="n103" class="pln"><a href="#n103">103</a></p>
+<p id="n104" class="stm mis"><a href="#n104">104</a></p>
+<p id="n105" class="pln"><a href="#n105">105</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">import</span> <span class="nam">pecan</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="op">,</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">import</span> <span class="nam">wsme</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsme</span> <span class="key">import</span> <span class="nam">types</span> <span class="key">as</span> <span class="nam">wtypes</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">error_base</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">services</span> <span class="key">as</span> <span class="nam">RegionService</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run"><span class="key">class</span> <span class="nam">RegionStatus</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">    <span class="str">"""main json header."""</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm run hide_run">    <span class="nam">status</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">str</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="stm run hide_run">    <span class="nam">links</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">{</span><span class="nam">str</span><span class="op">:</span> <span class="nam">str</span><span class="op">}</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">status</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">links</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln"><span class="str">        RegionStatus wrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="str">        :param status:</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status</span> <span class="op">=</span> <span class="nam">status</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">links</span> <span class="op">=</span> <span class="nam">links</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm run hide_run"><span class="key">class</span> <span class="nam">RegionStatusController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">RegionStatus</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">RegionStatus</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">new_status</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln"><span class="str">        Handle put request to modify region status</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="pln"><span class="str">        :param region_id:</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln"><span class="str">        :param new_status:</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="pln"><span class="str">        :return: 200 for updated, 404 for region not found</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln"><span class="str">        400 invalid status</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Entered update region status"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Got status: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">new_status</span><span class="op">.</span><span class="nam">status</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'status:put'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">            <span class="nam">allowed_status</span> <span class="op">=</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">region_options</span><span class="op">.</span><span class="nam">allowed_status_values</span><span class="op">[</span><span class="op">:</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">            <span class="key">if</span> <span class="nam">new_status</span><span class="op">.</span><span class="nam">status</span> <span class="key">not</span> <span class="key">in</span> <span class="nam">allowed_status</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">                <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Invalid status. Region status "</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="pln">                             <span class="str">"must be one of {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">allowed_status</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="stm run hide_run">                <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln">                    <span class="nam">message</span><span class="op">=</span><span class="str">"Invalid status. Region status "</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln">                            <span class="str">"must be one of {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">allowed_status</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln">            <span class="com"># May raise an exception which will return status code 400</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="stm run hide_run">            <span class="nam">status</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">update_region_status</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">new_status</span><span class="op">.</span><span class="nam">status</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="stm run hide_run">            <span class="nam">base_link</span> <span class="op">=</span> <span class="str">'https://{0}:{1}{2}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">conf</span><span class="op">.</span><span class="nam">server</span><span class="op">.</span><span class="nam">host</span><span class="op">,</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">server</span><span class="op">.</span><span class="nam">port</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="pln">                                                    <span class="nam">pecan</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">path</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">            <span class="nam">link</span> <span class="op">=</span> <span class="op">{</span><span class="str">'self'</span><span class="op">:</span> <span class="nam">base_link</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t69" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Region status for region id {}, was successfully "</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="pln">                         <span class="str">"changed to: {}."</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">new_status</span><span class="op">.</span><span class="nam">status</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t72" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region {} status updated to {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="pln">                <span class="nam">region_id</span><span class="op">,</span> <span class="nam">new_status</span><span class="op">.</span><span class="nam">status</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'Update status'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">            <span class="key">return</span> <span class="nam">RegionStatus</span><span class="op">(</span><span class="nam">status</span><span class="op">,</span> <span class="nam">link</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t80" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="pln">    <span class="key">def</span> <span class="nam">get</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="stm mis">        <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="pln">                                  <span class="nam">status_code</span><span class="op">=</span><span class="num">405</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t96" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">RegionStatus</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">RegionStatus</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="pln">    <span class="key">def</span> <span class="nam">post</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">status</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="stm mis">        <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln">                                  <span class="nam">status_code</span><span class="op">=</span><span class="num">405</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t102" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="pln">    <span class="key">def</span> <span class="nam">delete</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="stm mis">        <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="pln">                                  <span class="nam">status_code</span><span class="op">=</span><span class="num">405</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_controllers_v2_orm_root_py.html b/orm/services/region_manager/cover/rms_controllers_v2_orm_root_py.html
new file mode 100644
index 00000000..df7c358c
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_controllers_v2_orm_root_py.html
@@ -0,0 +1,109 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/orm/root.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/orm/root.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            5 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">5 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""ORM controller module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v2</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">resources</span> <span class="key">import</span> <span class="nam">groups</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v2</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">resources</span> <span class="key">import</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">class</span> <span class="nam">OrmController</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln">    <span class="str">"""ORM controller class."""</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run">    <span class="nam">regions</span> <span class="op">=</span> <span class="nam">regions</span><span class="op">.</span><span class="nam">RegionsController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run">    <span class="nam">groups</span> <span class="op">=</span> <span class="nam">groups</span><span class="op">.</span><span class="nam">GroupsController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_controllers_v2_root_py.html b/orm/services/region_manager/cover/rms_controllers_v2_root_py.html
new file mode 100644
index 00000000..addd8179
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_controllers_v2_root_py.html
@@ -0,0 +1,105 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/root.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/root.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            3 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">3 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""V2 root controller module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v2</span><span class="op">.</span><span class="nam">orm</span> <span class="key">import</span> <span class="nam">root</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">class</span> <span class="nam">V2Controller</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln">    <span class="str">"""V2 root controller class."""</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run">    <span class="nam">orm</span> <span class="op">=</span> <span class="nam">root</span><span class="op">.</span><span class="nam">OrmController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_external_mock___init___py.html b/orm/services/region_manager/cover/rms_external_mock___init___py.html
new file mode 100644
index 00000000..301a20c8
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_external_mock___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_external_mock_audit_client___init___py.html b/orm/services/region_manager/cover/rms_external_mock_audit_client___init___py.html
new file mode 100644
index 00000000..0ba1d066
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_external_mock_audit_client___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/audit_client/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/audit_client/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_external_mock_audit_client_api___init___py.html b/orm/services/region_manager/cover/rms_external_mock_audit_client_api___init___py.html
new file mode 100644
index 00000000..9415cc4a
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_external_mock_audit_client_api___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/audit_client/api/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/audit_client/api/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_external_mock_audit_client_api_audit_py.html b/orm/services/region_manager/cover/rms_external_mock_audit_client_api_audit_py.html
new file mode 100644
index 00000000..92fe9996
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_external_mock_audit_client_api_audit_py.html
@@ -0,0 +1,101 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/audit_client/api/audit.py: 0%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/audit_client/api/audit.py</b> :
+            <span class="pc_cov">0%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            4 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">4 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm mis"><a href="#n1">1</a></p>
+<p id="n2" class="stm mis"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm mis"><a href="#n5">5</a></p>
+<p id="n6" class="stm mis"><a href="#n6">6</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm mis"><span class="key">def</span> <span class="nam">audit</span><span class="op">(</span><span class="op">*</span><span class="nam">args</span><span class="op">,</span> <span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm mis">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm mis"><span class="key">def</span> <span class="nam">init</span><span class="op">(</span><span class="op">*</span><span class="nam">args</span><span class="op">,</span> <span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm mis">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_external_mock_keystone_utils___init___py.html b/orm/services/region_manager/cover/rms_external_mock_keystone_utils___init___py.html
new file mode 100644
index 00000000..c91da3f1
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_external_mock_keystone_utils___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/keystone_utils/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/keystone_utils/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_external_mock_keystone_utils_tokens_py.html b/orm/services/region_manager/cover/rms_external_mock_keystone_utils_tokens_py.html
new file mode 100644
index 00000000..b833593b
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_external_mock_keystone_utils_tokens_py.html
@@ -0,0 +1,103 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/keystone_utils/tokens.py: 80%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/keystone_utils/tokens.py</b> :
+            <span class="pc_cov">80%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            5 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">4 run</span>
+            <span class="mis shortkey_m button_toggle_mis">1 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm mis"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_token_user</span><span class="op">(</span><span class="op">*</span><span class="nam">a</span><span class="op">,</span> <span class="op">**</span><span class="nam">k</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm mis">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">class</span> <span class="nam">TokenConf</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="op">*</span><span class="nam">a</span><span class="op">,</span> <span class="op">**</span><span class="nam">kw</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run">        <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_external_mock_orm_common___init___py.html b/orm/services/region_manager/cover/rms_external_mock_orm_common___init___py.html
new file mode 100644
index 00000000..9d0575ed
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_external_mock_orm_common___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/orm_common/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/orm_common/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_external_mock_orm_common_policy___init___py.html b/orm/services/region_manager/cover/rms_external_mock_orm_common_policy___init___py.html
new file mode 100644
index 00000000..4367b302
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_external_mock_orm_common_policy___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/orm_common/policy/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/orm_common/policy/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_external_mock_orm_common_policy_policy_py.html b/orm/services/region_manager/cover/rms_external_mock_orm_common_policy_policy_py.html
new file mode 100644
index 00000000..972d1dcf
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_external_mock_orm_common_policy_policy_py.html
@@ -0,0 +1,109 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/orm_common/policy/policy.py: 67%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/orm_common/policy/policy.py</b> :
+            <span class="pc_cov">67%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            6 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">4 run</span>
+            <span class="mis shortkey_m button_toggle_mis">2 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm mis"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm mis"><a href="#n10">10</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">def</span> <span class="nam">init</span><span class="op">(</span><span class="op">*</span><span class="nam">a</span><span class="op">,</span> <span class="op">**</span><span class="nam">kw</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">def</span> <span class="nam">enforce</span><span class="op">(</span><span class="op">*</span><span class="nam">a</span><span class="op">,</span> <span class="op">**</span><span class="nam">kw</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm mis">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">def</span> <span class="nam">authorize</span><span class="op">(</span><span class="op">*</span><span class="nam">a</span><span class="op">,</span> <span class="op">**</span><span class="nam">kw</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm mis">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_external_mock_orm_common_utils___init___py.html b/orm/services/region_manager/cover/rms_external_mock_orm_common_utils___init___py.html
new file mode 100644
index 00000000..e339ed1a
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_external_mock_orm_common_utils___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/orm_common/utils/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/orm_common/utils/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_external_mock_orm_common_utils_api_error_utils_py.html b/orm/services/region_manager/cover/rms_external_mock_orm_common_utils_api_error_utils_py.html
new file mode 100644
index 00000000..9979bae3
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_external_mock_orm_common_utils_api_error_utils_py.html
@@ -0,0 +1,93 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/orm_common/utils/api_error_utils.py: 50%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/orm_common/utils/api_error_utils.py</b> :
+            <span class="pc_cov">50%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            2 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">1 run</span>
+            <span class="mis shortkey_m button_toggle_mis">1 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm mis"><a href="#n2">2</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_error</span><span class="op">(</span><span class="op">*</span><span class="nam">args</span><span class="op">,</span> <span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm mis">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_external_mock_orm_common_utils_utils_py.html b/orm/services/region_manager/cover/rms_external_mock_orm_common_utils_utils_py.html
new file mode 100644
index 00000000..fa2be4b5
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_external_mock_orm_common_utils_utils_py.html
@@ -0,0 +1,119 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/orm_common/utils/utils.py: 83%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/orm_common/utils/utils.py</b> :
+            <span class="pc_cov">83%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            6 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">5 run</span>
+            <span class="mis shortkey_m button_toggle_mis">1 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="stm mis"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""Utils module mock."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">def</span> <span class="nam">report_config</span><span class="op">(</span><span class="nam">conf</span><span class="op">,</span> <span class="nam">dump</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln">    <span class="str">"""Mock report_config function."""</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm mis">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">def</span> <span class="nam">set_utils_conf</span><span class="op">(</span><span class="nam">conf</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln">    <span class="str">"""Mock set_utils_conf function."""</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run"><span class="key">def</span> <span class="nam">audit_trail</span><span class="op">(</span><span class="op">*</span><span class="nam">args</span><span class="op">,</span> <span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_model___init___py.html b/orm/services/region_manager/cover/rms_model___init___py.html
new file mode 100644
index 00000000..dd0a069f
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_model___init___py.html
@@ -0,0 +1,119 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/model/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/model/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            3 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">3 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span>  <span class="com"># noqa</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">def</span> <span class="nam">init_model</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="str">    This is a stub method which is called at application startup time.</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="str">    If you need to bind to a parsed database configuration, set up tables or</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="str">    ORM classes, or perform any database initialization, this is the</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln"><span class="str">    recommended place to do it.</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="str">    For more information working with databases, and some common recipes,</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="str">    see http://pecan.readthedocs.org/en/latest/databases.html</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_model_model_py.html b/orm/services/region_manager/cover/rms_model_model_py.html
new file mode 100644
index 00000000..d4a4be2a
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_model_model_py.html
@@ -0,0 +1,475 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/model/model.py: 93%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/model/model.py</b> :
+            <span class="pc_cov">93%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            100 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">93 run</span>
+            <span class="mis shortkey_m button_toggle_mis">7 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="stm run hide_run"><a href="#n22">22</a></p>
+<p id="n23" class="stm run hide_run"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="stm run hide_run"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="pln"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="pln"><a href="#n48">48</a></p>
+<p id="n49" class="pln"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="pln"><a href="#n53">53</a></p>
+<p id="n54" class="pln"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="pln"><a href="#n56">56</a></p>
+<p id="n57" class="pln"><a href="#n57">57</a></p>
+<p id="n58" class="pln"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="pln"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="pln"><a href="#n68">68</a></p>
+<p id="n69" class="stm run hide_run"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="stm run hide_run"><a href="#n71">71</a></p>
+<p id="n72" class="stm run hide_run"><a href="#n72">72</a></p>
+<p id="n73" class="stm run hide_run"><a href="#n73">73</a></p>
+<p id="n74" class="stm run hide_run"><a href="#n74">74</a></p>
+<p id="n75" class="stm run hide_run"><a href="#n75">75</a></p>
+<p id="n76" class="stm run hide_run"><a href="#n76">76</a></p>
+<p id="n77" class="stm run hide_run"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="stm run hide_run"><a href="#n79">79</a></p>
+<p id="n80" class="stm run hide_run"><a href="#n80">80</a></p>
+<p id="n81" class="stm run hide_run"><a href="#n81">81</a></p>
+<p id="n82" class="pln"><a href="#n82">82</a></p>
+<p id="n83" class="stm run hide_run"><a href="#n83">83</a></p>
+<p id="n84" class="stm run hide_run"><a href="#n84">84</a></p>
+<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p>
+<p id="n87" class="stm run hide_run"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="stm mis"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="pln"><a href="#n91">91</a></p>
+<p id="n92" class="stm run hide_run"><a href="#n92">92</a></p>
+<p id="n93" class="stm run hide_run"><a href="#n93">93</a></p>
+<p id="n94" class="stm run hide_run"><a href="#n94">94</a></p>
+<p id="n95" class="stm run hide_run"><a href="#n95">95</a></p>
+<p id="n96" class="stm run hide_run"><a href="#n96">96</a></p>
+<p id="n97" class="stm run hide_run"><a href="#n97">97</a></p>
+<p id="n98" class="pln"><a href="#n98">98</a></p>
+<p id="n99" class="pln"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="stm run hide_run"><a href="#n101">101</a></p>
+<p id="n102" class="stm run hide_run"><a href="#n102">102</a></p>
+<p id="n103" class="stm run hide_run"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="pln"><a href="#n105">105</a></p>
+<p id="n106" class="stm run hide_run"><a href="#n106">106</a></p>
+<p id="n107" class="pln"><a href="#n107">107</a></p>
+<p id="n108" class="stm run hide_run"><a href="#n108">108</a></p>
+<p id="n109" class="stm run hide_run"><a href="#n109">109</a></p>
+<p id="n110" class="stm run hide_run"><a href="#n110">110</a></p>
+<p id="n111" class="stm run hide_run"><a href="#n111">111</a></p>
+<p id="n112" class="stm run hide_run"><a href="#n112">112</a></p>
+<p id="n113" class="stm run hide_run"><a href="#n113">113</a></p>
+<p id="n114" class="pln"><a href="#n114">114</a></p>
+<p id="n115" class="stm run hide_run"><a href="#n115">115</a></p>
+<p id="n116" class="stm run hide_run"><a href="#n116">116</a></p>
+<p id="n117" class="pln"><a href="#n117">117</a></p>
+<p id="n118" class="stm run hide_run"><a href="#n118">118</a></p>
+<p id="n119" class="stm run hide_run"><a href="#n119">119</a></p>
+<p id="n120" class="stm run hide_run"><a href="#n120">120</a></p>
+<p id="n121" class="stm run hide_run"><a href="#n121">121</a></p>
+<p id="n122" class="stm run hide_run"><a href="#n122">122</a></p>
+<p id="n123" class="pln"><a href="#n123">123</a></p>
+<p id="n124" class="stm run hide_run"><a href="#n124">124</a></p>
+<p id="n125" class="stm run hide_run"><a href="#n125">125</a></p>
+<p id="n126" class="stm run hide_run"><a href="#n126">126</a></p>
+<p id="n127" class="stm run hide_run"><a href="#n127">127</a></p>
+<p id="n128" class="stm run hide_run"><a href="#n128">128</a></p>
+<p id="n129" class="stm run hide_run"><a href="#n129">129</a></p>
+<p id="n130" class="stm run hide_run"><a href="#n130">130</a></p>
+<p id="n131" class="stm run hide_run"><a href="#n131">131</a></p>
+<p id="n132" class="stm run hide_run"><a href="#n132">132</a></p>
+<p id="n133" class="stm run hide_run"><a href="#n133">133</a></p>
+<p id="n134" class="stm run hide_run"><a href="#n134">134</a></p>
+<p id="n135" class="stm run hide_run"><a href="#n135">135</a></p>
+<p id="n136" class="stm run hide_run"><a href="#n136">136</a></p>
+<p id="n137" class="stm run hide_run"><a href="#n137">137</a></p>
+<p id="n138" class="stm run hide_run"><a href="#n138">138</a></p>
+<p id="n139" class="stm run hide_run"><a href="#n139">139</a></p>
+<p id="n140" class="stm run hide_run"><a href="#n140">140</a></p>
+<p id="n141" class="stm run hide_run"><a href="#n141">141</a></p>
+<p id="n142" class="stm run hide_run"><a href="#n142">142</a></p>
+<p id="n143" class="stm run hide_run"><a href="#n143">143</a></p>
+<p id="n144" class="stm run hide_run"><a href="#n144">144</a></p>
+<p id="n145" class="pln"><a href="#n145">145</a></p>
+<p id="n146" class="pln"><a href="#n146">146</a></p>
+<p id="n147" class="stm run hide_run"><a href="#n147">147</a></p>
+<p id="n148" class="pln"><a href="#n148">148</a></p>
+<p id="n149" class="pln"><a href="#n149">149</a></p>
+<p id="n150" class="stm run hide_run"><a href="#n150">150</a></p>
+<p id="n151" class="pln"><a href="#n151">151</a></p>
+<p id="n152" class="pln"><a href="#n152">152</a></p>
+<p id="n153" class="pln"><a href="#n153">153</a></p>
+<p id="n154" class="pln"><a href="#n154">154</a></p>
+<p id="n155" class="pln"><a href="#n155">155</a></p>
+<p id="n156" class="stm run hide_run"><a href="#n156">156</a></p>
+<p id="n157" class="pln"><a href="#n157">157</a></p>
+<p id="n158" class="pln"><a href="#n158">158</a></p>
+<p id="n159" class="stm run hide_run"><a href="#n159">159</a></p>
+<p id="n160" class="pln"><a href="#n160">160</a></p>
+<p id="n161" class="pln"><a href="#n161">161</a></p>
+<p id="n162" class="stm run hide_run"><a href="#n162">162</a></p>
+<p id="n163" class="pln"><a href="#n163">163</a></p>
+<p id="n164" class="pln"><a href="#n164">164</a></p>
+<p id="n165" class="pln"><a href="#n165">165</a></p>
+<p id="n166" class="pln"><a href="#n166">166</a></p>
+<p id="n167" class="pln"><a href="#n167">167</a></p>
+<p id="n168" class="pln"><a href="#n168">168</a></p>
+<p id="n169" class="stm run hide_run"><a href="#n169">169</a></p>
+<p id="n170" class="stm run hide_run"><a href="#n170">170</a></p>
+<p id="n171" class="stm run hide_run"><a href="#n171">171</a></p>
+<p id="n172" class="stm run hide_run"><a href="#n172">172</a></p>
+<p id="n173" class="pln"><a href="#n173">173</a></p>
+<p id="n174" class="stm run hide_run"><a href="#n174">174</a></p>
+<p id="n175" class="stm mis"><a href="#n175">175</a></p>
+<p id="n176" class="stm mis"><a href="#n176">176</a></p>
+<p id="n177" class="stm mis"><a href="#n177">177</a></p>
+<p id="n178" class="stm mis"><a href="#n178">178</a></p>
+<p id="n179" class="stm mis"><a href="#n179">179</a></p>
+<p id="n180" class="pln"><a href="#n180">180</a></p>
+<p id="n181" class="pln"><a href="#n181">181</a></p>
+<p id="n182" class="stm run hide_run"><a href="#n182">182</a></p>
+<p id="n183" class="pln"><a href="#n183">183</a></p>
+<p id="n184" class="pln"><a href="#n184">184</a></p>
+<p id="n185" class="stm run hide_run"><a href="#n185">185</a></p>
+<p id="n186" class="pln"><a href="#n186">186</a></p>
+<p id="n187" class="pln"><a href="#n187">187</a></p>
+<p id="n188" class="pln"><a href="#n188">188</a></p>
+<p id="n189" class="pln"><a href="#n189">189</a></p>
+<p id="n190" class="stm run hide_run"><a href="#n190">190</a></p>
+<p id="n191" class="stm run hide_run"><a href="#n191">191</a></p>
+<p id="n192" class="pln"><a href="#n192">192</a></p>
+<p id="n193" class="stm mis"><a href="#n193">193</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""model module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">error_base</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">class</span> <span class="nam">Address</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln">    <span class="str">"""address class."""</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">country</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">state</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">city</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln">                 <span class="nam">street</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">zip</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="str">        :param country:</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="str">        :param state:</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln"><span class="str">        :param city:</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="str">        :param street:</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="str">        :param zip:</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">country</span> <span class="op">=</span> <span class="nam">country</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">state</span> <span class="op">=</span> <span class="nam">state</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">city</span> <span class="op">=</span> <span class="nam">city</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">street</span> <span class="op">=</span> <span class="nam">street</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">zip</span> <span class="op">=</span> <span class="nam">zip</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run"><span class="key">class</span> <span class="nam">EndPoint</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln">    <span class="str">"""class method endpoints body."""</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">publicurl</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">type</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln">        <span class="str">"""init function.</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln"><span class="str">        :param public_url: field</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln"><span class="str">        :param type: field</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">type</span> <span class="op">=</span> <span class="nam">type</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">publicurl</span> <span class="op">=</span> <span class="nam">publicurl</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm run hide_run"><span class="key">class</span> <span class="nam">RegionData</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln">    <span class="str">"""class method json header."""</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">status</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">clli</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln">                 <span class="nam">ranger_agent_version</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">design_type</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">location_type</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="pln">                 <span class="nam">vlcp_name</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">open_stack_version</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln">                 <span class="nam">address</span><span class="op">=</span><span class="nam">Address</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">is_ecomp</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">is_ssp</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln">                 <span class="nam">purpose_of_region</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">=</span><span class="op">{</span><span class="op">}</span><span class="op">,</span> <span class="nam">endpoints</span><span class="op">=</span><span class="op">[</span><span class="nam">EndPoint</span><span class="op">(</span><span class="op">)</span><span class="op">]</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln"><span class="str">        :param status:</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln"><span class="str">        :param id:</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln"><span class="str">        :param name:</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="pln"><span class="str">        :param clli:</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="pln"><span class="str">        :param ranger_agent_version:</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln"><span class="str">        :param design_type:</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="pln"><span class="str">        :param location_type:</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="pln"><span class="str">        :param vlcp_name:</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="pln"><span class="str">        :param open_stack_version:</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln"><span class="str">        :param address:</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln"><span class="str">        :param is_ecomp</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln"><span class="str">        :param is_ssp</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln"><span class="str">        :param purpose_of_region</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln"><span class="str">        :param metadata:</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln"><span class="str">        :param endpoints:</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status</span> <span class="op">=</span> <span class="nam">status</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="pln">        <span class="com"># make id and name always the same</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">clli</span> <span class="op">=</span> <span class="nam">clli</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">ranger_agent_version</span> <span class="op">=</span> <span class="nam">ranger_agent_version</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">metadata</span> <span class="op">=</span> <span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">endpoints</span> <span class="op">=</span> <span class="nam">endpoints</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">design_type</span> <span class="op">=</span> <span class="nam">design_type</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">location_type</span> <span class="op">=</span> <span class="nam">location_type</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">vlcp_name</span> <span class="op">=</span> <span class="nam">vlcp_name</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">open_stack_version</span> <span class="op">=</span> <span class="nam">open_stack_version</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">address</span> <span class="op">=</span> <span class="nam">address</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">is_ecomp</span> <span class="op">=</span> <span class="nam">is_ecomp</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">is_ssp</span> <span class="op">=</span> <span class="nam">is_ssp</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">purpose_of_region</span> <span class="op">=</span> <span class="nam">purpose_of_region</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t83" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_validate_end_points</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">endpoints_types_must_have</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm run hide_run">        <span class="nam">ep_duplicate</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm run hide_run">        <span class="key">for</span> <span class="nam">endpoint</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">endpoints</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm run hide_run">            <span class="key">if</span> <span class="nam">endpoint</span><span class="op">.</span><span class="nam">type</span> <span class="key">not</span> <span class="key">in</span> <span class="nam">ep_duplicate</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="stm run hide_run">                <span class="nam">ep_duplicate</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">endpoint</span><span class="op">.</span><span class="nam">type</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln">            <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="stm mis">                <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln">                    <span class="nam">message</span><span class="op">=</span><span class="str">"Invalid endpoints. Duplicate endpoint "</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="pln">                            <span class="str">"type {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">endpoint</span><span class="op">.</span><span class="nam">type</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="stm run hide_run">            <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="stm run hide_run">                <span class="nam">endpoints_types_must_have</span><span class="op">.</span><span class="nam">remove</span><span class="op">(</span><span class="nam">endpoint</span><span class="op">.</span><span class="nam">type</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="stm run hide_run">            <span class="key">except</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="stm run hide_run">                <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="stm run hide_run">        <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">endpoints_types_must_have</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="pln">                <span class="nam">message</span><span class="op">=</span><span class="str">"Invalid endpoints. Endpoint type '{}' "</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="pln">                        <span class="str">"is missing"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">endpoints_types_must_have</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t101" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_validate_status</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">allowed_status</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="stm run hide_run">        <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">status</span> <span class="key">not</span> <span class="key">in</span> <span class="nam">allowed_status</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln">                <span class="nam">message</span><span class="op">=</span><span class="str">"Invalid status. Region status must be "</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="pln">                        <span class="str">"one of {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">allowed_status</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="stm run hide_run">        <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t108" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_validate_model</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="stm run hide_run">        <span class="nam">allowed_status</span> <span class="op">=</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">region_options</span><span class="op">.</span><span class="nam">allowed_status_values</span><span class="op">[</span><span class="op">:</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="stm run hide_run">        <span class="nam">endpoints_types_must_have</span> <span class="op">=</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">region_options</span><span class="op">.</span><span class="nam">endpoints_types_must_have</span><span class="op">[</span><span class="op">:</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">_validate_status</span><span class="op">(</span><span class="nam">allowed_status</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t112" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">_validate_end_points</span><span class="op">(</span><span class="nam">endpoints_types_must_have</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="stm run hide_run">        <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t115" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_to_db_model_dict</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="stm run hide_run">        <span class="nam">end_points</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t118" class="stm run hide_run">        <span class="key">for</span> <span class="nam">endpoint</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">endpoints</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="stm run hide_run">            <span class="nam">ep</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="stm run hide_run">            <span class="nam">ep</span><span class="op">[</span><span class="str">'type'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">endpoint</span><span class="op">.</span><span class="nam">type</span><span class="strut">&nbsp;</span></p>
+<p id="t121" class="stm run hide_run">            <span class="nam">ep</span><span class="op">[</span><span class="str">'url'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">endpoint</span><span class="op">.</span><span class="nam">publicurl</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="stm run hide_run">            <span class="nam">end_points</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">ep</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t123" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t124" class="stm run hide_run">        <span class="nam">db_model_dict</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'region_id'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t126" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t127" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'address_state'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">address</span><span class="op">.</span><span class="nam">state</span><span class="strut">&nbsp;</span></p>
+<p id="t128" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'address_country'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">address</span><span class="op">.</span><span class="nam">country</span><span class="strut">&nbsp;</span></p>
+<p id="t129" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'address_city'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">address</span><span class="op">.</span><span class="nam">city</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'address_street'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">address</span><span class="op">.</span><span class="nam">street</span><span class="strut">&nbsp;</span></p>
+<p id="t131" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'address_zip'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">address</span><span class="op">.</span><span class="nam">zip</span><span class="strut">&nbsp;</span></p>
+<p id="t132" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'region_status'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">status</span><span class="strut">&nbsp;</span></p>
+<p id="t133" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'ranger_agent_version'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">ranger_agent_version</span><span class="strut">&nbsp;</span></p>
+<p id="t134" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'open_stack_version'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">open_stack_version</span><span class="strut">&nbsp;</span></p>
+<p id="t135" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'design_type'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">design_type</span><span class="strut">&nbsp;</span></p>
+<p id="t136" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'location_type'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">location_type</span><span class="strut">&nbsp;</span></p>
+<p id="t137" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'vlcp_name'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">location_type</span><span class="strut">&nbsp;</span></p>
+<p id="t138" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'clli'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">clli</span><span class="strut">&nbsp;</span></p>
+<p id="t139" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'is_ecomp'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">is_ecomp</span> <span class="op">*</span> <span class="num">1</span><span class="strut">&nbsp;</span></p>
+<p id="t140" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'is_ssp'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">is_ssp</span> <span class="op">*</span> <span class="num">1</span><span class="strut">&nbsp;</span></p>
+<p id="t141" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'purpose_of_region'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">purpose_of_region</span><span class="strut">&nbsp;</span></p>
+<p id="t142" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'end_point_list'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">end_points</span><span class="strut">&nbsp;</span></p>
+<p id="t143" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'meta_data_dict'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t144" class="stm run hide_run">        <span class="key">return</span> <span class="nam">db_model_dict</span><span class="strut">&nbsp;</span></p>
+<p id="t145" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t146" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t147" class="stm run hide_run"><span class="key">class</span> <span class="nam">Regions</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t148" class="pln">    <span class="str">"""main json header."""</span><span class="strut">&nbsp;</span></p>
+<p id="t149" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t150" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">regions</span><span class="op">=</span><span class="op">[</span><span class="nam">RegionData</span><span class="op">(</span><span class="op">)</span><span class="op">]</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t151" class="pln">        <span class="str">"""init function.</span><span class="strut">&nbsp;</span></p>
+<p id="t152" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t153" class="pln"><span class="str">        :param regions:</span><span class="strut">&nbsp;</span></p>
+<p id="t154" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t155" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t156" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span> <span class="op">=</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t157" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t158" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t159" class="stm run hide_run"><span class="key">class</span> <span class="nam">Groups</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t160" class="pln">    <span class="str">"""main json header."""</span><span class="strut">&nbsp;</span></p>
+<p id="t161" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t162" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t163" class="pln">                 <span class="nam">description</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">regions</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t164" class="pln">        <span class="str">"""init function.</span><span class="strut">&nbsp;</span></p>
+<p id="t165" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t166" class="pln"><span class="str">        :param regions:</span><span class="strut">&nbsp;</span></p>
+<p id="t167" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t168" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t169" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t170" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t171" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">description</span><span class="strut">&nbsp;</span></p>
+<p id="t172" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span> <span class="op">=</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t173" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t174" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_to_db_model_dict</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t175" class="stm mis">        <span class="nam">db_dict</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t176" class="stm mis">        <span class="nam">db_dict</span><span class="op">[</span><span class="str">'group_name'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t177" class="stm mis">        <span class="nam">db_dict</span><span class="op">[</span><span class="str">'group_description'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">description</span><span class="strut">&nbsp;</span></p>
+<p id="t178" class="stm mis">        <span class="nam">db_dict</span><span class="op">[</span><span class="str">'group_regions'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t179" class="stm mis">        <span class="key">return</span> <span class="nam">db_dict</span><span class="strut">&nbsp;</span></p>
+<p id="t180" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t181" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t182" class="stm run hide_run"><span class="key">class</span> <span class="nam">GroupsWrraper</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t183" class="pln">    <span class="str">"""list of groups."""</span><span class="strut">&nbsp;</span></p>
+<p id="t184" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t185" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">groups</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t186" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t187" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t188" class="pln"><span class="str">        :param groups:</span><span class="strut">&nbsp;</span></p>
+<p id="t189" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t190" class="stm run hide_run">        <span class="key">if</span> <span class="nam">groups</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t191" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">groups</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t192" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t193" class="stm mis">            <span class="nam">self</span><span class="op">.</span><span class="nam">groups</span> <span class="op">=</span> <span class="nam">groups</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-12 23:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_model_url_parm_py.html b/orm/services/region_manager/cover/rms_model_url_parm_py.html
new file mode 100644
index 00000000..c8234f07
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_model_url_parm_py.html
@@ -0,0 +1,307 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/model/url_parm.py: 94%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/model/url_parm.py</b> :
+            <span class="pc_cov">94%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            63 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">59 run</span>
+            <span class="mis shortkey_m button_toggle_mis">4 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="stm run hide_run"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="stm run hide_run"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="stm run hide_run"><a href="#n39">39</a></p>
+<p id="n40" class="stm run hide_run"><a href="#n40">40</a></p>
+<p id="n41" class="stm run hide_run"><a href="#n41">41</a></p>
+<p id="n42" class="stm run hide_run"><a href="#n42">42</a></p>
+<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p>
+<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="stm run hide_run"><a href="#n46">46</a></p>
+<p id="n47" class="stm run hide_run"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="stm run hide_run"><a href="#n50">50</a></p>
+<p id="n51" class="stm run hide_run"><a href="#n51">51</a></p>
+<p id="n52" class="stm run hide_run"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="stm run hide_run"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="stm mis"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="stm run hide_run"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p>
+<p id="n69" class="stm run hide_run"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="pln"><a href="#n71">71</a></p>
+<p id="n72" class="stm run hide_run"><a href="#n72">72</a></p>
+<p id="n73" class="pln"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="stm run hide_run"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="stm run hide_run"><a href="#n79">79</a></p>
+<p id="n80" class="pln"><a href="#n80">80</a></p>
+<p id="n81" class="stm run hide_run"><a href="#n81">81</a></p>
+<p id="n82" class="stm run hide_run"><a href="#n82">82</a></p>
+<p id="n83" class="stm run hide_run"><a href="#n83">83</a></p>
+<p id="n84" class="stm run hide_run"><a href="#n84">84</a></p>
+<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="pln"><a href="#n86">86</a></p>
+<p id="n87" class="pln"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="stm mis"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="stm run hide_run"><a href="#n91">91</a></p>
+<p id="n92" class="stm run hide_run"><a href="#n92">92</a></p>
+<p id="n93" class="stm mis"><a href="#n93">93</a></p>
+<p id="n94" class="stm mis"><a href="#n94">94</a></p>
+<p id="n95" class="pln"><a href="#n95">95</a></p>
+<p id="n96" class="stm run hide_run"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="stm run hide_run"><a href="#n98">98</a></p>
+<p id="n99" class="pln"><a href="#n99">99</a></p>
+<p id="n100" class="stm run hide_run"><a href="#n100">100</a></p>
+<p id="n101" class="pln"><a href="#n101">101</a></p>
+<p id="n102" class="pln"><a href="#n102">102</a></p>
+<p id="n103" class="pln"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="stm run hide_run"><a href="#n105">105</a></p>
+<p id="n106" class="stm run hide_run"><a href="#n106">106</a></p>
+<p id="n107" class="stm run hide_run"><a href="#n107">107</a></p>
+<p id="n108" class="stm run hide_run"><a href="#n108">108</a></p>
+<p id="n109" class="stm run hide_run"><a href="#n109">109</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">class</span> <span class="nam">UrlParms</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln">    <span class="str">"""class method."""</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">type</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">status</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">rangerAgentVersion</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln">                 <span class="nam">clli</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">regionname</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">osversion</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">valet</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln">                 <span class="nam">state</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">country</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">city</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">street</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">zip</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln">                 <span class="nam">is_ecomp</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">is_ssp</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">purpose_of_region</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln">        <span class="str">"""init method.</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="str">        :param type:</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="str">        :param status:</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln"><span class="str">        :param metadata:</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="str">        :param rangerAgentVersion:</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="str">        :param clli:</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="str">        :param regionname:</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="str">        :param osversion:</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="str">        :param valet:</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln"><span class="str">        :param state:</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln"><span class="str">        :param country:</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="str">        :param city:</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln"><span class="str">        :param street:</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="str">        :param zip:</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run">        <span class="key">if</span> <span class="nam">type</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">location_type</span> <span class="op">=</span> <span class="nam">type</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">        <span class="key">if</span> <span class="nam">status</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">region_status</span> <span class="op">=</span> <span class="nam">status</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">        <span class="key">if</span> <span class="nam">metadata</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">metadata</span> <span class="op">=</span> <span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">        <span class="key">if</span> <span class="nam">rangerAgentVersion</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">ranger_agent_version</span> <span class="op">=</span> <span class="nam">rangerAgentVersion</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">        <span class="key">if</span> <span class="nam">clli</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">clli</span> <span class="op">=</span> <span class="nam">clli</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">        <span class="key">if</span> <span class="nam">regionname</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">regionname</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="stm run hide_run">        <span class="key">if</span> <span class="nam">osversion</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">open_stack_version</span> <span class="op">=</span> <span class="nam">osversion</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="stm run hide_run">        <span class="key">if</span> <span class="nam">valet</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">valet</span> <span class="op">=</span> <span class="nam">valet</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm run hide_run">        <span class="key">if</span> <span class="nam">state</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">address_state</span> <span class="op">=</span> <span class="nam">state</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">        <span class="key">if</span> <span class="nam">country</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">address_country</span> <span class="op">=</span> <span class="nam">country</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="stm run hide_run">        <span class="key">if</span> <span class="nam">city</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">address_city</span> <span class="op">=</span> <span class="nam">city</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run">        <span class="key">if</span> <span class="nam">street</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">address_street</span> <span class="op">=</span> <span class="nam">street</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm run hide_run">        <span class="key">if</span> <span class="nam">zip</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">address_zip</span> <span class="op">=</span> <span class="nam">zip</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">        <span class="key">if</span> <span class="nam">is_ecomp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">is_ecomp</span> <span class="op">=</span> <span class="nam">is_ecomp</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="stm run hide_run">        <span class="key">if</span> <span class="nam">is_ssp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">is_ssp</span> <span class="op">=</span> <span class="nam">is_ssp</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">        <span class="key">if</span> <span class="nam">purpose_of_region</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm mis">            <span class="nam">self</span><span class="op">.</span><span class="nam">purpose_of_region</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t60" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_build_query</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln">        <span class="str">"""nuild db query.</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="stm run hide_run">        <span class="nam">metadatadict</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">        <span class="nam">regiondict</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">        <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">__dict__</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm run hide_run">            <span class="nam">metadatadict</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_build_metadata_dict</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="stm run hide_run">            <span class="nam">regiondict</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_build_region_dict</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">        <span class="key">return</span> <span class="nam">regiondict</span><span class="op">,</span> <span class="nam">metadatadict</span><span class="op">,</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t72" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_build_metadata_dict</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="pln">        <span class="str">"""meta_data dict.</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln"><span class="str">        :return: metadata dict</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="stm run hide_run">        <span class="nam">metadata</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">        <span class="key">if</span> <span class="str">'metadata'</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">__dict__</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm run hide_run">            <span class="nam">metadata</span> <span class="op">=</span> <span class="op">{</span><span class="str">'ref_keys'</span><span class="op">:</span> <span class="op">[</span><span class="op">]</span><span class="op">,</span> <span class="str">'meta_data_pairs'</span><span class="op">:</span> <span class="op">[</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="pln">                        <span class="str">'meta_data_keys'</span><span class="op">:</span> <span class="op">[</span><span class="op">]</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="stm run hide_run">            <span class="key">for</span> <span class="nam">metadata_item</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">metadata</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="stm run hide_run">                <span class="key">if</span> <span class="str">':'</span> <span class="key">in</span> <span class="nam">metadata_item</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="stm run hide_run">                    <span class="nam">key</span> <span class="op">=</span> <span class="nam">metadata_item</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">':'</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm run hide_run">                    <span class="nam">metadata</span><span class="op">[</span><span class="str">'ref_keys'</span><span class="op">]</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">key</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm run hide_run">                    <span class="nam">metadata</span><span class="op">[</span><span class="str">'meta_data_pairs'</span><span class="op">]</span><span class="op">.</span><span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="pln">                        <span class="nam">append</span><span class="op">(</span><span class="op">{</span><span class="str">'metadata_key'</span><span class="op">:</span> <span class="nam">key</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="pln">                                <span class="str">'metadata_value'</span><span class="op">:</span> <span class="nam">metadata_item</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">':'</span><span class="op">)</span><span class="op">[</span><span class="num">1</span><span class="op">]</span><span class="op">}</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln">                <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="stm mis">                    <span class="nam">metadata</span><span class="op">[</span><span class="str">'meta_data_keys'</span><span class="op">]</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">metadata_item</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln">            <span class="com"># Now clean irrelevant values</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm run hide_run">            <span class="nam">keys_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="stm run hide_run">            <span class="key">for</span> <span class="nam">item</span> <span class="key">in</span> <span class="nam">metadata</span><span class="op">[</span><span class="str">'meta_data_keys'</span><span class="op">]</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="stm mis">                <span class="key">if</span> <span class="nam">item</span> <span class="key">not</span> <span class="key">in</span> <span class="nam">metadata</span><span class="op">[</span><span class="str">'ref_keys'</span><span class="op">]</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="stm mis">                    <span class="nam">keys_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">item</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t96" class="stm run hide_run">            <span class="nam">metadata</span><span class="op">[</span><span class="str">'meta_data_keys'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">keys_list</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t98" class="stm run hide_run">        <span class="key">return</span> <span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t100" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_build_region_dict</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="pln">        <span class="str">"""region dict.</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t103" class="pln"><span class="str">        :return:regin dict</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="stm run hide_run">        <span class="nam">regiondict</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="stm run hide_run">        <span class="key">for</span> <span class="nam">key</span><span class="op">,</span> <span class="nam">value</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">__dict__</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="stm run hide_run">            <span class="key">if</span> <span class="nam">key</span> <span class="op">!=</span> <span class="str">'metadata'</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="stm run hide_run">                <span class="nam">regiondict</span><span class="op">[</span><span class="nam">key</span><span class="op">]</span> <span class="op">=</span> <span class="nam">value</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="stm run hide_run">        <span class="key">return</span> <span class="nam">regiondict</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-12 23:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_services___init___py.html b/orm/services/region_manager/cover/rms_services___init___py.html
new file mode 100644
index 00000000..430566d0
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_services___init___py.html
@@ -0,0 +1,91 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/services/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/services/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""services package."""</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_services_error_base_py.html b/orm/services/region_manager/cover/rms_services_error_base_py.html
new file mode 100644
index 00000000..3488d3a4
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_services_error_base_py.html
@@ -0,0 +1,155 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/services/error_base.py: 89%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/services/error_base.py</b> :
+            <span class="pc_cov">89%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            18 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">16 run</span>
+            <span class="mis shortkey_m button_toggle_mis">2 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm mis"><a href="#n11">11</a></p>
+<p id="n12" class="stm mis"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="stm run hide_run"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="stm run hide_run"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p>
+<p id="n25" class="stm run hide_run"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""Exceptions module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">class</span> <span class="nam">Error</span><span class="op">(</span><span class="nam">Exception</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">class</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="nam">Error</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="str">""</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm mis">        <span class="nam">self</span><span class="op">.</span><span class="nam">status_code</span> <span class="op">=</span> <span class="nam">status_code</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm mis">        <span class="nam">self</span><span class="op">.</span><span class="nam">message</span> <span class="op">=</span> <span class="nam">message</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="key">class</span> <span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">ErrorStatus</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="str">"Not found"</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status_code</span> <span class="op">=</span> <span class="nam">status_code</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">message</span> <span class="op">=</span> <span class="nam">message</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t22" class="stm run hide_run"><span class="key">class</span> <span class="nam">ConflictError</span><span class="op">(</span><span class="nam">ErrorStatus</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">409</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="str">"Conflict error"</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status_code</span> <span class="op">=</span> <span class="nam">status_code</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">message</span> <span class="op">=</span> <span class="nam">message</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run"><span class="key">class</span> <span class="nam">InputValueError</span><span class="op">(</span><span class="nam">ErrorStatus</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">400</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="str">"value not allowed"</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status_code</span> <span class="op">=</span> <span class="nam">status_code</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">message</span> <span class="op">=</span> <span class="nam">message</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_services_services_py.html b/orm/services/region_manager/cover/rms_services_services_py.html
new file mode 100644
index 00000000..0192f62f
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_services_services_py.html
@@ -0,0 +1,661 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/services/services.py: 68%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/services/services.py</b> :
+            <span class="pc_cov">68%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            170 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">115 run</span>
+            <span class="mis shortkey_m button_toggle_mis">55 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="stm run hide_run"><a href="#n22">22</a></p>
+<p id="n23" class="stm run hide_run"><a href="#n23">23</a></p>
+<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="stm run hide_run"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="stm run hide_run"><a href="#n41">41</a></p>
+<p id="n42" class="stm run hide_run"><a href="#n42">42</a></p>
+<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="pln"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="stm run hide_run"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="stm run hide_run"><a href="#n60">60</a></p>
+<p id="n61" class="stm run hide_run"><a href="#n61">61</a></p>
+<p id="n62" class="stm run hide_run"><a href="#n62">62</a></p>
+<p id="n63" class="stm run hide_run"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p>
+<p id="n69" class="stm run hide_run"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="stm run hide_run"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="pln"><a href="#n73">73</a></p>
+<p id="n74" class="stm run hide_run"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="pln"><a href="#n77">77</a></p>
+<p id="n78" class="pln"><a href="#n78">78</a></p>
+<p id="n79" class="pln"><a href="#n79">79</a></p>
+<p id="n80" class="stm run hide_run"><a href="#n80">80</a></p>
+<p id="n81" class="stm run hide_run"><a href="#n81">81</a></p>
+<p id="n82" class="stm run hide_run"><a href="#n82">82</a></p>
+<p id="n83" class="stm run hide_run"><a href="#n83">83</a></p>
+<p id="n84" class="stm run hide_run"><a href="#n84">84</a></p>
+<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p>
+<p id="n87" class="stm run hide_run"><a href="#n87">87</a></p>
+<p id="n88" class="stm run hide_run"><a href="#n88">88</a></p>
+<p id="n89" class="pln"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="stm run hide_run"><a href="#n91">91</a></p>
+<p id="n92" class="pln"><a href="#n92">92</a></p>
+<p id="n93" class="pln"><a href="#n93">93</a></p>
+<p id="n94" class="pln"><a href="#n94">94</a></p>
+<p id="n95" class="pln"><a href="#n95">95</a></p>
+<p id="n96" class="pln"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="stm run hide_run"><a href="#n98">98</a></p>
+<p id="n99" class="stm run hide_run"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="stm run hide_run"><a href="#n101">101</a></p>
+<p id="n102" class="stm run hide_run"><a href="#n102">102</a></p>
+<p id="n103" class="pln"><a href="#n103">103</a></p>
+<p id="n104" class="stm run hide_run"><a href="#n104">104</a></p>
+<p id="n105" class="stm run hide_run"><a href="#n105">105</a></p>
+<p id="n106" class="stm run hide_run"><a href="#n106">106</a></p>
+<p id="n107" class="stm run hide_run"><a href="#n107">107</a></p>
+<p id="n108" class="stm run hide_run"><a href="#n108">108</a></p>
+<p id="n109" class="stm run hide_run"><a href="#n109">109</a></p>
+<p id="n110" class="pln"><a href="#n110">110</a></p>
+<p id="n111" class="stm run hide_run"><a href="#n111">111</a></p>
+<p id="n112" class="stm run hide_run"><a href="#n112">112</a></p>
+<p id="n113" class="stm run hide_run"><a href="#n113">113</a></p>
+<p id="n114" class="stm run hide_run"><a href="#n114">114</a></p>
+<p id="n115" class="stm run hide_run"><a href="#n115">115</a></p>
+<p id="n116" class="stm run hide_run"><a href="#n116">116</a></p>
+<p id="n117" class="stm run hide_run"><a href="#n117">117</a></p>
+<p id="n118" class="stm run hide_run"><a href="#n118">118</a></p>
+<p id="n119" class="stm run hide_run"><a href="#n119">119</a></p>
+<p id="n120" class="pln"><a href="#n120">120</a></p>
+<p id="n121" class="stm run hide_run"><a href="#n121">121</a></p>
+<p id="n122" class="pln"><a href="#n122">122</a></p>
+<p id="n123" class="pln"><a href="#n123">123</a></p>
+<p id="n124" class="stm run hide_run"><a href="#n124">124</a></p>
+<p id="n125" class="stm mis"><a href="#n125">125</a></p>
+<p id="n126" class="pln"><a href="#n126">126</a></p>
+<p id="n127" class="stm mis"><a href="#n127">127</a></p>
+<p id="n128" class="stm mis"><a href="#n128">128</a></p>
+<p id="n129" class="stm mis"><a href="#n129">129</a></p>
+<p id="n130" class="stm mis"><a href="#n130">130</a></p>
+<p id="n131" class="stm mis"><a href="#n131">131</a></p>
+<p id="n132" class="pln"><a href="#n132">132</a></p>
+<p id="n133" class="stm mis"><a href="#n133">133</a></p>
+<p id="n134" class="pln"><a href="#n134">134</a></p>
+<p id="n135" class="stm mis"><a href="#n135">135</a></p>
+<p id="n136" class="stm mis"><a href="#n136">136</a></p>
+<p id="n137" class="stm mis"><a href="#n137">137</a></p>
+<p id="n138" class="pln"><a href="#n138">138</a></p>
+<p id="n139" class="pln"><a href="#n139">139</a></p>
+<p id="n140" class="stm run hide_run"><a href="#n140">140</a></p>
+<p id="n141" class="stm mis"><a href="#n141">141</a></p>
+<p id="n142" class="pln"><a href="#n142">142</a></p>
+<p id="n143" class="stm mis"><a href="#n143">143</a></p>
+<p id="n144" class="stm mis"><a href="#n144">144</a></p>
+<p id="n145" class="stm mis"><a href="#n145">145</a></p>
+<p id="n146" class="stm mis"><a href="#n146">146</a></p>
+<p id="n147" class="stm mis"><a href="#n147">147</a></p>
+<p id="n148" class="pln"><a href="#n148">148</a></p>
+<p id="n149" class="pln"><a href="#n149">149</a></p>
+<p id="n150" class="stm mis"><a href="#n150">150</a></p>
+<p id="n151" class="pln"><a href="#n151">151</a></p>
+<p id="n152" class="stm mis"><a href="#n152">152</a></p>
+<p id="n153" class="stm mis"><a href="#n153">153</a></p>
+<p id="n154" class="stm mis"><a href="#n154">154</a></p>
+<p id="n155" class="pln"><a href="#n155">155</a></p>
+<p id="n156" class="pln"><a href="#n156">156</a></p>
+<p id="n157" class="stm run hide_run"><a href="#n157">157</a></p>
+<p id="n158" class="stm mis"><a href="#n158">158</a></p>
+<p id="n159" class="pln"><a href="#n159">159</a></p>
+<p id="n160" class="stm mis"><a href="#n160">160</a></p>
+<p id="n161" class="stm mis"><a href="#n161">161</a></p>
+<p id="n162" class="stm mis"><a href="#n162">162</a></p>
+<p id="n163" class="pln"><a href="#n163">163</a></p>
+<p id="n164" class="stm mis"><a href="#n164">164</a></p>
+<p id="n165" class="stm mis"><a href="#n165">165</a></p>
+<p id="n166" class="stm mis"><a href="#n166">166</a></p>
+<p id="n167" class="pln"><a href="#n167">167</a></p>
+<p id="n168" class="pln"><a href="#n168">168</a></p>
+<p id="n169" class="stm run hide_run"><a href="#n169">169</a></p>
+<p id="n170" class="pln"><a href="#n170">170</a></p>
+<p id="n171" class="pln"><a href="#n171">171</a></p>
+<p id="n172" class="pln"><a href="#n172">172</a></p>
+<p id="n173" class="pln"><a href="#n173">173</a></p>
+<p id="n174" class="pln"><a href="#n174">174</a></p>
+<p id="n175" class="pln"><a href="#n175">175</a></p>
+<p id="n176" class="stm run hide_run"><a href="#n176">176</a></p>
+<p id="n177" class="stm run hide_run"><a href="#n177">177</a></p>
+<p id="n178" class="stm run hide_run"><a href="#n178">178</a></p>
+<p id="n179" class="stm run hide_run"><a href="#n179">179</a></p>
+<p id="n180" class="stm run hide_run"><a href="#n180">180</a></p>
+<p id="n181" class="pln"><a href="#n181">181</a></p>
+<p id="n182" class="pln"><a href="#n182">182</a></p>
+<p id="n183" class="stm run hide_run"><a href="#n183">183</a></p>
+<p id="n184" class="pln"><a href="#n184">184</a></p>
+<p id="n185" class="pln"><a href="#n185">185</a></p>
+<p id="n186" class="pln"><a href="#n186">186</a></p>
+<p id="n187" class="pln"><a href="#n187">187</a></p>
+<p id="n188" class="stm run hide_run"><a href="#n188">188</a></p>
+<p id="n189" class="stm run hide_run"><a href="#n189">189</a></p>
+<p id="n190" class="stm run hide_run"><a href="#n190">190</a></p>
+<p id="n191" class="stm run hide_run"><a href="#n191">191</a></p>
+<p id="n192" class="stm run hide_run"><a href="#n192">192</a></p>
+<p id="n193" class="pln"><a href="#n193">193</a></p>
+<p id="n194" class="stm run hide_run"><a href="#n194">194</a></p>
+<p id="n195" class="stm run hide_run"><a href="#n195">195</a></p>
+<p id="n196" class="stm run hide_run"><a href="#n196">196</a></p>
+<p id="n197" class="stm run hide_run"><a href="#n197">197</a></p>
+<p id="n198" class="pln"><a href="#n198">198</a></p>
+<p id="n199" class="stm run hide_run"><a href="#n199">199</a></p>
+<p id="n200" class="pln"><a href="#n200">200</a></p>
+<p id="n201" class="pln"><a href="#n201">201</a></p>
+<p id="n202" class="stm run hide_run"><a href="#n202">202</a></p>
+<p id="n203" class="pln"><a href="#n203">203</a></p>
+<p id="n204" class="pln"><a href="#n204">204</a></p>
+<p id="n205" class="pln"><a href="#n205">205</a></p>
+<p id="n206" class="pln"><a href="#n206">206</a></p>
+<p id="n207" class="pln"><a href="#n207">207</a></p>
+<p id="n208" class="stm run hide_run"><a href="#n208">208</a></p>
+<p id="n209" class="stm run hide_run"><a href="#n209">209</a></p>
+<p id="n210" class="pln"><a href="#n210">210</a></p>
+<p id="n211" class="stm run hide_run"><a href="#n211">211</a></p>
+<p id="n212" class="stm run hide_run"><a href="#n212">212</a></p>
+<p id="n213" class="stm run hide_run"><a href="#n213">213</a></p>
+<p id="n214" class="pln"><a href="#n214">214</a></p>
+<p id="n215" class="stm run hide_run"><a href="#n215">215</a></p>
+<p id="n216" class="stm run hide_run"><a href="#n216">216</a></p>
+<p id="n217" class="stm run hide_run"><a href="#n217">217</a></p>
+<p id="n218" class="stm run hide_run"><a href="#n218">218</a></p>
+<p id="n219" class="pln"><a href="#n219">219</a></p>
+<p id="n220" class="pln"><a href="#n220">220</a></p>
+<p id="n221" class="stm run hide_run"><a href="#n221">221</a></p>
+<p id="n222" class="pln"><a href="#n222">222</a></p>
+<p id="n223" class="pln"><a href="#n223">223</a></p>
+<p id="n224" class="pln"><a href="#n224">224</a></p>
+<p id="n225" class="pln"><a href="#n225">225</a></p>
+<p id="n226" class="pln"><a href="#n226">226</a></p>
+<p id="n227" class="pln"><a href="#n227">227</a></p>
+<p id="n228" class="pln"><a href="#n228">228</a></p>
+<p id="n229" class="pln"><a href="#n229">229</a></p>
+<p id="n230" class="stm run hide_run"><a href="#n230">230</a></p>
+<p id="n231" class="stm run hide_run"><a href="#n231">231</a></p>
+<p id="n232" class="stm run hide_run"><a href="#n232">232</a></p>
+<p id="n233" class="stm run hide_run"><a href="#n233">233</a></p>
+<p id="n234" class="stm run hide_run"><a href="#n234">234</a></p>
+<p id="n235" class="stm run hide_run"><a href="#n235">235</a></p>
+<p id="n236" class="pln"><a href="#n236">236</a></p>
+<p id="n237" class="stm run hide_run"><a href="#n237">237</a></p>
+<p id="n238" class="stm run hide_run"><a href="#n238">238</a></p>
+<p id="n239" class="stm run hide_run"><a href="#n239">239</a></p>
+<p id="n240" class="pln"><a href="#n240">240</a></p>
+<p id="n241" class="pln"><a href="#n241">241</a></p>
+<p id="n242" class="pln"><a href="#n242">242</a></p>
+<p id="n243" class="stm run hide_run"><a href="#n243">243</a></p>
+<p id="n244" class="stm mis"><a href="#n244">244</a></p>
+<p id="n245" class="stm mis"><a href="#n245">245</a></p>
+<p id="n246" class="stm mis"><a href="#n246">246</a></p>
+<p id="n247" class="stm mis"><a href="#n247">247</a></p>
+<p id="n248" class="stm mis"><a href="#n248">248</a></p>
+<p id="n249" class="stm mis"><a href="#n249">249</a></p>
+<p id="n250" class="stm mis"><a href="#n250">250</a></p>
+<p id="n251" class="stm mis"><a href="#n251">251</a></p>
+<p id="n252" class="pln"><a href="#n252">252</a></p>
+<p id="n253" class="stm mis"><a href="#n253">253</a></p>
+<p id="n254" class="pln"><a href="#n254">254</a></p>
+<p id="n255" class="stm mis"><a href="#n255">255</a></p>
+<p id="n256" class="stm mis"><a href="#n256">256</a></p>
+<p id="n257" class="stm mis"><a href="#n257">257</a></p>
+<p id="n258" class="stm mis"><a href="#n258">258</a></p>
+<p id="n259" class="stm mis"><a href="#n259">259</a></p>
+<p id="n260" class="stm mis"><a href="#n260">260</a></p>
+<p id="n261" class="pln"><a href="#n261">261</a></p>
+<p id="n262" class="stm mis"><a href="#n262">262</a></p>
+<p id="n263" class="stm mis"><a href="#n263">263</a></p>
+<p id="n264" class="stm mis"><a href="#n264">264</a></p>
+<p id="n265" class="stm mis"><a href="#n265">265</a></p>
+<p id="n266" class="pln"><a href="#n266">266</a></p>
+<p id="n267" class="stm mis"><a href="#n267">267</a></p>
+<p id="n268" class="pln"><a href="#n268">268</a></p>
+<p id="n269" class="pln"><a href="#n269">269</a></p>
+<p id="n270" class="stm run hide_run"><a href="#n270">270</a></p>
+<p id="n271" class="pln"><a href="#n271">271</a></p>
+<p id="n272" class="pln"><a href="#n272">272</a></p>
+<p id="n273" class="pln"><a href="#n273">273</a></p>
+<p id="n274" class="pln"><a href="#n274">274</a></p>
+<p id="n275" class="pln"><a href="#n275">275</a></p>
+<p id="n276" class="pln"><a href="#n276">276</a></p>
+<p id="n277" class="stm mis"><a href="#n277">277</a></p>
+<p id="n278" class="pln"><a href="#n278">278</a></p>
+<p id="n279" class="stm mis"><a href="#n279">279</a></p>
+<p id="n280" class="stm mis"><a href="#n280">280</a></p>
+<p id="n281" class="stm mis"><a href="#n281">281</a></p>
+<p id="n282" class="stm mis"><a href="#n282">282</a></p>
+<p id="n283" class="pln"><a href="#n283">283</a></p>
+<p id="n284" class="stm mis"><a href="#n284">284</a></p>
+<p id="n285" class="stm mis"><a href="#n285">285</a></p>
+<p id="n286" class="stm mis"><a href="#n286">286</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""DB actions wrapper module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">model</span><span class="op">.</span><span class="nam">model</span> <span class="key">import</span> <span class="nam">Groups</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">model</span><span class="op">.</span><span class="nam">model</span> <span class="key">import</span> <span class="nam">Regions</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">error_base</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">storage</span> <span class="key">import</span> <span class="nam">base_data_manager</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">storage</span> <span class="key">import</span> <span class="nam">data_manager_factory</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="nam">LOG</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_regions_data</span><span class="op">(</span><span class="nam">url_parms</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln">    <span class="str">"""get region from db.</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln"><span class="str">    :param url_parms: the parameters got in the url to make the query</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="str">    :return: region model for json output</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="str">    :raise: NoContentError( status code 404)</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run">    <span class="nam">region_dict</span><span class="op">,</span> <span class="nam">metadata_dict</span><span class="op">,</span> <span class="nam">end_point</span> <span class="op">=</span> <span class="nam">url_parms</span><span class="op">.</span><span class="nam">_build_query</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run">    <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run">    <span class="nam">regions</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">get_regions</span><span class="op">(</span><span class="nam">region_dict</span><span class="op">,</span> <span class="nam">metadata_dict</span><span class="op">,</span> <span class="nam">end_point</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="stm run hide_run">    <span class="key">if</span> <span class="key">not</span> <span class="nam">regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="str">"No regions found for the given search parameters"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm run hide_run">    <span class="key">return</span> <span class="nam">Regions</span><span class="op">(</span><span class="nam">regions</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_region_by_id_or_name</span><span class="op">(</span><span class="nam">region_id_or_name</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="str">    :param region_id_or_name:</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln"><span class="str">    :return: region object (wsme format)</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"LOGIC:- get region data by id or name {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id_or_name</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm run hide_run">        <span class="nam">region</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">get_region_by_id_or_name</span><span class="op">(</span><span class="nam">region_id_or_name</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">        <span class="key">if</span> <span class="key">not</span> <span class="nam">region</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="str">"Region {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id_or_name</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t41" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"error in get region by id/name"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm run hide_run">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">    <span class="key">return</span> <span class="nam">region</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run"><span class="key">def</span> <span class="nam">update_region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">region</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln"><span class="str">    :param region:</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln"><span class="str">    :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"logic:- update region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">        <span class="nam">region</span> <span class="op">=</span> <span class="nam">region</span><span class="op">.</span><span class="nam">_to_clean_python_obj</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">        <span class="nam">region</span><span class="op">.</span><span class="nam">_validate_model</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm run hide_run">        <span class="nam">region_dict</span> <span class="op">=</span> <span class="nam">region</span><span class="op">.</span><span class="nam">_to_db_model_dict</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t60" class="stm run hide_run">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="stm run hide_run">        <span class="nam">db</span><span class="op">.</span><span class="nam">update_region</span><span class="op">(</span><span class="nam">region_to_update</span><span class="op">=</span><span class="nam">region_id</span><span class="op">,</span> <span class="op">**</span><span class="nam">region_dict</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"region {} updated"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="stm run hide_run">        <span class="nam">result</span> <span class="op">=</span> <span class="nam">get_region_by_id_or_name</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t65" class="stm run hide_run">    <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"fail to update region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"fail to update region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="stm run hide_run">    <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t73" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t74" class="stm run hide_run"><span class="key">def</span> <span class="nam">delete_region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t77" class="pln"><span class="str">    :param region_id:</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="pln"><span class="str">    :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="stm run hide_run">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"logic:- delete region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="stm run hide_run">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="stm run hide_run">        <span class="nam">db</span><span class="op">.</span><span class="nam">delete_region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"region deleted"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"fail to delete region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="stm run hide_run">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="stm run hide_run">    <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm run hide_run"><span class="key">def</span> <span class="nam">create_full_region</span><span class="op">(</span><span class="nam">full_region</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="pln">    <span class="str">"""create region logic.</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t94" class="pln"><span class="str">    :param full_region obj:</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="pln"><span class="str">    :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="pln"><span class="str">    :raise: input value error(status code 400)</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="stm run hide_run">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"logic:- save region "</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t101" class="stm run hide_run">        <span class="nam">full_region</span> <span class="op">=</span> <span class="nam">full_region</span><span class="op">.</span><span class="nam">_to_clean_python_obj</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="stm run hide_run">        <span class="nam">full_region</span><span class="op">.</span><span class="nam">_validate_model</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t104" class="stm run hide_run">        <span class="nam">full_region_db_dict</span> <span class="op">=</span> <span class="nam">full_region</span><span class="op">.</span><span class="nam">_to_db_model_dict</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"region to save {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">full_region_db_dict</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="stm run hide_run">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="stm run hide_run">        <span class="nam">db</span><span class="op">.</span><span class="nam">add_region</span><span class="op">(</span><span class="op">**</span><span class="nam">full_region_db_dict</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"region added"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="stm run hide_run">        <span class="nam">result</span> <span class="op">=</span> <span class="nam">get_region_by_id_or_name</span><span class="op">(</span><span class="nam">full_region</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t111" class="stm run hide_run">    <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t112" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"error in save region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="stm run hide_run">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="stm run hide_run">    <span class="key">except</span> <span class="nam">base_data_manager</span><span class="op">.</span><span class="nam">DuplicateEntryError</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"error in save region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ConflictError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t118" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"error in save region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="stm run hide_run">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t121" class="stm run hide_run">    <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t123" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t124" class="stm run hide_run"><span class="key">def</span> <span class="nam">add_region_metadata</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_dict</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="stm mis">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Add metadata: {} to region id : {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">metadata_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t126" class="pln">                                                          <span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t127" class="stm mis">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t128" class="stm mis">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t129" class="stm mis">        <span class="nam">result</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">add_meta_data_to_region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_dict</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="stm mis">        <span class="key">if</span> <span class="key">not</span> <span class="nam">result</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t131" class="stm mis">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="str">"Region {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t132" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t133" class="stm mis">            <span class="key">return</span> <span class="nam">result</span><span class="op">.</span><span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t134" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t135" class="stm mis">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t136" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Error getting metadata for region id:"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t137" class="stm mis">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t138" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t139" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t140" class="stm run hide_run"><span class="key">def</span> <span class="nam">update_region_metadata</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_dict</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t141" class="stm mis">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Update metadata to region id : {}. "</span><span class="strut">&nbsp;</span></p>
+<p id="t142" class="pln">              <span class="str">"New metadata: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_dict</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t143" class="stm mis">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t144" class="stm mis">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t145" class="stm mis">        <span class="nam">result</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">update_region_meta_data</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_dict</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t146" class="stm mis">        <span class="key">if</span> <span class="key">not</span> <span class="nam">result</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t147" class="stm mis">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="str">"Region {} not "</span><span class="strut">&nbsp;</span></p>
+<p id="t148" class="pln">                                                   <span class="str">"found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t149" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t150" class="stm mis">            <span class="key">return</span> <span class="nam">result</span><span class="op">.</span><span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t151" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t152" class="stm mis">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t153" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Error getting metadata for region id:"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t154" class="stm mis">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t155" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t156" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t157" class="stm run hide_run"><span class="key">def</span> <span class="nam">delete_metadata_from_region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_key</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t158" class="stm mis">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Delete metadata key: {} from region id : {}."</span><span class="strut">&nbsp;</span></p>
+<p id="t159" class="pln">             <span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">metadata_key</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t160" class="stm mis">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t161" class="stm mis">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t162" class="stm mis">        <span class="nam">db</span><span class="op">.</span><span class="nam">delete_region_metadata</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_key</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t163" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t164" class="stm mis">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t165" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Error getting metadata for region id:"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t166" class="stm mis">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t167" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t168" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t169" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_groups_data</span><span class="op">(</span><span class="nam">name</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t170" class="pln">    <span class="str">"""get group from db.</span><span class="strut">&nbsp;</span></p>
+<p id="t171" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t172" class="pln"><span class="str">    :param name: groupe name</span><span class="strut">&nbsp;</span></p>
+<p id="t173" class="pln"><span class="str">    :return: groupe object with its regions</span><span class="strut">&nbsp;</span></p>
+<p id="t174" class="pln"><span class="str">    :raise: NoContentError( status code 404)</span><span class="strut">&nbsp;</span></p>
+<p id="t175" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t176" class="stm run hide_run">    <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t177" class="stm run hide_run">    <span class="nam">groups</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">get_group</span><span class="op">(</span><span class="nam">name</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t178" class="stm run hide_run">    <span class="key">if</span> <span class="key">not</span> <span class="nam">groups</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t179" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="str">"Group {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">name</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t180" class="stm run hide_run">    <span class="key">return</span> <span class="nam">Groups</span><span class="op">(</span><span class="op">**</span><span class="nam">groups</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t181" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t182" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t183" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_all_groups</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t184" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t185" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t186" class="pln"><span class="str">    :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t187" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t188" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t189" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"logic - get all groups"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t190" class="stm run hide_run">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t191" class="stm run hide_run">        <span class="nam">all_groups</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">get_all_groups</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t192" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"logic - got all groups {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">all_groups</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t193" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t194" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t195" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"fail to get all groups"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t196" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t197" class="stm run hide_run">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t198" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t199" class="stm run hide_run">    <span class="key">return</span> <span class="nam">all_groups</span><span class="strut">&nbsp;</span></p>
+<p id="t200" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t201" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t202" class="stm run hide_run"><span class="key">def</span> <span class="nam">delete_group</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t203" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t204" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t205" class="pln"><span class="str">    :param group_id:</span><span class="strut">&nbsp;</span></p>
+<p id="t206" class="pln"><span class="str">    :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t207" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t208" class="stm run hide_run">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"delete group logic"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t209" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t210" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t211" class="stm run hide_run">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t212" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"delete group id {} from db"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t213" class="stm run hide_run">        <span class="nam">db</span><span class="op">.</span><span class="nam">delete_group</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t214" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t215" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t216" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t217" class="stm run hide_run">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t218" class="stm run hide_run">    <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t219" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t220" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t221" class="stm run hide_run"><span class="key">def</span> <span class="nam">create_group_in_db</span><span class="op">(</span><span class="nam">group_id</span><span class="op">,</span> <span class="nam">group_name</span><span class="op">,</span> <span class="nam">description</span><span class="op">,</span> <span class="nam">regions</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t222" class="pln">    <span class="str">"""Create a region group in the database.</span><span class="strut">&nbsp;</span></p>
+<p id="t223" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t224" class="pln"><span class="str">    :param group_id: The ID of the group to create</span><span class="strut">&nbsp;</span></p>
+<p id="t225" class="pln"><span class="str">    :param group_name: The name of the group to create</span><span class="strut">&nbsp;</span></p>
+<p id="t226" class="pln"><span class="str">    :param description: The group description</span><span class="strut">&nbsp;</span></p>
+<p id="t227" class="pln"><span class="str">    :param regions: A list of regions inside the group</span><span class="strut">&nbsp;</span></p>
+<p id="t228" class="pln"><span class="str">    :raise: GroupExistsError (status code 400) if the group already exists</span><span class="strut">&nbsp;</span></p>
+<p id="t229" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t230" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t231" class="stm run hide_run">        <span class="nam">manager</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t232" class="stm run hide_run">        <span class="nam">manager</span><span class="op">.</span><span class="nam">add_group</span><span class="op">(</span><span class="nam">group_id</span><span class="op">,</span> <span class="nam">group_name</span><span class="op">,</span> <span class="nam">description</span><span class="op">,</span> <span class="nam">regions</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t233" class="stm run hide_run">    <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ConflictError</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t234" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Group {} already exists"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t235" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ConflictError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t236" class="pln">            <span class="nam">message</span><span class="op">=</span><span class="str">"Group {} already exists"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t237" class="stm run hide_run">    <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t238" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Some of the regions not found"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t239" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t240" class="pln">            <span class="nam">message</span><span class="op">=</span><span class="str">"Some of the regions not found"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t241" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t242" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t243" class="stm run hide_run"><span class="key">def</span> <span class="nam">update_group</span><span class="op">(</span><span class="nam">group</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t244" class="stm mis">    <span class="nam">result</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t245" class="stm mis">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"update group logic"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t246" class="stm mis">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t247" class="stm mis">        <span class="nam">group</span> <span class="op">=</span> <span class="nam">group</span><span class="op">.</span><span class="nam">_to_python_obj</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t248" class="stm mis">        <span class="nam">db_manager</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t249" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"update group to {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group</span><span class="op">.</span><span class="nam">_to_db_model_dict</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t250" class="stm mis">        <span class="nam">db_manager</span><span class="op">.</span><span class="nam">update_group</span><span class="op">(</span><span class="nam">group_id</span><span class="op">=</span><span class="nam">group_id</span><span class="op">,</span> <span class="op">**</span><span class="nam">group</span><span class="op">.</span><span class="nam">_to_db_model_dict</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t251" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"group updated"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t252" class="pln">        <span class="com"># make sure it updated</span><span class="strut">&nbsp;</span></p>
+<p id="t253" class="stm mis">        <span class="nam">groups</span> <span class="op">=</span> <span class="nam">db_manager</span><span class="op">.</span><span class="nam">get_group</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t254" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t255" class="stm mis">    <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t256" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Group {} not found"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t257" class="stm mis">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t258" class="stm mis">    <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t259" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Some of the regions not found"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t260" class="stm mis">        <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t261" class="pln">            <span class="nam">message</span><span class="op">=</span><span class="str">"Some of the regions not found"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t262" class="stm mis">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t263" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Failed to update group {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group</span><span class="op">.</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t264" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t265" class="stm mis">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t266" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t267" class="stm mis">    <span class="key">return</span> <span class="nam">Groups</span><span class="op">(</span><span class="op">**</span><span class="nam">groups</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t268" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t269" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t270" class="stm run hide_run"><span class="key">def</span> <span class="nam">update_region_status</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">new_status</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t271" class="pln">    <span class="str">"""Update region.</span><span class="strut">&nbsp;</span></p>
+<p id="t272" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t273" class="pln"><span class="str">    :param region_id:</span><span class="strut">&nbsp;</span></p>
+<p id="t274" class="pln"><span class="str">    :param new_status:</span><span class="strut">&nbsp;</span></p>
+<p id="t275" class="pln"><span class="str">    :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t276" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t277" class="stm mis">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Update region id: {} status to: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t278" class="pln">                                                          <span class="nam">new_status</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t279" class="stm mis">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t280" class="stm mis">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t281" class="stm mis">        <span class="nam">result</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">update_region_status</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">new_status</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t282" class="stm mis">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t283" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t284" class="stm mis">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t285" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Error updating status for region id:"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t286" class="stm mis">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_storage___init___py.html b/orm/services/region_manager/cover/rms_storage___init___py.html
new file mode 100644
index 00000000..b9e43969
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_storage___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/storage/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/storage/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_storage_base_data_manager_py.html b/orm/services/region_manager/cover/rms_storage_base_data_manager_py.html
new file mode 100644
index 00000000..c3b0d045
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_storage_base_data_manager_py.html
@@ -0,0 +1,331 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/storage/base_data_manager.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/storage/base_data_manager.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            24 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">24 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="stm run hide_run"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="stm run hide_run"><a href="#n42">42</a></p>
+<p id="n43" class="pln"><a href="#n43">43</a></p>
+<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="pln"><a href="#n48">48</a></p>
+<p id="n49" class="pln"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="pln"><a href="#n53">53</a></p>
+<p id="n54" class="pln"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="pln"><a href="#n56">56</a></p>
+<p id="n57" class="pln"><a href="#n57">57</a></p>
+<p id="n58" class="pln"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="pln"><a href="#n65">65</a></p>
+<p id="n66" class="pln"><a href="#n66">66</a></p>
+<p id="n67" class="pln"><a href="#n67">67</a></p>
+<p id="n68" class="pln"><a href="#n68">68</a></p>
+<p id="n69" class="pln"><a href="#n69">69</a></p>
+<p id="n70" class="pln"><a href="#n70">70</a></p>
+<p id="n71" class="pln"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="stm run hide_run"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="pln"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="pln"><a href="#n79">79</a></p>
+<p id="n80" class="pln"><a href="#n80">80</a></p>
+<p id="n81" class="pln"><a href="#n81">81</a></p>
+<p id="n82" class="pln"><a href="#n82">82</a></p>
+<p id="n83" class="pln"><a href="#n83">83</a></p>
+<p id="n84" class="pln"><a href="#n84">84</a></p>
+<p id="n85" class="pln"><a href="#n85">85</a></p>
+<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p>
+<p id="n87" class="stm run hide_run"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="stm run hide_run"><a href="#n89">89</a></p>
+<p id="n90" class="stm run hide_run"><a href="#n90">90</a></p>
+<p id="n91" class="pln"><a href="#n91">91</a></p>
+<p id="n92" class="stm run hide_run"><a href="#n92">92</a></p>
+<p id="n93" class="pln"><a href="#n93">93</a></p>
+<p id="n94" class="pln"><a href="#n94">94</a></p>
+<p id="n95" class="pln"><a href="#n95">95</a></p>
+<p id="n96" class="pln"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="pln"><a href="#n98">98</a></p>
+<p id="n99" class="pln"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="pln"><a href="#n101">101</a></p>
+<p id="n102" class="pln"><a href="#n102">102</a></p>
+<p id="n103" class="pln"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="stm run hide_run"><a href="#n105">105</a></p>
+<p id="n106" class="stm run hide_run"><a href="#n106">106</a></p>
+<p id="n107" class="pln"><a href="#n107">107</a></p>
+<p id="n108" class="pln"><a href="#n108">108</a></p>
+<p id="n109" class="stm run hide_run"><a href="#n109">109</a></p>
+<p id="n110" class="pln"><a href="#n110">110</a></p>
+<p id="n111" class="stm run hide_run"><a href="#n111">111</a></p>
+<p id="n112" class="pln"><a href="#n112">112</a></p>
+<p id="n113" class="pln"><a href="#n113">113</a></p>
+<p id="n114" class="stm run hide_run"><a href="#n114">114</a></p>
+<p id="n115" class="pln"><a href="#n115">115</a></p>
+<p id="n116" class="stm run hide_run"><a href="#n116">116</a></p>
+<p id="n117" class="pln"><a href="#n117">117</a></p>
+<p id="n118" class="pln"><a href="#n118">118</a></p>
+<p id="n119" class="stm run hide_run"><a href="#n119">119</a></p>
+<p id="n120" class="pln"><a href="#n120">120</a></p>
+<p id="n121" class="stm run hide_run"><a href="#n121">121</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">class</span> <span class="nam">BaseDataManager</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">url</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln">                 <span class="nam">max_retries</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln">                 <span class="nam">retry_interval</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run">        <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_region</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln">                   <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln">                   <span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln">                   <span class="nam">address_state</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln">                   <span class="nam">address_country</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln">                   <span class="nam">address_city</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln">                   <span class="nam">address_street</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln">                   <span class="nam">address_zip</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln">                   <span class="nam">region_status</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln">                   <span class="nam">ranger_agent_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln">                   <span class="nam">open_stack_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln">                   <span class="nam">design_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln">                   <span class="nam">location_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">                   <span class="nam">vlcp_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln">                   <span class="nam">clli</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln">                   <span class="nam">description</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln">                   <span class="nam">meta_data_list</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln">                   <span class="nam">end_point_list</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln">                   <span class="nam">is_ecomp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln">                   <span class="nam">is_ssp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln">                   <span class="nam">purpose_of_region</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">"Please Implement this method"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln"><span class="str">    def delete_region(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="str">                      region_id):</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln"><span class="str">        raise NotImplementedError("Please Implement this method")</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_regions</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln">                    <span class="nam">region_filters_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln">                    <span class="nam">meta_data_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln">                    <span class="nam">end_point_dict</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">"Please Implement this method"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_all_regions</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">"Please Implement this method"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="pln"><span class="str">    def add_meta_data_to_region(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="pln"><span class="str">                                region_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln"><span class="str">                                key,</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln"><span class="str">                                value,</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln"><span class="str">                                description):</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="pln"><span class="str">        raise NotImplementedError("Please Implement this method")</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln"><span class="str">    def remove_meta_data_from_region(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="pln"><span class="str">                                     region_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="pln"><span class="str">                                     key):</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="pln"><span class="str">        raise NotImplementedError("Please Implement this method")</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln"><span class="str">    def add_end_point_to_region(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln"><span class="str">                                region_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln"><span class="str">                                end_point_type,</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln"><span class="str">                                end_point_url,</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln"><span class="str">                                description):</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="pln"><span class="str">        raise NotImplementedError("Please Implement this method")</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t67" class="pln"><span class="str">    def remove_end_point_from_region(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="pln"><span class="str">                                     region_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="pln"><span class="str">                                     end_point_type):</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="pln"><span class="str">        raise NotImplementedError("Please Implement this method")</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t73" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_group</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln">                  <span class="nam">group_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln">                  <span class="nam">group_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln">                  <span class="nam">group_description</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="pln">                  <span class="nam">region_ids_list</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">"Please Implement this method"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t80" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="pln"><span class="str">    def delete_group(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="pln"><span class="str">                     group_name):</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="pln"><span class="str">        raise NotImplementedError("Please Implement this method")</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_group</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">"Please Implement this method"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t89" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_all_groups</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">"Please Implement this method"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t92" class="stm run hide_run">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="pln"><span class="str">    def add_region_to_group(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="pln"><span class="str">                            group_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="pln"><span class="str">                            region_id):</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="pln"><span class="str">        raise NotImplementedError("Please Implement this method")</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t98" class="pln"><span class="str">    def remove_region_from_group(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="pln"><span class="str">                                 group_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln"><span class="str">                                 region_id):</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="pln"><span class="str">        raise NotImplementedError("Please Implement this method")</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t105" class="stm run hide_run"><span class="key">class</span> <span class="nam">SQLDBError</span><span class="op">(</span><span class="nam">Exception</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t108" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t109" class="stm run hide_run"><span class="key">class</span> <span class="nam">EntityNotFound</span><span class="op">(</span><span class="nam">Exception</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="pln">    <span class="str">"""if item not found in DB."""</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t112" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t113" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t114" class="stm run hide_run"><span class="key">class</span> <span class="nam">DuplicateEntryError</span><span class="op">(</span><span class="nam">Exception</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="pln">    <span class="str">"""A group already exists."""</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t118" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t119" class="stm run hide_run"><span class="key">class</span> <span class="nam">InputValueError</span><span class="op">(</span><span class="nam">Exception</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="pln">    <span class="str">""" unvalid input from user"""</span><span class="strut">&nbsp;</span></p>
+<p id="t121" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_storage_data_manager_factory_py.html b/orm/services/region_manager/cover/rms_storage_data_manager_factory_py.html
new file mode 100644
index 00000000..87d1ef0d
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_storage_data_manager_factory_py.html
@@ -0,0 +1,129 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/storage/data_manager_factory.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/storage/data_manager_factory.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            12 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">12 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p>
+<p id="n17" class="stm run hide_run"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">storage</span><span class="op">.</span><span class="nam">my_sql</span><span class="op">.</span><span class="nam">data_manager</span> <span class="key">import</span> <span class="nam">DataManager</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="nam">LOG</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run">        <span class="nam">dm</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="nam">url</span><span class="op">=</span><span class="nam">conf</span><span class="op">.</span><span class="nam">database</span><span class="op">.</span><span class="nam">url</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln">                         <span class="nam">max_retries</span><span class="op">=</span><span class="nam">conf</span><span class="op">.</span><span class="nam">database</span><span class="op">.</span><span class="nam">max_retries</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln">                         <span class="nam">retries_interval</span><span class="op">=</span><span class="nam">conf</span><span class="op">.</span><span class="nam">database</span><span class="op">.</span><span class="nam">retries_interval</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run">        <span class="key">return</span> <span class="nam">dm</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm run hide_run">        <span class="nam">nagios_message</span> <span class="op">=</span> <span class="str">"CRITICAL|CONDB001 - Could not establish "</span> <span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln">                         <span class="str">"database connection"</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">nagios_message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">Exception</span><span class="op">(</span><span class="str">"Could not establish database connection"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_storage_my_sql___init___py.html b/orm/services/region_manager/cover/rms_storage_my_sql___init___py.html
new file mode 100644
index 00000000..a6e95539
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_storage_my_sql___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/storage/my_sql/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/storage/my_sql/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_storage_my_sql_data_manager_py.html b/orm/services/region_manager/cover/rms_storage_my_sql_data_manager_py.html
new file mode 100644
index 00000000..589a433b
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_storage_my_sql_data_manager_py.html
@@ -0,0 +1,1147 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/storage/my_sql/data_manager.py: 89%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/storage/my_sql/data_manager.py</b> :
+            <span class="pc_cov">89%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            270 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">239 run</span>
+            <span class="mis shortkey_m button_toggle_mis">31 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="stm run hide_run"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="pln"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="pln"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="pln"><a href="#n48">48</a></p>
+<p id="n49" class="pln"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="pln"><a href="#n53">53</a></p>
+<p id="n54" class="pln"><a href="#n54">54</a></p>
+<p id="n55" class="stm run hide_run"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="stm run hide_run"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="pln"><a href="#n65">65</a></p>
+<p id="n66" class="pln"><a href="#n66">66</a></p>
+<p id="n67" class="pln"><a href="#n67">67</a></p>
+<p id="n68" class="pln"><a href="#n68">68</a></p>
+<p id="n69" class="pln"><a href="#n69">69</a></p>
+<p id="n70" class="pln"><a href="#n70">70</a></p>
+<p id="n71" class="pln"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="pln"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="stm run hide_run"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="stm run hide_run"><a href="#n79">79</a></p>
+<p id="n80" class="pln"><a href="#n80">80</a></p>
+<p id="n81" class="pln"><a href="#n81">81</a></p>
+<p id="n82" class="stm run hide_run"><a href="#n82">82</a></p>
+<p id="n83" class="pln"><a href="#n83">83</a></p>
+<p id="n84" class="stm run hide_run"><a href="#n84">84</a></p>
+<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p>
+<p id="n87" class="stm run hide_run"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="pln"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="pln"><a href="#n91">91</a></p>
+<p id="n92" class="stm run hide_run"><a href="#n92">92</a></p>
+<p id="n93" class="stm run hide_run"><a href="#n93">93</a></p>
+<p id="n94" class="stm run hide_run"><a href="#n94">94</a></p>
+<p id="n95" class="stm run hide_run"><a href="#n95">95</a></p>
+<p id="n96" class="pln"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="stm run hide_run"><a href="#n98">98</a></p>
+<p id="n99" class="pln"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="pln"><a href="#n101">101</a></p>
+<p id="n102" class="pln"><a href="#n102">102</a></p>
+<p id="n103" class="pln"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="pln"><a href="#n105">105</a></p>
+<p id="n106" class="pln"><a href="#n106">106</a></p>
+<p id="n107" class="pln"><a href="#n107">107</a></p>
+<p id="n108" class="pln"><a href="#n108">108</a></p>
+<p id="n109" class="pln"><a href="#n109">109</a></p>
+<p id="n110" class="pln"><a href="#n110">110</a></p>
+<p id="n111" class="pln"><a href="#n111">111</a></p>
+<p id="n112" class="pln"><a href="#n112">112</a></p>
+<p id="n113" class="pln"><a href="#n113">113</a></p>
+<p id="n114" class="pln"><a href="#n114">114</a></p>
+<p id="n115" class="pln"><a href="#n115">115</a></p>
+<p id="n116" class="pln"><a href="#n116">116</a></p>
+<p id="n117" class="pln"><a href="#n117">117</a></p>
+<p id="n118" class="pln"><a href="#n118">118</a></p>
+<p id="n119" class="pln"><a href="#n119">119</a></p>
+<p id="n120" class="pln"><a href="#n120">120</a></p>
+<p id="n121" class="pln"><a href="#n121">121</a></p>
+<p id="n122" class="pln"><a href="#n122">122</a></p>
+<p id="n123" class="pln"><a href="#n123">123</a></p>
+<p id="n124" class="pln"><a href="#n124">124</a></p>
+<p id="n125" class="pln"><a href="#n125">125</a></p>
+<p id="n126" class="pln"><a href="#n126">126</a></p>
+<p id="n127" class="pln"><a href="#n127">127</a></p>
+<p id="n128" class="stm run hide_run"><a href="#n128">128</a></p>
+<p id="n129" class="stm run hide_run"><a href="#n129">129</a></p>
+<p id="n130" class="stm run hide_run"><a href="#n130">130</a></p>
+<p id="n131" class="pln"><a href="#n131">131</a></p>
+<p id="n132" class="stm run hide_run"><a href="#n132">132</a></p>
+<p id="n133" class="stm run hide_run"><a href="#n133">133</a></p>
+<p id="n134" class="pln"><a href="#n134">134</a></p>
+<p id="n135" class="stm run hide_run"><a href="#n135">135</a></p>
+<p id="n136" class="stm run hide_run"><a href="#n136">136</a></p>
+<p id="n137" class="pln"><a href="#n137">137</a></p>
+<p id="n138" class="pln"><a href="#n138">138</a></p>
+<p id="n139" class="stm run hide_run"><a href="#n139">139</a></p>
+<p id="n140" class="stm run hide_run"><a href="#n140">140</a></p>
+<p id="n141" class="stm run hide_run"><a href="#n141">141</a></p>
+<p id="n142" class="stm run hide_run"><a href="#n142">142</a></p>
+<p id="n143" class="stm run hide_run"><a href="#n143">143</a></p>
+<p id="n144" class="stm run hide_run"><a href="#n144">144</a></p>
+<p id="n145" class="stm run hide_run"><a href="#n145">145</a></p>
+<p id="n146" class="stm run hide_run"><a href="#n146">146</a></p>
+<p id="n147" class="stm run hide_run"><a href="#n147">147</a></p>
+<p id="n148" class="stm run hide_run"><a href="#n148">148</a></p>
+<p id="n149" class="stm run hide_run"><a href="#n149">149</a></p>
+<p id="n150" class="stm run hide_run"><a href="#n150">150</a></p>
+<p id="n151" class="stm run hide_run"><a href="#n151">151</a></p>
+<p id="n152" class="stm run hide_run"><a href="#n152">152</a></p>
+<p id="n153" class="stm run hide_run"><a href="#n153">153</a></p>
+<p id="n154" class="stm run hide_run"><a href="#n154">154</a></p>
+<p id="n155" class="pln"><a href="#n155">155</a></p>
+<p id="n156" class="stm run hide_run"><a href="#n156">156</a></p>
+<p id="n157" class="stm run hide_run"><a href="#n157">157</a></p>
+<p id="n158" class="stm run hide_run"><a href="#n158">158</a></p>
+<p id="n159" class="pln"><a href="#n159">159</a></p>
+<p id="n160" class="pln"><a href="#n160">160</a></p>
+<p id="n161" class="pln"><a href="#n161">161</a></p>
+<p id="n162" class="stm run hide_run"><a href="#n162">162</a></p>
+<p id="n163" class="pln"><a href="#n163">163</a></p>
+<p id="n164" class="stm run hide_run"><a href="#n164">164</a></p>
+<p id="n165" class="stm run hide_run"><a href="#n165">165</a></p>
+<p id="n166" class="stm run hide_run"><a href="#n166">166</a></p>
+<p id="n167" class="stm run hide_run"><a href="#n167">167</a></p>
+<p id="n168" class="pln"><a href="#n168">168</a></p>
+<p id="n169" class="pln"><a href="#n169">169</a></p>
+<p id="n170" class="pln"><a href="#n170">170</a></p>
+<p id="n171" class="pln"><a href="#n171">171</a></p>
+<p id="n172" class="stm run hide_run"><a href="#n172">172</a></p>
+<p id="n173" class="pln"><a href="#n173">173</a></p>
+<p id="n174" class="stm run hide_run"><a href="#n174">174</a></p>
+<p id="n175" class="stm run hide_run"><a href="#n175">175</a></p>
+<p id="n176" class="pln"><a href="#n176">176</a></p>
+<p id="n177" class="pln"><a href="#n177">177</a></p>
+<p id="n178" class="stm run hide_run"><a href="#n178">178</a></p>
+<p id="n179" class="stm run hide_run"><a href="#n179">179</a></p>
+<p id="n180" class="stm run hide_run"><a href="#n180">180</a></p>
+<p id="n181" class="stm run hide_run"><a href="#n181">181</a></p>
+<p id="n182" class="pln"><a href="#n182">182</a></p>
+<p id="n183" class="stm run hide_run"><a href="#n183">183</a></p>
+<p id="n184" class="pln"><a href="#n184">184</a></p>
+<p id="n185" class="pln"><a href="#n185">185</a></p>
+<p id="n186" class="stm run hide_run"><a href="#n186">186</a></p>
+<p id="n187" class="stm run hide_run"><a href="#n187">187</a></p>
+<p id="n188" class="stm run hide_run"><a href="#n188">188</a></p>
+<p id="n189" class="pln"><a href="#n189">189</a></p>
+<p id="n190" class="stm run hide_run"><a href="#n190">190</a></p>
+<p id="n191" class="stm run hide_run"><a href="#n191">191</a></p>
+<p id="n192" class="pln"><a href="#n192">192</a></p>
+<p id="n193" class="stm run hide_run"><a href="#n193">193</a></p>
+<p id="n194" class="pln"><a href="#n194">194</a></p>
+<p id="n195" class="pln"><a href="#n195">195</a></p>
+<p id="n196" class="pln"><a href="#n196">196</a></p>
+<p id="n197" class="stm run hide_run"><a href="#n197">197</a></p>
+<p id="n198" class="stm run hide_run"><a href="#n198">198</a></p>
+<p id="n199" class="stm run hide_run"><a href="#n199">199</a></p>
+<p id="n200" class="stm run hide_run"><a href="#n200">200</a></p>
+<p id="n201" class="stm run hide_run"><a href="#n201">201</a></p>
+<p id="n202" class="stm run hide_run"><a href="#n202">202</a></p>
+<p id="n203" class="stm run hide_run"><a href="#n203">203</a></p>
+<p id="n204" class="pln"><a href="#n204">204</a></p>
+<p id="n205" class="stm run hide_run"><a href="#n205">205</a></p>
+<p id="n206" class="stm run hide_run"><a href="#n206">206</a></p>
+<p id="n207" class="pln"><a href="#n207">207</a></p>
+<p id="n208" class="stm run hide_run"><a href="#n208">208</a></p>
+<p id="n209" class="stm run hide_run"><a href="#n209">209</a></p>
+<p id="n210" class="stm run hide_run"><a href="#n210">210</a></p>
+<p id="n211" class="pln"><a href="#n211">211</a></p>
+<p id="n212" class="stm run hide_run"><a href="#n212">212</a></p>
+<p id="n213" class="stm run hide_run"><a href="#n213">213</a></p>
+<p id="n214" class="pln"><a href="#n214">214</a></p>
+<p id="n215" class="stm run hide_run"><a href="#n215">215</a></p>
+<p id="n216" class="stm run hide_run"><a href="#n216">216</a></p>
+<p id="n217" class="stm run hide_run"><a href="#n217">217</a></p>
+<p id="n218" class="stm run hide_run"><a href="#n218">218</a></p>
+<p id="n219" class="pln"><a href="#n219">219</a></p>
+<p id="n220" class="stm run hide_run"><a href="#n220">220</a></p>
+<p id="n221" class="stm run hide_run"><a href="#n221">221</a></p>
+<p id="n222" class="stm run hide_run"><a href="#n222">222</a></p>
+<p id="n223" class="stm run hide_run"><a href="#n223">223</a></p>
+<p id="n224" class="pln"><a href="#n224">224</a></p>
+<p id="n225" class="stm run hide_run"><a href="#n225">225</a></p>
+<p id="n226" class="stm run hide_run"><a href="#n226">226</a></p>
+<p id="n227" class="stm run hide_run"><a href="#n227">227</a></p>
+<p id="n228" class="stm mis"><a href="#n228">228</a></p>
+<p id="n229" class="stm run hide_run"><a href="#n229">229</a></p>
+<p id="n230" class="stm run hide_run"><a href="#n230">230</a></p>
+<p id="n231" class="stm run hide_run"><a href="#n231">231</a></p>
+<p id="n232" class="stm mis"><a href="#n232">232</a></p>
+<p id="n233" class="pln"><a href="#n233">233</a></p>
+<p id="n234" class="pln"><a href="#n234">234</a></p>
+<p id="n235" class="stm mis"><a href="#n235">235</a></p>
+<p id="n236" class="stm mis"><a href="#n236">236</a></p>
+<p id="n237" class="stm mis"><a href="#n237">237</a></p>
+<p id="n238" class="stm mis"><a href="#n238">238</a></p>
+<p id="n239" class="stm mis"><a href="#n239">239</a></p>
+<p id="n240" class="stm mis"><a href="#n240">240</a></p>
+<p id="n241" class="pln"><a href="#n241">241</a></p>
+<p id="n242" class="stm run hide_run"><a href="#n242">242</a></p>
+<p id="n243" class="stm run hide_run"><a href="#n243">243</a></p>
+<p id="n244" class="stm run hide_run"><a href="#n244">244</a></p>
+<p id="n245" class="stm run hide_run"><a href="#n245">245</a></p>
+<p id="n246" class="stm run hide_run"><a href="#n246">246</a></p>
+<p id="n247" class="pln"><a href="#n247">247</a></p>
+<p id="n248" class="stm mis"><a href="#n248">248</a></p>
+<p id="n249" class="stm run hide_run"><a href="#n249">249</a></p>
+<p id="n250" class="stm run hide_run"><a href="#n250">250</a></p>
+<p id="n251" class="pln"><a href="#n251">251</a></p>
+<p id="n252" class="stm run hide_run"><a href="#n252">252</a></p>
+<p id="n253" class="stm run hide_run"><a href="#n253">253</a></p>
+<p id="n254" class="stm run hide_run"><a href="#n254">254</a></p>
+<p id="n255" class="pln"><a href="#n255">255</a></p>
+<p id="n256" class="stm run hide_run"><a href="#n256">256</a></p>
+<p id="n257" class="stm run hide_run"><a href="#n257">257</a></p>
+<p id="n258" class="stm run hide_run"><a href="#n258">258</a></p>
+<p id="n259" class="stm run hide_run"><a href="#n259">259</a></p>
+<p id="n260" class="pln"><a href="#n260">260</a></p>
+<p id="n261" class="stm run hide_run"><a href="#n261">261</a></p>
+<p id="n262" class="stm run hide_run"><a href="#n262">262</a></p>
+<p id="n263" class="stm run hide_run"><a href="#n263">263</a></p>
+<p id="n264" class="pln"><a href="#n264">264</a></p>
+<p id="n265" class="stm run hide_run"><a href="#n265">265</a></p>
+<p id="n266" class="stm run hide_run"><a href="#n266">266</a></p>
+<p id="n267" class="stm run hide_run"><a href="#n267">267</a></p>
+<p id="n268" class="pln"><a href="#n268">268</a></p>
+<p id="n269" class="stm run hide_run"><a href="#n269">269</a></p>
+<p id="n270" class="pln"><a href="#n270">270</a></p>
+<p id="n271" class="pln"><a href="#n271">271</a></p>
+<p id="n272" class="pln"><a href="#n272">272</a></p>
+<p id="n273" class="pln"><a href="#n273">273</a></p>
+<p id="n274" class="pln"><a href="#n274">274</a></p>
+<p id="n275" class="pln"><a href="#n275">275</a></p>
+<p id="n276" class="stm run hide_run"><a href="#n276">276</a></p>
+<p id="n277" class="stm run hide_run"><a href="#n277">277</a></p>
+<p id="n278" class="stm run hide_run"><a href="#n278">278</a></p>
+<p id="n279" class="stm run hide_run"><a href="#n279">279</a></p>
+<p id="n280" class="pln"><a href="#n280">280</a></p>
+<p id="n281" class="pln"><a href="#n281">281</a></p>
+<p id="n282" class="stm run hide_run"><a href="#n282">282</a></p>
+<p id="n283" class="stm run hide_run"><a href="#n283">283</a></p>
+<p id="n284" class="stm run hide_run"><a href="#n284">284</a></p>
+<p id="n285" class="stm run hide_run"><a href="#n285">285</a></p>
+<p id="n286" class="stm run hide_run"><a href="#n286">286</a></p>
+<p id="n287" class="pln"><a href="#n287">287</a></p>
+<p id="n288" class="pln"><a href="#n288">288</a></p>
+<p id="n289" class="stm run hide_run"><a href="#n289">289</a></p>
+<p id="n290" class="stm run hide_run"><a href="#n290">290</a></p>
+<p id="n291" class="pln"><a href="#n291">291</a></p>
+<p id="n292" class="stm run hide_run"><a href="#n292">292</a></p>
+<p id="n293" class="pln"><a href="#n293">293</a></p>
+<p id="n294" class="stm run hide_run"><a href="#n294">294</a></p>
+<p id="n295" class="pln"><a href="#n295">295</a></p>
+<p id="n296" class="stm run hide_run"><a href="#n296">296</a></p>
+<p id="n297" class="stm run hide_run"><a href="#n297">297</a></p>
+<p id="n298" class="stm run hide_run"><a href="#n298">298</a></p>
+<p id="n299" class="pln"><a href="#n299">299</a></p>
+<p id="n300" class="pln"><a href="#n300">300</a></p>
+<p id="n301" class="stm run hide_run"><a href="#n301">301</a></p>
+<p id="n302" class="pln"><a href="#n302">302</a></p>
+<p id="n303" class="pln"><a href="#n303">303</a></p>
+<p id="n304" class="pln"><a href="#n304">304</a></p>
+<p id="n305" class="pln"><a href="#n305">305</a></p>
+<p id="n306" class="pln"><a href="#n306">306</a></p>
+<p id="n307" class="pln"><a href="#n307">307</a></p>
+<p id="n308" class="pln"><a href="#n308">308</a></p>
+<p id="n309" class="stm run hide_run"><a href="#n309">309</a></p>
+<p id="n310" class="stm run hide_run"><a href="#n310">310</a></p>
+<p id="n311" class="pln"><a href="#n311">311</a></p>
+<p id="n312" class="stm run hide_run"><a href="#n312">312</a></p>
+<p id="n313" class="pln"><a href="#n313">313</a></p>
+<p id="n314" class="stm run hide_run"><a href="#n314">314</a></p>
+<p id="n315" class="stm run hide_run"><a href="#n315">315</a></p>
+<p id="n316" class="stm run hide_run"><a href="#n316">316</a></p>
+<p id="n317" class="stm run hide_run"><a href="#n317">317</a></p>
+<p id="n318" class="pln"><a href="#n318">318</a></p>
+<p id="n319" class="stm run hide_run"><a href="#n319">319</a></p>
+<p id="n320" class="pln"><a href="#n320">320</a></p>
+<p id="n321" class="pln"><a href="#n321">321</a></p>
+<p id="n322" class="stm run hide_run"><a href="#n322">322</a></p>
+<p id="n323" class="stm run hide_run"><a href="#n323">323</a></p>
+<p id="n324" class="stm run hide_run"><a href="#n324">324</a></p>
+<p id="n325" class="stm run hide_run"><a href="#n325">325</a></p>
+<p id="n326" class="pln"><a href="#n326">326</a></p>
+<p id="n327" class="pln"><a href="#n327">327</a></p>
+<p id="n328" class="pln"><a href="#n328">328</a></p>
+<p id="n329" class="stm run hide_run"><a href="#n329">329</a></p>
+<p id="n330" class="stm run hide_run"><a href="#n330">330</a></p>
+<p id="n331" class="pln"><a href="#n331">331</a></p>
+<p id="n332" class="stm run hide_run"><a href="#n332">332</a></p>
+<p id="n333" class="stm run hide_run"><a href="#n333">333</a></p>
+<p id="n334" class="stm run hide_run"><a href="#n334">334</a></p>
+<p id="n335" class="stm run hide_run"><a href="#n335">335</a></p>
+<p id="n336" class="pln"><a href="#n336">336</a></p>
+<p id="n337" class="pln"><a href="#n337">337</a></p>
+<p id="n338" class="stm run hide_run"><a href="#n338">338</a></p>
+<p id="n339" class="stm run hide_run"><a href="#n339">339</a></p>
+<p id="n340" class="stm run hide_run"><a href="#n340">340</a></p>
+<p id="n341" class="stm run hide_run"><a href="#n341">341</a></p>
+<p id="n342" class="pln"><a href="#n342">342</a></p>
+<p id="n343" class="stm run hide_run"><a href="#n343">343</a></p>
+<p id="n344" class="pln"><a href="#n344">344</a></p>
+<p id="n345" class="pln"><a href="#n345">345</a></p>
+<p id="n346" class="stm run hide_run"><a href="#n346">346</a></p>
+<p id="n347" class="stm run hide_run"><a href="#n347">347</a></p>
+<p id="n348" class="stm run hide_run"><a href="#n348">348</a></p>
+<p id="n349" class="stm run hide_run"><a href="#n349">349</a></p>
+<p id="n350" class="pln"><a href="#n350">350</a></p>
+<p id="n351" class="stm run hide_run"><a href="#n351">351</a></p>
+<p id="n352" class="stm run hide_run"><a href="#n352">352</a></p>
+<p id="n353" class="stm run hide_run"><a href="#n353">353</a></p>
+<p id="n354" class="pln"><a href="#n354">354</a></p>
+<p id="n355" class="stm run hide_run"><a href="#n355">355</a></p>
+<p id="n356" class="stm run hide_run"><a href="#n356">356</a></p>
+<p id="n357" class="stm run hide_run"><a href="#n357">357</a></p>
+<p id="n358" class="stm run hide_run"><a href="#n358">358</a></p>
+<p id="n359" class="pln"><a href="#n359">359</a></p>
+<p id="n360" class="stm run hide_run"><a href="#n360">360</a></p>
+<p id="n361" class="stm run hide_run"><a href="#n361">361</a></p>
+<p id="n362" class="stm run hide_run"><a href="#n362">362</a></p>
+<p id="n363" class="pln"><a href="#n363">363</a></p>
+<p id="n364" class="pln"><a href="#n364">364</a></p>
+<p id="n365" class="pln"><a href="#n365">365</a></p>
+<p id="n366" class="pln"><a href="#n366">366</a></p>
+<p id="n367" class="pln"><a href="#n367">367</a></p>
+<p id="n368" class="pln"><a href="#n368">368</a></p>
+<p id="n369" class="pln"><a href="#n369">369</a></p>
+<p id="n370" class="pln"><a href="#n370">370</a></p>
+<p id="n371" class="pln"><a href="#n371">371</a></p>
+<p id="n372" class="pln"><a href="#n372">372</a></p>
+<p id="n373" class="pln"><a href="#n373">373</a></p>
+<p id="n374" class="pln"><a href="#n374">374</a></p>
+<p id="n375" class="pln"><a href="#n375">375</a></p>
+<p id="n376" class="pln"><a href="#n376">376</a></p>
+<p id="n377" class="pln"><a href="#n377">377</a></p>
+<p id="n378" class="pln"><a href="#n378">378</a></p>
+<p id="n379" class="pln"><a href="#n379">379</a></p>
+<p id="n380" class="pln"><a href="#n380">380</a></p>
+<p id="n381" class="pln"><a href="#n381">381</a></p>
+<p id="n382" class="pln"><a href="#n382">382</a></p>
+<p id="n383" class="pln"><a href="#n383">383</a></p>
+<p id="n384" class="pln"><a href="#n384">384</a></p>
+<p id="n385" class="pln"><a href="#n385">385</a></p>
+<p id="n386" class="pln"><a href="#n386">386</a></p>
+<p id="n387" class="pln"><a href="#n387">387</a></p>
+<p id="n388" class="pln"><a href="#n388">388</a></p>
+<p id="n389" class="pln"><a href="#n389">389</a></p>
+<p id="n390" class="pln"><a href="#n390">390</a></p>
+<p id="n391" class="pln"><a href="#n391">391</a></p>
+<p id="n392" class="pln"><a href="#n392">392</a></p>
+<p id="n393" class="pln"><a href="#n393">393</a></p>
+<p id="n394" class="pln"><a href="#n394">394</a></p>
+<p id="n395" class="pln"><a href="#n395">395</a></p>
+<p id="n396" class="pln"><a href="#n396">396</a></p>
+<p id="n397" class="pln"><a href="#n397">397</a></p>
+<p id="n398" class="pln"><a href="#n398">398</a></p>
+<p id="n399" class="stm run hide_run"><a href="#n399">399</a></p>
+<p id="n400" class="pln"><a href="#n400">400</a></p>
+<p id="n401" class="pln"><a href="#n401">401</a></p>
+<p id="n402" class="pln"><a href="#n402">402</a></p>
+<p id="n403" class="pln"><a href="#n403">403</a></p>
+<p id="n404" class="stm run hide_run"><a href="#n404">404</a></p>
+<p id="n405" class="stm run hide_run"><a href="#n405">405</a></p>
+<p id="n406" class="stm run hide_run"><a href="#n406">406</a></p>
+<p id="n407" class="stm run hide_run"><a href="#n407">407</a></p>
+<p id="n408" class="pln"><a href="#n408">408</a></p>
+<p id="n409" class="pln"><a href="#n409">409</a></p>
+<p id="n410" class="pln"><a href="#n410">410</a></p>
+<p id="n411" class="stm run hide_run"><a href="#n411">411</a></p>
+<p id="n412" class="pln"><a href="#n412">412</a></p>
+<p id="n413" class="stm run hide_run"><a href="#n413">413</a></p>
+<p id="n414" class="stm run hide_run"><a href="#n414">414</a></p>
+<p id="n415" class="stm run hide_run"><a href="#n415">415</a></p>
+<p id="n416" class="stm run hide_run"><a href="#n416">416</a></p>
+<p id="n417" class="pln"><a href="#n417">417</a></p>
+<p id="n418" class="stm run hide_run"><a href="#n418">418</a></p>
+<p id="n419" class="stm run hide_run"><a href="#n419">419</a></p>
+<p id="n420" class="stm run hide_run"><a href="#n420">420</a></p>
+<p id="n421" class="stm run hide_run"><a href="#n421">421</a></p>
+<p id="n422" class="stm run hide_run"><a href="#n422">422</a></p>
+<p id="n423" class="stm run hide_run"><a href="#n423">423</a></p>
+<p id="n424" class="stm run hide_run"><a href="#n424">424</a></p>
+<p id="n425" class="pln"><a href="#n425">425</a></p>
+<p id="n426" class="stm run hide_run"><a href="#n426">426</a></p>
+<p id="n427" class="stm run hide_run"><a href="#n427">427</a></p>
+<p id="n428" class="stm run hide_run"><a href="#n428">428</a></p>
+<p id="n429" class="stm run hide_run"><a href="#n429">429</a></p>
+<p id="n430" class="pln"><a href="#n430">430</a></p>
+<p id="n431" class="stm run hide_run"><a href="#n431">431</a></p>
+<p id="n432" class="stm run hide_run"><a href="#n432">432</a></p>
+<p id="n433" class="stm run hide_run"><a href="#n433">433</a></p>
+<p id="n434" class="stm run hide_run"><a href="#n434">434</a></p>
+<p id="n435" class="stm run hide_run"><a href="#n435">435</a></p>
+<p id="n436" class="stm run hide_run"><a href="#n436">436</a></p>
+<p id="n437" class="stm run hide_run"><a href="#n437">437</a></p>
+<p id="n438" class="stm mis"><a href="#n438">438</a></p>
+<p id="n439" class="stm mis"><a href="#n439">439</a></p>
+<p id="n440" class="stm mis"><a href="#n440">440</a></p>
+<p id="n441" class="stm mis"><a href="#n441">441</a></p>
+<p id="n442" class="stm mis"><a href="#n442">442</a></p>
+<p id="n443" class="stm mis"><a href="#n443">443</a></p>
+<p id="n444" class="pln"><a href="#n444">444</a></p>
+<p id="n445" class="stm mis"><a href="#n445">445</a></p>
+<p id="n446" class="stm mis"><a href="#n446">446</a></p>
+<p id="n447" class="pln"><a href="#n447">447</a></p>
+<p id="n448" class="stm mis"><a href="#n448">448</a></p>
+<p id="n449" class="stm mis"><a href="#n449">449</a></p>
+<p id="n450" class="stm run hide_run"><a href="#n450">450</a></p>
+<p id="n451" class="pln"><a href="#n451">451</a></p>
+<p id="n452" class="stm run hide_run"><a href="#n452">452</a></p>
+<p id="n453" class="pln"><a href="#n453">453</a></p>
+<p id="n454" class="stm run hide_run"><a href="#n454">454</a></p>
+<p id="n455" class="stm run hide_run"><a href="#n455">455</a></p>
+<p id="n456" class="stm run hide_run"><a href="#n456">456</a></p>
+<p id="n457" class="pln"><a href="#n457">457</a></p>
+<p id="n458" class="stm run hide_run"><a href="#n458">458</a></p>
+<p id="n459" class="pln"><a href="#n459">459</a></p>
+<p id="n460" class="pln"><a href="#n460">460</a></p>
+<p id="n461" class="stm run hide_run"><a href="#n461">461</a></p>
+<p id="n462" class="pln"><a href="#n462">462</a></p>
+<p id="n463" class="stm run hide_run"><a href="#n463">463</a></p>
+<p id="n464" class="stm mis"><a href="#n464">464</a></p>
+<p id="n465" class="pln"><a href="#n465">465</a></p>
+<p id="n466" class="pln"><a href="#n466">466</a></p>
+<p id="n467" class="stm run hide_run"><a href="#n467">467</a></p>
+<p id="n468" class="stm run hide_run"><a href="#n468">468</a></p>
+<p id="n469" class="stm run hide_run"><a href="#n469">469</a></p>
+<p id="n470" class="stm run hide_run"><a href="#n470">470</a></p>
+<p id="n471" class="stm run hide_run"><a href="#n471">471</a></p>
+<p id="n472" class="pln"><a href="#n472">472</a></p>
+<p id="n473" class="stm run hide_run"><a href="#n473">473</a></p>
+<p id="n474" class="pln"><a href="#n474">474</a></p>
+<p id="n475" class="stm mis"><a href="#n475">475</a></p>
+<p id="n476" class="stm mis"><a href="#n476">476</a></p>
+<p id="n477" class="stm mis"><a href="#n477">477</a></p>
+<p id="n478" class="stm mis"><a href="#n478">478</a></p>
+<p id="n479" class="stm mis"><a href="#n479">479</a></p>
+<p id="n480" class="stm mis"><a href="#n480">480</a></p>
+<p id="n481" class="stm mis"><a href="#n481">481</a></p>
+<p id="n482" class="stm mis"><a href="#n482">482</a></p>
+<p id="n483" class="stm mis"><a href="#n483">483</a></p>
+<p id="n484" class="stm mis"><a href="#n484">484</a></p>
+<p id="n485" class="stm run hide_run"><a href="#n485">485</a></p>
+<p id="n486" class="pln"><a href="#n486">486</a></p>
+<p id="n487" class="stm run hide_run"><a href="#n487">487</a></p>
+<p id="n488" class="stm run hide_run"><a href="#n488">488</a></p>
+<p id="n489" class="stm run hide_run"><a href="#n489">489</a></p>
+<p id="n490" class="stm run hide_run"><a href="#n490">490</a></p>
+<p id="n491" class="stm run hide_run"><a href="#n491">491</a></p>
+<p id="n492" class="stm run hide_run"><a href="#n492">492</a></p>
+<p id="n493" class="pln"><a href="#n493">493</a></p>
+<p id="n494" class="stm run hide_run"><a href="#n494">494</a></p>
+<p id="n495" class="stm run hide_run"><a href="#n495">495</a></p>
+<p id="n496" class="pln"><a href="#n496">496</a></p>
+<p id="n497" class="pln"><a href="#n497">497</a></p>
+<p id="n498" class="stm run hide_run"><a href="#n498">498</a></p>
+<p id="n499" class="stm run hide_run"><a href="#n499">499</a></p>
+<p id="n500" class="pln"><a href="#n500">500</a></p>
+<p id="n501" class="stm run hide_run"><a href="#n501">501</a></p>
+<p id="n502" class="stm mis"><a href="#n502">502</a></p>
+<p id="n503" class="stm run hide_run"><a href="#n503">503</a></p>
+<p id="n504" class="stm run hide_run"><a href="#n504">504</a></p>
+<p id="n505" class="pln"><a href="#n505">505</a></p>
+<p id="n506" class="stm run hide_run"><a href="#n506">506</a></p>
+<p id="n507" class="pln"><a href="#n507">507</a></p>
+<p id="n508" class="pln"><a href="#n508">508</a></p>
+<p id="n509" class="pln"><a href="#n509">509</a></p>
+<p id="n510" class="pln"><a href="#n510">510</a></p>
+<p id="n511" class="pln"><a href="#n511">511</a></p>
+<p id="n512" class="pln"><a href="#n512">512</a></p>
+<p id="n513" class="pln"><a href="#n513">513</a></p>
+<p id="n514" class="pln"><a href="#n514">514</a></p>
+<p id="n515" class="pln"><a href="#n515">515</a></p>
+<p id="n516" class="pln"><a href="#n516">516</a></p>
+<p id="n517" class="pln"><a href="#n517">517</a></p>
+<p id="n518" class="pln"><a href="#n518">518</a></p>
+<p id="n519" class="pln"><a href="#n519">519</a></p>
+<p id="n520" class="pln"><a href="#n520">520</a></p>
+<p id="n521" class="pln"><a href="#n521">521</a></p>
+<p id="n522" class="pln"><a href="#n522">522</a></p>
+<p id="n523" class="pln"><a href="#n523">523</a></p>
+<p id="n524" class="pln"><a href="#n524">524</a></p>
+<p id="n525" class="pln"><a href="#n525">525</a></p>
+<p id="n526" class="pln"><a href="#n526">526</a></p>
+<p id="n527" class="pln"><a href="#n527">527</a></p>
+<p id="n528" class="pln"><a href="#n528">528</a></p>
+<p id="n529" class="pln"><a href="#n529">529</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">import</span> <span class="nam">oslo_db</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">oslo_db</span><span class="op">.</span><span class="nam">sqlalchemy</span> <span class="key">import</span> <span class="nam">session</span> <span class="key">as</span> <span class="nam">db_session</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">sqlalchemy</span><span class="op">.</span><span class="nam">ext</span><span class="op">.</span><span class="nam">declarative</span><span class="op">.</span><span class="nam">api</span> <span class="key">import</span> <span class="nam">declarative_base</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">sqlalchemy</span><span class="op">.</span><span class="nam">sql</span> <span class="key">import</span> <span class="nam">or_</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">error_base</span> <span class="key">as</span> <span class="nam">ServiceBase</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">data_models</span> <span class="key">import</span> <span class="nam">Region</span><span class="op">,</span> <span class="nam">RegionEndPoint</span><span class="op">,</span> <span class="nam">Group</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">data_models</span> <span class="key">import</span> <span class="nam">RegionMetaData</span><span class="op">,</span> <span class="nam">GroupRegion</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">error_base</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">storage</span><span class="op">.</span><span class="nam">base_data_manager</span> <span class="key">import</span> <span class="nam">BaseDataManager</span><span class="op">,</span> <span class="nam">DuplicateEntryError</span><span class="op">,</span> <span class="nam">EntityNotFound</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">model</span> <span class="key">import</span> <span class="nam">model</span> <span class="key">as</span> <span class="nam">PythonModels</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="nam">Base</span> <span class="op">=</span> <span class="nam">declarative_base</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run"><span class="key">class</span> <span class="nam">DataManager</span><span class="op">(</span><span class="nam">BaseDataManager</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">url</span><span class="op">,</span> <span class="nam">max_retries</span><span class="op">,</span> <span class="nam">retries_interval</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span> <span class="op">=</span> <span class="nam">db_session</span><span class="op">.</span><span class="nam">EngineFacade</span><span class="op">(</span><span class="nam">url</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln">                                                      <span class="nam">max_retries</span><span class="op">=</span><span class="nam">max_retries</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln">                                                      <span class="nam">retry_interval</span><span class="op">=</span><span class="nam">retries_interval</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_region</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln">                   <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln">                   <span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln">                   <span class="nam">address_state</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln">                   <span class="nam">address_country</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln">                   <span class="nam">address_city</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln">                   <span class="nam">address_street</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln">                   <span class="nam">address_zip</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln">                   <span class="nam">region_status</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln">                   <span class="nam">ranger_agent_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln">                   <span class="nam">open_stack_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln">                   <span class="nam">design_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln">                   <span class="nam">location_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln">                   <span class="nam">vlcp_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln">                   <span class="nam">clli</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln">                   <span class="com"># a list of dictionaries of format</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln">                   <span class="com"># {"type":"", "url":"", "description":""</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="pln">                   <span class="nam">end_point_list</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln">                   <span class="com"># a dictionary of key,value pairs</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="pln">                   <span class="com"># {"key":"value", }</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln">                   <span class="nam">meta_data_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln">                   <span class="nam">is_ecomp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="pln">                   <span class="nam">is_ssp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="pln">                   <span class="nam">purpose_of_region</span><span class="op">=</span><span class="str">""</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln">                   <span class="nam">description</span><span class="op">=</span><span class="str">""</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln">        <span class="str">""" add a new region to the `region` table</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln"><span class="str">        add also the regions give meta_data and end_points to the `region_end_point` and</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="pln"><span class="str">        `region_meta_data` tables if given.</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="pln"><span class="str">        handle duplicate errors if raised"""</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">            <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">            <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm run hide_run">                <span class="nam">region</span> <span class="op">=</span> <span class="nam">Region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln">                                <span class="nam">name</span><span class="op">=</span><span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln">                                <span class="nam">address_state</span><span class="op">=</span><span class="nam">address_state</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln">                                <span class="nam">address_country</span><span class="op">=</span><span class="nam">address_country</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln">                                <span class="nam">address_city</span><span class="op">=</span><span class="nam">address_city</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln">                                <span class="nam">address_street</span><span class="op">=</span><span class="nam">address_street</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln">                                <span class="nam">address_zip</span><span class="op">=</span><span class="nam">address_zip</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="pln">                                <span class="nam">region_status</span><span class="op">=</span><span class="nam">region_status</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="pln">                                <span class="nam">ranger_agent_version</span><span class="op">=</span><span class="nam">ranger_agent_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="pln">                                <span class="nam">open_stack_version</span><span class="op">=</span><span class="nam">open_stack_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="pln">                                <span class="nam">design_type</span><span class="op">=</span><span class="nam">design_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="pln">                                <span class="nam">location_type</span><span class="op">=</span><span class="nam">location_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="pln">                                <span class="nam">vlcp_name</span><span class="op">=</span><span class="nam">vlcp_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="pln">                                <span class="nam">clli</span><span class="op">=</span><span class="nam">clli</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln">                                <span class="nam">description</span><span class="op">=</span><span class="nam">description</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="pln">                                <span class="nam">is_ecomp</span><span class="op">=</span><span class="nam">is_ecomp</span> <span class="op">*</span> <span class="num">1</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln">                                <span class="nam">is_ssp</span><span class="op">=</span><span class="nam">is_ssp</span> <span class="op">*</span> <span class="num">1</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln">                                <span class="nam">purpose_of_region</span><span class="op">=</span><span class="nam">purpose_of_region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t77" class="stm run hide_run">                <span class="key">if</span> <span class="nam">end_point_list</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">                    <span class="key">for</span> <span class="nam">end_point</span> <span class="key">in</span> <span class="nam">end_point_list</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm run hide_run">                        <span class="nam">region_end_point</span> <span class="op">=</span> <span class="nam">RegionEndPoint</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="pln">                            <span class="nam">end_point_type</span><span class="op">=</span><span class="nam">end_point</span><span class="op">[</span><span class="str">"type"</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="pln">                            <span class="nam">public_url</span><span class="op">=</span><span class="nam">end_point</span><span class="op">[</span><span class="str">"url"</span><span class="op">]</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="stm run hide_run">                        <span class="nam">region</span><span class="op">.</span><span class="nam">end_points</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">region_end_point</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm run hide_run">                <span class="key">if</span> <span class="nam">meta_data_dict</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm run hide_run">                    <span class="key">for</span> <span class="nam">k</span><span class="op">,</span> <span class="nam">v</span> <span class="key">in</span> <span class="nam">meta_data_dict</span><span class="op">.</span><span class="nam">iteritems</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm run hide_run">                        <span class="key">for</span> <span class="nam">list_item</span> <span class="key">in</span> <span class="nam">v</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="stm run hide_run">                            <span class="nam">region</span><span class="op">.</span><span class="nam">meta_data</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln">                                <span class="nam">RegionMetaData</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="pln">                                               <span class="nam">meta_data_key</span><span class="op">=</span><span class="nam">k</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln">                                               <span class="nam">meta_data_value</span><span class="op">=</span><span class="nam">list_item</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t92" class="stm run hide_run">                <span class="nam">session</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="stm run hide_run">        <span class="key">except</span> <span class="nam">oslo_db</span><span class="op">.</span><span class="nam">exception</span><span class="op">.</span><span class="nam">DBDuplicateEntry</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">warning</span><span class="op">(</span><span class="str">"Duplicate entry: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">e</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">DuplicateEntryError</span><span class="op">(</span><span class="str">"Region {} already "</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="pln">                                      <span class="str">"exist"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t98" class="stm run hide_run">    <span class="key">def</span> <span class="nam">update_region</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="pln">                      <span class="nam">region_to_update</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln">                      <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="pln">                      <span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="pln">                      <span class="nam">address_state</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="pln">                      <span class="nam">address_country</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln">                      <span class="nam">address_city</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="pln">                      <span class="nam">address_street</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="pln">                      <span class="nam">address_zip</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="pln">                      <span class="nam">region_status</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="pln">                      <span class="nam">ranger_agent_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="pln">                      <span class="nam">open_stack_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="pln">                      <span class="nam">design_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="pln">                      <span class="nam">location_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t112" class="pln">                      <span class="nam">vlcp_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="pln">                      <span class="nam">clli</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="pln">                      <span class="com"># a list of dictionaries of format</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="pln">                      <span class="com"># {"type":"", "url":"", "description":""</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="pln">                      <span class="nam">end_point_list</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="pln">                      <span class="com"># a list of dictionaries of format</span><span class="strut">&nbsp;</span></p>
+<p id="t118" class="pln">                      <span class="com"># {"key":"", "value":"", "description":""</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="pln">                      <span class="nam">meta_data_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="pln">                      <span class="nam">is_ecomp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t121" class="pln">                      <span class="nam">is_ssp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="pln">                      <span class="nam">purpose_of_region</span><span class="op">=</span><span class="str">""</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t123" class="pln">                      <span class="nam">description</span><span class="op">=</span><span class="str">""</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t124" class="pln">        <span class="str">""" add a new region to the `region` table</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="pln"><span class="str">        add also the regions give meta_data and end_points to the `region_end_point` and</span><span class="strut">&nbsp;</span></p>
+<p id="t126" class="pln"><span class="str">        `region_meta_data` tables if given.</span><span class="strut">&nbsp;</span></p>
+<p id="t127" class="pln"><span class="str">        handle duplicate errors if raised"""</span><span class="strut">&nbsp;</span></p>
+<p id="t128" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t129" class="stm run hide_run">            <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="stm run hide_run">            <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t131" class="pln">                <span class="com"># remove all childs as with update need to replace them</span><span class="strut">&nbsp;</span></p>
+<p id="t132" class="stm run hide_run">                <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_to_update</span><span class="op">)</span><span class="op">.</span><span class="nam">delete</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t133" class="stm run hide_run">                <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">RegionEndPoint</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_to_update</span><span class="op">)</span><span class="op">.</span><span class="nam">delete</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t134" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t135" class="stm run hide_run">                <span class="nam">record</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Region</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_to_update</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t136" class="stm run hide_run">                <span class="key">if</span> <span class="nam">record</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t137" class="pln">                    <span class="com">#   record.region_id = region_id  # ignore id and name when update</span><span class="strut">&nbsp;</span></p>
+<p id="t138" class="pln">                    <span class="com">#   record.name = name</span><span class="strut">&nbsp;</span></p>
+<p id="t139" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">address_state</span> <span class="op">=</span> <span class="nam">address_state</span><span class="strut">&nbsp;</span></p>
+<p id="t140" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">address_country</span> <span class="op">=</span> <span class="nam">address_country</span><span class="strut">&nbsp;</span></p>
+<p id="t141" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">address_city</span> <span class="op">=</span> <span class="nam">address_city</span><span class="strut">&nbsp;</span></p>
+<p id="t142" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">address_street</span> <span class="op">=</span> <span class="nam">address_street</span><span class="strut">&nbsp;</span></p>
+<p id="t143" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">address_zip</span> <span class="op">=</span> <span class="nam">address_zip</span><span class="strut">&nbsp;</span></p>
+<p id="t144" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">region_status</span> <span class="op">=</span> <span class="nam">region_status</span><span class="strut">&nbsp;</span></p>
+<p id="t145" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">ranger_agent_version</span> <span class="op">=</span> <span class="nam">ranger_agent_version</span><span class="strut">&nbsp;</span></p>
+<p id="t146" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">open_stack_version</span> <span class="op">=</span> <span class="nam">open_stack_version</span><span class="strut">&nbsp;</span></p>
+<p id="t147" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">design_type</span> <span class="op">=</span> <span class="nam">design_type</span><span class="strut">&nbsp;</span></p>
+<p id="t148" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">location_type</span> <span class="op">=</span> <span class="nam">location_type</span><span class="strut">&nbsp;</span></p>
+<p id="t149" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">vlcp_name</span> <span class="op">=</span> <span class="nam">vlcp_name</span><span class="strut">&nbsp;</span></p>
+<p id="t150" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">clli</span> <span class="op">=</span> <span class="nam">clli</span><span class="strut">&nbsp;</span></p>
+<p id="t151" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">description</span><span class="strut">&nbsp;</span></p>
+<p id="t152" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">is_ecomp</span> <span class="op">=</span> <span class="nam">is_ecomp</span> <span class="op">*</span> <span class="num">1</span><span class="strut">&nbsp;</span></p>
+<p id="t153" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">is_ssp</span> <span class="op">=</span> <span class="nam">is_ssp</span> <span class="op">*</span> <span class="num">1</span><span class="strut">&nbsp;</span></p>
+<p id="t154" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">purpose_of_region</span> <span class="op">=</span> <span class="nam">purpose_of_region</span><span class="strut">&nbsp;</span></p>
+<p id="t155" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t156" class="stm run hide_run">                    <span class="key">if</span> <span class="nam">end_point_list</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t157" class="stm run hide_run">                        <span class="key">for</span> <span class="nam">end_point</span> <span class="key">in</span> <span class="nam">end_point_list</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t158" class="stm run hide_run">                            <span class="nam">region_end_point</span> <span class="op">=</span> <span class="nam">RegionEndPoint</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t159" class="pln">                                <span class="nam">end_point_type</span><span class="op">=</span><span class="nam">end_point</span><span class="op">[</span><span class="str">"type"</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t160" class="pln">                                <span class="nam">public_url</span><span class="op">=</span><span class="nam">end_point</span><span class="op">[</span><span class="str">"url"</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t161" class="pln">                            <span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t162" class="stm run hide_run">                            <span class="nam">record</span><span class="op">.</span><span class="nam">end_points</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">region_end_point</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t163" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t164" class="stm run hide_run">                    <span class="key">if</span> <span class="nam">meta_data_dict</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t165" class="stm run hide_run">                        <span class="key">for</span> <span class="nam">k</span><span class="op">,</span> <span class="nam">v</span> <span class="key">in</span> <span class="nam">meta_data_dict</span><span class="op">.</span><span class="nam">iteritems</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t166" class="stm run hide_run">                            <span class="key">for</span> <span class="nam">list_item</span> <span class="key">in</span> <span class="nam">v</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t167" class="stm run hide_run">                                <span class="nam">record</span><span class="op">.</span><span class="nam">meta_data</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t168" class="pln">                                    <span class="nam">RegionMetaData</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t169" class="pln">                                                   <span class="nam">meta_data_key</span><span class="op">=</span><span class="nam">k</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t170" class="pln">                                                   <span class="nam">meta_data_value</span><span class="op">=</span><span class="nam">list_item</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t171" class="pln">                <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t172" class="stm run hide_run">                    <span class="key">raise</span> <span class="nam">EntityNotFound</span><span class="op">(</span><span class="str">"Region {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t173" class="pln">                        <span class="nam">region_to_update</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t174" class="stm run hide_run">        <span class="key">except</span> <span class="nam">EntityNotFound</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t175" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t176" class="pln">                <span class="str">"fail to update entity with id {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t177" class="pln">                    <span class="nam">region_to_update</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t178" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">ServiceBase</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t179" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t180" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"fail to update region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t181" class="stm run hide_run">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t182" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t183" class="stm run hide_run">    <span class="key">def</span> <span class="nam">delete_region</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t184" class="pln">        <span class="com"># delete a region from `region` table and also the region's</span><span class="strut">&nbsp;</span></p>
+<p id="t185" class="pln">        <span class="com"># entries from `region_meta_data` and `region_end_points` tables</span><span class="strut">&nbsp;</span></p>
+<p id="t186" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t187" class="stm run hide_run">        <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t188" class="stm run hide_run">            <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Region</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">)</span><span class="op">.</span><span class="nam">delete</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t189" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t190" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_all_regions</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t191" class="stm run hide_run">        <span class="key">return</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_regions</span><span class="op">(</span><span class="nam">None</span><span class="op">,</span> <span class="nam">None</span><span class="op">,</span> <span class="nam">None</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t192" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t193" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_regions</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t194" class="pln">                    <span class="nam">region_filters_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t195" class="pln">                    <span class="nam">meta_data_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t196" class="pln">                    <span class="nam">end_point_dict</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t197" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Get regions"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t198" class="stm run hide_run">        <span class="nam">records_model</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t199" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t200" class="stm run hide_run">        <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t201" class="stm run hide_run">            <span class="nam">records</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t202" class="stm run hide_run">            <span class="key">if</span> <span class="nam">region_filters_dict</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t203" class="stm run hide_run">                <span class="nam">records</span> <span class="op">=</span> <span class="nam">records</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="op">**</span><span class="nam">region_filters_dict</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t204" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t205" class="stm run hide_run">            <span class="key">if</span> <span class="nam">meta_data_dict</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t206" class="stm run hide_run">                <span class="nam">regions</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_get_regions_for_meta_data_dict</span><span class="op">(</span><span class="nam">meta_data_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t207" class="pln">                                                               <span class="nam">session</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t208" class="stm run hide_run">                <span class="nam">query</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t209" class="stm run hide_run">                <span class="nam">query</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">(</span><span class="nam">Region</span><span class="op">.</span><span class="nam">region_id</span><span class="op">.</span><span class="nam">in_</span><span class="op">(</span><span class="nam">regions</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t210" class="stm run hide_run">                <span class="nam">records</span> <span class="op">=</span> <span class="nam">records</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="op">*</span><span class="nam">query</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t211" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t212" class="stm run hide_run">            <span class="key">if</span> <span class="nam">end_point_dict</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t213" class="stm run hide_run">                <span class="nam">records</span> <span class="op">=</span> <span class="nam">records</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">RegionEndPoint</span><span class="op">)</span><span class="op">.</span><span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t214" class="pln">                    <span class="nam">filter_by</span><span class="op">(</span><span class="op">**</span><span class="nam">end_point_dict</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t215" class="stm run hide_run">            <span class="key">if</span> <span class="nam">records</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t216" class="stm run hide_run">                <span class="key">for</span> <span class="nam">record</span> <span class="key">in</span> <span class="nam">records</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t217" class="stm run hide_run">                    <span class="nam">records_model</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">record</span><span class="op">.</span><span class="nam">to_wsme</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t218" class="stm run hide_run">            <span class="key">return</span> <span class="nam">records_model</span><span class="strut">&nbsp;</span></p>
+<p id="t219" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t220" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_get_regions_for_meta_data_dict</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">meta_data_dict</span><span class="op">,</span> <span class="nam">session</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t221" class="stm run hide_run">        <span class="nam">result_lists</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t222" class="stm run hide_run">        <span class="key">for</span> <span class="nam">key</span> <span class="key">in</span> <span class="nam">meta_data_dict</span><span class="op">[</span><span class="str">'meta_data_keys'</span><span class="op">]</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t223" class="stm run hide_run">            <span class="nam">md_q</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">)</span><span class="op">.</span> <span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t224" class="pln">                <span class="nam">filter</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">.</span><span class="nam">meta_data_key</span> <span class="op">==</span> <span class="nam">key</span><span class="op">)</span><span class="op">.</span><span class="nam">all</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t225" class="stm run hide_run">            <span class="nam">temp_result_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t226" class="stm run hide_run">            <span class="key">if</span> <span class="nam">md_q</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t227" class="stm run hide_run">                <span class="key">for</span> <span class="nam">record</span> <span class="key">in</span> <span class="nam">md_q</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t228" class="stm mis">                    <span class="nam">temp_result_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">record</span><span class="op">.</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t229" class="stm run hide_run">            <span class="nam">result_lists</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">set</span><span class="op">(</span><span class="nam">temp_result_list</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t230" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="nam">set</span><span class="op">(</span><span class="nam">temp_result_list</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t231" class="stm run hide_run">        <span class="key">for</span> <span class="nam">item</span> <span class="key">in</span> <span class="nam">meta_data_dict</span><span class="op">[</span><span class="str">'meta_data_pairs'</span><span class="op">]</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t232" class="stm mis">            <span class="nam">md_q</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">)</span><span class="op">.</span> <span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t233" class="pln">                <span class="nam">filter</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">.</span><span class="nam">meta_data_key</span> <span class="op">==</span> <span class="nam">item</span><span class="op">[</span><span class="str">'metadata_key'</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t234" class="pln">                       <span class="nam">RegionMetaData</span><span class="op">.</span><span class="nam">meta_data_value</span> <span class="op">==</span> <span class="nam">item</span><span class="op">[</span><span class="str">'metadata_value'</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">all</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t235" class="stm mis">            <span class="nam">temp_result_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t236" class="stm mis">            <span class="key">if</span> <span class="nam">md_q</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t237" class="stm mis">                <span class="key">for</span> <span class="nam">record</span> <span class="key">in</span> <span class="nam">md_q</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t238" class="stm mis">                    <span class="nam">temp_result_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">record</span><span class="op">.</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t239" class="stm mis">            <span class="nam">result_lists</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">set</span><span class="op">(</span><span class="nam">temp_result_list</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t240" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="nam">set</span><span class="op">(</span><span class="nam">temp_result_list</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t241" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t242" class="stm run hide_run">        <span class="nam">result</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t243" class="stm run hide_run">        <span class="key">if</span> <span class="nam">result_lists</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t244" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">result_lists</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t245" class="stm run hide_run">            <span class="key">for</span> <span class="nam">l</span> <span class="key">in</span> <span class="nam">result_lists</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t246" class="stm run hide_run">                <span class="nam">result</span> <span class="op">=</span> <span class="nam">result</span><span class="op">.</span><span class="nam">intersection</span><span class="op">(</span><span class="nam">l</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t247" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t248" class="stm mis">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t249" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t250" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t251" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t252" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_region_by_id_or_name</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id_or_name</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t253" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Get region by id or name: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id_or_name</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t254" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t255" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t256" class="stm run hide_run">            <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t257" class="stm run hide_run">            <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t258" class="stm run hide_run">                <span class="nam">record</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t259" class="stm run hide_run">                <span class="nam">record</span> <span class="op">=</span> <span class="nam">record</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="nam">or_</span><span class="op">(</span><span class="nam">Region</span><span class="op">.</span><span class="nam">region_id</span> <span class="op">==</span> <span class="nam">region_id_or_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t260" class="pln">                                           <span class="nam">Region</span><span class="op">.</span><span class="nam">name</span> <span class="op">==</span> <span class="nam">region_id_or_name</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t261" class="stm run hide_run">                <span class="key">if</span> <span class="nam">record</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t262" class="stm run hide_run">                    <span class="key">return</span> <span class="nam">record</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">to_wsme</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t263" class="stm run hide_run">                <span class="key">return</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t264" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t265" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t266" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"DB error filtering by id/name"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t267" class="stm run hide_run">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t268" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t269" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_meta_data_to_region</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t270" class="pln">                                <span class="nam">metadata_dict</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t271" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t272" class="pln"><span class="str">        :param region_id:</span><span class="strut">&nbsp;</span></p>
+<p id="t273" class="pln"><span class="str">        :param metadata_dict:</span><span class="strut">&nbsp;</span></p>
+<p id="t274" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t275" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t276" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t277" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t278" class="stm run hide_run">            <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t279" class="stm run hide_run">                <span class="nam">record</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Region</span><span class="op">)</span><span class="op">.</span><span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t280" class="pln">                    <span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t281" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t282" class="stm run hide_run">                <span class="key">if</span> <span class="nam">record</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t283" class="stm run hide_run">                    <span class="nam">region_metadata</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t284" class="stm run hide_run">                    <span class="key">for</span> <span class="nam">k</span><span class="op">,</span> <span class="nam">v</span> <span class="key">in</span> <span class="nam">metadata_dict</span><span class="op">.</span><span class="nam">iteritems</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t285" class="stm run hide_run">                        <span class="key">for</span> <span class="nam">list_item</span> <span class="key">in</span> <span class="nam">v</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t286" class="stm run hide_run">                            <span class="nam">region_metadata</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t287" class="pln">                                                                  <span class="nam">meta_data_key</span><span class="op">=</span><span class="nam">k</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t288" class="pln">                                                                  <span class="nam">meta_data_value</span><span class="op">=</span><span class="nam">list_item</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t289" class="stm run hide_run">                    <span class="nam">session</span><span class="op">.</span><span class="nam">add_all</span><span class="op">(</span><span class="nam">region_metadata</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t290" class="stm run hide_run">                    <span class="key">return</span> <span class="nam">record</span><span class="op">.</span><span class="nam">to_wsme</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t291" class="pln">                <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t292" class="stm run hide_run">                    <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Region {} does not exist. "</span><span class="strut">&nbsp;</span></p>
+<p id="t293" class="pln">                                 <span class="str">"Meta Data was not added!"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t294" class="stm run hide_run">                    <span class="key">return</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t295" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t296" class="stm run hide_run">        <span class="key">except</span> <span class="nam">oslo_db</span><span class="op">.</span><span class="nam">exception</span><span class="op">.</span><span class="nam">DBDuplicateEntry</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t297" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">warning</span><span class="op">(</span><span class="str">"Duplicate entry: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">e</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t298" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ConflictError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="str">"Duplicate metadata value "</span><span class="strut">&nbsp;</span></p>
+<p id="t299" class="pln">                                           <span class="str">"in region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t300" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t301" class="stm run hide_run">    <span class="key">def</span> <span class="nam">update_region_meta_data</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t302" class="pln">                                <span class="nam">metadata_dict</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t303" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t304" class="pln"><span class="str">        Replace existing metadata for given region_id</span><span class="strut">&nbsp;</span></p>
+<p id="t305" class="pln"><span class="str">        :param region_id:</span><span class="strut">&nbsp;</span></p>
+<p id="t306" class="pln"><span class="str">        :param metadata_dict:</span><span class="strut">&nbsp;</span></p>
+<p id="t307" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t308" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t309" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t310" class="stm run hide_run">        <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t311" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t312" class="stm run hide_run">            <span class="nam">record</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Region</span><span class="op">)</span><span class="op">.</span> <span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t313" class="pln">                <span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t314" class="stm run hide_run">            <span class="key">if</span> <span class="key">not</span> <span class="nam">record</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t315" class="stm run hide_run">                <span class="nam">msg</span> <span class="op">=</span> <span class="str">"Region {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t316" class="stm run hide_run">                <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="nam">msg</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t317" class="stm run hide_run">                <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="nam">msg</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t318" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t319" class="stm run hide_run">            <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">)</span><span class="op">.</span><span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t320" class="pln">                <span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">)</span><span class="op">.</span><span class="nam">delete</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t321" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t322" class="stm run hide_run">            <span class="nam">region_metadata</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t323" class="stm run hide_run">            <span class="key">for</span> <span class="nam">k</span><span class="op">,</span> <span class="nam">v</span> <span class="key">in</span> <span class="nam">metadata_dict</span><span class="op">.</span><span class="nam">iteritems</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t324" class="stm run hide_run">                <span class="key">for</span> <span class="nam">list_item</span> <span class="key">in</span> <span class="nam">v</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t325" class="stm run hide_run">                    <span class="nam">region_metadata</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t326" class="pln">                                                          <span class="nam">meta_data_key</span><span class="op">=</span><span class="nam">k</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t327" class="pln">                                                          <span class="nam">meta_data_value</span><span class="op">=</span><span class="nam">list_item</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t328" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t329" class="stm run hide_run">            <span class="nam">session</span><span class="op">.</span><span class="nam">add_all</span><span class="op">(</span><span class="nam">region_metadata</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t330" class="stm run hide_run">            <span class="key">return</span> <span class="nam">record</span><span class="op">.</span><span class="nam">to_wsme</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t331" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t332" class="stm run hide_run">    <span class="key">def</span> <span class="nam">delete_region_metadata</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">key</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t333" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t334" class="stm run hide_run">        <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t335" class="stm run hide_run">            <span class="nam">record</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Region</span><span class="op">)</span><span class="op">.</span> <span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t336" class="pln">                <span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t337" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t338" class="stm run hide_run">            <span class="key">if</span> <span class="key">not</span> <span class="nam">record</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t339" class="stm run hide_run">                <span class="nam">msg</span> <span class="op">=</span> <span class="str">"Region {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t340" class="stm run hide_run">                <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="nam">msg</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t341" class="stm run hide_run">                <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="nam">msg</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t342" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t343" class="stm run hide_run">            <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t344" class="pln">                                                    <span class="nam">meta_data_key</span><span class="op">=</span><span class="nam">key</span><span class="op">)</span><span class="op">.</span><span class="nam">delete</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t345" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t346" class="stm run hide_run">    <span class="key">def</span> <span class="nam">update_region_status</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">region_status</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t347" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t348" class="stm run hide_run">            <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t349" class="stm run hide_run">            <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t350" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t351" class="stm run hide_run">                <span class="nam">record</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Region</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t352" class="stm run hide_run">                <span class="key">if</span> <span class="nam">record</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t353" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">region_status</span> <span class="op">=</span> <span class="nam">region_status</span><span class="strut">&nbsp;</span></p>
+<p id="t354" class="pln">                <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t355" class="stm run hide_run">                    <span class="nam">msg</span> <span class="op">=</span> <span class="str">"Region {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t356" class="stm run hide_run">                    <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="nam">msg</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t357" class="stm run hide_run">                    <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="nam">msg</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t358" class="stm run hide_run">                <span class="key">return</span> <span class="nam">record</span><span class="op">.</span><span class="nam">region_status</span><span class="strut">&nbsp;</span></p>
+<p id="t359" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t360" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t361" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"failed to update region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t362" class="stm run hide_run">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t363" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t364" class="pln"><span class="str">    def add_end_point_to_region(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t365" class="pln"><span class="str">                                region_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t366" class="pln"><span class="str">                                end_point_type,</span><span class="strut">&nbsp;</span></p>
+<p id="t367" class="pln"><span class="str">                                end_point_url,</span><span class="strut">&nbsp;</span></p>
+<p id="t368" class="pln"><span class="str">                                description):</span><span class="strut">&nbsp;</span></p>
+<p id="t369" class="pln"><span class="str">        session = self._engine_facade.get_session()</span><span class="strut">&nbsp;</span></p>
+<p id="t370" class="pln"><span class="str">        try:</span><span class="strut">&nbsp;</span></p>
+<p id="t371" class="pln"><span class="str">            with session.begin():</span><span class="strut">&nbsp;</span></p>
+<p id="t372" class="pln"><span class="str">                record = session.query(Region).filter_by(region_id=region_id).\</span><span class="strut">&nbsp;</span></p>
+<p id="t373" class="pln"><span class="str">                    first()</span><span class="strut">&nbsp;</span></p>
+<p id="t374" class="pln"><span class="str">                if record is not None:</span><span class="strut">&nbsp;</span></p>
+<p id="t375" class="pln"><span class="str">                        session.add(</span><span class="strut">&nbsp;</span></p>
+<p id="t376" class="pln"><span class="str">                            RegionEndPoint(region_id=region_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t377" class="pln"><span class="str">                                           end_point_type=end_point_type,</span><span class="strut">&nbsp;</span></p>
+<p id="t378" class="pln"><span class="str">                                           public_url=end_point_url,</span><span class="strut">&nbsp;</span></p>
+<p id="t379" class="pln"><span class="str">                                           description=description))</span><span class="strut">&nbsp;</span></p>
+<p id="t380" class="pln"><span class="str">                else:</span><span class="strut">&nbsp;</span></p>
+<p id="t381" class="pln"><span class="str">                    logger.error("Region {} does not exist. "</span><span class="strut">&nbsp;</span></p>
+<p id="t382" class="pln"><span class="str">                                 "End point was not added !".format(region_id))</span><span class="strut">&nbsp;</span></p>
+<p id="t383" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t384" class="pln"><span class="str">        except oslo_db.exception.DBDuplicateEntry as e:</span><span class="strut">&nbsp;</span></p>
+<p id="t385" class="pln"><span class="str">            logger.warning("Duplicate entry: {}".format(str(e)))</span><span class="strut">&nbsp;</span></p>
+<p id="t386" class="pln"><span class="str">            raise SQLDBError("Duplicate entry error")</span><span class="strut">&nbsp;</span></p>
+<p id="t387" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t388" class="pln"><span class="str">    def remove_end_point_from_region(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t389" class="pln"><span class="str">                                     region_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t390" class="pln"><span class="str">                                     end_point_type):</span><span class="strut">&nbsp;</span></p>
+<p id="t391" class="pln"><span class="str">        session = self._engine_facade.get_session()</span><span class="strut">&nbsp;</span></p>
+<p id="t392" class="pln"><span class="str">        with session.begin():</span><span class="strut">&nbsp;</span></p>
+<p id="t393" class="pln"><span class="str">            session.query(Region).filter_by(region_id=region_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t394" class="pln"><span class="str">                                            end_point_type=end_point_type).\</span><span class="strut">&nbsp;</span></p>
+<p id="t395" class="pln"><span class="str">                delete()</span><span class="strut">&nbsp;</span></p>
+<p id="t396" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t397" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t398" class="pln">    <span class="com"># Handle group management operations</span><span class="strut">&nbsp;</span></p>
+<p id="t399" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_group</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t400" class="pln">                  <span class="nam">group_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t401" class="pln">                  <span class="nam">group_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t402" class="pln">                  <span class="nam">group_description</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t403" class="pln">                  <span class="nam">region_ids_list</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t404" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t405" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t406" class="stm run hide_run">            <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t407" class="stm run hide_run">                <span class="nam">session</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Group</span><span class="op">(</span><span class="nam">group_id</span><span class="op">=</span><span class="nam">group_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t408" class="pln">                                  <span class="nam">name</span><span class="op">=</span><span class="nam">group_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t409" class="pln">                                  <span class="nam">description</span><span class="op">=</span><span class="nam">group_description</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t410" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t411" class="stm run hide_run">                <span class="nam">session</span><span class="op">.</span><span class="nam">flush</span><span class="op">(</span><span class="op">)</span>  <span class="com"># add the groupe if not rollback</span><span class="strut">&nbsp;</span></p>
+<p id="t412" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t413" class="stm run hide_run">                <span class="key">if</span> <span class="nam">region_ids_list</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t414" class="stm run hide_run">                    <span class="nam">group_regions</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t415" class="stm run hide_run">                    <span class="key">for</span> <span class="nam">region_id</span> <span class="key">in</span> <span class="nam">region_ids_list</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t416" class="stm run hide_run">                        <span class="nam">group_regions</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">GroupRegion</span><span class="op">(</span><span class="nam">group_id</span><span class="op">=</span><span class="nam">group_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t417" class="pln">                                                         <span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t418" class="stm run hide_run">                    <span class="nam">session</span><span class="op">.</span><span class="nam">add_all</span><span class="op">(</span><span class="nam">group_regions</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t419" class="stm run hide_run">        <span class="key">except</span> <span class="nam">oslo_db</span><span class="op">.</span><span class="nam">exception</span><span class="op">.</span><span class="nam">DBReferenceError</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t420" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Reference error: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">e</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t421" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span><span class="op">(</span><span class="str">"Reference error"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t422" class="stm run hide_run">        <span class="key">except</span> <span class="nam">oslo_db</span><span class="op">.</span><span class="nam">exception</span><span class="op">.</span><span class="nam">DBDuplicateEntry</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t423" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Duplicate entry: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">e</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t424" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ConflictError</span><span class="op">(</span><span class="str">"Duplicate entry error"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t425" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t426" class="stm run hide_run">    <span class="key">def</span> <span class="nam">delete_group</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t427" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t428" class="stm run hide_run">        <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t429" class="stm run hide_run">            <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Group</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">group_id</span><span class="op">=</span><span class="nam">group_id</span><span class="op">)</span><span class="op">.</span><span class="nam">delete</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t430" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t431" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_all_groups</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t432" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"DB- Get all groups"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t433" class="stm run hide_run">        <span class="nam">records_model</span> <span class="op">=</span> <span class="nam">PythonModels</span><span class="op">.</span><span class="nam">GroupsWrraper</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t434" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t435" class="stm run hide_run">        <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t436" class="stm run hide_run">            <span class="nam">groups</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Group</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t437" class="stm run hide_run">            <span class="key">for</span> <span class="nam">a_group</span> <span class="key">in</span> <span class="nam">groups</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t438" class="stm mis">                <span class="nam">group_model</span> <span class="op">=</span> <span class="nam">PythonModels</span><span class="op">.</span><span class="nam">Groups</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t439" class="stm mis">                <span class="nam">group_model</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">a_group</span><span class="op">.</span><span class="nam">group_id</span><span class="strut">&nbsp;</span></p>
+<p id="t440" class="stm mis">                <span class="nam">group_model</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">a_group</span><span class="op">.</span><span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t441" class="stm mis">                <span class="nam">group_model</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">a_group</span><span class="op">.</span><span class="nam">description</span><span class="strut">&nbsp;</span></p>
+<p id="t442" class="stm mis">                <span class="nam">regions</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t443" class="stm mis">                <span class="nam">group_regions</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">GroupRegion</span><span class="op">)</span><span class="op">.</span><span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t444" class="pln">                    <span class="nam">filter_by</span><span class="op">(</span><span class="nam">group_id</span><span class="op">=</span><span class="nam">a_group</span><span class="op">.</span><span class="nam">group_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t445" class="stm mis">                <span class="key">for</span> <span class="nam">group_region</span> <span class="key">in</span> <span class="nam">group_regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t446" class="stm mis">                    <span class="nam">regions</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">group_region</span><span class="op">.</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t447" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t448" class="stm mis">                <span class="nam">group_model</span><span class="op">.</span><span class="nam">regions</span> <span class="op">=</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t449" class="stm mis">                <span class="nam">records_model</span><span class="op">.</span><span class="nam">groups</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">group_model</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t450" class="stm run hide_run">            <span class="key">return</span> <span class="nam">records_model</span><span class="strut">&nbsp;</span></p>
+<p id="t451" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t452" class="stm run hide_run">    <span class="key">def</span> <span class="nam">update_group</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">,</span> <span class="nam">group_name</span><span class="op">,</span> <span class="nam">group_description</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t453" class="pln">                     <span class="nam">group_regions</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t454" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t455" class="stm run hide_run">            <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t456" class="stm run hide_run">            <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t457" class="pln">                <span class="com"># in update scenario delete all child records</span><span class="strut">&nbsp;</span></p>
+<p id="t458" class="stm run hide_run">                <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">GroupRegion</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t459" class="pln">                    <span class="nam">group_id</span><span class="op">=</span><span class="nam">group_id</span><span class="op">)</span><span class="op">.</span><span class="nam">delete</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t460" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t461" class="stm run hide_run">                <span class="nam">group_record</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Group</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t462" class="pln">                    <span class="nam">group_id</span><span class="op">=</span><span class="nam">group_id</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t463" class="stm run hide_run">                <span class="key">if</span> <span class="nam">group_record</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t464" class="stm mis">                    <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t465" class="pln">                        <span class="nam">message</span><span class="op">=</span><span class="str">"Group {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t466" class="pln">                <span class="com"># only desc and regions can be changed</span><span class="strut">&nbsp;</span></p>
+<p id="t467" class="stm run hide_run">                <span class="nam">group_record</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">group_description</span><span class="strut">&nbsp;</span></p>
+<p id="t468" class="stm run hide_run">                <span class="nam">group_record</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">group_name</span><span class="strut">&nbsp;</span></p>
+<p id="t469" class="stm run hide_run">                <span class="nam">regions</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t470" class="stm run hide_run">                <span class="key">for</span> <span class="nam">region_id</span> <span class="key">in</span> <span class="nam">group_regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t471" class="stm run hide_run">                    <span class="nam">regions</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">GroupRegion</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t472" class="pln">                                               <span class="nam">group_id</span><span class="op">=</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t473" class="stm run hide_run">                <span class="nam">session</span><span class="op">.</span><span class="nam">add_all</span><span class="op">(</span><span class="nam">regions</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t474" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t475" class="stm mis">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t476" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t477" class="stm mis">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t478" class="stm mis">        <span class="key">except</span> <span class="nam">oslo_db</span><span class="op">.</span><span class="nam">exception</span><span class="op">.</span><span class="nam">DBReferenceError</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t479" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Reference error: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">e</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t480" class="stm mis">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span><span class="op">(</span><span class="str">"Reference error"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t481" class="stm mis">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t482" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"failed to update group {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t483" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t484" class="stm mis">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t485" class="stm run hide_run">        <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t486" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t487" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_group</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t488" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Get group by name"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t489" class="stm run hide_run">        <span class="nam">group_model</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t490" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t491" class="stm run hide_run">        <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t492" class="stm run hide_run">            <span class="nam">a_group</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Group</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">group_id</span><span class="op">=</span><span class="nam">group_id</span><span class="op">)</span><span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t493" class="pln">                <span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t494" class="stm run hide_run">            <span class="key">if</span> <span class="nam">a_group</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t495" class="stm run hide_run">                <span class="nam">group_model</span> <span class="op">=</span> <span class="op">{</span><span class="str">"id"</span><span class="op">:</span> <span class="nam">a_group</span><span class="op">.</span><span class="nam">group_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t496" class="pln">                               <span class="str">"name"</span><span class="op">:</span> <span class="nam">a_group</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t497" class="pln">                               <span class="str">"description"</span><span class="op">:</span> <span class="nam">a_group</span><span class="op">.</span><span class="nam">description</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t498" class="stm run hide_run">                <span class="nam">regions</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t499" class="stm run hide_run">                <span class="nam">group_regions</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">GroupRegion</span><span class="op">)</span><span class="op">.</span> <span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t500" class="pln">                    <span class="nam">filter_by</span><span class="op">(</span><span class="nam">group_id</span><span class="op">=</span><span class="nam">a_group</span><span class="op">.</span><span class="nam">group_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t501" class="stm run hide_run">                <span class="key">for</span> <span class="nam">group_region</span> <span class="key">in</span> <span class="nam">group_regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t502" class="stm mis">                    <span class="nam">regions</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">group_region</span><span class="op">.</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t503" class="stm run hide_run">                <span class="nam">group_model</span><span class="op">[</span><span class="str">"regions"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t504" class="stm run hide_run">            <span class="key">return</span> <span class="nam">group_model</span><span class="strut">&nbsp;</span></p>
+<p id="t505" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t506" class="stm run hide_run">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t507" class="pln"><span class="str">    def add_region_to_group(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t508" class="pln"><span class="str">                            group_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t509" class="pln"><span class="str">                            region_id):</span><span class="strut">&nbsp;</span></p>
+<p id="t510" class="pln"><span class="str">        session = self._engine_facade.get_session()</span><span class="strut">&nbsp;</span></p>
+<p id="t511" class="pln"><span class="str">        try:</span><span class="strut">&nbsp;</span></p>
+<p id="t512" class="pln"><span class="str">            with session.begin():</span><span class="strut">&nbsp;</span></p>
+<p id="t513" class="pln"><span class="str">                session.add(GroupRegion(group_id=group_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t514" class="pln"><span class="str">                                        region_id=region_id))</span><span class="strut">&nbsp;</span></p>
+<p id="t515" class="pln"><span class="str">        except oslo_db.exception.DBReferenceError as e:</span><span class="strut">&nbsp;</span></p>
+<p id="t516" class="pln"><span class="str">            logger.error("Refernce error: {}".format(str(e)))</span><span class="strut">&nbsp;</span></p>
+<p id="t517" class="pln"><span class="str">            raise SQLDBError("Reference error")</span><span class="strut">&nbsp;</span></p>
+<p id="t518" class="pln"><span class="str">        except oslo_db.exception.DBDuplicateEntry as e:</span><span class="strut">&nbsp;</span></p>
+<p id="t519" class="pln"><span class="str">            logger.error("Duplicate entry: {}".format(str(e)))</span><span class="strut">&nbsp;</span></p>
+<p id="t520" class="pln"><span class="str">            raise SQLDBError("Duplicate entry error")</span><span class="strut">&nbsp;</span></p>
+<p id="t521" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t522" class="pln"><span class="str">    def remove_region_from_group(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t523" class="pln"><span class="str">                                 group_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t524" class="pln"><span class="str">                                 region_id):</span><span class="strut">&nbsp;</span></p>
+<p id="t525" class="pln"><span class="str">        session = self._engine_facade.get_session()</span><span class="strut">&nbsp;</span></p>
+<p id="t526" class="pln"><span class="str">        with session.begin():</span><span class="strut">&nbsp;</span></p>
+<p id="t527" class="pln"><span class="str">            session.query(GroupRegion).filter_by(group_id=group_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t528" class="pln"><span class="str">                                                 region_id=region_id).delete()</span><span class="strut">&nbsp;</span></p>
+<p id="t529" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-12 23:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_utils___init___py.html b/orm/services/region_manager/cover/rms_utils___init___py.html
new file mode 100644
index 00000000..e9506082
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_utils___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/utils/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/utils/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/rms_utils_authentication_py.html b/orm/services/region_manager/cover/rms_utils_authentication_py.html
new file mode 100644
index 00000000..70124848
--- /dev/null
+++ b/orm/services/region_manager/cover/rms_utils_authentication_py.html
@@ -0,0 +1,195 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/utils/authentication.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/utils/authentication.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            32 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">32 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p>
+<p id="n17" class="stm run hide_run"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="stm run hide_run"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="stm run hide_run"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="stm run hide_run"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="stm run hide_run"><a href="#n40">40</a></p>
+<p id="n41" class="stm run hide_run"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="pln"><a href="#n43">43</a></p>
+<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="stm run hide_run"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="stm run hide_run"><a href="#n50">50</a></p>
+<p id="n51" class="stm run hide_run"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">keystone_utils</span> <span class="key">import</span> <span class="nam">tokens</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">policy</span> <span class="key">import</span> <span class="nam">policy</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">services</span> <span class="key">as</span> <span class="nam">RegionService</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="key">def</span> <span class="nam">_get_keystone_ep</span><span class="op">(</span><span class="nam">auth_region</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm run hide_run">    <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">get_region_by_id_or_name</span><span class="op">(</span><span class="nam">auth_region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm run hide_run">    <span class="key">for</span> <span class="nam">ep</span> <span class="key">in</span> <span class="nam">result</span><span class="op">.</span><span class="nam">endpoints</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run">        <span class="key">if</span> <span class="nam">ep</span><span class="op">.</span><span class="nam">type</span> <span class="op">==</span> <span class="str">'identity'</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run">            <span class="key">return</span> <span class="nam">ep</span><span class="op">.</span><span class="nam">publicurl</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln">    <span class="com"># Keystone EP not found</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="stm run hide_run">    <span class="key">return</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t25" class="stm run hide_run"><span class="key">def</span> <span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="nam">action</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">    <span class="key">if</span> <span class="key">not</span> <span class="nam">_is_authorization_enabled</span><span class="op">(</span><span class="nam">conf</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run">        <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">    <span class="nam">auth_region</span> <span class="op">=</span> <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'X-Auth-Region'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">        <span class="nam">keystone_ep</span> <span class="op">=</span> <span class="nam">_get_keystone_ep</span><span class="op">(</span><span class="nam">auth_region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln">        <span class="com"># Failed to find Keystone EP - we'll set it to None instead of failing</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln">        <span class="com"># because the rule might be to let everyone pass</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">        <span class="nam">keystone_ep</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">    <span class="nam">policy</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">action</span><span class="op">,</span> <span class="nam">request</span><span class="op">,</span> <span class="nam">conf</span><span class="op">,</span> <span class="nam">keystone_ep</span><span class="op">=</span><span class="nam">keystone_ep</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm run hide_run"><span class="key">def</span> <span class="nam">_is_authorization_enabled</span><span class="op">(</span><span class="nam">app_conf</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="stm run hide_run">    <span class="key">return</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">enabled</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t43" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_token_conf</span><span class="op">(</span><span class="nam">app_conf</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">    <span class="nam">mech_id</span> <span class="op">=</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">mech_id</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="stm run hide_run">    <span class="nam">mech_password</span> <span class="op">=</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">mech_pass</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln">    <span class="com"># RMS URL is not necessary since this service is RMS</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run">    <span class="nam">rms_url</span> <span class="op">=</span> <span class="str">''</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run">    <span class="nam">tenant_name</span> <span class="op">=</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">tenant_name</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="stm run hide_run">    <span class="nam">keystone_version</span> <span class="op">=</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">keystone_version</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm run hide_run">    <span class="nam">conf</span> <span class="op">=</span> <span class="nam">tokens</span><span class="op">.</span><span class="nam">TokenConf</span><span class="op">(</span><span class="nam">mech_id</span><span class="op">,</span> <span class="nam">mech_password</span><span class="op">,</span> <span class="nam">rms_url</span><span class="op">,</span> <span class="nam">tenant_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln">                            <span class="nam">keystone_version</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">    <span class="key">return</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/cover/status.json b/orm/services/region_manager/cover/status.json
new file mode 100644
index 00000000..ae70bd7f
--- /dev/null
+++ b/orm/services/region_manager/cover/status.json
@@ -0,0 +1 @@
+{"files":{"rms_controllers_v2_orm_resources___init___py":{"index":{"relative_filename":"rms/controllers/v2/orm/resources/__init__.py","html_filename":"rms_controllers_v2_orm_resources___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"103b3a1826780f920626a4f622bcee7c"},"rms___init___py":{"index":{"relative_filename":"rms/__init__.py","html_filename":"rms___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"},"rms_external_mock_audit_client_api___init___py":{"index":{"relative_filename":"rms/external_mock/audit_client/api/__init__.py","html_filename":"rms_external_mock_audit_client_api___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"19a064df3967067a2ec86c467e92d140"},"rms_controllers_lcp_controller_py":{"index":{"relative_filename":"rms/controllers/lcp_controller.py","html_filename":"rms_controllers_lcp_controller_py.html","nums":[1,56,0,0,0,0,0]},"hash":"a032e4765d0af628116fb4a525003601"},"rms_utils_authentication_py":{"index":{"relative_filename":"rms/utils/authentication.py","html_filename":"rms_utils_authentication_py.html","nums":[1,32,0,0,0,0,0]},"hash":"9816983ff8e57e8d1a9ed68b7c30ff50"},"rms_external_mock_orm_common___init___py":{"index":{"relative_filename":"rms/external_mock/orm_common/__init__.py","html_filename":"rms_external_mock_orm_common___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"},"rms_model___init___py":{"index":{"relative_filename":"rms/model/__init__.py","html_filename":"rms_model___init___py.html","nums":[1,3,0,0,0,0,0]},"hash":"cf7982d8674fcb1858c46e0ed829f1e2"},"rms_storage_my_sql___init___py":{"index":{"relative_filename":"rms/storage/my_sql/__init__.py","html_filename":"rms_storage_my_sql___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"},"rms_model_url_parm_py":{"index":{"relative_filename":"rms/model/url_parm.py","html_filename":"rms_model_url_parm_py.html","nums":[1,63,0,4,0,0,0]},"hash":"554a5d26967309c0321bb2d5ca4de2d0"},"rms_controllers_root_py":{"index":{"relative_filename":"rms/controllers/root.py","html_filename":"rms_controllers_root_py.html","nums":[1,12,0,1,0,0,0]},"hash":"22b13e705390f352b9e7a78c2f83d7b9"},"rms_external_mock_keystone_utils___init___py":{"index":{"relative_filename":"rms/external_mock/keystone_utils/__init__.py","html_filename":"rms_external_mock_keystone_utils___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"},"rms_controllers_v2_orm_resources_groups_py":{"index":{"relative_filename":"rms/controllers/v2/orm/resources/groups.py","html_filename":"rms_controllers_v2_orm_resources_groups_py.html","nums":[1,124,0,22,0,0,0]},"hash":"38e755d11e73209da31ce4c4faff8d49"},"rms_controllers_v2_orm_resources_status_py":{"index":{"relative_filename":"rms/controllers/v2/orm/resources/status.py","html_filename":"rms_controllers_v2_orm_resources_status_py.html","nums":[1,47,0,3,0,0,0]},"hash":"afc1e6ecd339095ff57e6b9c7c9c819d"},"rms_services_error_base_py":{"index":{"relative_filename":"rms/services/error_base.py","html_filename":"rms_services_error_base_py.html","nums":[1,18,0,2,0,0,0]},"hash":"9cf5cf89d59dd8f73527b7bec0f6f11d"},"rms_external_mock_orm_common_policy_policy_py":{"index":{"relative_filename":"rms/external_mock/orm_common/policy/policy.py","html_filename":"rms_external_mock_orm_common_policy_policy_py.html","nums":[1,6,0,2,0,0,0]},"hash":"7ea56b6475a95231ec2271c5fb347853"},"rms_storage___init___py":{"index":{"relative_filename":"rms/storage/__init__.py","html_filename":"rms_storage___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"},"rms_external_mock_orm_common_policy___init___py":{"index":{"relative_filename":"rms/external_mock/orm_common/policy/__init__.py","html_filename":"rms_external_mock_orm_common_policy___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"},"rms_controllers_v2_orm___init___py":{"index":{"relative_filename":"rms/controllers/v2/orm/__init__.py","html_filename":"rms_controllers_v2_orm___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"f820fd7cab97fc8512bec0556f3f002c"},"rms_controllers_v2___init___py":{"index":{"relative_filename":"rms/controllers/v2/__init__.py","html_filename":"rms_controllers_v2___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"103b3a1826780f920626a4f622bcee7c"},"rms_controllers_v2_orm_resources_regions_py":{"index":{"relative_filename":"rms/controllers/v2/orm/resources/regions.py","html_filename":"rms_controllers_v2_orm_resources_regions_py.html","nums":[1,187,0,5,0,0,0]},"hash":"31c3b8e26317be7b0c19896d4f008617"},"rms_model_model_py":{"index":{"relative_filename":"rms/model/model.py","html_filename":"rms_model_model_py.html","nums":[1,100,0,7,0,0,0]},"hash":"29463d225fbe8d7a76bd2c96fc854ea9"},"rms_external_mock_orm_common_utils_utils_py":{"index":{"relative_filename":"rms/external_mock/orm_common/utils/utils.py","html_filename":"rms_external_mock_orm_common_utils_utils_py.html","nums":[1,6,0,1,0,0,0]},"hash":"3fd1f8e4472126ea5ccdbf31e97d61ea"},"rms_services___init___py":{"index":{"relative_filename":"rms/services/__init__.py","html_filename":"rms_services___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"8ac99c36cc7a0f004e5b32bd37a07666"},"rms_controllers_configuration_py":{"index":{"relative_filename":"rms/controllers/configuration.py","html_filename":"rms_controllers_configuration_py.html","nums":[1,17,0,0,0,0,0]},"hash":"b26d7e4d8662a3399ee6bfcca7910f6a"},"rms_storage_data_manager_factory_py":{"index":{"relative_filename":"rms/storage/data_manager_factory.py","html_filename":"rms_storage_data_manager_factory_py.html","nums":[1,12,0,0,0,0,0]},"hash":"187c41f6ce3b54925ae87043fbd31c9d"},"rms_storage_base_data_manager_py":{"index":{"relative_filename":"rms/storage/base_data_manager.py","html_filename":"rms_storage_base_data_manager_py.html","nums":[1,24,0,0,0,0,0]},"hash":"161f32081cdb26e50f07e76b8b1a9a5d"},"rms_controllers_v2_orm_resources_metadata_py":{"index":{"relative_filename":"rms/controllers/v2/orm/resources/metadata.py","html_filename":"rms_controllers_v2_orm_resources_metadata_py.html","nums":[1,85,0,19,0,0,0]},"hash":"7bb73ee1f834e6f8998371ce19f77ade"},"rms_external_mock___init___py":{"index":{"relative_filename":"rms/external_mock/__init__.py","html_filename":"rms_external_mock___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"19a064df3967067a2ec86c467e92d140"},"rms_storage_my_sql_data_manager_py":{"index":{"relative_filename":"rms/storage/my_sql/data_manager.py","html_filename":"rms_storage_my_sql_data_manager_py.html","nums":[1,270,0,31,0,0,0]},"hash":"5a1cbfe3ec7b9c95011d5586e27057cb"},"rms_external_mock_keystone_utils_tokens_py":{"index":{"relative_filename":"rms/external_mock/keystone_utils/tokens.py","html_filename":"rms_external_mock_keystone_utils_tokens_py.html","nums":[1,5,0,1,0,0,0]},"hash":"9e3b83a68d18e91870ada743cc6e8aaf"},"rms_controllers_v2_root_py":{"index":{"relative_filename":"rms/controllers/v2/root.py","html_filename":"rms_controllers_v2_root_py.html","nums":[1,3,0,0,0,0,0]},"hash":"a6ab4c4b9cc373374c0cdf71e05f92b2"},"rms_external_mock_orm_common_utils_api_error_utils_py":{"index":{"relative_filename":"rms/external_mock/orm_common/utils/api_error_utils.py","html_filename":"rms_external_mock_orm_common_utils_api_error_utils_py.html","nums":[1,2,0,1,0,0,0]},"hash":"5b097d36789f1b7dea3d91b3b8d3718a"},"rms_services_services_py":{"index":{"relative_filename":"rms/services/services.py","html_filename":"rms_services_services_py.html","nums":[1,170,0,55,0,0,0]},"hash":"ee882c9e5fa6c871e813a62a7126e7f8"},"rms_external_mock_audit_client_api_audit_py":{"index":{"relative_filename":"rms/external_mock/audit_client/api/audit.py","html_filename":"rms_external_mock_audit_client_api_audit_py.html","nums":[1,4,0,4,0,0,0]},"hash":"b0c363258cf77b3628c98037bd768ab4"},"rms_controllers___init___py":{"index":{"relative_filename":"rms/controllers/__init__.py","html_filename":"rms_controllers___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"},"rms_controllers_logs_py":{"index":{"relative_filename":"rms/controllers/logs.py","html_filename":"rms_controllers_logs_py.html","nums":[1,36,0,2,0,0,0]},"hash":"8e5e06cf27f60958af7f39bc4c28a5b9"},"rms_external_mock_audit_client___init___py":{"index":{"relative_filename":"rms/external_mock/audit_client/__init__.py","html_filename":"rms_external_mock_audit_client___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"19a064df3967067a2ec86c467e92d140"},"rms_controllers_v2_orm_root_py":{"index":{"relative_filename":"rms/controllers/v2/orm/root.py","html_filename":"rms_controllers_v2_orm_root_py.html","nums":[1,5,0,0,0,0,0]},"hash":"7d9f45649dfaa9de7107f13e60452b2e"},"rms_external_mock_orm_common_utils___init___py":{"index":{"relative_filename":"rms/external_mock/orm_common/utils/__init__.py","html_filename":"rms_external_mock_orm_common_utils___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"},"rms_utils___init___py":{"index":{"relative_filename":"rms/utils/__init__.py","html_filename":"rms_utils___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"}},"version":"4.3.4","settings":"952e86a4dc73f0a7bf1b5052a0d6c45a","format":1}
\ No newline at end of file
diff --git a/orm/services/region_manager/cover/style.css b/orm/services/region_manager/cover/style.css
new file mode 100644
index 00000000..86b82091
--- /dev/null
+++ b/orm/services/region_manager/cover/style.css
@@ -0,0 +1,375 @@
+/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */
+/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */
+
+/* CSS styles for coverage.py. */
+
+/* Page-wide styles */
+html, body, h1, h2, h3, p, table, td, th {
+    margin: 0;
+    padding: 0;
+    border: 0;
+    outline: 0;
+    font-weight: inherit;
+    font-style: inherit;
+    font-size: 100%;
+    font-family: inherit;
+    vertical-align: baseline;
+    }
+
+/* Set baseline grid to 16 pt. */
+body {
+    font-family: georgia, serif;
+    font-size: 1em;
+    }
+
+html>body {
+    font-size: 16px;
+    }
+
+/* Set base font size to 12/16 */
+p {
+    font-size: .75em;           /* 12/16 */
+    line-height: 1.33333333em;  /* 16/12 */
+    }
+
+table {
+    border-collapse: collapse;
+    }
+td {
+    vertical-align: top;
+}
+table tr.hidden {
+    display: none !important;
+    }
+
+p#no_rows {
+    display: none;
+    font-size: 1.2em;
+    }
+
+a.nav {
+    text-decoration: none;
+    color: inherit;
+    }
+a.nav:hover {
+    text-decoration: underline;
+    color: inherit;
+    }
+
+/* Page structure */
+#header {
+    background: #f8f8f8;
+    width: 100%;
+    border-bottom: 1px solid #eee;
+    }
+
+#source {
+    padding: 1em;
+    font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
+    }
+
+.indexfile #footer {
+    margin: 1em 3em;
+    }
+
+.pyfile #footer {
+    margin: 1em 1em;
+    }
+
+#footer .content {
+    padding: 0;
+    font-size: 85%;
+    font-family: verdana, sans-serif;
+    color: #666666;
+    font-style: italic;
+    }
+
+#index {
+    margin: 1em 0 0 3em;
+    }
+
+/* Header styles */
+#header .content {
+    padding: 1em 3em;
+    }
+
+h1 {
+    font-size: 1.25em;
+    display: inline-block;
+}
+
+#filter_container {
+    display: inline-block;
+    float: right;
+    margin: 0 2em 0 0;
+}
+#filter_container input {
+    width: 10em;
+}
+
+h2.stats {
+    margin-top: .5em;
+    font-size: 1em;
+}
+.stats span {
+    border: 1px solid;
+    padding: .1em .25em;
+    margin: 0 .1em;
+    cursor: pointer;
+    border-color: #999 #ccc #ccc #999;
+}
+.stats span.hide_run, .stats span.hide_exc,
+.stats span.hide_mis, .stats span.hide_par,
+.stats span.par.hide_run.hide_par {
+    border-color: #ccc #999 #999 #ccc;
+}
+.stats span.par.hide_run {
+    border-color: #999 #ccc #ccc #999;
+}
+
+.stats span.run {
+    background: #ddffdd;
+}
+.stats span.exc {
+    background: #eeeeee;
+}
+.stats span.mis {
+    background: #ffdddd;
+}
+.stats span.hide_run {
+    background: #eeffee;
+}
+.stats span.hide_exc {
+    background: #f5f5f5;
+}
+.stats span.hide_mis {
+    background: #ffeeee;
+}
+.stats span.par {
+    background: #ffffaa;
+}
+.stats span.hide_par {
+    background: #ffffcc;
+}
+
+/* Help panel */
+#keyboard_icon {
+    float: right;
+    margin: 5px;
+    cursor: pointer;
+}
+
+.help_panel {
+    position: absolute;
+    background: #ffffcc;
+    padding: .5em;
+    border: 1px solid #883;
+    display: none;
+}
+
+.indexfile .help_panel {
+    width: 20em; height: 4em;
+}
+
+.pyfile .help_panel {
+    width: 16em; height: 8em;
+}
+
+.help_panel .legend {
+    font-style: italic;
+    margin-bottom: 1em;
+}
+
+#panel_icon {
+    float: right;
+    cursor: pointer;
+}
+
+.keyhelp {
+    margin: .75em;
+}
+
+.keyhelp .key {
+    border: 1px solid black;
+    border-color: #888 #333 #333 #888;
+    padding: .1em .35em;
+    font-family: monospace;
+    font-weight: bold;
+    background: #eee;
+}
+
+/* Source file styles */
+.linenos p {
+    text-align: right;
+    margin: 0;
+    padding: 0 .5em;
+    color: #999999;
+    font-family: verdana, sans-serif;
+    font-size: .625em;   /* 10/16 */
+    line-height: 1.6em;  /* 16/10 */
+    }
+.linenos p.highlight {
+    background: #ffdd00;
+    }
+.linenos p a {
+    text-decoration: none;
+    color: #999999;
+    }
+.linenos p a:hover {
+    text-decoration: underline;
+    color: #999999;
+    }
+
+td.text {
+    width: 100%;
+    }
+.text p {
+    margin: 0;
+    padding: 0 0 0 .5em;
+    border-left: 2px solid #ffffff;
+    white-space: pre;
+    position: relative;
+    }
+
+.text p.mis {
+    background: #ffdddd;
+    border-left: 2px solid #ff0000;
+    }
+.text p.run, .text p.run.hide_par {
+    background: #ddffdd;
+    border-left: 2px solid #00ff00;
+    }
+.text p.exc {
+    background: #eeeeee;
+    border-left: 2px solid #808080;
+    }
+.text p.par, .text p.par.hide_run {
+    background: #ffffaa;
+    border-left: 2px solid #eeee99;
+    }
+.text p.hide_run, .text p.hide_exc, .text p.hide_mis, .text p.hide_par,
+.text p.hide_run.hide_par {
+    background: inherit;
+    }
+
+.text span.annotate {
+    font-family: georgia;
+    color: #666;
+    float: right;
+    padding-right: .5em;
+    }
+.text p.hide_par span.annotate {
+    display: none;
+    }
+.text span.annotate.long {
+    display: none;
+    }
+.text p:hover span.annotate.long {
+    display: block;
+    max-width: 50%;
+    white-space: normal;
+    float: right;
+    position: absolute;
+    top: 1.75em;
+    right: 1em;
+    width: 30em;
+    height: auto;
+    color: #333;
+    background: #ffffcc;
+    border: 1px solid #888;
+    padding: .25em .5em;
+    z-index: 999;
+    border-radius: .2em;
+    box-shadow: #cccccc .2em .2em .2em;
+    }
+
+/* Syntax coloring */
+.text .com {
+    color: green;
+    font-style: italic;
+    line-height: 1px;
+    }
+.text .key {
+    font-weight: bold;
+    line-height: 1px;
+    }
+.text .str {
+    color: #000080;
+    }
+
+/* index styles */
+#index td, #index th {
+    text-align: right;
+    width: 5em;
+    padding: .25em .5em;
+    border-bottom: 1px solid #eee;
+    }
+#index th {
+    font-style: italic;
+    color: #333;
+    border-bottom: 1px solid #ccc;
+    cursor: pointer;
+    }
+#index th:hover {
+    background: #eee;
+    border-bottom: 1px solid #999;
+    }
+#index td.left, #index th.left {
+    padding-left: 0;
+    }
+#index td.right, #index th.right {
+    padding-right: 0;
+    }
+#index th.headerSortDown, #index th.headerSortUp {
+    border-bottom: 1px solid #000;
+    white-space: nowrap;
+    background: #eee;
+    }
+#index th.headerSortDown:after {
+    content: " ↓";
+}
+#index th.headerSortUp:after {
+    content: " ↑";
+}
+#index td.name, #index th.name {
+    text-align: left;
+    width: auto;
+    }
+#index td.name a {
+    text-decoration: none;
+    color: #000;
+    }
+#index tr.total,
+#index tr.total_dynamic {
+    }
+#index tr.total td,
+#index tr.total_dynamic td {
+    font-weight: bold;
+    border-top: 1px solid #ccc;
+    border-bottom: none;
+    }
+#index tr.file:hover {
+    background: #eeeeee;
+    }
+#index tr.file:hover td.name {
+    text-decoration: underline;
+    color: #000;
+    }
+
+/* scroll marker styles */
+#scroll_marker {
+    position: fixed;
+    right: 0;
+    top: 0;
+    width: 16px;
+    height: 100%;
+    background: white;
+    border-left: 1px solid #eee;
+    }
+
+#scroll_marker .marker {
+    background: #eedddd;
+    position: absolute;
+    min-height: 3px;
+    width: 100%;
+    }
diff --git a/orm/services/region_manager/csv2db.py b/orm/services/region_manager/csv2db.py
new file mode 100755
index 00000000..5961dafc
--- /dev/null
+++ b/orm/services/region_manager/csv2db.py
@@ -0,0 +1,57 @@
+import logging
+import csv
+
+from rms.storage.base_data_manager import SQLDBError
+
+from rms.storage.my_sql.data_manager import DataManager
+import config
+
+logger = logging.getLogger(__name__)
+
+
+def load_csv2db(data_manager):
+    logger.info('Loading csv to db..')
+
+    try:
+
+        with open('rms/resources/regions.csv') as csvfile:
+            reader = csv.DictReader(csvfile)
+            for row in reader:
+                end_point_list = [{"type": "ord",
+                                   "url": row["ord_url"]
+                                   },
+                                  {"type": "dashboard",
+                                   "url": row["horizon_url"],
+                                   },
+                                  {"type": "identity",
+                                   "url": row["keystone_url"],
+                                   }]
+                data_manager.add_region(row["region_id"],
+                                        row["region_name"],
+                                        row["address_state"],
+                                        row["address_country"],
+                                        row["address_city"],
+                                        row["address_street"],
+                                        row["address_zip"],
+                                        row["region_status"],
+                                        row["ranger_agent_version"],
+                                        row["open_stack_version"],
+                                        row["location_type"],
+                                        row["vlcp_name"],
+                                        row["clli"],
+                                        row["design_type"],
+                                        end_point_list,
+                                        None,
+                                        row["description"])
+
+    except SQLDBError as e:
+        logger.error("SQL error raised {}".format(e.message))
+
+
+def main():
+    db_url = config.database['url']
+    data_manager = DataManager(db_url, 3, 3)
+    load_csv2db(data_manager)
+
+if __name__ == "__main__":
+    main()
diff --git a/orm/services/region_manager/htmlcov/coverage_html.js b/orm/services/region_manager/htmlcov/coverage_html.js
new file mode 100644
index 00000000..f6f5de20
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/coverage_html.js
@@ -0,0 +1,584 @@
+// Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
+// For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt
+
+// Coverage.py HTML report browser code.
+/*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */
+/*global coverage: true, document, window, $ */
+
+coverage = {};
+
+// Find all the elements with shortkey_* class, and use them to assign a shortcut key.
+coverage.assign_shortkeys = function () {
+    $("*[class*='shortkey_']").each(function (i, e) {
+        $.each($(e).attr("class").split(" "), function (i, c) {
+            if (/^shortkey_/.test(c)) {
+                $(document).bind('keydown', c.substr(9), function () {
+                    $(e).click();
+                });
+            }
+        });
+    });
+};
+
+// Create the events for the help panel.
+coverage.wire_up_help_panel = function () {
+    $("#keyboard_icon").click(function () {
+        // Show the help panel, and position it so the keyboard icon in the
+        // panel is in the same place as the keyboard icon in the header.
+        $(".help_panel").show();
+        var koff = $("#keyboard_icon").offset();
+        var poff = $("#panel_icon").position();
+        $(".help_panel").offset({
+            top: koff.top-poff.top,
+            left: koff.left-poff.left
+        });
+    });
+    $("#panel_icon").click(function () {
+        $(".help_panel").hide();
+    });
+};
+
+// Create the events for the filter box.
+coverage.wire_up_filter = function () {
+    // Cache elements.
+    var table = $("table.index");
+    var table_rows = table.find("tbody tr");
+    var table_row_names = table_rows.find("td.name a");
+    var no_rows = $("#no_rows");
+
+    // Create a duplicate table footer that we can modify with dynamic summed values.
+    var table_footer = $("table.index tfoot tr");
+    var table_dynamic_footer = table_footer.clone();
+    table_dynamic_footer.attr('class', 'total_dynamic hidden');
+    table_footer.after(table_dynamic_footer);
+
+    // Observe filter keyevents.
+    $("#filter").on("keyup change", $.debounce(150, function (event) {
+        var filter_value = $(this).val();
+
+        if (filter_value === "") {
+            // Filter box is empty, remove all filtering.
+            table_rows.removeClass("hidden");
+
+            // Show standard footer, hide dynamic footer.
+            table_footer.removeClass("hidden");
+            table_dynamic_footer.addClass("hidden");
+
+            // Hide placeholder, show table.
+            if (no_rows.length > 0) {
+                no_rows.hide();
+            }
+            table.show();
+
+        }
+        else {
+            // Filter table items by value.
+            var hidden = 0;
+            var shown = 0;
+
+            // Hide / show elements.
+            $.each(table_row_names, function () {
+                var element = $(this).parents("tr");
+
+                if ($(this).text().indexOf(filter_value) === -1) {
+                    // hide
+                    element.addClass("hidden");
+                    hidden++;
+                }
+                else {
+                    // show
+                    element.removeClass("hidden");
+                    shown++;
+                }
+            });
+
+            // Show placeholder if no rows will be displayed.
+            if (no_rows.length > 0) {
+                if (shown === 0) {
+                    // Show placeholder, hide table.
+                    no_rows.show();
+                    table.hide();
+                }
+                else {
+                    // Hide placeholder, show table.
+                    no_rows.hide();
+                    table.show();
+                }
+            }
+
+            // Manage dynamic header:
+            if (hidden > 0) {
+                // Calculate new dynamic sum values based on visible rows.
+                for (var column = 2; column < 20; column++) {
+                    // Calculate summed value.
+                    var cells = table_rows.find('td:nth-child(' + column + ')');
+                    if (!cells.length) {
+                        // No more columns...!
+                        break;
+                    }
+
+                    var sum = 0, numer = 0, denom = 0;
+                    $.each(cells.filter(':visible'), function () {
+                        var ratio = $(this).data("ratio");
+                        if (ratio) {
+                            var splitted = ratio.split(" ");
+                            numer += parseInt(splitted[0], 10);
+                            denom += parseInt(splitted[1], 10);
+                        }
+                        else {
+                            sum += parseInt(this.innerHTML, 10);
+                        }
+                    });
+
+                    // Get footer cell element.
+                    var footer_cell = table_dynamic_footer.find('td:nth-child(' + column + ')');
+
+                    // Set value into dynamic footer cell element.
+                    if (cells[0].innerHTML.indexOf('%') > -1) {
+                        // Percentage columns use the numerator and denominator,
+                        // and adapt to the number of decimal places.
+                        var match = /\.([0-9]+)/.exec(cells[0].innerHTML);
+                        var places = 0;
+                        if (match) {
+                            places = match[1].length;
+                        }
+                        var pct = numer * 100 / denom;
+                        footer_cell.text(pct.toFixed(places) + '%');
+                    }
+                    else {
+                        footer_cell.text(sum);
+                    }
+                }
+
+                // Hide standard footer, show dynamic footer.
+                table_footer.addClass("hidden");
+                table_dynamic_footer.removeClass("hidden");
+            }
+            else {
+                // Show standard footer, hide dynamic footer.
+                table_footer.removeClass("hidden");
+                table_dynamic_footer.addClass("hidden");
+            }
+        }
+    }));
+
+    // Trigger change event on setup, to force filter on page refresh
+    // (filter value may still be present).
+    $("#filter").trigger("change");
+};
+
+// Loaded on index.html
+coverage.index_ready = function ($) {
+    // Look for a cookie containing previous sort settings:
+    var sort_list = [];
+    var cookie_name = "COVERAGE_INDEX_SORT";
+    var i;
+
+    // This almost makes it worth installing the jQuery cookie plugin:
+    if (document.cookie.indexOf(cookie_name) > -1) {
+        var cookies = document.cookie.split(";");
+        for (i = 0; i < cookies.length; i++) {
+            var parts = cookies[i].split("=");
+
+            if ($.trim(parts[0]) === cookie_name && parts[1]) {
+                sort_list = eval("[[" + parts[1] + "]]");
+                break;
+            }
+        }
+    }
+
+    // Create a new widget which exists only to save and restore
+    // the sort order:
+    $.tablesorter.addWidget({
+        id: "persistentSort",
+
+        // Format is called by the widget before displaying:
+        format: function (table) {
+            if (table.config.sortList.length === 0 && sort_list.length > 0) {
+                // This table hasn't been sorted before - we'll use
+                // our stored settings:
+                $(table).trigger('sorton', [sort_list]);
+            }
+            else {
+                // This is not the first load - something has
+                // already defined sorting so we'll just update
+                // our stored value to match:
+                sort_list = table.config.sortList;
+            }
+        }
+    });
+
+    // Configure our tablesorter to handle the variable number of
+    // columns produced depending on report options:
+    var headers = [];
+    var col_count = $("table.index > thead > tr > th").length;
+
+    headers[0] = { sorter: 'text' };
+    for (i = 1; i < col_count-1; i++) {
+        headers[i] = { sorter: 'digit' };
+    }
+    headers[col_count-1] = { sorter: 'percent' };
+
+    // Enable the table sorter:
+    $("table.index").tablesorter({
+        widgets: ['persistentSort'],
+        headers: headers
+    });
+
+    coverage.assign_shortkeys();
+    coverage.wire_up_help_panel();
+    coverage.wire_up_filter();
+
+    // Watch for page unload events so we can save the final sort settings:
+    $(window).unload(function () {
+        document.cookie = cookie_name + "=" + sort_list.toString() + "; path=/";
+    });
+};
+
+// -- pyfile stuff --
+
+coverage.pyfile_ready = function ($) {
+    // If we're directed to a particular line number, highlight the line.
+    var frag = location.hash;
+    if (frag.length > 2 && frag[1] === 'n') {
+        $(frag).addClass('highlight');
+        coverage.set_sel(parseInt(frag.substr(2), 10));
+    }
+    else {
+        coverage.set_sel(0);
+    }
+
+    $(document)
+        .bind('keydown', 'j', coverage.to_next_chunk_nicely)
+        .bind('keydown', 'k', coverage.to_prev_chunk_nicely)
+        .bind('keydown', '0', coverage.to_top)
+        .bind('keydown', '1', coverage.to_first_chunk)
+        ;
+
+    $(".button_toggle_run").click(function (evt) {coverage.toggle_lines(evt.target, "run");});
+    $(".button_toggle_exc").click(function (evt) {coverage.toggle_lines(evt.target, "exc");});
+    $(".button_toggle_mis").click(function (evt) {coverage.toggle_lines(evt.target, "mis");});
+    $(".button_toggle_par").click(function (evt) {coverage.toggle_lines(evt.target, "par");});
+
+    coverage.assign_shortkeys();
+    coverage.wire_up_help_panel();
+
+    coverage.init_scroll_markers();
+
+    // Rebuild scroll markers after window high changing
+    $(window).resize(coverage.resize_scroll_markers);
+};
+
+coverage.toggle_lines = function (btn, cls) {
+    btn = $(btn);
+    var hide = "hide_"+cls;
+    if (btn.hasClass(hide)) {
+        $("#source ."+cls).removeClass(hide);
+        btn.removeClass(hide);
+    }
+    else {
+        $("#source ."+cls).addClass(hide);
+        btn.addClass(hide);
+    }
+};
+
+// Return the nth line div.
+coverage.line_elt = function (n) {
+    return $("#t" + n);
+};
+
+// Return the nth line number div.
+coverage.num_elt = function (n) {
+    return $("#n" + n);
+};
+
+// Return the container of all the code.
+coverage.code_container = function () {
+    return $(".linenos");
+};
+
+// Set the selection.  b and e are line numbers.
+coverage.set_sel = function (b, e) {
+    // The first line selected.
+    coverage.sel_begin = b;
+    // The next line not selected.
+    coverage.sel_end = (e === undefined) ? b+1 : e;
+};
+
+coverage.to_top = function () {
+    coverage.set_sel(0, 1);
+    coverage.scroll_window(0);
+};
+
+coverage.to_first_chunk = function () {
+    coverage.set_sel(0, 1);
+    coverage.to_next_chunk();
+};
+
+coverage.is_transparent = function (color) {
+    // Different browsers return different colors for "none".
+    return color === "transparent" || color === "rgba(0, 0, 0, 0)";
+};
+
+coverage.to_next_chunk = function () {
+    var c = coverage;
+
+    // Find the start of the next colored chunk.
+    var probe = c.sel_end;
+    var color, probe_line;
+    while (true) {
+        probe_line = c.line_elt(probe);
+        if (probe_line.length === 0) {
+            return;
+        }
+        color = probe_line.css("background-color");
+        if (!c.is_transparent(color)) {
+            break;
+        }
+        probe++;
+    }
+
+    // There's a next chunk, `probe` points to it.
+    var begin = probe;
+
+    // Find the end of this chunk.
+    var next_color = color;
+    while (next_color === color) {
+        probe++;
+        probe_line = c.line_elt(probe);
+        next_color = probe_line.css("background-color");
+    }
+    c.set_sel(begin, probe);
+    c.show_selection();
+};
+
+coverage.to_prev_chunk = function () {
+    var c = coverage;
+
+    // Find the end of the prev colored chunk.
+    var probe = c.sel_begin-1;
+    var probe_line = c.line_elt(probe);
+    if (probe_line.length === 0) {
+        return;
+    }
+    var color = probe_line.css("background-color");
+    while (probe > 0 && c.is_transparent(color)) {
+        probe--;
+        probe_line = c.line_elt(probe);
+        if (probe_line.length === 0) {
+            return;
+        }
+        color = probe_line.css("background-color");
+    }
+
+    // There's a prev chunk, `probe` points to its last line.
+    var end = probe+1;
+
+    // Find the beginning of this chunk.
+    var prev_color = color;
+    while (prev_color === color) {
+        probe--;
+        probe_line = c.line_elt(probe);
+        prev_color = probe_line.css("background-color");
+    }
+    c.set_sel(probe+1, end);
+    c.show_selection();
+};
+
+// Return the line number of the line nearest pixel position pos
+coverage.line_at_pos = function (pos) {
+    var l1 = coverage.line_elt(1),
+        l2 = coverage.line_elt(2),
+        result;
+    if (l1.length && l2.length) {
+        var l1_top = l1.offset().top,
+            line_height = l2.offset().top - l1_top,
+            nlines = (pos - l1_top) / line_height;
+        if (nlines < 1) {
+            result = 1;
+        }
+        else {
+            result = Math.ceil(nlines);
+        }
+    }
+    else {
+        result = 1;
+    }
+    return result;
+};
+
+// Returns 0, 1, or 2: how many of the two ends of the selection are on
+// the screen right now?
+coverage.selection_ends_on_screen = function () {
+    if (coverage.sel_begin === 0) {
+        return 0;
+    }
+
+    var top = coverage.line_elt(coverage.sel_begin);
+    var next = coverage.line_elt(coverage.sel_end-1);
+
+    return (
+        (top.isOnScreen() ? 1 : 0) +
+        (next.isOnScreen() ? 1 : 0)
+    );
+};
+
+coverage.to_next_chunk_nicely = function () {
+    coverage.finish_scrolling();
+    if (coverage.selection_ends_on_screen() === 0) {
+        // The selection is entirely off the screen: select the top line on
+        // the screen.
+        var win = $(window);
+        coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop()));
+    }
+    coverage.to_next_chunk();
+};
+
+coverage.to_prev_chunk_nicely = function () {
+    coverage.finish_scrolling();
+    if (coverage.selection_ends_on_screen() === 0) {
+        var win = $(window);
+        coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop() + win.height()));
+    }
+    coverage.to_prev_chunk();
+};
+
+// Select line number lineno, or if it is in a colored chunk, select the
+// entire chunk
+coverage.select_line_or_chunk = function (lineno) {
+    var c = coverage;
+    var probe_line = c.line_elt(lineno);
+    if (probe_line.length === 0) {
+        return;
+    }
+    var the_color = probe_line.css("background-color");
+    if (!c.is_transparent(the_color)) {
+        // The line is in a highlighted chunk.
+        // Search backward for the first line.
+        var probe = lineno;
+        var color = the_color;
+        while (probe > 0 && color === the_color) {
+            probe--;
+            probe_line = c.line_elt(probe);
+            if (probe_line.length === 0) {
+                break;
+            }
+            color = probe_line.css("background-color");
+        }
+        var begin = probe + 1;
+
+        // Search forward for the last line.
+        probe = lineno;
+        color = the_color;
+        while (color === the_color) {
+            probe++;
+            probe_line = c.line_elt(probe);
+            color = probe_line.css("background-color");
+        }
+
+        coverage.set_sel(begin, probe);
+    }
+    else {
+        coverage.set_sel(lineno);
+    }
+};
+
+coverage.show_selection = function () {
+    var c = coverage;
+
+    // Highlight the lines in the chunk
+    c.code_container().find(".highlight").removeClass("highlight");
+    for (var probe = c.sel_begin; probe > 0 && probe < c.sel_end; probe++) {
+        c.num_elt(probe).addClass("highlight");
+    }
+
+    c.scroll_to_selection();
+};
+
+coverage.scroll_to_selection = function () {
+    // Scroll the page if the chunk isn't fully visible.
+    if (coverage.selection_ends_on_screen() < 2) {
+        // Need to move the page. The html,body trick makes it scroll in all
+        // browsers, got it from http://stackoverflow.com/questions/3042651
+        var top = coverage.line_elt(coverage.sel_begin);
+        var top_pos = parseInt(top.offset().top, 10);
+        coverage.scroll_window(top_pos - 30);
+    }
+};
+
+coverage.scroll_window = function (to_pos) {
+    $("html,body").animate({scrollTop: to_pos}, 200);
+};
+
+coverage.finish_scrolling = function () {
+    $("html,body").stop(true, true);
+};
+
+coverage.init_scroll_markers = function () {
+    var c = coverage;
+    // Init some variables
+    c.lines_len = $('td.text p').length;
+    c.body_h = $('body').height();
+    c.header_h = $('div#header').height();
+    c.missed_lines = $('td.text p.mis, td.text p.par');
+
+    // Build html
+    c.resize_scroll_markers();
+};
+
+coverage.resize_scroll_markers = function () {
+    var c = coverage,
+        min_line_height = 3,
+        max_line_height = 10,
+        visible_window_h = $(window).height();
+
+    $('#scroll_marker').remove();
+    // Don't build markers if the window has no scroll bar.
+    if (c.body_h <= visible_window_h) {
+        return;
+    }
+
+    $("body").append("<div id='scroll_marker'>&nbsp;</div>");
+    var scroll_marker = $('#scroll_marker'),
+        marker_scale = scroll_marker.height() / c.body_h,
+        line_height = scroll_marker.height() / c.lines_len;
+
+    // Line height must be between the extremes.
+    if (line_height > min_line_height) {
+        if (line_height > max_line_height) {
+            line_height = max_line_height;
+        }
+    }
+    else {
+        line_height = min_line_height;
+    }
+
+    var previous_line = -99,
+        last_mark,
+        last_top;
+
+    c.missed_lines.each(function () {
+        var line_top = Math.round($(this).offset().top * marker_scale),
+            id_name = $(this).attr('id'),
+            line_number = parseInt(id_name.substring(1, id_name.length));
+
+        if (line_number === previous_line + 1) {
+            // If this solid missed block just make previous mark higher.
+            last_mark.css({
+                'height': line_top + line_height - last_top
+            });
+        }
+        else {
+            // Add colored line in scroll_marker block.
+            scroll_marker.append('<div id="m' + line_number + '" class="marker"></div>');
+            last_mark = $('#m' + line_number);
+            last_mark.css({
+                'height': line_height,
+                'top': line_top
+            });
+            last_top = line_top;
+        }
+
+        previous_line = line_number;
+    });
+};
diff --git a/orm/services/region_manager/htmlcov/index.html b/orm/services/region_manager/htmlcov/index.html
new file mode 100644
index 00000000..672002e7
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/index.html
@@ -0,0 +1,455 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Coverage report</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.ba-throttle-debounce.min.js"></script>
+    <script type="text/javascript" src="jquery.tablesorter.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.index_ready);
+    </script>
+</head>
+<body class="indexfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage report:
+            <span class="pc_cov">88%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <form id="filter_container">
+            <input id="filter" type="text" value="" placeholder="filter..." />
+        </form>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">n</span>
+        <span class="key">s</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        
+        <span class="key">c</span> &nbsp; change column sorting
+    </p>
+    </div>
+</div>
+
+<div id="index">
+    <table class="index">
+        <thead>
+            
+            <tr class="tablehead" title="Click to sort">
+                <th class="name left headerSortDown shortkey_n">Module</th>
+                <th class="shortkey_s">statements</th>
+                <th class="shortkey_m">missing</th>
+                <th class="shortkey_x">excluded</th>
+                
+                <th class="right shortkey_c">coverage</th>
+            </tr>
+        </thead>
+        
+        <tfoot>
+            <tr class="total">
+                <td class="name left">Total</td>
+                <td>1287</td>
+                <td>160</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="1127 1287">88%</td>
+            </tr>
+        </tfoot>
+        <tbody>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms___init___py.html">rms/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers___init___py.html">rms/controllers/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_configuration_py.html">rms/controllers/configuration.py</a></td>
+                <td>17</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="17 17">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_lcp_controller_py.html">rms/controllers/lcp_controller.py</a></td>
+                <td>56</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="56 56">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_logs_py.html">rms/controllers/logs.py</a></td>
+                <td>36</td>
+                <td>2</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="34 36">94%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_root_py.html">rms/controllers/root.py</a></td>
+                <td>12</td>
+                <td>1</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="11 12">92%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2___init___py.html">rms/controllers/v2/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2_orm___init___py.html">rms/controllers/v2/orm/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2_orm_resources___init___py.html">rms/controllers/v2/orm/resources/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2_orm_resources_groups_py.html">rms/controllers/v2/orm/resources/groups.py</a></td>
+                <td>124</td>
+                <td>22</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="102 124">82%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2_orm_resources_metadata_py.html">rms/controllers/v2/orm/resources/metadata.py</a></td>
+                <td>85</td>
+                <td>19</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="66 85">78%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2_orm_resources_regions_py.html">rms/controllers/v2/orm/resources/regions.py</a></td>
+                <td>187</td>
+                <td>5</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="182 187">97%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2_orm_resources_status_py.html">rms/controllers/v2/orm/resources/status.py</a></td>
+                <td>47</td>
+                <td>3</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="44 47">94%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2_orm_root_py.html">rms/controllers/v2/orm/root.py</a></td>
+                <td>5</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="5 5">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_controllers_v2_root_py.html">rms/controllers/v2/root.py</a></td>
+                <td>3</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="3 3">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock___init___py.html">rms/external_mock/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_audit_client___init___py.html">rms/external_mock/audit_client/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_audit_client_api___init___py.html">rms/external_mock/audit_client/api/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_audit_client_api_audit_py.html">rms/external_mock/audit_client/api/audit.py</a></td>
+                <td>4</td>
+                <td>4</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 4">0%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_keystone_utils___init___py.html">rms/external_mock/keystone_utils/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_keystone_utils_tokens_py.html">rms/external_mock/keystone_utils/tokens.py</a></td>
+                <td>5</td>
+                <td>1</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="4 5">80%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_orm_common___init___py.html">rms/external_mock/orm_common/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_orm_common_policy___init___py.html">rms/external_mock/orm_common/policy/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_orm_common_policy_policy_py.html">rms/external_mock/orm_common/policy/policy.py</a></td>
+                <td>6</td>
+                <td>2</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="4 6">67%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_orm_common_utils___init___py.html">rms/external_mock/orm_common/utils/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_orm_common_utils_api_error_utils_py.html">rms/external_mock/orm_common/utils/api_error_utils.py</a></td>
+                <td>2</td>
+                <td>1</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="1 2">50%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_external_mock_orm_common_utils_utils_py.html">rms/external_mock/orm_common/utils/utils.py</a></td>
+                <td>6</td>
+                <td>1</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="5 6">83%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_model___init___py.html">rms/model/__init__.py</a></td>
+                <td>3</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="3 3">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_model_model_py.html">rms/model/model.py</a></td>
+                <td>100</td>
+                <td>7</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="93 100">93%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_model_url_parm_py.html">rms/model/url_parm.py</a></td>
+                <td>63</td>
+                <td>4</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="59 63">94%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_services___init___py.html">rms/services/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_services_error_base_py.html">rms/services/error_base.py</a></td>
+                <td>18</td>
+                <td>2</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="16 18">89%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_services_services_py.html">rms/services/services.py</a></td>
+                <td>170</td>
+                <td>55</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="115 170">68%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_storage___init___py.html">rms/storage/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_storage_base_data_manager_py.html">rms/storage/base_data_manager.py</a></td>
+                <td>24</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="24 24">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_storage_data_manager_factory_py.html">rms/storage/data_manager_factory.py</a></td>
+                <td>12</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="12 12">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_storage_my_sql___init___py.html">rms/storage/my_sql/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_storage_my_sql_data_manager_py.html">rms/storage/my_sql/data_manager.py</a></td>
+                <td>270</td>
+                <td>31</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="239 270">89%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_utils___init___py.html">rms/utils/__init__.py</a></td>
+                <td>0</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="0 0">100%</td>
+            </tr>
+            
+            <tr class="file">
+                <td class="name left"><a href="rms_utils_authentication_py.html">rms/utils/authentication.py</a></td>
+                <td>32</td>
+                <td>0</td>
+                <td>0</td>
+                
+                <td class="right" data-ratio="32 32">100%</td>
+            </tr>
+            
+        </tbody>
+    </table>
+
+    <p id="no_rows">
+        No items found using the specified filter.
+    </p>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-13 02:18
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/jquery.ba-throttle-debounce.min.js b/orm/services/region_manager/htmlcov/jquery.ba-throttle-debounce.min.js
new file mode 100644
index 00000000..648fe5d3
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/jquery.ba-throttle-debounce.min.js
@@ -0,0 +1,9 @@
+/*
+ * jQuery throttle / debounce - v1.1 - 3/7/2010
+ * http://benalman.com/projects/jquery-throttle-debounce-plugin/
+ *
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function(b,c){var $=b.jQuery||b.Cowboy||(b.Cowboy={}),a;$.throttle=a=function(e,f,j,i){var h,d=0;if(typeof f!=="boolean"){i=j;j=f;f=c}function g(){var o=this,m=+new Date()-d,n=arguments;function l(){d=+new Date();j.apply(o,n)}function k(){h=c}if(i&&!h){l()}h&&clearTimeout(h);if(i===c&&m>e){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this);
diff --git a/orm/services/region_manager/htmlcov/jquery.hotkeys.js b/orm/services/region_manager/htmlcov/jquery.hotkeys.js
new file mode 100644
index 00000000..09b21e03
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/jquery.hotkeys.js
@@ -0,0 +1,99 @@
+/*
+ * jQuery Hotkeys Plugin
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ * Based upon the plugin by Tzury Bar Yochay:
+ * http://github.com/tzuryby/hotkeys
+ *
+ * Original idea by:
+ * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
+*/
+
+(function(jQuery){
+
+	jQuery.hotkeys = {
+		version: "0.8",
+
+		specialKeys: {
+			8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause",
+			20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home",
+			37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del",
+			96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7",
+			104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/",
+			112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8",
+			120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 191: "/", 224: "meta"
+		},
+
+		shiftNums: {
+			"`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&",
+			"8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<",
+			".": ">",  "/": "?",  "\\": "|"
+		}
+	};
+
+	function keyHandler( handleObj ) {
+		// Only care when a possible input has been specified
+		if ( typeof handleObj.data !== "string" ) {
+			return;
+		}
+
+		var origHandler = handleObj.handler,
+			keys = handleObj.data.toLowerCase().split(" ");
+
+		handleObj.handler = function( event ) {
+			// Don't fire in text-accepting inputs that we didn't directly bind to
+			if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) ||
+				 event.target.type === "text") ) {
+				return;
+			}
+
+			// Keypress represents characters, not special keys
+			var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ],
+				character = String.fromCharCode( event.which ).toLowerCase(),
+				key, modif = "", possible = {};
+
+			// check combinations (alt|ctrl|shift+anything)
+			if ( event.altKey && special !== "alt" ) {
+				modif += "alt+";
+			}
+
+			if ( event.ctrlKey && special !== "ctrl" ) {
+				modif += "ctrl+";
+			}
+
+			// TODO: Need to make sure this works consistently across platforms
+			if ( event.metaKey && !event.ctrlKey && special !== "meta" ) {
+				modif += "meta+";
+			}
+
+			if ( event.shiftKey && special !== "shift" ) {
+				modif += "shift+";
+			}
+
+			if ( special ) {
+				possible[ modif + special ] = true;
+
+			} else {
+				possible[ modif + character ] = true;
+				possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true;
+
+				// "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
+				if ( modif === "shift+" ) {
+					possible[ jQuery.hotkeys.shiftNums[ character ] ] = true;
+				}
+			}
+
+			for ( var i = 0, l = keys.length; i < l; i++ ) {
+				if ( possible[ keys[i] ] ) {
+					return origHandler.apply( this, arguments );
+				}
+			}
+		};
+	}
+
+	jQuery.each([ "keydown", "keyup", "keypress" ], function() {
+		jQuery.event.special[ this ] = { add: keyHandler };
+	});
+
+})( jQuery );
diff --git a/orm/services/region_manager/htmlcov/jquery.isonscreen.js b/orm/services/region_manager/htmlcov/jquery.isonscreen.js
new file mode 100644
index 00000000..0182ebd2
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/jquery.isonscreen.js
@@ -0,0 +1,53 @@
+/* Copyright (c) 2010
+ * @author Laurence Wheway
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
+ * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
+ *
+ * @version 1.2.0
+ */
+(function($) {
+	jQuery.extend({
+		isOnScreen: function(box, container) {
+			//ensure numbers come in as intgers (not strings) and remove 'px' is it's there
+			for(var i in box){box[i] = parseFloat(box[i])};
+			for(var i in container){container[i] = parseFloat(container[i])};
+
+			if(!container){
+				container = {
+					left: $(window).scrollLeft(),
+					top: $(window).scrollTop(),
+					width: $(window).width(),
+					height: $(window).height()
+				}
+			}
+
+			if(	box.left+box.width-container.left > 0 &&
+				box.left < container.width+container.left &&
+				box.top+box.height-container.top > 0 &&
+				box.top < container.height+container.top
+			) return true;
+			return false;
+		}
+	})
+
+
+	jQuery.fn.isOnScreen = function (container) {
+		for(var i in container){container[i] = parseFloat(container[i])};
+
+		if(!container){
+			container = {
+				left: $(window).scrollLeft(),
+				top: $(window).scrollTop(),
+				width: $(window).width(),
+				height: $(window).height()
+			}
+		}
+
+		if(	$(this).offset().left+$(this).width()-container.left > 0 &&
+			$(this).offset().left < container.width+container.left &&
+			$(this).offset().top+$(this).height()-container.top > 0 &&
+			$(this).offset().top < container.height+container.top
+		) return true;
+		return false;
+	}
+})(jQuery);
diff --git a/orm/services/region_manager/htmlcov/jquery.min.js b/orm/services/region_manager/htmlcov/jquery.min.js
new file mode 100644
index 00000000..e2efc335
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/jquery.min.js
@@ -0,0 +1,9404 @@
+/*!
+ * jQuery JavaScript Library v1.7.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Fri Jul  5 14:07:58 UTC 2013
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+	navigator = window.navigator,
+	location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// A simple way to check for HTML strings or ID strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Check if a string has a non-whitespace character in it
+	rnotwhite = /\S/,
+
+	// Used for trimming whitespace
+	trimLeft = /^\s+/,
+	trimRight = /\s+$/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+	// Useragent RegExp
+	rwebkit = /(webkit)[ \/]([\w.]+)/,
+	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+	rmsie = /(msie) ([\w.]+)/,
+	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+	// Matches dashed string for camelizing
+	rdashAlpha = /-([a-z]|[0-9])/ig,
+	rmsPrefix = /^-ms-/,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// Keep a UserAgent string for use with jQuery.browser
+	userAgent = navigator.userAgent,
+
+	// For matching the engine and version of the browser
+	browserMatch,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// The ready event handler
+	DOMContentLoaded,
+
+	// Save a reference to some core methods
+	toString = Object.prototype.toString,
+	hasOwn = Object.prototype.hasOwnProperty,
+	push = Array.prototype.push,
+	slice = Array.prototype.slice,
+	trim = String.prototype.trim,
+	indexOf = Array.prototype.indexOf,
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), or $(undefined)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// The body element only exists once, optimize finding it
+		if ( selector === "body" && !context && document.body ) {
+			this.context = document;
+			this[0] = document.body;
+			this.selector = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = quickExpr.exec( selector );
+			}
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = ( context ? context.ownerDocument || context : document );
+
+					// If a single string is passed in and it's a single tag
+					// just do a createElement and skip the rest
+					ret = rsingleTag.exec( selector );
+
+					if ( ret ) {
+						if ( jQuery.isPlainObject( context ) ) {
+							selector = [ document.createElement( ret[1] ) ];
+							jQuery.fn.attr.call( selector, context, true );
+
+						} else {
+							selector = [ doc.createElement( ret[1] ) ];
+						}
+
+					} else {
+						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+						selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
+					}
+
+					return jQuery.merge( this, selector );
+
+				// HANDLE: $("#id")
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || rootjQuery ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if ( selector.selector !== undefined ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.7.2",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return slice.call( this, 0 );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = this.constructor();
+
+		if ( jQuery.isArray( elems ) ) {
+			push.apply( ret, elems );
+
+		} else {
+			jQuery.merge( ret, elems );
+		}
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Attach the listeners
+		jQuery.bindReady();
+
+		// Add the callback
+		readyList.add( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		i = +i;
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ),
+			"slice", slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+		// Either a released hold or an DOMready/load event and not yet ready
+		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+			if ( !document.body ) {
+				return setTimeout( jQuery.ready, 1 );
+			}
+
+			// Remember that the DOM is ready
+			jQuery.isReady = true;
+
+			// If a normal DOM Ready event fired, decrement, and wait if need be
+			if ( wait !== true && --jQuery.readyWait > 0 ) {
+				return;
+			}
+
+			// If there are functions bound, to execute
+			readyList.fireWith( document, [ jQuery ] );
+
+			// Trigger any bound ready events
+			if ( jQuery.fn.trigger ) {
+				jQuery( document ).trigger( "ready" ).off( "ready" );
+			}
+		}
+	},
+
+	bindReady: function() {
+		if ( readyList ) {
+			return;
+		}
+
+		readyList = jQuery.Callbacks( "once memory" );
+
+		// Catch cases where $(document).ready() is called after the
+		// browser event has already occurred.
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Mozilla, Opera and webkit nightlies currently support this event
+		if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else if ( document.attachEvent ) {
+			// ensure firing before onload,
+			// maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var toplevel = false;
+
+			try {
+				toplevel = window.frameElement == null;
+			} catch(e) {}
+
+			if ( document.documentElement.doScroll && toplevel ) {
+				doScrollCheck();
+			}
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	isWindow: function( obj ) {
+		return obj != null && obj == obj.window;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!hasOwn.call(obj, "constructor") &&
+				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		for ( var name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	parseJSON: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+			.replace( rvalidtokens, "]" )
+			.replace( rvalidbraces, "")) ) {
+
+			return ( new Function( "return " + data ) )();
+
+		}
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+		var xml, tmp;
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && rnotwhite.test( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0,
+			length = object.length,
+			isObj = length === undefined || jQuery.isFunction( object );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.apply( object[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( object[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return object;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: trim ?
+		function( text ) {
+			return text == null ?
+				"" :
+				trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( array, results ) {
+		var ret = results || [];
+
+		if ( array != null ) {
+			// The window, strings (and functions) also have 'length'
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			var type = jQuery.type( array );
+
+			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+				push.call( ret, array );
+			} else {
+				jQuery.merge( ret, array );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array, i ) {
+		var len;
+
+		if ( array ) {
+			if ( indexOf ) {
+				return indexOf.call( array, elem, i );
+			}
+
+			len = array.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in array && array[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var i = first.length,
+			j = 0;
+
+		if ( typeof second.length === "number" ) {
+			for ( var l = second.length; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var ret = [], retVal;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value, key, ret = [],
+			i = 0,
+			length = elems.length,
+			// jquery objects are treated as arrays
+			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( key in elems ) {
+				value = callback( elems[ key ], key, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		if ( typeof context === "string" ) {
+			var tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		var args = slice.call( arguments, 2 ),
+			proxy = function() {
+				return fn.apply( context, args.concat( slice.call( arguments ) ) );
+			};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Mutifunctional method to get and set values to a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
+		var exec,
+			bulk = key == null,
+			i = 0,
+			length = elems.length;
+
+		// Sets many values
+		if ( key && typeof key === "object" ) {
+			for ( i in key ) {
+				jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
+			}
+			chainable = 1;
+
+		// Sets one value
+		} else if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = pass === undefined && jQuery.isFunction( value );
+
+			if ( bulk ) {
+				// Bulk operations only iterate when executing function values
+				if ( exec ) {
+					exec = fn;
+					fn = function( elem, key, value ) {
+						return exec.call( jQuery( elem ), value );
+					};
+
+				// Otherwise they run against the entire set
+				} else {
+					fn.call( elems, value );
+					fn = null;
+				}
+			}
+
+			if ( fn ) {
+				for (; i < length; i++ ) {
+					fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+				}
+			}
+
+			chainable = 1;
+		}
+
+		return chainable ?
+			elems :
+
+			// Gets
+			bulk ?
+				fn.call( elems ) :
+				length ? fn( elems[0], key ) : emptyGet;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	},
+
+	// Use of jQuery.browser is frowned upon.
+	// More details: http://docs.jquery.com/Utilities/jQuery.browser
+	uaMatch: function( ua ) {
+		ua = ua.toLowerCase();
+
+		var match = rwebkit.exec( ua ) ||
+			ropera.exec( ua ) ||
+			rmsie.exec( ua ) ||
+			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+			[];
+
+		return { browser: match[1] || "", version: match[2] || "0" };
+	},
+
+	sub: function() {
+		function jQuerySub( selector, context ) {
+			return new jQuerySub.fn.init( selector, context );
+		}
+		jQuery.extend( true, jQuerySub, this );
+		jQuerySub.superclass = this;
+		jQuerySub.fn = jQuerySub.prototype = this();
+		jQuerySub.fn.constructor = jQuerySub;
+		jQuerySub.sub = this.sub;
+		jQuerySub.fn.init = function init( selector, context ) {
+			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+				context = jQuerySub( context );
+			}
+
+			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+		};
+		jQuerySub.fn.init.prototype = jQuerySub.fn;
+		var rootjQuerySub = jQuerySub(document);
+		return jQuerySub;
+	},
+
+	browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+	jQuery.browser[ browserMatch.browser ] = true;
+	jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+	jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+	trimLeft = /^[\s\xA0]+/;
+	trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+	DOMContentLoaded = function() {
+		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+		jQuery.ready();
+	};
+
+} else if ( document.attachEvent ) {
+	DOMContentLoaded = function() {
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	};
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+	if ( jQuery.isReady ) {
+		return;
+	}
+
+	try {
+		// If IE is used, use the trick by Diego Perini
+		// http://javascript.nwbox.com/IEContentLoaded/
+		document.documentElement.doScroll("left");
+	} catch(e) {
+		setTimeout( doScrollCheck, 1 );
+		return;
+	}
+
+	// and execute any waiting functions
+	jQuery.ready();
+}
+
+return jQuery;
+
+})();
+
+
+// String to Object flags format cache
+var flagsCache = {};
+
+// Convert String-formatted flags into Object-formatted ones and store in cache
+function createFlags( flags ) {
+	var object = flagsCache[ flags ] = {},
+		i, length;
+	flags = flags.split( /\s+/ );
+	for ( i = 0, length = flags.length; i < length; i++ ) {
+		object[ flags[i] ] = true;
+	}
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	flags:	an optional list of space-separated flags that will change how
+ *			the callback list behaves
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible flags:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( flags ) {
+
+	// Convert flags from String-formatted to Object-formatted
+	// (we check in cache first)
+	flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+
+	var // Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = [],
+		// Last fire value (for non-forgettable lists)
+		memory,
+		// Flag to know if list was already fired
+		fired,
+		// Flag to know if list is currently firing
+		firing,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// Add one or several callbacks to the list
+		add = function( args ) {
+			var i,
+				length,
+				elem,
+				type,
+				actual;
+			for ( i = 0, length = args.length; i < length; i++ ) {
+				elem = args[ i ];
+				type = jQuery.type( elem );
+				if ( type === "array" ) {
+					// Inspect recursively
+					add( elem );
+				} else if ( type === "function" ) {
+					// Add if not in unique mode and callback is not in
+					if ( !flags.unique || !self.has( elem ) ) {
+						list.push( elem );
+					}
+				}
+			}
+		},
+		// Fire callbacks
+		fire = function( context, args ) {
+			args = args || [];
+			memory = !flags.memory || [ context, args ];
+			fired = true;
+			firing = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
+					memory = true; // Mark as halted
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( !flags.once ) {
+					if ( stack && stack.length ) {
+						memory = stack.shift();
+						self.fireWith( memory[ 0 ], memory[ 1 ] );
+					}
+				} else if ( memory === true ) {
+					self.disable();
+				} else {
+					list = [];
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					var length = list.length;
+					add( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away, unless previous
+					// firing was halted (stopOnFalse)
+					} else if ( memory && memory !== true ) {
+						firingStart = length;
+						fire( memory[ 0 ], memory[ 1 ] );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					var args = arguments,
+						argIndex = 0,
+						argLength = args.length;
+					for ( ; argIndex < argLength ; argIndex++ ) {
+						for ( var i = 0; i < list.length; i++ ) {
+							if ( args[ argIndex ] === list[ i ] ) {
+								// Handle firingIndex and firingLength
+								if ( firing ) {
+									if ( i <= firingLength ) {
+										firingLength--;
+										if ( i <= firingIndex ) {
+											firingIndex--;
+										}
+									}
+								}
+								// Remove the element
+								list.splice( i--, 1 );
+								// If we have some unicity property then
+								// we only need to do this once
+								if ( flags.unique ) {
+									break;
+								}
+							}
+						}
+					}
+				}
+				return this;
+			},
+			// Control if a given callback is in the list
+			has: function( fn ) {
+				if ( list ) {
+					var i = 0,
+						length = list.length;
+					for ( ; i < length; i++ ) {
+						if ( fn === list[ i ] ) {
+							return true;
+						}
+					}
+				}
+				return false;
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory || memory === true ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( stack ) {
+					if ( firing ) {
+						if ( !flags.once ) {
+							stack.push( [ context, args ] );
+						}
+					} else if ( !( flags.once && memory ) ) {
+						fire( context, args );
+					}
+				}
+				return this;
+			},
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+
+
+
+
+var // Static reference to slice
+	sliceDeferred = [].slice;
+
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var doneList = jQuery.Callbacks( "once memory" ),
+			failList = jQuery.Callbacks( "once memory" ),
+			progressList = jQuery.Callbacks( "memory" ),
+			state = "pending",
+			lists = {
+				resolve: doneList,
+				reject: failList,
+				notify: progressList
+			},
+			promise = {
+				done: doneList.add,
+				fail: failList.add,
+				progress: progressList.add,
+
+				state: function() {
+					return state;
+				},
+
+				// Deprecated
+				isResolved: doneList.fired,
+				isRejected: failList.fired,
+
+				then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
+					deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
+					return this;
+				},
+				always: function() {
+					deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+					return this;
+				},
+				pipe: function( fnDone, fnFail, fnProgress ) {
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( {
+							done: [ fnDone, "resolve" ],
+							fail: [ fnFail, "reject" ],
+							progress: [ fnProgress, "notify" ]
+						}, function( handler, data ) {
+							var fn = data[ 0 ],
+								action = data[ 1 ],
+								returned;
+							if ( jQuery.isFunction( fn ) ) {
+								deferred[ handler ](function() {
+									returned = fn.apply( this, arguments );
+									if ( returned && jQuery.isFunction( returned.promise ) ) {
+										returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
+									} else {
+										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+									}
+								});
+							} else {
+								deferred[ handler ]( newDefer[ action ] );
+							}
+						});
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					if ( obj == null ) {
+						obj = promise;
+					} else {
+						for ( var key in promise ) {
+							obj[ key ] = promise[ key ];
+						}
+					}
+					return obj;
+				}
+			},
+			deferred = promise.promise({}),
+			key;
+
+		for ( key in lists ) {
+			deferred[ key ] = lists[ key ].fire;
+			deferred[ key + "With" ] = lists[ key ].fireWith;
+		}
+
+		// Handle state
+		deferred.done( function() {
+			state = "resolved";
+		}, failList.disable, progressList.lock ).fail( function() {
+			state = "rejected";
+		}, doneList.disable, progressList.lock );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( firstParam ) {
+		var args = sliceDeferred.call( arguments, 0 ),
+			i = 0,
+			length = args.length,
+			pValues = new Array( length ),
+			count = length,
+			pCount = length,
+			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+				firstParam :
+				jQuery.Deferred(),
+			promise = deferred.promise();
+		function resolveFunc( i ) {
+			return function( value ) {
+				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				if ( !( --count ) ) {
+					deferred.resolveWith( deferred, args );
+				}
+			};
+		}
+		function progressFunc( i ) {
+			return function( value ) {
+				pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				deferred.notifyWith( promise, pValues );
+			};
+		}
+		if ( length > 1 ) {
+			for ( ; i < length; i++ ) {
+				if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
+					args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
+				} else {
+					--count;
+				}
+			}
+			if ( !count ) {
+				deferred.resolveWith( deferred, args );
+			}
+		} else if ( deferred !== firstParam ) {
+			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+		}
+		return promise;
+	}
+});
+
+
+
+
+jQuery.support = (function() {
+
+	var support,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		fragment,
+		tds,
+		events,
+		eventName,
+		i,
+		isSupported,
+		div = document.createElement( "div" ),
+		documentElement = document.documentElement;
+
+	// Preliminary tests
+	div.setAttribute("className", "t");
+	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+	all = div.getElementsByTagName( "*" );
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return {};
+	}
+
+	// First batch of supports tests
+	select = document.createElement( "select" );
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName( "input" )[ 0 ];
+
+	support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.55/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: ( input.value === "on" ),
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// Tests for enctype support on a form(#6743)
+		enctype: !!document.createElement("form").enctype,
+
+		// Makes sure cloning an html5 element does not cause problems
+		// Where outerHTML is undefined, this still works
+		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true,
+		pixelMargin: true
+	};
+
+	// jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead
+	jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");
+
+	// Make sure checked status is properly cloned
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent( "onclick", function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent( "onclick" );
+	}
+
+	// Check if a radio maintains its value
+	// after being appended to the DOM
+	input = document.createElement("input");
+	input.value = "t";
+	input.setAttribute("type", "radio");
+	support.radioValue = input.value === "t";
+
+	input.setAttribute("checked", "checked");
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.lastChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	fragment.removeChild( input );
+	fragment.appendChild( div );
+
+	// Technique from Juriy Zaytsev
+	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+	// We only care about the case where non-standard event systems
+	// are used, namely in IE. Short-circuiting here helps us to
+	// avoid an eval call (in setAttribute) which can cause CSP
+	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+	if ( div.attachEvent ) {
+		for ( i in {
+			submit: 1,
+			change: 1,
+			focusin: 1
+		}) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	fragment.removeChild( div );
+
+	// Null elements to avoid leaks in IE
+	fragment = select = opt = div = input = null;
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, outer, inner, table, td, offsetSupport,
+			marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,
+			paddingMarginBorderVisibility, paddingMarginBorder,
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		conMarginTop = 1;
+		paddingMarginBorder = "padding:0;margin:0;border:";
+		positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";
+		paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";
+		style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";
+		html = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +
+			"<table " + style + "' cellpadding='0' cellspacing='0'>" +
+			"<tr><td></td></tr></table>";
+
+		container = document.createElement("div");
+		container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
+		body.insertBefore( container, body.firstChild );
+
+		// Construct the test element
+		div = document.createElement("div");
+		container.appendChild( div );
+
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		// (only IE 8 fails this test)
+		div.innerHTML = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName( "td" );
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Check if empty table cells still have offsetWidth/Height
+		// (IE <= 8 fail this test)
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Check if div with explicit width and no margin-right incorrectly
+		// gets computed margin-right based on width of container. For more
+		// info see bug #3333
+		// Fails in WebKit before Feb 2011 nightlies
+		// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+		if ( window.getComputedStyle ) {
+			div.innerHTML = "";
+			marginDiv = document.createElement( "div" );
+			marginDiv.style.width = "0";
+			marginDiv.style.marginRight = "0";
+			div.style.width = "2px";
+			div.appendChild( marginDiv );
+			support.reliableMarginRight =
+				( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+		}
+
+		if ( typeof div.style.zoom !== "undefined" ) {
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			// (IE < 8 does this)
+			div.innerHTML = "";
+			div.style.width = div.style.padding = "1px";
+			div.style.border = 0;
+			div.style.overflow = "hidden";
+			div.style.display = "inline";
+			div.style.zoom = 1;
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "block";
+			div.style.overflow = "visible";
+			div.innerHTML = "<div style='width:5px;'></div>";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+		}
+
+		div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;
+		div.innerHTML = html;
+
+		outer = div.firstChild;
+		inner = outer.firstChild;
+		td = outer.nextSibling.firstChild.firstChild;
+
+		offsetSupport = {
+			doesNotAddBorder: ( inner.offsetTop !== 5 ),
+			doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
+		};
+
+		inner.style.position = "fixed";
+		inner.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
+		inner.style.position = inner.style.top = "";
+
+		outer.style.overflow = "hidden";
+		outer.style.position = "relative";
+
+		offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
+		offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
+
+		if ( window.getComputedStyle ) {
+			div.style.marginTop = "1%";
+			support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%";
+		}
+
+		if ( typeof container.style.zoom !== "undefined" ) {
+			container.style.zoom = 1;
+		}
+
+		body.removeChild( container );
+		marginDiv = div = container = null;
+
+		jQuery.extend( support, offsetSupport );
+	});
+
+	return support;
+})();
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	// Please use with caution
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var privateCache, thisCache, ret,
+			internalKey = jQuery.expando,
+			getByName = typeof name === "string",
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
+			isEvents = name === "events";
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ internalKey ] = id = ++jQuery.uuid;
+			} else {
+				id = internalKey;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// Avoids exposing jQuery metadata on plain JS objects when the object
+			// is serialized using JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ] = jQuery.extend( cache[ id ], name );
+			} else {
+				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+			}
+		}
+
+		privateCache = thisCache = cache[ id ];
+
+		// jQuery data() is stored in a separate object inside the object's internal data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data.
+		if ( !pvt ) {
+			if ( !thisCache.data ) {
+				thisCache.data = {};
+			}
+
+			thisCache = thisCache.data;
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// Users should not attempt to inspect the internal events object using jQuery.data,
+		// it is undocumented and subject to change. But does anyone listen? No.
+		if ( isEvents && !thisCache[ name ] ) {
+			return privateCache.events;
+		}
+
+		// Check for both converted-to-camel and non-converted data property names
+		// If a data property was specified
+		if ( getByName ) {
+
+			// First Try to find as-is property data
+			ret = thisCache[ name ];
+
+			// Test for null|undefined property data
+			if ( ret == null ) {
+
+				// Try to find the camelCased property
+				ret = thisCache[ jQuery.camelCase( name ) ];
+			}
+		} else {
+			ret = thisCache;
+		}
+
+		return ret;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, i, l,
+
+			// Reference to internal data cache key
+			internalKey = jQuery.expando,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+
+			// See jQuery.data for more information
+			id = isNode ? elem[ internalKey ] : internalKey;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+
+			thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+			if ( thisCache ) {
+
+				// Support array or space separated string names for data keys
+				if ( !jQuery.isArray( name ) ) {
+
+					// try the string as a key before any manipulation
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+
+						// split the camel cased version by spaces unless a key with the spaces exists
+						name = jQuery.camelCase( name );
+						if ( name in thisCache ) {
+							name = [ name ];
+						} else {
+							name = name.split( " " );
+						}
+					}
+				}
+
+				for ( i = 0, l = name.length; i < l; i++ ) {
+					delete thisCache[ name[i] ];
+				}
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( !pvt ) {
+			delete cache[ id ].data;
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject(cache[ id ]) ) {
+				return;
+			}
+		}
+
+		// Browsers that fail expando deletion also refuse to delete expandos on
+		// the window, but it will allow it on all other JS objects; other browsers
+		// don't care
+		// Ensure that `cache` is not a window object #10080
+		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+			delete cache[ id ];
+		} else {
+			cache[ id ] = null;
+		}
+
+		// We destroyed the cache and need to eliminate the expando on the node to avoid
+		// false lookups in the cache for entries that no longer exist
+		if ( isNode ) {
+			// IE does not allow us to delete expando properties from nodes,
+			// nor does it have a removeAttribute function on Document nodes;
+			// we must handle all of these cases
+			if ( jQuery.support.deleteExpando ) {
+				delete elem[ internalKey ];
+			} else if ( elem.removeAttribute ) {
+				elem.removeAttribute( internalKey );
+			} else {
+				elem[ internalKey ] = null;
+			}
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		if ( elem.nodeName ) {
+			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+			if ( match ) {
+				return !(match === true || elem.getAttribute("classid") !== match);
+			}
+		}
+
+		return true;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var parts, part, attr, name, l,
+			elem = this[0],
+			i = 0,
+			data = null;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = jQuery.data( elem );
+
+				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+					attr = elem.attributes;
+					for ( l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( elem, name, data[ name ] );
+						}
+					}
+					jQuery._data( elem, "parsedAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		parts = key.split( ".", 2 );
+		parts[1] = parts[1] ? "." + parts[1] : "";
+		part = parts[1] + "!";
+
+		return jQuery.access( this, function( value ) {
+
+			if ( value === undefined ) {
+				data = this.triggerHandler( "getData" + part, [ parts[0] ] );
+
+				// Try to fetch any internally stored data first
+				if ( data === undefined && elem ) {
+					data = jQuery.data( elem, key );
+					data = dataAttr( elem, key, data );
+				}
+
+				return data === undefined && parts[1] ?
+					this.data( parts[0] ) :
+					data;
+			}
+
+			parts[1] = value;
+			this.each(function() {
+				var self = jQuery( this );
+
+				self.triggerHandler( "setData" + part, parts );
+				jQuery.data( this, key, value );
+				self.triggerHandler( "changeData" + part, parts );
+			});
+		}, null, value, arguments.length > 1, null, false );
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+				data === "false" ? false :
+				data === "null" ? null :
+				jQuery.isNumeric( data ) ? +data :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	for ( var name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+	var deferDataKey = type + "defer",
+		queueDataKey = type + "queue",
+		markDataKey = type + "mark",
+		defer = jQuery._data( elem, deferDataKey );
+	if ( defer &&
+		( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
+		( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
+		// Give room for hard-coded callbacks to fire first
+		// and eventually mark/queue something else on the element
+		setTimeout( function() {
+			if ( !jQuery._data( elem, queueDataKey ) &&
+				!jQuery._data( elem, markDataKey ) ) {
+				jQuery.removeData( elem, deferDataKey, true );
+				defer.fire();
+			}
+		}, 0 );
+	}
+}
+
+jQuery.extend({
+
+	_mark: function( elem, type ) {
+		if ( elem ) {
+			type = ( type || "fx" ) + "mark";
+			jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
+		}
+	},
+
+	_unmark: function( force, elem, type ) {
+		if ( force !== true ) {
+			type = elem;
+			elem = force;
+			force = false;
+		}
+		if ( elem ) {
+			type = type || "fx";
+			var key = type + "mark",
+				count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
+			if ( count ) {
+				jQuery._data( elem, key, count );
+			} else {
+				jQuery.removeData( elem, key, true );
+				handleQueueMarkDefer( elem, type, "mark" );
+			}
+		}
+	},
+
+	queue: function( elem, type, data ) {
+		var q;
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			q = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !q || jQuery.isArray(data) ) {
+					q = jQuery._data( elem, type, jQuery.makeArray(data) );
+				} else {
+					q.push( data );
+				}
+			}
+			return q || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift(),
+			hooks = {};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+		}
+
+		if ( fn ) {
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			jQuery._data( elem, type + ".run", hooks );
+			fn.call( elem, function() {
+				jQuery.dequeue( elem, type );
+			}, hooks );
+		}
+
+		if ( !queue.length ) {
+			jQuery.removeData( elem, type + "queue " + type + ".run", true );
+			handleQueueMarkDefer( elem, type, "queue" );
+		}
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[0], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each(function() {
+				var queue = jQuery.queue( this, type, data );
+
+				if ( type === "fx" && queue[0] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function( next, hooks ) {
+			var timeout = setTimeout( next, time );
+			hooks.stop = function() {
+				clearTimeout( timeout );
+			};
+		});
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, object ) {
+		if ( typeof type !== "string" ) {
+			object = type;
+			type = undefined;
+		}
+		type = type || "fx";
+		var defer = jQuery.Deferred(),
+			elements = this,
+			i = elements.length,
+			count = 1,
+			deferDataKey = type + "defer",
+			queueDataKey = type + "queue",
+			markDataKey = type + "mark",
+			tmp;
+		function resolve() {
+			if ( !( --count ) ) {
+				defer.resolveWith( elements, [ elements ] );
+			}
+		}
+		while( i-- ) {
+			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+					jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
+				count++;
+				tmp.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( object );
+	}
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+	rspace = /\s+/,
+	rreturn = /\r/g,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea)?$/i,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute,
+	nodeHook, boolHook, fixSpecified;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classNames, i, l, elem,
+			setClass, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			classNames = value.split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className && classNames.length === 1 ) {
+						elem.className = value;
+
+					} else {
+						setClass = " " + elem.className + " ";
+
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classNames, i, l, elem, className, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( (value && typeof value === "string") || value === undefined ) {
+			classNames = ( value || "" ).split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 && elem.className ) {
+					if ( value ) {
+						className = (" " + elem.className + " ").replace( rclass, " " );
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							className = className.replace(" " + classNames[ c ] + " ", " ");
+						}
+						elem.className = jQuery.trim( className );
+
+					} else {
+						elem.className = "";
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.split( rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space seperated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ?
+					// handle most common string cases
+					ret.replace(rreturn, "") :
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var self = jQuery(this), val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map(val, function ( value ) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				// attributes.value is undefined in Blackberry 4.7 but
+				// uses .value. See #6932
+				var val = elem.attributes.value;
+				return !val || val.specified ? elem.value : elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, i, max, option,
+					index = elem.selectedIndex,
+					values = [],
+					options = elem.options,
+					one = elem.type === "select-one";
+
+				// Nothing was selected
+				if ( index < 0 ) {
+					return null;
+				}
+
+				// Loop through all the selected options
+				i = one ? index : 0;
+				max = one ? index + 1 : options.length;
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// Don't return options that are disabled or in a disabled optgroup
+					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+				if ( one && !values.length && options.length ) {
+					return jQuery( options[ index ] ).val();
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attrFn: {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true
+	},
+
+	attr: function( elem, name, value, pass ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( pass && name in jQuery.attrFn ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( notxml ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+
+			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, "" + value );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			ret = elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret === null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var propName, attrNames, name, l, isBool,
+			i = 0;
+
+		if ( value && elem.nodeType === 1 ) {
+			attrNames = value.toLowerCase().split( rspace );
+			l = attrNames.length;
+
+			for ( ; i < l; i++ ) {
+				name = attrNames[ i ];
+
+				if ( name ) {
+					propName = jQuery.propFix[ name ] || name;
+					isBool = rboolean.test( name );
+
+					// See #9699 for explanation of this approach (setting first, then removal)
+					// Do not do this for boolean attributes (see #10870)
+					if ( !isBool ) {
+						jQuery.attr( elem, name, "" );
+					}
+					elem.removeAttribute( getSetAttribute ? name : propName );
+
+					// Set corresponding property to false for boolean attributes
+					if ( isBool && propName in elem ) {
+						elem[ propName ] = false;
+					}
+				}
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				// We can't allow the type property to be changed (since it causes problems in IE)
+				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+					jQuery.error( "type property can't be changed" );
+				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to it's default in case type is set after value
+					// This is for element creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		},
+		// Use the value property for back compat
+		// Use the nodeHook for button elements in IE6/7 (#1954)
+		value: {
+			get: function( elem, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.get( elem, name );
+				}
+				return name in elem ?
+					elem.value :
+					null;
+			},
+			set: function( elem, value, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.set( elem, value, name );
+				}
+				// Does not return so that setAttribute is also used
+				elem.value = value;
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+
+	prop: function( elem, name, value ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return ( elem[ name ] = value );
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		// Align boolean attributes with corresponding properties
+		// Fall back to attribute presence where some booleans are not supported
+		var attrNode,
+			property = jQuery.prop( elem, name );
+		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		var propName;
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			// value is true since we know at this point it's type boolean and not false
+			// Set boolean attributes to the same name and set the DOM property
+			propName = jQuery.propFix[ name ] || name;
+			if ( propName in elem ) {
+				// Only set the IDL specifically if it already exists on the element
+				elem[ propName ] = true;
+			}
+
+			elem.setAttribute( name, name.toLowerCase() );
+		}
+		return name;
+	}
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	fixSpecified = {
+		name: true,
+		id: true,
+		coords: true
+	};
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret;
+			ret = elem.getAttributeNode( name );
+			return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
+				ret.nodeValue :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				ret = document.createAttribute( name );
+				elem.setAttributeNode( ret );
+			}
+			return ( ret.nodeValue = value + "" );
+		}
+	};
+
+	// Apply the nodeHook to tabindex
+	jQuery.attrHooks.tabindex.set = nodeHook.set;
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		get: nodeHook.get,
+		set: function( elem, value, name ) {
+			if ( value === "" ) {
+				value = "false";
+			}
+			nodeHook.set( elem, value, name );
+		}
+	};
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret === null ? undefined : ret;
+			}
+		});
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Normalize to lowercase since IE uppercases css property names
+			return elem.style.cssText.toLowerCase() || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = "" + value );
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	});
+});
+
+
+
+
+var rformElems = /^(?:textarea|input|select)$/i,
+	rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
+	rhoverHack = /(?:^|\s)hover(\.\S+)?\b/,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
+	quickParse = function( selector ) {
+		var quick = rquickIs.exec( selector );
+		if ( quick ) {
+			//   0  1    2   3
+			// [ _, tag, id, class ]
+			quick[1] = ( quick[1] || "" ).toLowerCase();
+			quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
+		}
+		return quick;
+	},
+	quickIs = function( elem, m ) {
+		var attrs = elem.attributes || {};
+		return (
+			(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
+			(!m[2] || (attrs.id || {}).value === m[2]) &&
+			(!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
+		);
+	},
+	hoverHack = function( events ) {
+		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+	};
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var elemData, eventHandle, events,
+			t, tns, type, namespaces, handleObj,
+			handleObjIn, quick, handlers, special;
+
+		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
+		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		events = elemData.events;
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+		eventHandle = elemData.handle;
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = function( e ) {
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = jQuery.trim( hoverHack(types) ).split( " " );
+		for ( t = 0; t < types.length; t++ ) {
+
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = tns[1];
+			namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend({
+				type: type,
+				origType: tns[1],
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				quick: selector && quickParse( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			handlers = events[ type ];
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+			t, tns, type, origType, namespaces, origCount,
+			j, events, special, handle, eventType, handleObj;
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+		for ( t = 0; t < types.length; t++ ) {
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tns[1];
+			namespaces = tns[2];
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector? special.delegateType : special.bindType ) || type;
+			eventType = events[ type ] || [];
+			origCount = eventType.length;
+			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+
+			// Remove matching events
+			for ( j = 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					 ( !handler || handler.guid === handleObj.guid ) &&
+					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					eventType.splice( j--, 1 );
+
+					if ( handleObj.selector ) {
+						eventType.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( eventType.length === 0 && origCount !== eventType.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			handle = elemData.handle;
+			if ( handle ) {
+				handle.elem = null;
+			}
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery.removeData( elem, [ "events", "handle" ], true );
+		}
+	},
+
+	// Events that are safe to short-circuit if no handlers are attached.
+	// Native DOM events should not be added, they may have inline handlers.
+	customEvent: {
+		"getData": true,
+		"setData": true,
+		"changeData": true
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		// Don't do events on text and comment nodes
+		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+			return;
+		}
+
+		// Event object or event type
+		var type = event.type || event,
+			namespaces = [],
+			cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "!" ) >= 0 ) {
+			// Exclusive events trigger only for the exact event (no namespaces)
+			type = type.slice(0, -1);
+			exclusive = true;
+		}
+
+		if ( type.indexOf( "." ) >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+
+		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+			// No jQuery handlers for this event type, and it can't have inline handlers
+			return;
+		}
+
+		// Caller can pass in an Event, Object, or just an event type string
+		event = typeof event === "object" ?
+			// jQuery.Event object
+			event[ jQuery.expando ] ? event :
+			// Object literal
+			new jQuery.Event( type, event ) :
+			// Just the event type (string)
+			new jQuery.Event( type );
+
+		event.type = type;
+		event.isTrigger = true;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join( "." );
+		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+		// Handle a global trigger
+		if ( !elem ) {
+
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			cache = jQuery.cache;
+			for ( i in cache ) {
+				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+				}
+			}
+			return;
+		}
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data != null ? jQuery.makeArray( data ) : [];
+		data.unshift( event );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		eventPath = [[ elem, special.bindType || type ]];
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+			old = null;
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push([ cur, bubbleType ]);
+				old = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( old && old === elem.ownerDocument ) {
+				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+			}
+		}
+
+		// Fire handlers on the event path
+		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+			cur = eventPath[i][0];
+			event.type = eventPath[i][1];
+
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+			// Note that this is a bare JS function and not a jQuery handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
+				event.preventDefault();
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				// IE<9 dies on focus/blur to hidden element (#1486)
+				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					old = elem[ ontype ];
+
+					if ( old ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					elem[ type ]();
+					jQuery.event.triggered = undefined;
+
+					if ( old ) {
+						elem[ ontype ] = old;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event || window.event );
+
+		var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+			delegateCount = handlers.delegateCount,
+			args = [].slice.call( arguments, 0 ),
+			run_all = !event.exclusive && !event.namespace,
+			special = jQuery.event.special[ event.type ] || {},
+			handlerQueue = [],
+			i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers that should run if there are delegated events
+		// Avoid non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && !(event.button && event.type === "click") ) {
+
+			// Pregenerate a single jQuery object for reuse with .is()
+			jqcur = jQuery(this);
+			jqcur.context = this.ownerDocument || this;
+
+			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+
+				// Don't process events on disabled elements (#6911, #8165)
+				if ( cur.disabled !== true ) {
+					selMatch = {};
+					matches = [];
+					jqcur[0] = cur;
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+						sel = handleObj.selector;
+
+						if ( selMatch[ sel ] === undefined ) {
+							selMatch[ sel ] = (
+								handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
+							);
+						}
+						if ( selMatch[ sel ] ) {
+							matches.push( handleObj );
+						}
+					}
+					if ( matches.length ) {
+						handlerQueue.push({ elem: cur, matches: matches });
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( handlers.length > delegateCount ) {
+			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+		}
+
+		// Run delegates first; they may want to stop propagation beneath us
+		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+			matched = handlerQueue[ i ];
+			event.currentTarget = matched.elem;
+
+			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+				handleObj = matched.matches[ j ];
+
+				// Triggered event must either 1) be non-exclusive and have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+	fixHooks: {},
+
+	keyHooks: {
+		props: "char charCode key keyCode".split(" "),
+		filter: function( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var eventDoc, doc, body,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop,
+			originalEvent = event,
+			fixHook = jQuery.event.fixHooks[ event.type ] || {},
+			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = jQuery.Event( originalEvent );
+
+		for ( i = copy.length; i; ) {
+			prop = copy[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Target should not be a text node (#504, Safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
+		if ( event.metaKey === undefined ) {
+			event.metaKey = event.ctrlKey;
+		}
+
+		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: jQuery.bindReady
+		},
+
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+
+		focus: {
+			delegateType: "focusin"
+		},
+		blur: {
+			delegateType: "focusout"
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// Piggyback on a donor event to simulate a different one.
+		// Fake originalEvent to avoid donor's stopPropagation, but if the
+		// simulated event prevents default then we do the same on the donor.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{ type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		if ( elem.detachEvent ) {
+			elem.detachEvent( "on" + type, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !(this instanceof jQuery.Event) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj,
+				selector = handleObj.selector,
+				ret;
+
+			// For mousenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !form._submit_attached ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submit_bubble = true;
+					});
+					form._submit_attached = true;
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+		
+		postDispatch: function( event ) {
+			// If form was submitted by the user, bubble the event up the tree
+			if ( event._submit_bubble ) {
+				delete event._submit_bubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event, true );
+				}
+			}
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+							jQuery.event.simulate( "change", this, event, true );
+						}
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					elem._change_attached = true;
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0,
+			handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var origFn, type;
+
+		// Types can be a map of types/handlers
+		if ( typeof types === "object" ) {
+			// ( types-Object, selector, data )
+			if ( typeof selector !== "string" ) { // && selector != null
+				// ( types-Object, data )
+				data = data || selector;
+				selector = undefined;
+			}
+			for ( type in types ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		if ( data == null && fn == null ) {
+			// ( types, fn )
+			fn = selector;
+			data = selector = undefined;
+		} else if ( fn == null ) {
+			if ( typeof selector === "string" ) {
+				// ( types, selector, fn )
+				fn = data;
+				data = undefined;
+			} else {
+				// ( types, data, fn )
+				fn = data;
+				data = selector;
+				selector = undefined;
+			}
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		} else if ( !fn ) {
+			return this;
+		}
+
+		if ( one === 1 ) {
+			origFn = fn;
+			fn = function( event ) {
+				// Can use an empty set, since event contains the info
+				jQuery().off( event );
+				return origFn.apply( this, arguments );
+			};
+			// Use same guid so caller can remove using origFn
+			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+		}
+		return this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on( types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			var handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( var type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each(function() {
+			jQuery.event.remove( this, types, fn, selector );
+		});
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	live: function( types, data, fn ) {
+		jQuery( this.context ).on( types, this.selector, data, fn );
+		return this;
+	},
+	die: function( types, fn ) {
+		jQuery( this.context ).off( types, this.selector || "**", fn );
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			return jQuery.event.trigger( type, data, this[0], true );
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			guid = fn.guid || jQuery.guid++,
+			i = 0,
+			toggler = function( event ) {
+				// Figure out which function to execute
+				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+				// Make sure that clicks stop
+				event.preventDefault();
+
+				// and execute the function
+				return args[ lastToggle ].apply( this, arguments ) || false;
+			};
+
+		// link all the functions, so any of them can unbind this click handler
+		toggler.guid = guid;
+		while ( i < args.length ) {
+			args[ i++ ].guid = guid;
+		}
+
+		return this.click( toggler );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( jQuery.attrFn ) {
+		jQuery.attrFn[ name ] = true;
+	}
+
+	if ( rkeyEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+	}
+
+	if ( rmouseEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+	}
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+	expando = "sizcache" + (Math.random() + '').replace('.', ''),
+	done = 0,
+	toString = Object.prototype.toString,
+	hasDuplicate = false,
+	baseHasDuplicate = true,
+	rBackslash = /\\/g,
+	rReturn = /\r\n/g,
+	rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+	baseHasDuplicate = false;
+	return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+
+	var origContext = context;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+		return [];
+	}
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var m, set, checkSet, extra, ret, cur, pop, i,
+		prune = true,
+		contextXML = Sizzle.isXML( context ),
+		parts = [],
+		soFar = selector;
+
+	// Reset the position of the chunker regexp (start from head)
+	do {
+		chunker.exec( "" );
+		m = chunker.exec( soFar );
+
+		if ( m ) {
+			soFar = m[3];
+
+			parts.push( m[1] );
+
+			if ( m[2] ) {
+				extra = m[3];
+				break;
+			}
+		}
+	} while ( m );
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context, seed );
+
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] ) {
+					selector += parts.shift();
+				}
+
+				set = posProcess( selector, set, seed );
+			}
+		}
+
+	} else {
+		// Take a shortcut and set the context if the root selector is an ID
+		// (but not if it'll be faster if the inner selector is an ID)
+		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+			ret = Sizzle.find( parts.shift(), context, contextXML );
+			context = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set )[0] :
+				ret.set[0];
+		}
+
+		if ( context ) {
+			ret = seed ?
+				{ expr: parts.pop(), set: makeArray(seed) } :
+				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+			set = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set ) :
+				ret.set;
+
+			if ( parts.length > 0 ) {
+				checkSet = makeArray( set );
+
+			} else {
+				prune = false;
+			}
+
+			while ( parts.length ) {
+				cur = parts.pop();
+				pop = cur;
+
+				if ( !Expr.relative[ cur ] ) {
+					cur = "";
+				} else {
+					pop = parts.pop();
+				}
+
+				if ( pop == null ) {
+					pop = context;
+				}
+
+				Expr.relative[ cur ]( checkSet, pop, contextXML );
+			}
+
+		} else {
+			checkSet = parts = [];
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		Sizzle.error( cur || selector );
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+
+		} else if ( context && context.nodeType === 1 ) {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+
+		} else {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, origContext, results, seed );
+		Sizzle.uniqueSort( results );
+	}
+
+	return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+	if ( sortOrder ) {
+		hasDuplicate = baseHasDuplicate;
+		results.sort( sortOrder );
+
+		if ( hasDuplicate ) {
+			for ( var i = 1; i < results.length; i++ ) {
+				if ( results[i] === results[ i - 1 ] ) {
+					results.splice( i--, 1 );
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+	return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+	return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+	var set, i, len, match, type, left;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( i = 0, len = Expr.order.length; i < len; i++ ) {
+		type = Expr.order[i];
+
+		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+			left = match[1];
+			match.splice( 1, 1 );
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace( rBackslash, "" );
+				set = Expr.find[ type ]( match, context, isXML );
+
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( "*" ) :
+			[];
+	}
+
+	return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+	var match, anyFound,
+		type, found, item, filter, left,
+		i, pass,
+		old = expr,
+		result = [],
+		curLoop = set,
+		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+	while ( expr && set.length ) {
+		for ( type in Expr.filter ) {
+			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+				filter = Expr.filter[ type ];
+				left = match[1];
+
+				anyFound = false;
+
+				match.splice(1,1);
+
+				if ( left.substr( left.length - 1 ) === "\\" ) {
+					continue;
+				}
+
+				if ( curLoop === result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							pass = not ^ found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+
+								} else {
+									curLoop[i] = false;
+								}
+
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr === old ) {
+			if ( anyFound == null ) {
+				Sizzle.error( expr );
+
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Utility function for retreiving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+var getText = Sizzle.getText = function( elem ) {
+    var i, node,
+		nodeType = elem.nodeType,
+		ret = "";
+
+	if ( nodeType ) {
+		if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+			// Use textContent || innerText for elements
+			if ( typeof elem.textContent === 'string' ) {
+				return elem.textContent;
+			} else if ( typeof elem.innerText === 'string' ) {
+				// Replace IE's carriage returns
+				return elem.innerText.replace( rReturn, '' );
+			} else {
+				// Traverse it's children
+				for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
+					ret += getText( elem );
+				}
+			}
+		} else if ( nodeType === 3 || nodeType === 4 ) {
+			return elem.nodeValue;
+		}
+	} else {
+
+		// If no nodeType, this is expected to be an array
+		for ( i = 0; (node = elem[i]); i++ ) {
+			// Do not traverse comment nodes
+			if ( node.nodeType !== 8 ) {
+				ret += getText( node );
+			}
+		}
+	}
+	return ret;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+	},
+
+	leftMatch: {},
+
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+
+	attrHandle: {
+		href: function( elem ) {
+			return elem.getAttribute( "href" );
+		},
+		type: function( elem ) {
+			return elem.getAttribute( "type" );
+		}
+	},
+
+	relative: {
+		"+": function(checkSet, part){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !rNonWord.test( part ),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag ) {
+				part = part.toLowerCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+
+		">": function( checkSet, part ) {
+			var elem,
+				isPartStr = typeof part === "string",
+				i = 0,
+				l = checkSet.length;
+
+			if ( isPartStr && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+					}
+				}
+
+			} else {
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+
+		"": function(checkSet, part, isXML){
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+		},
+
+		"~": function( checkSet, part, isXML ) {
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+		}
+	},
+
+	find: {
+		ID: function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		},
+
+		NAME: function( match, context ) {
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [],
+					results = context.getElementsByName( match[1] );
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+
+		TAG: function( match, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( match[1] );
+			}
+		}
+	},
+	preFilter: {
+		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+			match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+						if ( !inplace ) {
+							result.push( elem );
+						}
+
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+
+		ID: function( match ) {
+			return match[1].replace( rBackslash, "" );
+		},
+
+		TAG: function( match, curLoop ) {
+			return match[1].replace( rBackslash, "" ).toLowerCase();
+		},
+
+		CHILD: function( match ) {
+			if ( match[1] === "nth" ) {
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				match[2] = match[2].replace(/^\+|\s*/g, '');
+
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+			else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+
+		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+			var name = match[1] = match[1].replace( rBackslash, "" );
+
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			// Handle if an un-quoted value was used
+			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+
+		PSEUDO: function( match, curLoop, inplace, result, not ) {
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+
+					return false;
+				}
+
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+
+			return match;
+		},
+
+		POS: function( match ) {
+			match.unshift( true );
+
+			return match;
+		}
+	},
+
+	filters: {
+		enabled: function( elem ) {
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+
+		disabled: function( elem ) {
+			return elem.disabled === true;
+		},
+
+		checked: function( elem ) {
+			return elem.checked === true;
+		},
+
+		selected: function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		parent: function( elem ) {
+			return !!elem.firstChild;
+		},
+
+		empty: function( elem ) {
+			return !elem.firstChild;
+		},
+
+		has: function( elem, i, match ) {
+			return !!Sizzle( match[3], elem ).length;
+		},
+
+		header: function( elem ) {
+			return (/h\d/i).test( elem.nodeName );
+		},
+
+		text: function( elem ) {
+			var attr = elem.getAttribute( "type" ), type = elem.type;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
+		},
+
+		radio: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+		},
+
+		checkbox: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+		},
+
+		file: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+		},
+
+		password: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+		},
+
+		submit: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "submit" === elem.type;
+		},
+
+		image: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+		},
+
+		reset: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "reset" === elem.type;
+		},
+
+		button: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && "button" === elem.type || name === "button";
+		},
+
+		input: function( elem ) {
+			return (/input|select|textarea|button/i).test( elem.nodeName );
+		},
+
+		focus: function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		}
+	},
+	setFilters: {
+		first: function( elem, i ) {
+			return i === 0;
+		},
+
+		last: function( elem, i, match, array ) {
+			return i === array.length - 1;
+		},
+
+		even: function( elem, i ) {
+			return i % 2 === 0;
+		},
+
+		odd: function( elem, i ) {
+			return i % 2 === 1;
+		},
+
+		lt: function( elem, i, match ) {
+			return i < match[3] - 0;
+		},
+
+		gt: function( elem, i, match ) {
+			return i > match[3] - 0;
+		},
+
+		nth: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		},
+
+		eq: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		}
+	},
+	filter: {
+		PSEUDO: function( elem, match, i, array ) {
+			var name = match[1],
+				filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var j = 0, l = not.length; j < l; j++ ) {
+					if ( not[j] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+
+			} else {
+				Sizzle.error( name );
+			}
+		},
+
+		CHILD: function( elem, match ) {
+			var first, last,
+				doneName, parent, cache,
+				count, diff,
+				type = match[1],
+				node = elem;
+
+			switch ( type ) {
+				case "only":
+				case "first":
+					while ( (node = node.previousSibling) ) {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					if ( type === "first" ) {
+						return true;
+					}
+
+					node = elem;
+
+					/* falls through */
+				case "last":
+					while ( (node = node.nextSibling) ) {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					return true;
+
+				case "nth":
+					first = match[2];
+					last = match[3];
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+
+					doneName = match[0];
+					parent = elem.parentNode;
+
+					if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
+						count = 0;
+
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						}
+
+						parent[ expando ] = doneName;
+					}
+
+					diff = elem.nodeIndex - last;
+
+					if ( first === 0 ) {
+						return diff === 0;
+
+					} else {
+						return ( diff % first === 0 && diff / first >= 0 );
+					}
+			}
+		},
+
+		ID: function( elem, match ) {
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+
+		TAG: function( elem, match ) {
+			return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
+		},
+
+		CLASS: function( elem, match ) {
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+
+		ATTR: function( elem, match ) {
+			var name = match[1],
+				result = Sizzle.attr ?
+					Sizzle.attr( elem, name ) :
+					Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				!type && Sizzle.attr ?
+				result != null :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value !== check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+
+		POS: function( elem, match, i, array ) {
+			var name = match[2],
+				filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS,
+	fescape = function(all, num){
+		return "\\" + (num - 0 + 1);
+	};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+// Expose origPOS
+// "global" as in regardless of relation to brackets/parens
+Expr.match.globalPOS = origPOS;
+
+var makeArray = function( array, results ) {
+	array = Array.prototype.slice.call( array, 0 );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+	makeArray = function( array, results ) {
+		var i = 0,
+			ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+
+			} else {
+				for ( ; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+			return a.compareDocumentPosition ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+	};
+
+} else {
+	sortOrder = function( a, b ) {
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Fallback to using sourceIndex (in IE) if it's available on both nodes
+		} else if ( a.sourceIndex && b.sourceIndex ) {
+			return a.sourceIndex - b.sourceIndex;
+		}
+
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+	siblingCheck = function( a, b, ret ) {
+		if ( a === b ) {
+			return ret;
+		}
+
+		var cur = a.nextSibling;
+
+		while ( cur ) {
+			if ( cur === b ) {
+				return -1;
+			}
+
+			cur = cur.nextSibling;
+		}
+
+		return 1;
+	};
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("div"),
+		id = "script" + (new Date()).getTime(),
+		root = document.documentElement;
+
+	form.innerHTML = "<a name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( document.getElementById( id ) ) {
+		Expr.find.ID = function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+
+				return m ?
+					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+
+		Expr.filter.ID = function( elem, match ) {
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+
+	// release memory in IE
+	root = form = null;
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function( match, context ) {
+			var results = context.getElementsByTagName( match[1] );
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+
+		Expr.attrHandle.href = function( elem ) {
+			return elem.getAttribute( "href", 2 );
+		};
+	}
+
+	// release memory in IE
+	div = null;
+})();
+
+if ( document.querySelectorAll ) {
+	(function(){
+		var oldSizzle = Sizzle,
+			div = document.createElement("div"),
+			id = "__sizzle__";
+
+		div.innerHTML = "<p class='TEST'></p>";
+
+		// Safari can't handle uppercase or unicode characters when
+		// in quirks mode.
+		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+			return;
+		}
+
+		Sizzle = function( query, context, extra, seed ) {
+			context = context || document;
+
+			// Only use querySelectorAll on non-XML documents
+			// (ID selectors don't work in non-HTML documents)
+			if ( !seed && !Sizzle.isXML(context) ) {
+				// See if we find a selector to speed up
+				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+
+				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+					// Speed-up: Sizzle("TAG")
+					if ( match[1] ) {
+						return makeArray( context.getElementsByTagName( query ), extra );
+
+					// Speed-up: Sizzle(".CLASS")
+					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+						return makeArray( context.getElementsByClassName( match[2] ), extra );
+					}
+				}
+
+				if ( context.nodeType === 9 ) {
+					// Speed-up: Sizzle("body")
+					// The body element only exists once, optimize finding it
+					if ( query === "body" && context.body ) {
+						return makeArray( [ context.body ], extra );
+
+					// Speed-up: Sizzle("#ID")
+					} else if ( match && match[3] ) {
+						var elem = context.getElementById( match[3] );
+
+						// Check parentNode to catch when Blackberry 4.6 returns
+						// nodes that are no longer in the document #6963
+						if ( elem && elem.parentNode ) {
+							// Handle the case where IE and Opera return items
+							// by name instead of ID
+							if ( elem.id === match[3] ) {
+								return makeArray( [ elem ], extra );
+							}
+
+						} else {
+							return makeArray( [], extra );
+						}
+					}
+
+					try {
+						return makeArray( context.querySelectorAll(query), extra );
+					} catch(qsaError) {}
+
+				// qSA works strangely on Element-rooted queries
+				// We can work around this by specifying an extra ID on the root
+				// and working up from there (Thanks to Andrew Dupont for the technique)
+				// IE 8 doesn't work on object elements
+				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					var oldContext = context,
+						old = context.getAttribute( "id" ),
+						nid = old || id,
+						hasParent = context.parentNode,
+						relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+					if ( !old ) {
+						context.setAttribute( "id", nid );
+					} else {
+						nid = nid.replace( /'/g, "\\$&" );
+					}
+					if ( relativeHierarchySelector && hasParent ) {
+						context = context.parentNode;
+					}
+
+					try {
+						if ( !relativeHierarchySelector || hasParent ) {
+							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+						}
+
+					} catch(pseudoError) {
+					} finally {
+						if ( !old ) {
+							oldContext.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+
+			return oldSizzle(query, context, extra, seed);
+		};
+
+		for ( var prop in oldSizzle ) {
+			Sizzle[ prop ] = oldSizzle[ prop ];
+		}
+
+		// release memory in IE
+		div = null;
+	})();
+}
+
+(function(){
+	var html = document.documentElement,
+		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+	if ( matches ) {
+		// Check to see if it's possible to do matchesSelector
+		// on a disconnected node (IE 9 fails this)
+		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+			pseudoWorks = false;
+
+		try {
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( document.documentElement, "[test!='']:sizzle" );
+
+		} catch( pseudoError ) {
+			pseudoWorks = true;
+		}
+
+		Sizzle.matchesSelector = function( node, expr ) {
+			// Make sure that attribute selectors are quoted
+			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+			if ( !Sizzle.isXML( node ) ) {
+				try {
+					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+						var ret = matches.call( node, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || !disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9, so check for that
+								node.document && node.document.nodeType !== 11 ) {
+							return ret;
+						}
+					}
+				} catch(e) {}
+			}
+
+			return Sizzle(expr, null, null, [node]).length > 0;
+		};
+	}
+})();
+
+(function(){
+	var div = document.createElement("div");
+
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	// Also, make sure that getElementsByClassName actually exists
+	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+		return;
+	}
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 ) {
+		return;
+	}
+
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function( match, context, isXML ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+
+	// release memory in IE
+	div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem[ expando ] = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName.toLowerCase() === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem[ expando ] = doneName;
+						elem.sizset = i;
+					}
+
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+if ( document.documentElement.contains ) {
+	Sizzle.contains = function( a, b ) {
+		return a !== b && (a.contains ? a.contains(b) : true);
+	};
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+	Sizzle.contains = function( a, b ) {
+		return !!(a.compareDocumentPosition(b) & 16);
+	};
+
+} else {
+	Sizzle.contains = function() {
+		return false;
+	};
+}
+
+Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833)
+	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context, seed ) {
+	var match,
+		tmpSet = [],
+		later = "",
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet, seed );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+Sizzle.selectors.attrMap = {};
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+	// Note: This RegExp should be improved, or likely pulled from Sizzle
+	rmultiselector = /,/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	slice = Array.prototype.slice,
+	POS = jQuery.expr.match.globalPOS,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var self = this,
+			i, l;
+
+		if ( typeof selector !== "string" ) {
+			return jQuery( selector ).filter(function() {
+				for ( i = 0, l = self.length; i < l; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			});
+		}
+
+		var ret = this.pushStack( "", "find", selector ),
+			length, n, r;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( n = length; n < ret.length; n++ ) {
+					for ( r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target );
+		return this.filter(function() {
+			for ( var i = 0, l = targets.length; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && (
+			typeof selector === "string" ?
+				// If this is a positional selector, check membership in the returned set
+				// so $("p:first").is("p:last") won't return true for a doc with two "p".
+				POS.test( selector ) ?
+					jQuery( selector, this.context ).index( this[0] ) >= 0 :
+					jQuery.filter( selector, this ).length > 0 :
+				this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var ret = [], i, l, cur = this[0];
+
+		// Array (deprecated as of jQuery 1.7)
+		if ( jQuery.isArray( selectors ) ) {
+			var level = 1;
+
+			while ( cur && cur.ownerDocument && cur !== context ) {
+				for ( i = 0; i < selectors.length; i++ ) {
+
+					if ( jQuery( cur ).is( selectors[ i ] ) ) {
+						ret.push({ selector: selectors[ i ], elem: cur, level: level });
+					}
+				}
+
+				cur = cur.parentNode;
+				level++;
+			}
+
+			return ret;
+		}
+
+		// String
+		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+
+				} else {
+					cur = cur.parentNode;
+					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+						break;
+					}
+				}
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	}
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return jQuery.nth( elem, 2, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return jQuery.nth( elem, 2, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.makeArray( elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, slice.call( arguments ).join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	nth: function( cur, result, dir, elem ) {
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] ) {
+			if ( cur.nodeType === 1 && ++num === result ) {
+				break;
+			}
+		}
+
+		return cur;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return ( elem === qualifier ) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+	});
+}
+
+
+
+
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+	safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style)/i,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	},
+	safeFragment = createSafeFragment( document );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( value ) {
+		return jQuery.access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+		}, null, value, arguments.length );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each(function(i) {
+			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery.clean(arguments) );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		return jQuery.access( this, function( value ) {
+			var elem = this[0] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined ) {
+				return elem.nodeType === 1 ?
+					elem.innerHTML.replace( rinlinejQuery, "" ) :
+					null;
+			}
+
+
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+				value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+				try {
+					for (; i < l; i++ ) {
+						// Remove element nodes and prevent memory leaks
+						elem = this[i] || {};
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( elem.getElementsByTagName( "*" ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch(e) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.length ?
+				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+				this;
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || ( l > 1 && i < lastIndex ) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, function( i, elem ) {
+					if ( elem.src ) {
+						jQuery.ajax({
+							type: "GET",
+							global: false,
+							url: elem.src,
+							async: false,
+							dataType: "script"
+						});
+					} else {
+						jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+					}
+
+					if ( elem.parentNode ) {
+						elem.parentNode.removeChild( elem );
+					}
+				});
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type, events[ type ][ i ] );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+
+	// IE blanks contents when cloning scripts
+	} else if ( nodeName === "script" && dest.text !== src.text ) {
+		dest.text = src.text;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+
+	// Clear flags for bubbling special change/submit events, they must
+	// be reattached when the newly cloned events are first activated
+	dest.removeAttribute( "_submit_attached" );
+	dest.removeAttribute( "_change_attached" );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults, doc,
+	first = args[ 0 ];
+
+	// nodes may contain either an explicit document object,
+	// a jQuery collection or context object.
+	// If nodes[0] contains a valid object to assign to doc
+	if ( nodes && nodes[0] ) {
+		doc = nodes[0].ownerDocument || nodes[0];
+	}
+
+	// Ensure that an attr object doesn't incorrectly stand in as a document object
+	// Chrome and Firefox seem to allow this to occur and will throw exception
+	// Fixes #8950
+	if ( !doc.createDocumentFragment ) {
+		doc = document;
+	}
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+	if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
+		first.charAt(0) === "<" && !rnocache.test( first ) &&
+		(jQuery.support.checkClone || !rchecked.test( first )) &&
+		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+		cacheable = true;
+
+		cacheresults = jQuery.fragments[ first ];
+		if ( cacheresults && cacheresults !== 1 ) {
+			fragment = cacheresults;
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = ( i > 0 ? this.clone(true) : this ).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( typeof elem.getElementsByTagName !== "undefined" ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( elem.type === "checkbox" || elem.type === "radio" ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+	var nodeName = ( elem.nodeName || "" ).toLowerCase();
+	if ( nodeName === "input" ) {
+		fixDefaultChecked( elem );
+	// Skip scripts, get other children
+	} else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
+		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+	}
+}
+
+// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
+function shimCloneNode( elem ) {
+	var div = document.createElement( "div" );
+	safeFragment.appendChild( div );
+
+	div.innerHTML = elem.outerHTML;
+	return div.firstChild;
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var srcElements,
+			destElements,
+			i,
+			// IE<=8 does not properly clone detached, unknown element nodes
+			clone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ?
+				elem.cloneNode( true ) :
+				shimCloneNode( elem );
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					cloneFixAttributes( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var checkScriptType, script, j,
+				ret = [];
+
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Trim whitespace, otherwise indexOf won't work as expected
+					var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
+						wrap = wrapMap[ tag ] || wrapMap._default,
+						depth = wrap[0],
+						div = context.createElement("div"),
+						safeChildNodes = safeFragment.childNodes,
+						remove;
+
+					// Append wrapper element to unknown element safe doc fragment
+					if ( context === document ) {
+						// Use the fragment we've already created for this document
+						safeFragment.appendChild( div );
+					} else {
+						// Use a fragment created with the owner document
+						createSafeFragment( context ).appendChild( div );
+					}
+
+					// Go to html and back, then peel off extra wrappers
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						var hasBody = rtbody.test(elem),
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+
+					// Clear elements from DocumentFragment (safeFragment or otherwise)
+					// to avoid hoarding elements. Fixes #11356
+					if ( div ) {
+						div.parentNode.removeChild( div );
+
+						// Guard against -1 index exceptions in FF3.6
+						if ( safeChildNodes.length > 0 ) {
+							remove = safeChildNodes[ safeChildNodes.length - 1 ];
+
+							if ( remove && remove.parentNode ) {
+								remove.parentNode.removeChild( remove );
+							}
+						}
+					}
+				}
+			}
+
+			// Resets defaultChecked for any radios and checkboxes
+			// about to be appended to the DOM in IE 6/7 (#8060)
+			var len;
+			if ( !jQuery.support.appendChecked ) {
+				if ( elem[0] && typeof (len = elem.length) === "number" ) {
+					for ( j = 0; j < len; j++ ) {
+						findInputs( elem[j] );
+					}
+				} else {
+					findInputs( elem );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			checkScriptType = function( elem ) {
+				return !elem.type || rscriptType.test( elem.type );
+			};
+			for ( i = 0; ret[i]; i++ ) {
+				script = ret[i];
+				if ( scripts && jQuery.nodeName( script, "script" ) && (!script.type || rscriptType.test( script.type )) ) {
+					scripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );
+
+				} else {
+					if ( script.nodeType === 1 ) {
+						var jsTags = jQuery.grep( script.getElementsByTagName( "script" ), checkScriptType );
+
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+					}
+					fragment.appendChild( script );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id,
+			cache = jQuery.cache,
+			special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						if ( special[ type ] ) {
+							jQuery.event.remove( elem, type );
+
+						// This is a shortcut to avoid jQuery.event.remove's overhead
+						} else {
+							jQuery.removeEvent( elem, type, data.handle );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	// fixed for IE9, see #8346
+	rupper = /([A-Z]|^ms)/g,
+	rnum = /^[\-+]?(?:\d*\.)?\d+$/i,
+	rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,
+	rrelNum = /^([\-+])=([\-+.\de]+)/,
+	rmargin = /^margin/,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+
+	// order is important!
+	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+
+	curCSS,
+
+	getComputedStyle,
+	currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+	return jQuery.access( this, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	}, name, value, arguments.length > 1 );
+};
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra ) {
+		var ret, hooks;
+
+		// Make sure that we're working with the right name
+		name = jQuery.camelCase( name );
+		hooks = jQuery.cssHooks[ name ];
+		name = jQuery.cssProps[ name ] || name;
+
+		// cssFloat needs a special treatment
+		if ( name === "cssFloat" ) {
+			name = "float";
+		}
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {},
+			ret, name;
+
+		// Remember the old values, and insert the new ones
+		for ( name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		ret = callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+
+		return ret;
+	}
+});
+
+// DEPRECATED in 1.3, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, name ) {
+		var ret, defaultView, computedStyle, width,
+			style = elem.style;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( (defaultView = elem.ownerDocument.defaultView) &&
+				(computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		// A tribute to the "awesome hack by Dean Edwards"
+		// WebKit uses "computed value (percentage if specified)" instead of "used value" for margins
+		// which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+		if ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {
+			width = style.width;
+			style.width = ret;
+			ret = computedStyle.width;
+			style.width = width;
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left, rsLeft, uncomputed,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret == null && style && (uncomputed = style[ name ]) ) {
+			ret = uncomputed;
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( rnumnonpx.test( ret ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ret;
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with offset property
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		i = name === "width" ? 1 : 0,
+		len = 4;
+
+	if ( val > 0 ) {
+		if ( extra !== "border" ) {
+			for ( ; i < len; i += 2 ) {
+				if ( !extra ) {
+					val -= parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
+				}
+				if ( extra === "margin" ) {
+					val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;
+				} else {
+					val -= parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+				}
+			}
+		}
+
+		return val + "px";
+	}
+
+	// Fall back to computed then uncomputed css if necessary
+	val = curCSS( elem, name );
+	if ( val < 0 || val == null ) {
+		val = elem.style[ name ];
+	}
+
+	// Computed unit is not pixels. Stop here and return.
+	if ( rnumnonpx.test(val) ) {
+		return val;
+	}
+
+	// Normalize "", auto, and prepare for extra
+	val = parseFloat( val ) || 0;
+
+	// Add padding, border, margin
+	if ( extra ) {
+		for ( ; i < len; i += 2 ) {
+			val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
+			if ( extra !== "padding" ) {
+				val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+			}
+			if ( extra === "margin" ) {
+				val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;
+			}
+		}
+	}
+
+	return val + "px";
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					return getWidthOrHeight( elem, name, extra );
+				} else {
+					return jQuery.swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, name, extra );
+					});
+				}
+			}
+		},
+
+		set: function( elem, value ) {
+			return rnum.test( value ) ?
+				value + "px" :
+				value;
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( parseFloat( RegExp.$1 ) / 100 ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there there is no filter style applied in a css rule, we are done
+				if ( currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery(function() {
+	// This hook cannot be added until DOM ready because the support test
+	// for it is not run until after DOM ready
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				return jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						return curCSS( elem, "margin-right" );
+					} else {
+						return elem.style.marginRight;
+					}
+				});
+			}
+		};
+	}
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i,
+
+				// assumes a single number if not a string
+				parts = typeof value === "string" ? value.split(" ") : [ value ],
+				expanded = {};
+
+			for ( i = 0; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+});
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts,
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for ( ; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = undefined;
+
+			// Otherwise, build a param string
+			} else if ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.on( o, f );
+	};
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		if ( settings ) {
+			// Building a settings object
+			ajaxExtend( target, jQuery.ajaxSettings );
+		} else {
+			// Extending ajaxSettings
+			settings = target;
+			target = jQuery.ajaxSettings;
+		}
+		ajaxExtend( target, settings );
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": allTypes
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			context: true,
+			url: true
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, nativeStatusText, responses, headers ) {
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			var isSuccess,
+				success,
+				error,
+				statusText = nativeStatusText,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = "" + ( nativeStatusText || statusText );
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.add;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for ( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					throw e;
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = jQuery.ajaxSettings.traditional;
+		}
+
+		// If an array was passed in, assume that it is an array of form elements.
+		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+			// Serialize the form elements
+			jQuery.each( a, function() {
+				add( this.name, this.value );
+			});
+
+		} else {
+			// If traditional, encode the "old" way (the way 1.3.2 or older
+			// did it), otherwise encode params recursively.
+			for ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+		// Serialize object item.
+		for ( var name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for ( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for ( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for ( key in s.converters ) {
+				if ( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if ( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for ( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var inspectData = ( typeof s.data === "string" ) && /^application\/x\-www\-form\-urlencoded/.test( s.contentType );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				inspectData && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2";
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( inspectData ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Clean-up function
+		jqXHR.always(function() {
+			// Set callback back to previous value
+			window[ jsonpCallback ] = previous;
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( previous ) ) {
+				window[ jsonpCallback ]( responseContainer[ 0 ] );
+			}
+		});
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0,
+	xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+
+									// When requesting binary data, IE6-9 will throw an exception
+									// on any attempt to access responseText (#11426)
+									try {
+										responses.text = xhr.responseText;
+									} catch( _ ) {
+									}
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	iframe, iframeDoc,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	],
+	fxNow;
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback );
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					// Reset the inline display of this element to learn if it is
+					// being hidden by cascaded rules or not
+					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+						display = elem.style.display = "";
+					}
+
+					// Set elements which have been overridden with display: none
+					// in a stylesheet to whatever the default browser style is
+					// for such an element
+					if ( (display === "" && jQuery.css(elem, "display") === "none") ||
+						!jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+						jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+					}
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					if ( display === "" || display === "none" ) {
+						elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
+					}
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			var elem, display,
+				i = 0,
+				j = this.length;
+
+			for ( ; i < j; i++ ) {
+				elem = this[i];
+				if ( elem.style ) {
+					display = jQuery.css( elem, "display" );
+
+					if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
+						jQuery._data( elem, "olddisplay", display );
+					}
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				if ( this[i].style ) {
+					this[i].style.display = "none";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed( speed, easing, callback );
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete, [ false ] );
+		}
+
+		// Do not change referenced properties as per-property easing will be lost
+		prop = jQuery.extend( {}, prop );
+
+		function doAnimation() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			if ( optall.queue === false ) {
+				jQuery._mark( this );
+			}
+
+			var opt = jQuery.extend( {}, optall ),
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				name, val, p, e, hooks, replace,
+				parts, start, end, unit,
+				method;
+
+			// will store per property easing and be used to determine when an animation is complete
+			opt.animatedProperties = {};
+
+			// first pass over propertys to expand / normalize
+			for ( p in prop ) {
+				name = jQuery.camelCase( p );
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+				}
+
+				if ( ( hooks = jQuery.cssHooks[ name ] ) && "expand" in hooks ) {
+					replace = hooks.expand( prop[ name ] );
+					delete prop[ name ];
+
+					// not quite $.extend, this wont overwrite keys already present.
+					// also - reusing 'p' from above because we have the correct "name"
+					for ( p in replace ) {
+						if ( ! ( p in prop ) ) {
+							prop[ p ] = replace[ p ];
+						}
+					}
+				}
+			}
+
+			for ( name in prop ) {
+				val = prop[ name ];
+				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+				if ( jQuery.isArray( val ) ) {
+					opt.animatedProperties[ name ] = val[ 1 ];
+					val = prop[ name ] = val[ 0 ];
+				} else {
+					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+				}
+
+				if ( val === "hide" && hidden || val === "show" && !hidden ) {
+					return opt.complete.call( this );
+				}
+
+				if ( isElement && ( name === "height" || name === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+
+						// inline-level elements accept inline-block;
+						// block-level elements need to be inline with layout
+						if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
+							this.style.display = "inline-block";
+
+						} else {
+							this.style.zoom = 1;
+						}
+					}
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			for ( p in prop ) {
+				e = new jQuery.fx( this, opt, p );
+				val = prop[ p ];
+
+				if ( rfxtypes.test( val ) ) {
+
+					// Tracks whether to show or hide based on private
+					// data attached to the element
+					method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
+					if ( method ) {
+						jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
+						e[ method ]();
+					} else {
+						e[ val ]();
+					}
+
+				} else {
+					parts = rfxnum.exec( val );
+					start = e.cur();
+
+					if ( parts ) {
+						end = parseFloat( parts[2] );
+						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( this, p, (end || 1) + unit);
+							start = ( (end || 1) / e.cur() ) * start;
+							jQuery.style( this, p, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			}
+
+			// For JS strict compliance
+			return true;
+		}
+
+		return optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+
+	stop: function( type, clearQueue, gotoEnd ) {
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var index,
+				hadTimers = false,
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			// clear marker counters if we know they won't be
+			if ( !gotoEnd ) {
+				jQuery._unmark( true, this );
+			}
+
+			function stopQueue( elem, data, index ) {
+				var hooks = data[ index ];
+				jQuery.removeData( elem, index, true );
+				hooks.stop( gotoEnd );
+			}
+
+			if ( type == null ) {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
+						stopQueue( this, data, index );
+					}
+				}
+			} else if ( data[ index = type + ".run" ] && data[ index ].stop ){
+				stopQueue( this, data, index );
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					if ( gotoEnd ) {
+
+						// force the next step to be the last
+						timers[ index ]( true );
+					} else {
+						timers[ index ].saveState();
+					}
+					hadTimers = true;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// start the next in the queue if the last step wasn't forced
+			// timers currently will call their complete callbacks, which will dequeue
+			// but only if they were gotoEnd
+			if ( !( gotoEnd && hadTimers ) ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	}
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout( clearFxNow, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+	fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx( "show", 1 ),
+	slideUp: genFx( "hide", 1 ),
+	slideToggle: genFx( "toggle", 1 ),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.extend({
+	speed: function( speed, easing, fn ) {
+		var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+		};
+
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+		// normalize opt.queue - true/undefined/null -> "fx"
+		if ( opt.queue == null || opt.queue === true ) {
+			opt.queue = "fx";
+		}
+
+		// Queueing
+		opt.old = opt.complete;
+
+		opt.complete = function( noUnmark ) {
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+
+			if ( opt.queue ) {
+				jQuery.dequeue( this, opt.queue );
+			} else if ( noUnmark !== false ) {
+				jQuery._unmark( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p ) {
+			return p;
+		},
+		swing: function( p ) {
+			return ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		options.orig = options.orig || {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx;
+
+		this.startTime = fxNow || createFxNow();
+		this.end = to;
+		this.now = this.start = from;
+		this.pos = this.state = 0;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+
+		function t( gotoEnd ) {
+			return self.step( gotoEnd );
+		}
+
+		t.queue = this.options.queue;
+		t.elem = this.elem;
+		t.saveState = function() {
+			if ( jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
+				if ( self.options.hide ) {
+					jQuery._data( self.elem, "fxshow" + self.prop, self.start );
+				} else if ( self.options.show ) {
+					jQuery._data( self.elem, "fxshow" + self.prop, self.end );
+				}
+			}
+		};
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval( fx.tick, fx.interval );
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
+
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any flash of content
+		if ( dataShow !== undefined ) {
+			// This show is picking up where a previous hide or show left off
+			this.custom( this.cur(), dataShow );
+		} else {
+			this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+		}
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom( this.cur(), 0 );
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var p, n, complete,
+			t = fxNow || createFxNow(),
+			done = true,
+			elem = this.elem,
+			options = this.options;
+
+		if ( gotoEnd || t >= options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			options.animatedProperties[ this.prop ] = true;
+
+			for ( p in options.animatedProperties ) {
+				if ( options.animatedProperties[ p ] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+					jQuery.each( [ "", "X", "Y" ], function( index, value ) {
+						elem.style[ "overflow" + value ] = options.overflow[ index ];
+					});
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( options.hide ) {
+					jQuery( elem ).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( options.hide || options.show ) {
+					for ( p in options.animatedProperties ) {
+						jQuery.style( elem, p, options.orig[ p ] );
+						jQuery.removeData( elem, "fxshow" + p, true );
+						// Toggle data is no longer needed
+						jQuery.removeData( elem, "toggle" + p, true );
+					}
+				}
+
+				// Execute the complete function
+				// in the event that the complete function throws an exception
+				// we must ensure it won't be called twice. #5684
+
+				complete = options.complete;
+				if ( complete ) {
+
+					options.complete = false;
+					complete.call( elem );
+				}
+			}
+
+			return false;
+
+		} else {
+			// classical easing cannot be used with an Infinity duration
+			if ( options.duration == Infinity ) {
+				this.now = t;
+			} else {
+				n = t - this.startTime;
+				this.state = n / options.duration;
+
+				// Perform the easing function, defaults to swing
+				this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
+				this.now = this.start + ( (this.end - this.start) * this.pos );
+			}
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		var timer,
+			timers = jQuery.timers,
+			i = 0;
+
+		for ( ; i < timers.length; i++ ) {
+			timer = timers[ i ];
+			// Checks the timer has not already been removed
+			if ( !timer() && timers[ i ] === timer ) {
+				timers.splice( i--, 1 );
+			}
+		}
+
+		if ( !timers.length ) {
+			jQuery.fx.stop();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+// Ensure props that can't be negative don't go there on undershoot easing
+jQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {
+	// exclude marginTop, marginLeft, marginBottom and marginRight from this list
+	if ( prop.indexOf( "margin" ) ) {
+		jQuery.fx.step[ prop ] = function( fx ) {
+			jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
+		};
+	}
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+	if ( !elemdisplay[ nodeName ] ) {
+
+		var body = document.body,
+			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+			display = elem.css( "display" );
+		elem.remove();
+
+		// If the simple way fails,
+		// get element's real default display by attaching it to a temp iframe
+		if ( display === "none" || display === "" ) {
+			// No iframe to use yet, so create it
+			if ( !iframe ) {
+				iframe = document.createElement( "iframe" );
+				iframe.frameBorder = iframe.width = iframe.height = 0;
+			}
+
+			body.appendChild( iframe );
+
+			// Create a cacheable copy of the iframe document on first call.
+			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+			// document to it; WebKit & Firefox won't allow reusing the iframe document.
+			if ( !iframeDoc || !iframe.createElement ) {
+				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+				iframeDoc.write( ( jQuery.support.boxModel ? "<!doctype html>" : "" ) + "<html><body>" );
+				iframeDoc.close();
+			}
+
+			elem = iframeDoc.createElement( nodeName );
+
+			iframeDoc.body.appendChild( elem );
+
+			display = jQuery.css( elem, "display" );
+			body.removeChild( iframe );
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var getOffset,
+	rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	getOffset = function( elem, doc, docElem, box ) {
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow( doc ),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	getOffset = function( elem, doc, docElem ) {
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.fn.offset = function( options ) {
+	if ( arguments.length ) {
+		return options === undefined ?
+			this :
+			this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+	}
+
+	var elem = this[0],
+		doc = elem && elem.ownerDocument;
+
+	if ( !doc ) {
+		return null;
+	}
+
+	if ( elem === doc.body ) {
+		return jQuery.offset.bodyOffset( elem );
+	}
+
+	return getOffset( elem, doc, doc.documentElement );
+};
+
+jQuery.offset = {
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+
+	position: function() {
+		if ( !this[0] ) {
+			return null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+	var top = /Y/.test( prop );
+
+	jQuery.fn[ method ] = function( val ) {
+		return jQuery.access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? (prop in win) ? win[ prop ] :
+					jQuery.support.boxModel && win.document.documentElement[ method ] ||
+						win.document.body[ method ] :
+					elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : jQuery( win ).scrollLeft(),
+					 top ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	var clientProp = "client" + name,
+		scrollProp = "scroll" + name,
+		offsetProp = "offset" + name;
+
+	// innerHeight and innerWidth
+	jQuery.fn[ "inner" + name ] = function() {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, "padding" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn[ "outer" + name ] = function( margin ) {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( value ) {
+		return jQuery.access( this, function( elem, type, value ) {
+			var doc, docElemProp, orig, ret;
+
+			if ( jQuery.isWindow( elem ) ) {
+				// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+				doc = elem.document;
+				docElemProp = doc.documentElement[ clientProp ];
+				return jQuery.support.boxModel && docElemProp ||
+					doc.body && doc.body[ clientProp ] || docElemProp;
+			}
+
+			// Get document width or height
+			if ( elem.nodeType === 9 ) {
+				// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+				doc = elem.documentElement;
+
+				// when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]
+				// so we can't use max, as it'll choose the incorrect offset[Width/Height]
+				// instead we use the correct client[Width/Height]
+				// support:IE6
+				if ( doc[ clientProp ] >= doc[ scrollProp ] ) {
+					return doc[ clientProp ];
+				}
+
+				return Math.max(
+					elem.body[ scrollProp ], doc[ scrollProp ],
+					elem.body[ offsetProp ], doc[ offsetProp ]
+				);
+			}
+
+			// Get width or height on the element
+			if ( value === undefined ) {
+				orig = jQuery.css( elem, type );
+				ret = parseFloat( orig );
+				return jQuery.isNumeric( ret ) ? ret : orig;
+			}
+
+			// Set the width or height on the element
+			jQuery( elem ).css( type, value );
+		}, type, value, arguments.length, null );
+	};
+});
+
+
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+	define( "jquery", [], function () { return jQuery; } );
+}
+
+
+
+})( window );
diff --git a/orm/services/region_manager/htmlcov/jquery.tablesorter.min.js b/orm/services/region_manager/htmlcov/jquery.tablesorter.min.js
new file mode 100644
index 00000000..f11a3b96
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/jquery.tablesorter.min.js
@@ -0,0 +1 @@
+(function($){$.extend({tablesorter:new function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",cssChildRow:"expand-child",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,sortLocaleCompare:true,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:"/.|,/g",onRenderHeader:null,selectorHeaders:"thead th",debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms")}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s)}else{alert(s)}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug=""}if(table.tBodies.length==0){return}var rows=table.tBodies[0].rows;if(rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers[i]).metadata()&&$($headers[i]).metadata().sorter)){p=getParserById($($headers[i]).metadata().sorter)}else{if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter)}}if(!p){p=detectParserForColumn(table,rows,-1,i)}if(table.config.debug){parsersDebug+="column:"+i+" parser:"+p.id+"\n"}list.push(p)}}if(table.config.debug){log(parsersDebug)}return list}function detectParserForColumn(table,rows,rowIndex,cellIndex){var l=parsers.length,node=false,nodeValue=false,keepLooking=true;while(nodeValue==""&&keepLooking){rowIndex++;if(rows[rowIndex]){node=getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex);nodeValue=trimAndGetNodeText(table.config,node);if(table.config.debug){log("Checking if value was empty on row:"+rowIndex)}}else{keepLooking=false}}for(var i=1;i<l;i++){if(parsers[i].is(nodeValue,table,node)){return parsers[i]}}return parsers[0]}function getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex){return rows[rowIndex].cells[cellIndex]}function trimAndGetNodeText(config,node){return $.trim(getElementText(config,node))}function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==name.toLowerCase()){return parsers[i]}}return false}function buildCache(table){if(table.config.debug){var cacheTime=new Date()}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=$(table.tBodies[0].rows[i]),cols=[];if(c.hasClass(table.config.cssChildRow)){cache.row[cache.row.length-1]=cache.row[cache.row.length-1].add(c);continue}cache.row.push(c);for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c[0].cells[j]),table,c[0].cells[j]))}cols.push(cache.normalized.length);cache.normalized.push(cols);cols=null}if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime)}return cache}function getElementText(config,node){var text="";if(!node){return""}if(!config.supportsTextContent){config.supportsTextContent=node.textContent||false}if(config.textExtraction=="simple"){if(config.supportsTextContent){text=node.textContent}else{if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){text=node.childNodes[0].innerHTML}else{text=node.innerHTML}}}else{if(typeof(config.textExtraction)=="function"){text=config.textExtraction(node)}else{text=$(node).text()}}return text}function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){var pos=n[i][checkCell];rows.push(r[pos]);if(!table.config.appender){var l=r[pos].length;for(var j=0;j<l;j++){tableBody[0].appendChild(r[pos][j])}}}if(table.config.appender){table.config.appender(table,rows)}rows=null;if(table.config.debug){benchmark("Rebuilt table:",appendTime)}applyWidget(table);setTimeout(function(){$(table).trigger("sortEnd")},0)}function buildHeaders(table){if(table.config.debug){var time=new Date()}var meta=($.metadata)?true:false;var header_index=computeTableHeaderCellIndexes(table);$tableHeaders=$(table.config.selectorHeaders,table).each(function(index){this.column=header_index[this.parentNode.rowIndex+"-"+this.cellIndex];this.order=formatSortingOrder(table.config.sortInitialOrder);this.count=this.order;if(checkHeaderMetadata(this)||checkHeaderOptions(table,index)){this.sortDisabled=true}if(checkHeaderOptionsSortingLocked(table,index)){this.order=this.lockedOrder=checkHeaderOptionsSortingLocked(table,index)}if(!this.sortDisabled){var $th=$(this).addClass(table.config.cssHeader);if(table.config.onRenderHeader){table.config.onRenderHeader.apply($th)}}table.config.headerList[index]=this});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders)}return $tableHeaders}function computeTableHeaderCellIndexes(t){var matrix=[];var lookup={};var thead=t.getElementsByTagName("THEAD")[0];var trs=thead.getElementsByTagName("TR");for(var i=0;i<trs.length;i++){var cells=trs[i].cells;for(var j=0;j<cells.length;j++){var c=cells[j];var rowIndex=c.parentNode.rowIndex;var cellId=rowIndex+"-"+c.cellIndex;var rowSpan=c.rowSpan||1;var colSpan=c.colSpan||1;var firstAvailCol;if(typeof(matrix[rowIndex])=="undefined"){matrix[rowIndex]=[]}for(var k=0;k<matrix[rowIndex].length+1;k++){if(typeof(matrix[rowIndex][k])=="undefined"){firstAvailCol=k;break}}lookup[cellId]=firstAvailCol;for(var k=rowIndex;k<rowIndex+rowSpan;k++){if(typeof(matrix[k])=="undefined"){matrix[k]=[]}var matrixrow=matrix[k];for(var l=firstAvailCol;l<firstAvailCol+colSpan;l++){matrixrow[l]="x"}}}}return lookup}function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r[row].cells;for(var i=0;i<c.length;i++){var cell=c[i];if(cell.colSpan>1){arr=arr.concat(checkCellColSpan(table,headerArr,row++))}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell)}}}return arr}function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true}return false}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true}return false}function checkHeaderOptionsSortingLocked(table,i){if((table.config.headers[i])&&(table.config.headers[i].lockedOrder)){return table.config.headers[i].lockedOrder}return false}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i<l;i++){getWidgetById(c[i]).format(table)}}function getWidgetById(name){var l=widgets.length;for(var i=0;i<l;i++){if(widgets[i].id.toLowerCase()==name.toLowerCase()){return widgets[i]}}}function formatSortingOrder(v){if(typeof(v)!="Number"){return(v.toLowerCase()=="desc")?1:0}else{return(v==1)?1:0}}function isValueInArray(v,a){var l=a.length;for(var i=0;i<l;i++){if(a[i][0]==v){return true}}return false}function setHeadersCss(table,$headers,list,css){$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset){if(!this.sortDisabled){h[this.column]=$(this)}});var l=list.length;for(var i=0;i<l;i++){h[list[i][0]].addClass(css[list[i][1]])}}function fixColumnWidth(table,$headers){var c=table.config;if(c.widthFixed){var colgroup=$("<colgroup>");$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($("<col>").css("width",$(this).width()))});$(table).prepend(colgroup)}}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i<l;i++){var s=sortList[i],o=c.headerList[s[0]];o.count=s[1];o.count++}}function multisort(table,sortList,cache){if(table.config.debug){var sortTime=new Date()}var dynamicExp="var sortWrapper = function(a,b) {",l=sortList.length;for(var i=0;i<l;i++){var c=sortList[i][0];var order=sortList[i][1];var s=(table.config.parsers[c].type=="text")?((order==0)?makeSortFunction("text","asc",c):makeSortFunction("text","desc",c)):((order==0)?makeSortFunction("numeric","asc",c):makeSortFunction("numeric","desc",c));var e="e"+i;dynamicExp+="var "+e+" = "+s;dynamicExp+="if("+e+") { return "+e+"; } ";dynamicExp+="else { "}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+="return a["+orgOrderCol+"]-b["+orgOrderCol+"];";for(var i=0;i<l;i++){dynamicExp+="}; "}dynamicExp+="return 0; ";dynamicExp+="}; ";if(table.config.debug){benchmark("Evaling expression:"+dynamicExp,new Date())}eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time:",sortTime)}return cache}function makeSortFunction(type,direction,index){var a="a["+index+"]",b="b["+index+"]";if(type=="text"&&direction=="asc"){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+a+" < "+b+") ? -1 : 1 )));"}else{if(type=="text"&&direction=="desc"){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+b+" < "+a+") ? -1 : 1 )));"}else{if(type=="numeric"&&direction=="asc"){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+a+" - "+b+"));"}else{if(type=="numeric"&&direction=="desc"){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+b+" - "+a+"));"}}}}}function makeSortText(i){return"((a["+i+"] < b["+i+"]) ? -1 : ((a["+i+"] > b["+i+"]) ? 1 : 0));"}function makeSortTextDesc(i){return"((b["+i+"] < a["+i+"]) ? -1 : ((b["+i+"] > a["+i+"]) ? 1 : 0));"}function makeSortNumeric(i){return"a["+i+"]-b["+i+"];"}function makeSortNumericDesc(i){return"b["+i+"]-a["+i+"];"}function sortText(a,b){if(table.config.sortLocaleCompare){return a.localeCompare(b)}return((a<b)?-1:((a>b)?1:0))}function sortTextDesc(a,b){if(table.config.sortLocaleCompare){return b.localeCompare(a)}return((b<a)?-1:((b>a)?1:0))}function sortNumeric(a,b){return a-b}function sortNumericDesc(a,b){return b-a}function getCachedSortType(parsers,i){return parsers[i].type}this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies){return}var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$.data(this,"tablesorter",config);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){$this.trigger("sortStart");var $cell=$(this);var i=this.column;this.order=this.count++%2;if(this.lockedOrder){this.order=this.lockedOrder}if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j<a.length;j++){if(a[j][0]!=i){config.sortList.push(a[j])}}}config.sortList.push([i,this.order])}else{if(isValueInArray(i,config.sortList)){for(var j=0;j<config.sortList.length;j++){var s=config.sortList[j],o=config.headerList[s[0]];if(s[0]==i){o.count=s[1];o.count++;s[1]=o.count%2}}}else{config.sortList.push([i,this.order])}}setTimeout(function(){setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache))},1);return false}}).mousedown(function(){if(config.cancelSelection){this.onselectstart=function(){return false};return false}});$this.bind("update",function(){var me=this;setTimeout(function(){me.config.parsers=buildParserCache(me,$headers);cache=buildCache(me)},1)}).bind("updateCell",function(e,cell){var config=this.config;var pos=[(cell.parentNode.rowIndex-1),cell.cellIndex];cache.normalized[pos[0]][pos[1]]=config.parsers[pos[1]].format(getElementText(config,cell),cell)}).bind("sorton",function(e,list){$(this).trigger("sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache))}).bind("appendCache",function(){appendToTable(this,cache)}).bind("applyWidgetId",function(e,id){getWidgetById(id).format(this)}).bind("applyWidgets",function(){applyWidget(this)});if($.metadata&&($(this).metadata()&&$(this).metadata().sortlist)){config.sortList=$(this).metadata().sortlist}if(config.sortList.length>0){$this.trigger("sorton",[config.sortList])}applyWidget(this)})};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==parser.id.toLowerCase()){a=false}}if(a){parsers.push(parser)}};this.addWidget=function(widget){widgets.push(widget)};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i};this.isDigit=function(s,config){return/^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g,"")))};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild){this.removeChild(this.firstChild)}}empty.apply(table.tBodies[0])}else{table.tBodies[0].innerHTML=""}}}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true},format:function(s){return $.trim(s.toLocaleLowerCase())},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c)},format:function(s){return $.tablesorter.formatFloat(s)},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$€?.]/.test(s)},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g),""))},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s)},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a[i];if(item.length==2){r+="0"+item}else{r+=item}}return $.tablesorter.formatFloat(r)},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s)},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),""))},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s)},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0")},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s))},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""))},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/))},format:function(s){return $.tablesorter.formatFloat(new Date(s).getTime())},type:"numeric"});ts.addParser({id:"shortDate",is:function(s){return/\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s)},format:function(s,table){var c=table.config;s=s.replace(/\-/g,"/");if(c.dateFormat=="us"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$1/$2")}else{if(c.dateFormat=="uk"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$2/$1")}else{if(c.dateFormat=="dd/mm/yy"||c.dateFormat=="dd-mm-yy"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/,"$1/$2/$3")}}}return $.tablesorter.formatFloat(new Date(s).getTime())},type:"numeric"});ts.addParser({id:"time",is:function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s)},format:function(s){return $.tablesorter.formatFloat(new Date("2000/01/01 "+s).getTime())},type:"numeric"});ts.addParser({id:"metadata",is:function(s){return false},format:function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?"sortValue":c.parserMetadataName;return $(cell).metadata()[p]},type:"numeric"});ts.addWidget({id:"zebra",format:function(table){if(table.config.debug){var time=new Date()}var $tr,row=-1,odd;$("tr:visible",table.tBodies[0]).each(function(i){$tr=$(this);if(!$tr.hasClass(table.config.cssChildRow)){row++}odd=(row%2==0);$tr.removeClass(table.config.widgetZebra.css[odd?0:1]).addClass(table.config.widgetZebra.css[odd?1:0])});if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time)}}})})(jQuery);
\ No newline at end of file
diff --git a/orm/services/region_manager/htmlcov/keybd_closed.png b/orm/services/region_manager/htmlcov/keybd_closed.png
new file mode 100644
index 00000000..db114023
Binary files /dev/null and b/orm/services/region_manager/htmlcov/keybd_closed.png differ
diff --git a/orm/services/region_manager/htmlcov/keybd_open.png b/orm/services/region_manager/htmlcov/keybd_open.png
new file mode 100644
index 00000000..db114023
Binary files /dev/null and b/orm/services/region_manager/htmlcov/keybd_open.png differ
diff --git a/orm/services/region_manager/htmlcov/rms___init___py.html b/orm/services/region_manager/htmlcov/rms___init___py.html
new file mode 100644
index 00000000..64321698
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_controllers___init___py.html b/orm/services/region_manager/htmlcov/rms_controllers___init___py.html
new file mode 100644
index 00000000..e9a4bb7f
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_controllers___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_controllers_configuration_py.html b/orm/services/region_manager/htmlcov/rms_controllers_configuration_py.html
new file mode 100644
index 00000000..5fd6bb6f
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_controllers_configuration_py.html
@@ -0,0 +1,157 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/configuration.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/configuration.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            17 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">17 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="stm run hide_run"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="stm run hide_run"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""Configuration rest API input module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm run hide_run"><span class="key">class</span> <span class="nam">ConfigurationController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln">    <span class="str">"""Configuration controller."""</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">dump_to_log</span><span class="op">=</span><span class="str">'false'</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">        <span class="str">"""get method.</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln"><span class="str">        :param dump_to_log: A boolean string that says whether the</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="str">        configuration should be written to log</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln"><span class="str">        :return: A pretty string that contains the service's configuration</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Get configuration..."</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'configuration:get'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">        <span class="nam">dump</span> <span class="op">=</span> <span class="nam">dump_to_log</span><span class="op">.</span><span class="nam">lower</span><span class="op">(</span><span class="op">)</span> <span class="op">==</span> <span class="str">'true'</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">        <span class="nam">utils</span><span class="op">.</span><span class="nam">set_utils_conf</span><span class="op">(</span><span class="nam">conf</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">        <span class="nam">result</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">report_config</span><span class="op">(</span><span class="nam">conf</span><span class="op">,</span> <span class="nam">dump</span><span class="op">,</span> <span class="nam">logger</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_controllers_lcp_controller_py.html b/orm/services/region_manager/htmlcov/rms_controllers_lcp_controller_py.html
new file mode 100644
index 00000000..90c29c78
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_controllers_lcp_controller_py.html
@@ -0,0 +1,329 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/lcp_controller.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/lcp_controller.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            56 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">56 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="stm run hide_run"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="stm run hide_run"><a href="#n39">39</a></p>
+<p id="n40" class="stm run hide_run"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="pln"><a href="#n43">43</a></p>
+<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p>
+<p id="n45" class="pln"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="stm run hide_run"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="pln"><a href="#n49">49</a></p>
+<p id="n50" class="stm run hide_run"><a href="#n50">50</a></p>
+<p id="n51" class="stm run hide_run"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="pln"><a href="#n54">54</a></p>
+<p id="n55" class="stm run hide_run"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="pln"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="stm run hide_run"><a href="#n61">61</a></p>
+<p id="n62" class="stm run hide_run"><a href="#n62">62</a></p>
+<p id="n63" class="stm run hide_run"><a href="#n63">63</a></p>
+<p id="n64" class="stm run hide_run"><a href="#n64">64</a></p>
+<p id="n65" class="pln"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p>
+<p id="n69" class="pln"><a href="#n69">69</a></p>
+<p id="n70" class="pln"><a href="#n70">70</a></p>
+<p id="n71" class="pln"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="stm run hide_run"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="pln"><a href="#n77">77</a></p>
+<p id="n78" class="pln"><a href="#n78">78</a></p>
+<p id="n79" class="pln"><a href="#n79">79</a></p>
+<p id="n80" class="pln"><a href="#n80">80</a></p>
+<p id="n81" class="stm run hide_run"><a href="#n81">81</a></p>
+<p id="n82" class="stm run hide_run"><a href="#n82">82</a></p>
+<p id="n83" class="pln"><a href="#n83">83</a></p>
+<p id="n84" class="stm run hide_run"><a href="#n84">84</a></p>
+<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p>
+<p id="n87" class="pln"><a href="#n87">87</a></p>
+<p id="n88" class="stm run hide_run"><a href="#n88">88</a></p>
+<p id="n89" class="stm run hide_run"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="stm run hide_run"><a href="#n91">91</a></p>
+<p id="n92" class="pln"><a href="#n92">92</a></p>
+<p id="n93" class="pln"><a href="#n93">93</a></p>
+<p id="n94" class="stm run hide_run"><a href="#n94">94</a></p>
+<p id="n95" class="stm run hide_run"><a href="#n95">95</a></p>
+<p id="n96" class="pln"><a href="#n96">96</a></p>
+<p id="n97" class="stm run hide_run"><a href="#n97">97</a></p>
+<p id="n98" class="pln"><a href="#n98">98</a></p>
+<p id="n99" class="pln"><a href="#n99">99</a></p>
+<p id="n100" class="stm run hide_run"><a href="#n100">100</a></p>
+<p id="n101" class="pln"><a href="#n101">101</a></p>
+<p id="n102" class="stm run hide_run"><a href="#n102">102</a></p>
+<p id="n103" class="pln"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="stm run hide_run"><a href="#n105">105</a></p>
+<p id="n106" class="stm run hide_run"><a href="#n106">106</a></p>
+<p id="n107" class="pln"><a href="#n107">107</a></p>
+<p id="n108" class="stm run hide_run"><a href="#n108">108</a></p>
+<p id="n109" class="pln"><a href="#n109">109</a></p>
+<p id="n110" class="pln"><a href="#n110">110</a></p>
+<p id="n111" class="pln"><a href="#n111">111</a></p>
+<p id="n112" class="pln"><a href="#n112">112</a></p>
+<p id="n113" class="pln"><a href="#n113">113</a></p>
+<p id="n114" class="pln"><a href="#n114">114</a></p>
+<p id="n115" class="pln"><a href="#n115">115</a></p>
+<p id="n116" class="pln"><a href="#n116">116</a></p>
+<p id="n117" class="pln"><a href="#n117">117</a></p>
+<p id="n118" class="pln"><a href="#n118">118</a></p>
+<p id="n119" class="pln"><a href="#n119">119</a></p>
+<p id="n120" class="pln"><a href="#n120">120</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsme</span> <span class="key">import</span> <span class="nam">types</span> <span class="key">as</span> <span class="nam">wtypes</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">model</span> <span class="key">import</span> <span class="nam">url_parm</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span><span class="op">.</span><span class="nam">error_base</span> <span class="key">import</span> <span class="nam">ErrorStatus</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">services</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run"><span class="key">class</span> <span class="nam">LcpController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln">    <span class="key">def</span> <span class="nam">get_all</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="str">            This function is called when receiving /lcp without a parameter.</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln"><span class="str">            parameter:</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="str">                None.</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln"><span class="str">            return: entire list of lcp.</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">'Received a GET request for all LCPs'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'lcp:get_all'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">        <span class="nam">zones</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm run hide_run">            <span class="nam">zones</span> <span class="op">=</span> <span class="nam">get_zones</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">'Returning LCP list: %s'</span> <span class="op">%</span> <span class="op">(</span><span class="nam">zones</span><span class="op">,</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm run hide_run">            <span class="key">return</span> <span class="nam">zones</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="pln">    <span class="key">def</span> <span class="nam">get_one</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">lcp_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t47" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">'Received a GET request for LCP %s'</span> <span class="op">%</span> <span class="op">(</span><span class="nam">id</span><span class="op">,</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'lcp:get_one'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t50" class="stm run hide_run">        <span class="nam">zones</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">            <span class="nam">zones</span> <span class="op">=</span> <span class="nam">get_zones</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t55" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t61" class="stm run hide_run">        <span class="key">for</span> <span class="nam">zone</span> <span class="key">in</span> <span class="nam">zones</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="stm run hide_run">            <span class="key">if</span> <span class="nam">zone</span><span class="op">[</span><span class="str">"id"</span><span class="op">]</span> <span class="op">==</span> <span class="nam">lcp_id</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="stm run hide_run">                <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">'Returning: %s'</span> <span class="op">%</span> <span class="op">(</span><span class="nam">zone</span><span class="op">,</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="stm run hide_run">                <span class="key">return</span> <span class="nam">zone</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">        <span class="nam">error_msg</span> <span class="op">=</span> <span class="str">'LCP %s not found'</span> <span class="op">%</span> <span class="op">(</span><span class="nam">lcp_id</span><span class="op">,</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="nam">error_msg</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="pln">                                  <span class="nam">message</span><span class="op">=</span><span class="nam">error_msg</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="pln">                                  <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t73" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_zones</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln"><span class="str">    This function returns the lcp list from CSV file.</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln"><span class="str">    parameter:</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="pln"><span class="str">        None.</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="pln"><span class="str">    return:</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="pln"><span class="str">        zone list in json format.</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="stm run hide_run">    <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">'Enter get_zones function'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="stm run hide_run">    <span class="nam">result</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm run hide_run">        <span class="nam">url_args</span> <span class="op">=</span> <span class="nam">url_parm</span><span class="op">.</span><span class="nam">UrlParms</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm run hide_run">        <span class="nam">zones</span> <span class="op">=</span> <span class="nam">services</span><span class="op">.</span><span class="nam">get_regions_data</span><span class="op">(</span><span class="nam">url_args</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t88" class="stm run hide_run">        <span class="key">for</span> <span class="nam">zone</span> <span class="key">in</span> <span class="nam">zones</span><span class="op">.</span><span class="nam">regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="stm run hide_run">            <span class="nam">result</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">build_zone_response</span><span class="op">(</span><span class="nam">zone</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Available regions: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="str">', '</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="pln">            <span class="op">[</span><span class="nam">region</span><span class="op">[</span><span class="str">"zone_name"</span><span class="op">]</span> <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span> <span class="nam">result</span><span class="op">]</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t94" class="stm run hide_run">    <span class="key">except</span> <span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="pln">    <span class="key">finally</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t99" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t100" class="stm run hide_run"><span class="key">def</span> <span class="nam">build_zone_response</span><span class="op">(</span><span class="nam">zone</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t102" class="stm run hide_run">    <span class="nam">end_points_dict</span> <span class="op">=</span> <span class="op">{</span><span class="str">"identity"</span><span class="op">:</span> <span class="str">""</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="pln">                       <span class="str">"dashboard"</span><span class="op">:</span> <span class="str">""</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln">                       <span class="str">"ord"</span><span class="op">:</span> <span class="str">""</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="stm run hide_run">    <span class="key">for</span> <span class="nam">end_point</span> <span class="key">in</span> <span class="nam">zone</span><span class="op">.</span><span class="nam">endpoints</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="stm run hide_run">        <span class="nam">end_points_dict</span><span class="op">[</span><span class="nam">end_point</span><span class="op">.</span><span class="nam">type</span><span class="op">]</span> <span class="op">=</span> <span class="nam">end_point</span><span class="op">.</span><span class="nam">publicurl</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t108" class="stm run hide_run">    <span class="key">return</span> <span class="nam">dict</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="pln">        <span class="nam">zone_name</span><span class="op">=</span><span class="nam">zone</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="pln">        <span class="nam">id</span><span class="op">=</span><span class="nam">zone</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="pln">        <span class="nam">status</span><span class="op">=</span><span class="str">"1"</span> <span class="key">if</span> <span class="nam">zone</span><span class="op">.</span><span class="nam">status</span> <span class="op">==</span> <span class="str">"functional"</span> <span class="key">else</span> <span class="str">"0"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t112" class="pln">        <span class="nam">design_type</span><span class="op">=</span><span class="nam">zone</span><span class="op">.</span><span class="nam">design_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="pln">        <span class="nam">location_type</span><span class="op">=</span><span class="nam">zone</span><span class="op">.</span><span class="nam">location_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="pln">        <span class="nam">vLCP_name</span><span class="op">=</span><span class="nam">zone</span><span class="op">.</span><span class="nam">vlcp_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="pln">        <span class="nam">AIC_version</span><span class="op">=</span><span class="nam">zone</span><span class="op">.</span><span class="nam">ranger_agent_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="pln">        <span class="nam">OS_version</span><span class="op">=</span><span class="nam">zone</span><span class="op">.</span><span class="nam">open_stack_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="pln">        <span class="nam">keystone_EP</span><span class="op">=</span><span class="nam">end_points_dict</span><span class="op">[</span><span class="str">"identity"</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t118" class="pln">        <span class="nam">horizon_EP</span><span class="op">=</span><span class="nam">end_points_dict</span><span class="op">[</span><span class="str">"dashboard"</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="pln">        <span class="nam">ORD_EP</span><span class="op">=</span><span class="nam">end_points_dict</span><span class="op">[</span><span class="str">"ord"</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="pln">    <span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_controllers_logs_py.html b/orm/services/region_manager/htmlcov/rms_controllers_logs_py.html
new file mode 100644
index 00000000..51ddc2a1
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_controllers_logs_py.html
@@ -0,0 +1,237 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/logs.py: 94%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/logs.py</b> :
+            <span class="pc_cov">94%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            36 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">34 run</span>
+            <span class="mis shortkey_m button_toggle_mis">2 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="stm mis"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="stm run hide_run"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="stm run hide_run"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p>
+<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p>
+<p id="n45" class="pln"><a href="#n45">45</a></p>
+<p id="n46" class="stm run hide_run"><a href="#n46">46</a></p>
+<p id="n47" class="stm run hide_run"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="stm run hide_run"><a href="#n50">50</a></p>
+<p id="n51" class="stm run hide_run"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="pln"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="pln"><a href="#n57">57</a></p>
+<p id="n58" class="stm run hide_run"><a href="#n58">58</a></p>
+<p id="n59" class="stm run hide_run"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="stm run hide_run"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p>
+<p id="n66" class="pln"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p>
+<p id="n69" class="stm run hide_run"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="stm run hide_run"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="stm mis"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">import</span> <span class="nam">wsme</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">class</span> <span class="nam">LogChangeResultWSME</span><span class="op">(</span><span class="nam">wsme</span><span class="op">.</span><span class="nam">types</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln">    <span class="str">"""log change result wsme type."""</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm run hide_run">    <span class="nam">result</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">str</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">default</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln">        <span class="str">""""init method."""</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm mis">        <span class="nam">super</span><span class="op">(</span><span class="nam">LogChangeResult</span><span class="op">,</span> <span class="nam">self</span><span class="op">)</span><span class="op">.</span><span class="nam">__init__</span><span class="op">(</span><span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm run hide_run"><span class="key">class</span> <span class="nam">LogChangeResult</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln">    <span class="str">"""log change result type."""</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">result</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln">        <span class="str">""""init method."""</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">result</span> <span class="op">=</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run"><span class="key">class</span> <span class="nam">LogsController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln">    <span class="str">"""Logs Audit controller."""</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">LogChangeResultWSME</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">level</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln">        <span class="str">"""update log level.</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln"><span class="str">        :param level: the log level text name</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Changing log level to [{}]"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">level</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'log:update'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t46" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="stm run hide_run">            <span class="nam">log_level</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">_levelNames</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">level</span><span class="op">.</span><span class="nam">upper</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run">            <span class="key">if</span> <span class="nam">log_level</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run">                <span class="nam">self</span><span class="op">.</span><span class="nam">_change_log_level</span><span class="op">(</span><span class="nam">log_level</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="stm run hide_run">                <span class="nam">result</span> <span class="op">=</span> <span class="str">"Log level changed to {}."</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">level</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm run hide_run">                <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln">            <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">                <span class="key">raise</span> <span class="nam">Exception</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="pln">                    <span class="str">"The given log level [{}] doesn't exist."</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">level</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">            <span class="key">return</span> <span class="nam">LogChangeResult</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Fail to change log_level. Reason: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln">                <span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t65" class="stm run hide_run">    <span class="op">@</span><span class="nam">staticmethod</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="pln">    <span class="key">def</span> <span class="nam">_change_log_level</span><span class="op">(</span><span class="nam">log_level</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">        <span class="nam">path</span> <span class="op">=</span> <span class="nam">__name__</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">'.'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm run hide_run">        <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">path</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="stm run hide_run">            <span class="nam">root</span> <span class="op">=</span> <span class="nam">path</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">            <span class="nam">root_logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">root</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="stm run hide_run">            <span class="nam">root_logger</span><span class="op">.</span><span class="nam">setLevel</span><span class="op">(</span><span class="nam">log_level</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Fail to change log_level to [{}]. "</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln">                        <span class="str">"the given log level doesn't exist."</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">log_level</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_controllers_root_py.html b/orm/services/region_manager/htmlcov/rms_controllers_root_py.html
new file mode 100644
index 00000000..9a9cdf4b
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_controllers_root_py.html
@@ -0,0 +1,159 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/root.py: 92%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/root.py</b> :
+            <span class="pc_cov">92%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            12 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">11 run</span>
+            <span class="mis shortkey_m button_toggle_mis">1 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="stm mis"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">expose</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">lcp_controller</span> <span class="key">import</span> <span class="nam">LcpController</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">logs</span> <span class="key">import</span> <span class="nam">LogsController</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">configuration</span> <span class="key">import</span> <span class="nam">ConfigurationController</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v2</span> <span class="key">import</span> <span class="nam">root</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">class</span> <span class="nam">RootController</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run">    <span class="nam">lcp</span> <span class="op">=</span> <span class="nam">LcpController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run">    <span class="nam">logs</span> <span class="op">=</span> <span class="nam">LogsController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run">    <span class="nam">configuration</span> <span class="op">=</span> <span class="nam">ConfigurationController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run">    <span class="nam">v2</span> <span class="op">=</span> <span class="nam">root</span><span class="op">.</span><span class="nam">V2Controller</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run">    <span class="op">@</span><span class="nam">expose</span><span class="op">(</span><span class="nam">template</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln">    <span class="key">def</span> <span class="nam">_default</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="str">            Method to handle GET /</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="str">            parameters: None</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="str">            return: dict describing lcp rest version information</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm mis">        <span class="key">return</span> <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">            <span class="str">"versions"</span><span class="op">:</span> <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln">                <span class="str">"values"</span><span class="op">:</span> <span class="op">[</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln">                    <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln">                        <span class="str">"status"</span><span class="op">:</span> <span class="str">"stable"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln">                        <span class="str">"id"</span><span class="op">:</span> <span class="str">"v2"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln">                        <span class="str">"links"</span><span class="op">:</span> <span class="op">[</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln">                            <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln">                                <span class="str">"href"</span><span class="op">:</span> <span class="str">"http://localhost:8789/"</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln">                            <span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln">                        <span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln">                    <span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln">                <span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln">            <span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln">        <span class="op">}</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_controllers_v2___init___py.html b/orm/services/region_manager/htmlcov/rms_controllers_v2___init___py.html
new file mode 100644
index 00000000..bf5cfb53
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_controllers_v2___init___py.html
@@ -0,0 +1,91 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""orm package."""</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_controllers_v2_orm___init___py.html b/orm/services/region_manager/htmlcov/rms_controllers_v2_orm___init___py.html
new file mode 100644
index 00000000..40a61780
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_controllers_v2_orm___init___py.html
@@ -0,0 +1,91 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/orm/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/orm/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""resource package."""</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_resources___init___py.html b/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_resources___init___py.html
new file mode 100644
index 00000000..80509395
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_resources___init___py.html
@@ -0,0 +1,91 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/orm/resources/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/orm/resources/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""orm package."""</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_resources_groups_py.html b/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_resources_groups_py.html
new file mode 100644
index 00000000..76366806
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_resources_groups_py.html
@@ -0,0 +1,597 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/orm/resources/groups.py: 82%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/orm/resources/groups.py</b> :
+            <span class="pc_cov">82%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            124 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">102 run</span>
+            <span class="mis shortkey_m button_toggle_mis">22 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p>
+<p id="n25" class="stm run hide_run"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="stm run hide_run"><a href="#n40">40</a></p>
+<p id="n41" class="stm mis"><a href="#n41">41</a></p>
+<p id="n42" class="stm mis"><a href="#n42">42</a></p>
+<p id="n43" class="stm mis"><a href="#n43">43</a></p>
+<p id="n44" class="stm mis"><a href="#n44">44</a></p>
+<p id="n45" class="stm mis"><a href="#n45">45</a></p>
+<p id="n46" class="stm mis"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="pln"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="stm run hide_run"><a href="#n52">52</a></p>
+<p id="n53" class="pln"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="pln"><a href="#n56">56</a></p>
+<p id="n57" class="pln"><a href="#n57">57</a></p>
+<p id="n58" class="pln"><a href="#n58">58</a></p>
+<p id="n59" class="stm mis"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="stm run hide_run"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p>
+<p id="n69" class="pln"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="pln"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="pln"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="stm run hide_run"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="stm run hide_run"><a href="#n79">79</a></p>
+<p id="n80" class="stm run hide_run"><a href="#n80">80</a></p>
+<p id="n81" class="pln"><a href="#n81">81</a></p>
+<p id="n82" class="pln"><a href="#n82">82</a></p>
+<p id="n83" class="stm run hide_run"><a href="#n83">83</a></p>
+<p id="n84" class="pln"><a href="#n84">84</a></p>
+<p id="n85" class="pln"><a href="#n85">85</a></p>
+<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p>
+<p id="n87" class="pln"><a href="#n87">87</a></p>
+<p id="n88" class="stm run hide_run"><a href="#n88">88</a></p>
+<p id="n89" class="pln"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="pln"><a href="#n91">91</a></p>
+<p id="n92" class="pln"><a href="#n92">92</a></p>
+<p id="n93" class="stm run hide_run"><a href="#n93">93</a></p>
+<p id="n94" class="pln"><a href="#n94">94</a></p>
+<p id="n95" class="pln"><a href="#n95">95</a></p>
+<p id="n96" class="stm run hide_run"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="pln"><a href="#n98">98</a></p>
+<p id="n99" class="stm run hide_run"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="stm run hide_run"><a href="#n101">101</a></p>
+<p id="n102" class="pln"><a href="#n102">102</a></p>
+<p id="n103" class="pln"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="pln"><a href="#n105">105</a></p>
+<p id="n106" class="pln"><a href="#n106">106</a></p>
+<p id="n107" class="stm run hide_run"><a href="#n107">107</a></p>
+<p id="n108" class="stm run hide_run"><a href="#n108">108</a></p>
+<p id="n109" class="pln"><a href="#n109">109</a></p>
+<p id="n110" class="stm run hide_run"><a href="#n110">110</a></p>
+<p id="n111" class="pln"><a href="#n111">111</a></p>
+<p id="n112" class="stm run hide_run"><a href="#n112">112</a></p>
+<p id="n113" class="stm run hide_run"><a href="#n113">113</a></p>
+<p id="n114" class="stm run hide_run"><a href="#n114">114</a></p>
+<p id="n115" class="pln"><a href="#n115">115</a></p>
+<p id="n116" class="stm run hide_run"><a href="#n116">116</a></p>
+<p id="n117" class="stm run hide_run"><a href="#n117">117</a></p>
+<p id="n118" class="stm run hide_run"><a href="#n118">118</a></p>
+<p id="n119" class="pln"><a href="#n119">119</a></p>
+<p id="n120" class="pln"><a href="#n120">120</a></p>
+<p id="n121" class="stm run hide_run"><a href="#n121">121</a></p>
+<p id="n122" class="stm run hide_run"><a href="#n122">122</a></p>
+<p id="n123" class="stm run hide_run"><a href="#n123">123</a></p>
+<p id="n124" class="pln"><a href="#n124">124</a></p>
+<p id="n125" class="pln"><a href="#n125">125</a></p>
+<p id="n126" class="pln"><a href="#n126">126</a></p>
+<p id="n127" class="stm run hide_run"><a href="#n127">127</a></p>
+<p id="n128" class="pln"><a href="#n128">128</a></p>
+<p id="n129" class="stm run hide_run"><a href="#n129">129</a></p>
+<p id="n130" class="stm run hide_run"><a href="#n130">130</a></p>
+<p id="n131" class="stm run hide_run"><a href="#n131">131</a></p>
+<p id="n132" class="pln"><a href="#n132">132</a></p>
+<p id="n133" class="stm run hide_run"><a href="#n133">133</a></p>
+<p id="n134" class="stm run hide_run"><a href="#n134">134</a></p>
+<p id="n135" class="stm run hide_run"><a href="#n135">135</a></p>
+<p id="n136" class="pln"><a href="#n136">136</a></p>
+<p id="n137" class="stm mis"><a href="#n137">137</a></p>
+<p id="n138" class="stm mis"><a href="#n138">138</a></p>
+<p id="n139" class="stm mis"><a href="#n139">139</a></p>
+<p id="n140" class="stm mis"><a href="#n140">140</a></p>
+<p id="n141" class="pln"><a href="#n141">141</a></p>
+<p id="n142" class="pln"><a href="#n142">142</a></p>
+<p id="n143" class="pln"><a href="#n143">143</a></p>
+<p id="n144" class="stm run hide_run"><a href="#n144">144</a></p>
+<p id="n145" class="pln"><a href="#n145">145</a></p>
+<p id="n146" class="stm run hide_run"><a href="#n146">146</a></p>
+<p id="n147" class="pln"><a href="#n147">147</a></p>
+<p id="n148" class="pln"><a href="#n148">148</a></p>
+<p id="n149" class="pln"><a href="#n149">149</a></p>
+<p id="n150" class="pln"><a href="#n150">150</a></p>
+<p id="n151" class="pln"><a href="#n151">151</a></p>
+<p id="n152" class="pln"><a href="#n152">152</a></p>
+<p id="n153" class="stm run hide_run"><a href="#n153">153</a></p>
+<p id="n154" class="stm run hide_run"><a href="#n154">154</a></p>
+<p id="n155" class="pln"><a href="#n155">155</a></p>
+<p id="n156" class="pln"><a href="#n156">156</a></p>
+<p id="n157" class="pln"><a href="#n157">157</a></p>
+<p id="n158" class="pln"><a href="#n158">158</a></p>
+<p id="n159" class="stm run hide_run"><a href="#n159">159</a></p>
+<p id="n160" class="pln"><a href="#n160">160</a></p>
+<p id="n161" class="stm run hide_run"><a href="#n161">161</a></p>
+<p id="n162" class="pln"><a href="#n162">162</a></p>
+<p id="n163" class="stm run hide_run"><a href="#n163">163</a></p>
+<p id="n164" class="pln"><a href="#n164">164</a></p>
+<p id="n165" class="pln"><a href="#n165">165</a></p>
+<p id="n166" class="pln"><a href="#n166">166</a></p>
+<p id="n167" class="stm run hide_run"><a href="#n167">167</a></p>
+<p id="n168" class="pln"><a href="#n168">168</a></p>
+<p id="n169" class="pln"><a href="#n169">169</a></p>
+<p id="n170" class="stm run hide_run"><a href="#n170">170</a></p>
+<p id="n171" class="pln"><a href="#n171">171</a></p>
+<p id="n172" class="pln"><a href="#n172">172</a></p>
+<p id="n173" class="pln"><a href="#n173">173</a></p>
+<p id="n174" class="pln"><a href="#n174">174</a></p>
+<p id="n175" class="pln"><a href="#n175">175</a></p>
+<p id="n176" class="pln"><a href="#n176">176</a></p>
+<p id="n177" class="stm run hide_run"><a href="#n177">177</a></p>
+<p id="n178" class="pln"><a href="#n178">178</a></p>
+<p id="n179" class="stm run hide_run"><a href="#n179">179</a></p>
+<p id="n180" class="pln"><a href="#n180">180</a></p>
+<p id="n181" class="pln"><a href="#n181">181</a></p>
+<p id="n182" class="stm run hide_run"><a href="#n182">182</a></p>
+<p id="n183" class="pln"><a href="#n183">183</a></p>
+<p id="n184" class="stm run hide_run"><a href="#n184">184</a></p>
+<p id="n185" class="stm run hide_run"><a href="#n185">185</a></p>
+<p id="n186" class="stm run hide_run"><a href="#n186">186</a></p>
+<p id="n187" class="pln"><a href="#n187">187</a></p>
+<p id="n188" class="pln"><a href="#n188">188</a></p>
+<p id="n189" class="stm mis"><a href="#n189">189</a></p>
+<p id="n190" class="stm mis"><a href="#n190">190</a></p>
+<p id="n191" class="stm mis"><a href="#n191">191</a></p>
+<p id="n192" class="pln"><a href="#n192">192</a></p>
+<p id="n193" class="pln"><a href="#n193">193</a></p>
+<p id="n194" class="pln"><a href="#n194">194</a></p>
+<p id="n195" class="stm run hide_run"><a href="#n195">195</a></p>
+<p id="n196" class="pln"><a href="#n196">196</a></p>
+<p id="n197" class="stm run hide_run"><a href="#n197">197</a></p>
+<p id="n198" class="stm run hide_run"><a href="#n198">198</a></p>
+<p id="n199" class="pln"><a href="#n199">199</a></p>
+<p id="n200" class="stm run hide_run"><a href="#n200">200</a></p>
+<p id="n201" class="pln"><a href="#n201">201</a></p>
+<p id="n202" class="stm run hide_run"><a href="#n202">202</a></p>
+<p id="n203" class="stm run hide_run"><a href="#n203">203</a></p>
+<p id="n204" class="stm run hide_run"><a href="#n204">204</a></p>
+<p id="n205" class="pln"><a href="#n205">205</a></p>
+<p id="n206" class="stm run hide_run"><a href="#n206">206</a></p>
+<p id="n207" class="stm run hide_run"><a href="#n207">207</a></p>
+<p id="n208" class="pln"><a href="#n208">208</a></p>
+<p id="n209" class="pln"><a href="#n209">209</a></p>
+<p id="n210" class="pln"><a href="#n210">210</a></p>
+<p id="n211" class="stm run hide_run"><a href="#n211">211</a></p>
+<p id="n212" class="pln"><a href="#n212">212</a></p>
+<p id="n213" class="stm run hide_run"><a href="#n213">213</a></p>
+<p id="n214" class="stm run hide_run"><a href="#n214">214</a></p>
+<p id="n215" class="pln"><a href="#n215">215</a></p>
+<p id="n216" class="pln"><a href="#n216">216</a></p>
+<p id="n217" class="stm run hide_run"><a href="#n217">217</a></p>
+<p id="n218" class="pln"><a href="#n218">218</a></p>
+<p id="n219" class="stm run hide_run"><a href="#n219">219</a></p>
+<p id="n220" class="pln"><a href="#n220">220</a></p>
+<p id="n221" class="pln"><a href="#n221">221</a></p>
+<p id="n222" class="stm run hide_run"><a href="#n222">222</a></p>
+<p id="n223" class="stm run hide_run"><a href="#n223">223</a></p>
+<p id="n224" class="pln"><a href="#n224">224</a></p>
+<p id="n225" class="stm run hide_run"><a href="#n225">225</a></p>
+<p id="n226" class="stm run hide_run"><a href="#n226">226</a></p>
+<p id="n227" class="stm run hide_run"><a href="#n227">227</a></p>
+<p id="n228" class="stm run hide_run"><a href="#n228">228</a></p>
+<p id="n229" class="pln"><a href="#n229">229</a></p>
+<p id="n230" class="pln"><a href="#n230">230</a></p>
+<p id="n231" class="stm run hide_run"><a href="#n231">231</a></p>
+<p id="n232" class="pln"><a href="#n232">232</a></p>
+<p id="n233" class="pln"><a href="#n233">233</a></p>
+<p id="n234" class="pln"><a href="#n234">234</a></p>
+<p id="n235" class="pln"><a href="#n235">235</a></p>
+<p id="n236" class="pln"><a href="#n236">236</a></p>
+<p id="n237" class="stm run hide_run"><a href="#n237">237</a></p>
+<p id="n238" class="pln"><a href="#n238">238</a></p>
+<p id="n239" class="stm run hide_run"><a href="#n239">239</a></p>
+<p id="n240" class="pln"><a href="#n240">240</a></p>
+<p id="n241" class="pln"><a href="#n241">241</a></p>
+<p id="n242" class="pln"><a href="#n242">242</a></p>
+<p id="n243" class="stm mis"><a href="#n243">243</a></p>
+<p id="n244" class="stm mis"><a href="#n244">244</a></p>
+<p id="n245" class="stm mis"><a href="#n245">245</a></p>
+<p id="n246" class="stm mis"><a href="#n246">246</a></p>
+<p id="n247" class="pln"><a href="#n247">247</a></p>
+<p id="n248" class="pln"><a href="#n248">248</a></p>
+<p id="n249" class="stm mis"><a href="#n249">249</a></p>
+<p id="n250" class="stm mis"><a href="#n250">250</a></p>
+<p id="n251" class="stm mis"><a href="#n251">251</a></p>
+<p id="n252" class="stm mis"><a href="#n252">252</a></p>
+<p id="n253" class="pln"><a href="#n253">253</a></p>
+<p id="n254" class="stm run hide_run"><a href="#n254">254</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""rest module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">import</span> <span class="nam">time</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">import</span> <span class="nam">wsme</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">error_base</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">services</span> <span class="key">as</span> <span class="nam">GroupService</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsme</span> <span class="key">import</span> <span class="nam">types</span> <span class="key">as</span> <span class="nam">wtypes</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">model</span> <span class="key">import</span> <span class="nam">model</span> <span class="key">as</span> <span class="nam">PythonModel</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run"><span class="key">class</span> <span class="nam">Groups</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">    <span class="str">"""main json header."""</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm run hide_run">    <span class="nam">id</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="stm run hide_run">    <span class="nam">name</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">    <span class="nam">description</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run">    <span class="nam">regions</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">description</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">regions</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln">        <span class="str">"""init function.</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln"><span class="str">        :param regions:</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">description</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span> <span class="op">=</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_to_python_obj</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="stm mis">        <span class="nam">obj</span> <span class="op">=</span> <span class="nam">PythonModel</span><span class="op">.</span><span class="nam">Groups</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="stm mis">        <span class="nam">obj</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm mis">        <span class="nam">obj</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm mis">        <span class="nam">obj</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">description</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm mis">        <span class="nam">obj</span><span class="op">.</span><span class="nam">regions</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="stm mis">        <span class="key">return</span> <span class="nam">obj</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t48" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run"><span class="key">class</span> <span class="nam">GroupWrapper</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln">    <span class="str">"""main cotain lis of groups."""</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t52" class="stm run hide_run">    <span class="nam">groups</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">Groups</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">groups</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t57" class="pln"><span class="str">        :param group:</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="stm mis">        <span class="nam">self</span><span class="op">.</span><span class="nam">groups</span> <span class="op">=</span> <span class="nam">groups</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t62" class="stm run hide_run"><span class="key">class</span> <span class="nam">OutputResource</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln">    <span class="str">"""class method returned json body."""</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t65" class="stm run hide_run">    <span class="nam">id</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">    <span class="nam">name</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">    <span class="nam">created</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm run hide_run">    <span class="nam">links</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">{</span><span class="nam">str</span><span class="op">:</span> <span class="nam">str</span><span class="op">}</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">created</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">links</span><span class="op">=</span><span class="op">{</span><span class="op">}</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="pln">        <span class="str">"""init function.</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t73" class="pln"><span class="str">        :param id:</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln"><span class="str">        :param created:</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln"><span class="str">        :param links:</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">created</span> <span class="op">=</span> <span class="nam">created</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">links</span> <span class="op">=</span> <span class="nam">links</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t82" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t83" class="stm run hide_run"><span class="key">class</span> <span class="nam">Result</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="pln">    <span class="str">"""class method json headers."""</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm run hide_run">    <span class="nam">group</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">OutputResource</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t88" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group</span><span class="op">=</span><span class="nam">OutputResource</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="pln">        <span class="str">"""init dunction.</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t91" class="pln"><span class="str">        :param group: The created group</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">group</span> <span class="op">=</span> <span class="nam">group</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t95" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t96" class="stm run hide_run"><span class="key">class</span> <span class="nam">GroupsController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln">    <span class="str">"""controller get resource."""</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t99" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">Groups</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="pln">        <span class="str">"""Handle get request.</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln"><span class="str">        :param id: Group ID</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="pln"><span class="str">        :return: 200 OK on success, 404 Not Found otherwise.</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Entered Get Group: id = {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'group:get_one'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t110" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t112" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">GroupService</span><span class="op">.</span><span class="nam">get_groups_data</span><span class="op">(</span><span class="nam">id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">'Returning group, regions: {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">result</span><span class="op">.</span><span class="nam">regions</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="stm run hide_run">            <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t116" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"GroupsController - Group not found"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t118" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t121" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t123" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t124" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t126" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t127" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">GroupWrapper</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t128" class="pln">    <span class="key">def</span> <span class="nam">get_all</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t129" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"gett all groups"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'group:get_all'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t131" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t132" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t133" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"api-get all groups"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t134" class="stm run hide_run">            <span class="nam">groups_wrraper</span> <span class="op">=</span> <span class="nam">GroupService</span><span class="op">.</span><span class="nam">get_all_groups</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t135" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"got groups {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">groups_wrraper</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t136" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t137" class="stm mis">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t138" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"api--fail to get all groups"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t139" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t140" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t141" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t142" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t143" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t144" class="stm run hide_run">        <span class="key">return</span> <span class="nam">groups_wrraper</span><span class="strut">&nbsp;</span></p>
+<p id="t145" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t146" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">Result</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">Groups</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t147" class="pln">    <span class="key">def</span> <span class="nam">post</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group_input</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t148" class="pln">        <span class="str">"""Handle post request.</span><span class="strut">&nbsp;</span></p>
+<p id="t149" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t150" class="pln"><span class="str">        :param group_input: json data</span><span class="strut">&nbsp;</span></p>
+<p id="t151" class="pln"><span class="str">        :return: 201 created on success, 409 otherwise.</span><span class="strut">&nbsp;</span></p>
+<p id="t152" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t153" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Entered Create Group"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t154" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"id = {}, name = {}, description = {}, regions = {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t155" class="pln">            <span class="nam">group_input</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t156" class="pln">            <span class="nam">group_input</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t157" class="pln">            <span class="nam">group_input</span><span class="op">.</span><span class="nam">description</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t158" class="pln">            <span class="nam">group_input</span><span class="op">.</span><span class="nam">regions</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t159" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'group:create'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t160" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t161" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t162" class="pln">            <span class="com"># May raise an exception which will return status code 400</span><span class="strut">&nbsp;</span></p>
+<p id="t163" class="stm run hide_run">            <span class="nam">GroupService</span><span class="op">.</span><span class="nam">create_group_in_db</span><span class="op">(</span><span class="nam">group_input</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t164" class="pln">                                            <span class="nam">group_input</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t165" class="pln">                                            <span class="nam">group_input</span><span class="op">.</span><span class="nam">description</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t166" class="pln">                                            <span class="nam">group_input</span><span class="op">.</span><span class="nam">regions</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t167" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Group created successfully in DB"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t168" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t169" class="pln">            <span class="com"># Create the group output data with the correct timestamp and link</span><span class="strut">&nbsp;</span></p>
+<p id="t170" class="stm run hide_run">            <span class="nam">group</span> <span class="op">=</span> <span class="nam">OutputResource</span><span class="op">(</span><span class="nam">group_input</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t171" class="pln">                                   <span class="nam">group_input</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t172" class="pln">                                   <span class="nam">repr</span><span class="op">(</span><span class="nam">int</span><span class="op">(</span><span class="nam">time</span><span class="op">.</span><span class="nam">time</span><span class="op">(</span><span class="op">)</span> <span class="op">*</span> <span class="num">1000</span><span class="op">)</span><span class="op">)</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t173" class="pln">                                   <span class="op">{</span><span class="str">'self'</span><span class="op">:</span> <span class="str">'{}/v2/orm/groups/{}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t174" class="pln">                                       <span class="nam">request</span><span class="op">.</span><span class="nam">application_url</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t175" class="pln">                                       <span class="nam">group_input</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span><span class="op">}</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t176" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t177" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region group {} {} created with regions: {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t178" class="pln">                <span class="nam">group_input</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span> <span class="nam">group_input</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span> <span class="nam">group_input</span><span class="op">.</span><span class="nam">regions</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t179" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'create group'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t180" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">group_input</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t181" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t182" class="stm run hide_run">            <span class="key">return</span> <span class="nam">Result</span><span class="op">(</span><span class="nam">group</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t183" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t184" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t185" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"GroupsController - {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t186" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t187" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t188" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t189" class="stm mis">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t190" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t191" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t192" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t193" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t194" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t195" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">None</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">204</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t196" class="pln">    <span class="key">def</span> <span class="nam">delete</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t197" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"delete group"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t198" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'group:delete'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t199" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t200" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t201" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t202" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"delete group with id {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t203" class="stm run hide_run">            <span class="nam">GroupService</span><span class="op">.</span><span class="nam">delete_group</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t204" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"done"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t205" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t206" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region group {} deleted'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t207" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'delete group'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t208" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t209" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t210" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t211" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t212" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t213" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"fail to delete group :- {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t214" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t215" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t216" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t217" class="stm run hide_run">        <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t218" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t219" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">Result</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">Groups</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t220" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t221" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">,</span> <span class="nam">group</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t222" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"update group"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t223" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'group:update'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t224" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t225" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t226" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"update group - id {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t227" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">GroupService</span><span class="op">.</span><span class="nam">update_group</span><span class="op">(</span><span class="nam">group</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t228" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"group updated to :- {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t229" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t230" class="pln">            <span class="com"># build result</span><span class="strut">&nbsp;</span></p>
+<p id="t231" class="stm run hide_run">            <span class="nam">group_result</span> <span class="op">=</span> <span class="nam">OutputResource</span><span class="op">(</span><span class="nam">result</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span> <span class="nam">result</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t232" class="pln">                                          <span class="nam">repr</span><span class="op">(</span><span class="nam">int</span><span class="op">(</span><span class="nam">time</span><span class="op">.</span><span class="nam">time</span><span class="op">(</span><span class="op">)</span> <span class="op">*</span> <span class="num">1000</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> <span class="op">{</span><span class="strut">&nbsp;</span></p>
+<p id="t233" class="pln">                                              <span class="str">'self'</span><span class="op">:</span> <span class="str">'{}/v2/orm/groups/{}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t234" class="pln">                                                  <span class="nam">request</span><span class="op">.</span><span class="nam">application_url</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t235" class="pln">                                                  <span class="nam">result</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span><span class="op">}</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t236" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t237" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region group {} {} updated with regions: {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t238" class="pln">                <span class="nam">group_id</span><span class="op">,</span> <span class="nam">group</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span> <span class="nam">group</span><span class="op">.</span><span class="nam">regions</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t239" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'update group'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t240" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t241" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t242" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t243" class="stm mis">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t244" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"group to update not found {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t245" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t246" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t247" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t248" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t249" class="stm mis">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t250" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"fail to update groupt -- id {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t251" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t252" class="stm mis">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t253" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t254" class="stm run hide_run">        <span class="key">return</span> <span class="nam">Result</span><span class="op">(</span><span class="nam">group_result</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_resources_metadata_py.html b/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_resources_metadata_py.html
new file mode 100644
index 00000000..fcb8e1ed
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_resources_metadata_py.html
@@ -0,0 +1,437 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/orm/resources/metadata.py: 78%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/orm/resources/metadata.py</b> :
+            <span class="pc_cov">78%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            85 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">66 run</span>
+            <span class="mis shortkey_m button_toggle_mis">19 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="stm run hide_run"><a href="#n39">39</a></p>
+<p id="n40" class="stm run hide_run"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="stm run hide_run"><a href="#n42">42</a></p>
+<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p>
+<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="stm run hide_run"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="stm run hide_run"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="pln"><a href="#n56">56</a></p>
+<p id="n57" class="pln"><a href="#n57">57</a></p>
+<p id="n58" class="stm run hide_run"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="pln"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p>
+<p id="n69" class="pln"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="stm run hide_run"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="stm mis"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+<p id="n75" class="stm mis"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="pln"><a href="#n77">77</a></p>
+<p id="n78" class="stm mis"><a href="#n78">78</a></p>
+<p id="n79" class="stm mis"><a href="#n79">79</a></p>
+<p id="n80" class="pln"><a href="#n80">80</a></p>
+<p id="n81" class="pln"><a href="#n81">81</a></p>
+<p id="n82" class="stm mis"><a href="#n82">82</a></p>
+<p id="n83" class="pln"><a href="#n83">83</a></p>
+<p id="n84" class="stm run hide_run"><a href="#n84">84</a></p>
+<p id="n85" class="stm mis"><a href="#n85">85</a></p>
+<p id="n86" class="stm mis"><a href="#n86">86</a></p>
+<p id="n87" class="pln"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="stm run hide_run"><a href="#n89">89</a></p>
+<p id="n90" class="stm run hide_run"><a href="#n90">90</a></p>
+<p id="n91" class="stm run hide_run"><a href="#n91">91</a></p>
+<p id="n92" class="pln"><a href="#n92">92</a></p>
+<p id="n93" class="pln"><a href="#n93">93</a></p>
+<p id="n94" class="pln"><a href="#n94">94</a></p>
+<p id="n95" class="stm run hide_run"><a href="#n95">95</a></p>
+<p id="n96" class="pln"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="pln"><a href="#n98">98</a></p>
+<p id="n99" class="pln"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="pln"><a href="#n101">101</a></p>
+<p id="n102" class="pln"><a href="#n102">102</a></p>
+<p id="n103" class="stm run hide_run"><a href="#n103">103</a></p>
+<p id="n104" class="stm run hide_run"><a href="#n104">104</a></p>
+<p id="n105" class="stm run hide_run"><a href="#n105">105</a></p>
+<p id="n106" class="pln"><a href="#n106">106</a></p>
+<p id="n107" class="stm run hide_run"><a href="#n107">107</a></p>
+<p id="n108" class="stm run hide_run"><a href="#n108">108</a></p>
+<p id="n109" class="pln"><a href="#n109">109</a></p>
+<p id="n110" class="stm mis"><a href="#n110">110</a></p>
+<p id="n111" class="pln"><a href="#n111">111</a></p>
+<p id="n112" class="stm mis"><a href="#n112">112</a></p>
+<p id="n113" class="pln"><a href="#n113">113</a></p>
+<p id="n114" class="pln"><a href="#n114">114</a></p>
+<p id="n115" class="stm mis"><a href="#n115">115</a></p>
+<p id="n116" class="stm mis"><a href="#n116">116</a></p>
+<p id="n117" class="pln"><a href="#n117">117</a></p>
+<p id="n118" class="pln"><a href="#n118">118</a></p>
+<p id="n119" class="stm mis"><a href="#n119">119</a></p>
+<p id="n120" class="pln"><a href="#n120">120</a></p>
+<p id="n121" class="stm run hide_run"><a href="#n121">121</a></p>
+<p id="n122" class="stm mis"><a href="#n122">122</a></p>
+<p id="n123" class="stm mis"><a href="#n123">123</a></p>
+<p id="n124" class="pln"><a href="#n124">124</a></p>
+<p id="n125" class="pln"><a href="#n125">125</a></p>
+<p id="n126" class="stm run hide_run"><a href="#n126">126</a></p>
+<p id="n127" class="stm run hide_run"><a href="#n127">127</a></p>
+<p id="n128" class="stm run hide_run"><a href="#n128">128</a></p>
+<p id="n129" class="pln"><a href="#n129">129</a></p>
+<p id="n130" class="pln"><a href="#n130">130</a></p>
+<p id="n131" class="pln"><a href="#n131">131</a></p>
+<p id="n132" class="stm run hide_run"><a href="#n132">132</a></p>
+<p id="n133" class="pln"><a href="#n133">133</a></p>
+<p id="n134" class="pln"><a href="#n134">134</a></p>
+<p id="n135" class="pln"><a href="#n135">135</a></p>
+<p id="n136" class="pln"><a href="#n136">136</a></p>
+<p id="n137" class="pln"><a href="#n137">137</a></p>
+<p id="n138" class="pln"><a href="#n138">138</a></p>
+<p id="n139" class="stm run hide_run"><a href="#n139">139</a></p>
+<p id="n140" class="pln"><a href="#n140">140</a></p>
+<p id="n141" class="stm run hide_run"><a href="#n141">141</a></p>
+<p id="n142" class="pln"><a href="#n142">142</a></p>
+<p id="n143" class="stm run hide_run"><a href="#n143">143</a></p>
+<p id="n144" class="pln"><a href="#n144">144</a></p>
+<p id="n145" class="stm run hide_run"><a href="#n145">145</a></p>
+<p id="n146" class="pln"><a href="#n146">146</a></p>
+<p id="n147" class="stm run hide_run"><a href="#n147">147</a></p>
+<p id="n148" class="pln"><a href="#n148">148</a></p>
+<p id="n149" class="stm run hide_run"><a href="#n149">149</a></p>
+<p id="n150" class="pln"><a href="#n150">150</a></p>
+<p id="n151" class="stm run hide_run"><a href="#n151">151</a></p>
+<p id="n152" class="pln"><a href="#n152">152</a></p>
+<p id="n153" class="pln"><a href="#n153">153</a></p>
+<p id="n154" class="pln"><a href="#n154">154</a></p>
+<p id="n155" class="stm run hide_run"><a href="#n155">155</a></p>
+<p id="n156" class="stm run hide_run"><a href="#n156">156</a></p>
+<p id="n157" class="stm run hide_run"><a href="#n157">157</a></p>
+<p id="n158" class="pln"><a href="#n158">158</a></p>
+<p id="n159" class="pln"><a href="#n159">159</a></p>
+<p id="n160" class="stm run hide_run"><a href="#n160">160</a></p>
+<p id="n161" class="stm run hide_run"><a href="#n161">161</a></p>
+<p id="n162" class="stm run hide_run"><a href="#n162">162</a></p>
+<p id="n163" class="pln"><a href="#n163">163</a></p>
+<p id="n164" class="pln"><a href="#n164">164</a></p>
+<p id="n165" class="pln"><a href="#n165">165</a></p>
+<p id="n166" class="stm run hide_run"><a href="#n166">166</a></p>
+<p id="n167" class="stm run hide_run"><a href="#n167">167</a></p>
+<p id="n168" class="stm mis"><a href="#n168">168</a></p>
+<p id="n169" class="stm mis"><a href="#n169">169</a></p>
+<p id="n170" class="stm mis"><a href="#n170">170</a></p>
+<p id="n171" class="stm mis"><a href="#n171">171</a></p>
+<p id="n172" class="pln"><a href="#n172">172</a></p>
+<p id="n173" class="stm mis"><a href="#n173">173</a></p>
+<p id="n174" class="pln"><a href="#n174">174</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">json</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">import</span> <span class="nam">wsme</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsme</span> <span class="key">import</span> <span class="nam">types</span> <span class="key">as</span> <span class="nam">wtypes</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">error_base</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">services</span> <span class="key">as</span> <span class="nam">RegionService</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run"><span class="key">class</span> <span class="nam">MetaData</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">    <span class="str">"""main json header."""</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm run hide_run">    <span class="nam">metadata</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">{</span><span class="nam">str</span><span class="op">:</span> <span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">}</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">=</span><span class="op">{</span><span class="op">}</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln">        <span class="str">"""init function.</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln"><span class="str">        :param regions:</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">metadata</span> <span class="op">=</span> <span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run"><span class="key">class</span> <span class="nam">RegionMetadataController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">MetaData</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln">    <span class="key">def</span> <span class="nam">get</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Get metadata for region id: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'metadata:get'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t42" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm run hide_run">            <span class="nam">region</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">get_region_by_id_or_name</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Got region metadata: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region</span><span class="op">.</span><span class="nam">metadata</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">            <span class="key">return</span> <span class="nam">MetaData</span><span class="op">(</span><span class="nam">region</span><span class="op">.</span><span class="nam">metadata</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t47" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"RegionsController - {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">MetaData</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">MetaData</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln">    <span class="key">def</span> <span class="nam">post</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_input</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln">        <span class="str">"""Handle post request.</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln"><span class="str">        :param region_id: region_id to add metadata to.</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln"><span class="str">        :param metadata_input: json data</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln"><span class="str">        :return: 201 created on success, 409 duplicate entry, 404 not found</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Entered Create region metadata"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Got metadata: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">metadata_input</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'metadata:create'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">_validate_request_input</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln">            <span class="com"># May raise an exception which will return status code 400</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="stm mis">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">add_region_metadata</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln">                                                       <span class="nam">metadata_input</span><span class="op">.</span><span class="nam">metadata</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Metadata was successfully added to "</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln">                         <span class="str">"region: {}. New metadata: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">result</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm mis">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region {} metadata added'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm mis">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'create metadata'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="stm mis">            <span class="key">return</span> <span class="nam">MetaData</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t95" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">MetaData</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">MetaData</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_input</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="pln">        <span class="str">"""Handle put request.</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="pln"><span class="str">        :param region_id: region_id to update metadata to.</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln"><span class="str">        :param metadata_input: json data</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="pln"><span class="str">        :return: 201 created on success, 404 not found</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Entered update region metadata"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Got metadata: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">metadata_input</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'metadata:update'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t107" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">_validate_request_input</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="pln">            <span class="com"># May raise an exception which will return status code 400</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="stm mis">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">update_region_metadata</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="pln">                                                          <span class="nam">metadata_input</span><span class="op">.</span><span class="nam">metadata</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t112" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Metadata was successfully added to "</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="pln">                         <span class="str">"region: {}. New metadata: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">result</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t115" class="stm mis">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region {} metadata updated'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="stm mis">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'update metadata'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t118" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="stm mis">            <span class="key">return</span> <span class="nam">MetaData</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t121" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t123" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t124" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t126" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t127" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t128" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t129" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t131" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t132" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">None</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">204</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t133" class="pln">    <span class="key">def</span> <span class="nam">delete</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_key</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t134" class="pln">        <span class="str">"""Handle delete request.</span><span class="strut">&nbsp;</span></p>
+<p id="t135" class="pln"><span class="str">        :param region_id: region_id to update metadata to.</span><span class="strut">&nbsp;</span></p>
+<p id="t136" class="pln"><span class="str">        :param metadata_key: metadata key to be deleted</span><span class="strut">&nbsp;</span></p>
+<p id="t137" class="pln"><span class="str">        :return: 204 deleted</span><span class="strut">&nbsp;</span></p>
+<p id="t138" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t139" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Entered delete region metadata with "</span><span class="strut">&nbsp;</span></p>
+<p id="t140" class="pln">                    <span class="str">"key: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">metadata_key</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t141" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'metadata:delete'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t142" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t143" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t144" class="pln">            <span class="com"># May raise an exception which will return status code 400</span><span class="strut">&nbsp;</span></p>
+<p id="t145" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">delete_metadata_from_region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t146" class="pln">                                                               <span class="nam">metadata_key</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t147" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Metadata was successfully deleted."</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t148" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t149" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region {} metadata {} deleted'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t150" class="pln">                <span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_key</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t151" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'delete metadata'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t152" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t153" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t154" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t155" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t156" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t157" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t158" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t159" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t160" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t161" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t162" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t163" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t164" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t165" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t166" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_validate_request_input</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t167" class="stm run hide_run">        <span class="nam">data_dict</span> <span class="op">=</span> <span class="nam">json</span><span class="op">.</span><span class="nam">loads</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">body</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t168" class="stm mis">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Got {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">data_dict</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t169" class="stm mis">        <span class="key">for</span> <span class="nam">k</span><span class="op">,</span> <span class="nam">v</span> <span class="key">in</span> <span class="nam">data_dict</span><span class="op">[</span><span class="str">'metadata'</span><span class="op">]</span><span class="op">.</span><span class="nam">iteritems</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t170" class="stm mis">            <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">v</span><span class="op">,</span> <span class="nam">basestring</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t171" class="stm mis">                <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Invalid json. value type list is expected, "</span><span class="strut">&nbsp;</span></p>
+<p id="t172" class="pln">                             <span class="str">"received string, for metadata key {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">k</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t173" class="stm mis">                <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span><span class="op">(</span><span class="num">400</span><span class="op">,</span> <span class="str">"Invalid json. Expecting list "</span><span class="strut">&nbsp;</span></p>
+<p id="t174" class="pln">                                                  <span class="str">"of metadata values, got string"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_resources_regions_py.html b/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_resources_regions_py.html
new file mode 100644
index 00000000..02014699
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_resources_regions_py.html
@@ -0,0 +1,819 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/orm/resources/regions.py: 97%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/orm/resources/regions.py</b> :
+            <span class="pc_cov">97%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            187 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">182 run</span>
+            <span class="mis shortkey_m button_toggle_mis">5 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="stm run hide_run"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="stm run hide_run"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="stm run hide_run"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="pln"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="stm run hide_run"><a href="#n46">46</a></p>
+<p id="n47" class="stm run hide_run"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="stm run hide_run"><a href="#n51">51</a></p>
+<p id="n52" class="stm run hide_run"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="stm run hide_run"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="stm run hide_run"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="stm run hide_run"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="stm run hide_run"><a href="#n64">64</a></p>
+<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p>
+<p id="n66" class="pln"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="pln"><a href="#n68">68</a></p>
+<p id="n69" class="pln"><a href="#n69">69</a></p>
+<p id="n70" class="pln"><a href="#n70">70</a></p>
+<p id="n71" class="pln"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="pln"><a href="#n73">73</a></p>
+<p id="n74" class="stm run hide_run"><a href="#n74">74</a></p>
+<p id="n75" class="stm run hide_run"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="stm run hide_run"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="stm run hide_run"><a href="#n79">79</a></p>
+<p id="n80" class="stm run hide_run"><a href="#n80">80</a></p>
+<p id="n81" class="stm run hide_run"><a href="#n81">81</a></p>
+<p id="n82" class="pln"><a href="#n82">82</a></p>
+<p id="n83" class="pln"><a href="#n83">83</a></p>
+<p id="n84" class="stm run hide_run"><a href="#n84">84</a></p>
+<p id="n85" class="pln"><a href="#n85">85</a></p>
+<p id="n86" class="pln"><a href="#n86">86</a></p>
+<p id="n87" class="stm run hide_run"><a href="#n87">87</a></p>
+<p id="n88" class="stm run hide_run"><a href="#n88">88</a></p>
+<p id="n89" class="stm run hide_run"><a href="#n89">89</a></p>
+<p id="n90" class="stm run hide_run"><a href="#n90">90</a></p>
+<p id="n91" class="stm run hide_run"><a href="#n91">91</a></p>
+<p id="n92" class="stm run hide_run"><a href="#n92">92</a></p>
+<p id="n93" class="stm run hide_run"><a href="#n93">93</a></p>
+<p id="n94" class="stm run hide_run"><a href="#n94">94</a></p>
+<p id="n95" class="stm run hide_run"><a href="#n95">95</a></p>
+<p id="n96" class="stm run hide_run"><a href="#n96">96</a></p>
+<p id="n97" class="stm run hide_run"><a href="#n97">97</a></p>
+<p id="n98" class="stm run hide_run"><a href="#n98">98</a></p>
+<p id="n99" class="stm run hide_run"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="stm run hide_run"><a href="#n101">101</a></p>
+<p id="n102" class="pln"><a href="#n102">102</a></p>
+<p id="n103" class="stm run hide_run"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="stm run hide_run"><a href="#n105">105</a></p>
+<p id="n106" class="pln"><a href="#n106">106</a></p>
+<p id="n107" class="pln"><a href="#n107">107</a></p>
+<p id="n108" class="pln"><a href="#n108">108</a></p>
+<p id="n109" class="pln"><a href="#n109">109</a></p>
+<p id="n110" class="pln"><a href="#n110">110</a></p>
+<p id="n111" class="pln"><a href="#n111">111</a></p>
+<p id="n112" class="pln"><a href="#n112">112</a></p>
+<p id="n113" class="pln"><a href="#n113">113</a></p>
+<p id="n114" class="pln"><a href="#n114">114</a></p>
+<p id="n115" class="pln"><a href="#n115">115</a></p>
+<p id="n116" class="pln"><a href="#n116">116</a></p>
+<p id="n117" class="pln"><a href="#n117">117</a></p>
+<p id="n118" class="pln"><a href="#n118">118</a></p>
+<p id="n119" class="pln"><a href="#n119">119</a></p>
+<p id="n120" class="pln"><a href="#n120">120</a></p>
+<p id="n121" class="pln"><a href="#n121">121</a></p>
+<p id="n122" class="pln"><a href="#n122">122</a></p>
+<p id="n123" class="pln"><a href="#n123">123</a></p>
+<p id="n124" class="pln"><a href="#n124">124</a></p>
+<p id="n125" class="pln"><a href="#n125">125</a></p>
+<p id="n126" class="pln"><a href="#n126">126</a></p>
+<p id="n127" class="pln"><a href="#n127">127</a></p>
+<p id="n128" class="stm run hide_run"><a href="#n128">128</a></p>
+<p id="n129" class="stm run hide_run"><a href="#n129">129</a></p>
+<p id="n130" class="stm run hide_run"><a href="#n130">130</a></p>
+<p id="n131" class="stm run hide_run"><a href="#n131">131</a></p>
+<p id="n132" class="stm run hide_run"><a href="#n132">132</a></p>
+<p id="n133" class="stm run hide_run"><a href="#n133">133</a></p>
+<p id="n134" class="stm run hide_run"><a href="#n134">134</a></p>
+<p id="n135" class="stm run hide_run"><a href="#n135">135</a></p>
+<p id="n136" class="stm run hide_run"><a href="#n136">136</a></p>
+<p id="n137" class="stm run hide_run"><a href="#n137">137</a></p>
+<p id="n138" class="stm run hide_run"><a href="#n138">138</a></p>
+<p id="n139" class="stm run hide_run"><a href="#n139">139</a></p>
+<p id="n140" class="stm run hide_run"><a href="#n140">140</a></p>
+<p id="n141" class="stm run hide_run"><a href="#n141">141</a></p>
+<p id="n142" class="stm run hide_run"><a href="#n142">142</a></p>
+<p id="n143" class="pln"><a href="#n143">143</a></p>
+<p id="n144" class="stm run hide_run"><a href="#n144">144</a></p>
+<p id="n145" class="stm run hide_run"><a href="#n145">145</a></p>
+<p id="n146" class="stm run hide_run"><a href="#n146">146</a></p>
+<p id="n147" class="stm run hide_run"><a href="#n147">147</a></p>
+<p id="n148" class="stm run hide_run"><a href="#n148">148</a></p>
+<p id="n149" class="stm run hide_run"><a href="#n149">149</a></p>
+<p id="n150" class="stm run hide_run"><a href="#n150">150</a></p>
+<p id="n151" class="stm run hide_run"><a href="#n151">151</a></p>
+<p id="n152" class="stm run hide_run"><a href="#n152">152</a></p>
+<p id="n153" class="stm run hide_run"><a href="#n153">153</a></p>
+<p id="n154" class="stm run hide_run"><a href="#n154">154</a></p>
+<p id="n155" class="stm run hide_run"><a href="#n155">155</a></p>
+<p id="n156" class="stm run hide_run"><a href="#n156">156</a></p>
+<p id="n157" class="stm run hide_run"><a href="#n157">157</a></p>
+<p id="n158" class="stm run hide_run"><a href="#n158">158</a></p>
+<p id="n159" class="stm run hide_run"><a href="#n159">159</a></p>
+<p id="n160" class="stm run hide_run"><a href="#n160">160</a></p>
+<p id="n161" class="stm run hide_run"><a href="#n161">161</a></p>
+<p id="n162" class="stm run hide_run"><a href="#n162">162</a></p>
+<p id="n163" class="stm run hide_run"><a href="#n163">163</a></p>
+<p id="n164" class="pln"><a href="#n164">164</a></p>
+<p id="n165" class="pln"><a href="#n165">165</a></p>
+<p id="n166" class="stm run hide_run"><a href="#n166">166</a></p>
+<p id="n167" class="pln"><a href="#n167">167</a></p>
+<p id="n168" class="pln"><a href="#n168">168</a></p>
+<p id="n169" class="stm run hide_run"><a href="#n169">169</a></p>
+<p id="n170" class="pln"><a href="#n170">170</a></p>
+<p id="n171" class="stm run hide_run"><a href="#n171">171</a></p>
+<p id="n172" class="pln"><a href="#n172">172</a></p>
+<p id="n173" class="pln"><a href="#n173">173</a></p>
+<p id="n174" class="pln"><a href="#n174">174</a></p>
+<p id="n175" class="pln"><a href="#n175">175</a></p>
+<p id="n176" class="pln"><a href="#n176">176</a></p>
+<p id="n177" class="stm mis"><a href="#n177">177</a></p>
+<p id="n178" class="pln"><a href="#n178">178</a></p>
+<p id="n179" class="pln"><a href="#n179">179</a></p>
+<p id="n180" class="stm run hide_run"><a href="#n180">180</a></p>
+<p id="n181" class="pln"><a href="#n181">181</a></p>
+<p id="n182" class="stm run hide_run"><a href="#n182">182</a></p>
+<p id="n183" class="stm run hide_run"><a href="#n183">183</a></p>
+<p id="n184" class="pln"><a href="#n184">184</a></p>
+<p id="n185" class="stm run hide_run"><a href="#n185">185</a></p>
+<p id="n186" class="pln"><a href="#n186">186</a></p>
+<p id="n187" class="stm run hide_run"><a href="#n187">187</a></p>
+<p id="n188" class="pln"><a href="#n188">188</a></p>
+<p id="n189" class="pln"><a href="#n189">189</a></p>
+<p id="n190" class="pln"><a href="#n190">190</a></p>
+<p id="n191" class="pln"><a href="#n191">191</a></p>
+<p id="n192" class="pln"><a href="#n192">192</a></p>
+<p id="n193" class="pln"><a href="#n193">193</a></p>
+<p id="n194" class="pln"><a href="#n194">194</a></p>
+<p id="n195" class="pln"><a href="#n195">195</a></p>
+<p id="n196" class="pln"><a href="#n196">196</a></p>
+<p id="n197" class="pln"><a href="#n197">197</a></p>
+<p id="n198" class="pln"><a href="#n198">198</a></p>
+<p id="n199" class="pln"><a href="#n199">199</a></p>
+<p id="n200" class="pln"><a href="#n200">200</a></p>
+<p id="n201" class="pln"><a href="#n201">201</a></p>
+<p id="n202" class="pln"><a href="#n202">202</a></p>
+<p id="n203" class="pln"><a href="#n203">203</a></p>
+<p id="n204" class="pln"><a href="#n204">204</a></p>
+<p id="n205" class="pln"><a href="#n205">205</a></p>
+<p id="n206" class="pln"><a href="#n206">206</a></p>
+<p id="n207" class="pln"><a href="#n207">207</a></p>
+<p id="n208" class="pln"><a href="#n208">208</a></p>
+<p id="n209" class="pln"><a href="#n209">209</a></p>
+<p id="n210" class="pln"><a href="#n210">210</a></p>
+<p id="n211" class="pln"><a href="#n211">211</a></p>
+<p id="n212" class="stm run hide_run"><a href="#n212">212</a></p>
+<p id="n213" class="stm run hide_run"><a href="#n213">213</a></p>
+<p id="n214" class="pln"><a href="#n214">214</a></p>
+<p id="n215" class="stm run hide_run"><a href="#n215">215</a></p>
+<p id="n216" class="pln"><a href="#n216">216</a></p>
+<p id="n217" class="pln"><a href="#n217">217</a></p>
+<p id="n218" class="pln"><a href="#n218">218</a></p>
+<p id="n219" class="pln"><a href="#n219">219</a></p>
+<p id="n220" class="pln"><a href="#n220">220</a></p>
+<p id="n221" class="stm run hide_run"><a href="#n221">221</a></p>
+<p id="n222" class="pln"><a href="#n222">222</a></p>
+<p id="n223" class="stm run hide_run"><a href="#n223">223</a></p>
+<p id="n224" class="stm run hide_run"><a href="#n224">224</a></p>
+<p id="n225" class="pln"><a href="#n225">225</a></p>
+<p id="n226" class="stm run hide_run"><a href="#n226">226</a></p>
+<p id="n227" class="pln"><a href="#n227">227</a></p>
+<p id="n228" class="stm run hide_run"><a href="#n228">228</a></p>
+<p id="n229" class="pln"><a href="#n229">229</a></p>
+<p id="n230" class="pln"><a href="#n230">230</a></p>
+<p id="n231" class="stm run hide_run"><a href="#n231">231</a></p>
+<p id="n232" class="pln"><a href="#n232">232</a></p>
+<p id="n233" class="stm run hide_run"><a href="#n233">233</a></p>
+<p id="n234" class="stm run hide_run"><a href="#n234">234</a></p>
+<p id="n235" class="stm run hide_run"><a href="#n235">235</a></p>
+<p id="n236" class="pln"><a href="#n236">236</a></p>
+<p id="n237" class="pln"><a href="#n237">237</a></p>
+<p id="n238" class="pln"><a href="#n238">238</a></p>
+<p id="n239" class="stm run hide_run"><a href="#n239">239</a></p>
+<p id="n240" class="stm run hide_run"><a href="#n240">240</a></p>
+<p id="n241" class="stm run hide_run"><a href="#n241">241</a></p>
+<p id="n242" class="pln"><a href="#n242">242</a></p>
+<p id="n243" class="pln"><a href="#n243">243</a></p>
+<p id="n244" class="pln"><a href="#n244">244</a></p>
+<p id="n245" class="stm run hide_run"><a href="#n245">245</a></p>
+<p id="n246" class="pln"><a href="#n246">246</a></p>
+<p id="n247" class="stm run hide_run"><a href="#n247">247</a></p>
+<p id="n248" class="stm run hide_run"><a href="#n248">248</a></p>
+<p id="n249" class="pln"><a href="#n249">249</a></p>
+<p id="n250" class="stm run hide_run"><a href="#n250">250</a></p>
+<p id="n251" class="stm run hide_run"><a href="#n251">251</a></p>
+<p id="n252" class="stm run hide_run"><a href="#n252">252</a></p>
+<p id="n253" class="stm run hide_run"><a href="#n253">253</a></p>
+<p id="n254" class="stm run hide_run"><a href="#n254">254</a></p>
+<p id="n255" class="stm run hide_run"><a href="#n255">255</a></p>
+<p id="n256" class="pln"><a href="#n256">256</a></p>
+<p id="n257" class="pln"><a href="#n257">257</a></p>
+<p id="n258" class="stm run hide_run"><a href="#n258">258</a></p>
+<p id="n259" class="stm run hide_run"><a href="#n259">259</a></p>
+<p id="n260" class="stm run hide_run"><a href="#n260">260</a></p>
+<p id="n261" class="pln"><a href="#n261">261</a></p>
+<p id="n262" class="pln"><a href="#n262">262</a></p>
+<p id="n263" class="pln"><a href="#n263">263</a></p>
+<p id="n264" class="stm run hide_run"><a href="#n264">264</a></p>
+<p id="n265" class="pln"><a href="#n265">265</a></p>
+<p id="n266" class="stm run hide_run"><a href="#n266">266</a></p>
+<p id="n267" class="pln"><a href="#n267">267</a></p>
+<p id="n268" class="stm run hide_run"><a href="#n268">268</a></p>
+<p id="n269" class="stm run hide_run"><a href="#n269">269</a></p>
+<p id="n270" class="pln"><a href="#n270">270</a></p>
+<p id="n271" class="stm run hide_run"><a href="#n271">271</a></p>
+<p id="n272" class="stm run hide_run"><a href="#n272">272</a></p>
+<p id="n273" class="stm run hide_run"><a href="#n273">273</a></p>
+<p id="n274" class="stm run hide_run"><a href="#n274">274</a></p>
+<p id="n275" class="pln"><a href="#n275">275</a></p>
+<p id="n276" class="stm run hide_run"><a href="#n276">276</a></p>
+<p id="n277" class="pln"><a href="#n277">277</a></p>
+<p id="n278" class="pln"><a href="#n278">278</a></p>
+<p id="n279" class="pln"><a href="#n279">279</a></p>
+<p id="n280" class="stm run hide_run"><a href="#n280">280</a></p>
+<p id="n281" class="pln"><a href="#n281">281</a></p>
+<p id="n282" class="pln"><a href="#n282">282</a></p>
+<p id="n283" class="stm run hide_run"><a href="#n283">283</a></p>
+<p id="n284" class="stm run hide_run"><a href="#n284">284</a></p>
+<p id="n285" class="stm run hide_run"><a href="#n285">285</a></p>
+<p id="n286" class="pln"><a href="#n286">286</a></p>
+<p id="n287" class="pln"><a href="#n287">287</a></p>
+<p id="n288" class="pln"><a href="#n288">288</a></p>
+<p id="n289" class="stm run hide_run"><a href="#n289">289</a></p>
+<p id="n290" class="stm mis"><a href="#n290">290</a></p>
+<p id="n291" class="stm mis"><a href="#n291">291</a></p>
+<p id="n292" class="pln"><a href="#n292">292</a></p>
+<p id="n293" class="pln"><a href="#n293">293</a></p>
+<p id="n294" class="pln"><a href="#n294">294</a></p>
+<p id="n295" class="stm run hide_run"><a href="#n295">295</a></p>
+<p id="n296" class="stm run hide_run"><a href="#n296">296</a></p>
+<p id="n297" class="stm run hide_run"><a href="#n297">297</a></p>
+<p id="n298" class="pln"><a href="#n298">298</a></p>
+<p id="n299" class="pln"><a href="#n299">299</a></p>
+<p id="n300" class="pln"><a href="#n300">300</a></p>
+<p id="n301" class="stm run hide_run"><a href="#n301">301</a></p>
+<p id="n302" class="pln"><a href="#n302">302</a></p>
+<p id="n303" class="stm run hide_run"><a href="#n303">303</a></p>
+<p id="n304" class="pln"><a href="#n304">304</a></p>
+<p id="n305" class="stm run hide_run"><a href="#n305">305</a></p>
+<p id="n306" class="stm run hide_run"><a href="#n306">306</a></p>
+<p id="n307" class="pln"><a href="#n307">307</a></p>
+<p id="n308" class="stm run hide_run"><a href="#n308">308</a></p>
+<p id="n309" class="pln"><a href="#n309">309</a></p>
+<p id="n310" class="stm run hide_run"><a href="#n310">310</a></p>
+<p id="n311" class="stm run hide_run"><a href="#n311">311</a></p>
+<p id="n312" class="stm run hide_run"><a href="#n312">312</a></p>
+<p id="n313" class="pln"><a href="#n313">313</a></p>
+<p id="n314" class="stm run hide_run"><a href="#n314">314</a></p>
+<p id="n315" class="stm run hide_run"><a href="#n315">315</a></p>
+<p id="n316" class="pln"><a href="#n316">316</a></p>
+<p id="n317" class="pln"><a href="#n317">317</a></p>
+<p id="n318" class="pln"><a href="#n318">318</a></p>
+<p id="n319" class="stm run hide_run"><a href="#n319">319</a></p>
+<p id="n320" class="stm run hide_run"><a href="#n320">320</a></p>
+<p id="n321" class="pln"><a href="#n321">321</a></p>
+<p id="n322" class="stm run hide_run"><a href="#n322">322</a></p>
+<p id="n323" class="pln"><a href="#n323">323</a></p>
+<p id="n324" class="pln"><a href="#n324">324</a></p>
+<p id="n325" class="stm run hide_run"><a href="#n325">325</a></p>
+<p id="n326" class="pln"><a href="#n326">326</a></p>
+<p id="n327" class="stm run hide_run"><a href="#n327">327</a></p>
+<p id="n328" class="pln"><a href="#n328">328</a></p>
+<p id="n329" class="pln"><a href="#n329">329</a></p>
+<p id="n330" class="stm run hide_run"><a href="#n330">330</a></p>
+<p id="n331" class="stm run hide_run"><a href="#n331">331</a></p>
+<p id="n332" class="pln"><a href="#n332">332</a></p>
+<p id="n333" class="stm run hide_run"><a href="#n333">333</a></p>
+<p id="n334" class="pln"><a href="#n334">334</a></p>
+<p id="n335" class="stm run hide_run"><a href="#n335">335</a></p>
+<p id="n336" class="pln"><a href="#n336">336</a></p>
+<p id="n337" class="stm run hide_run"><a href="#n337">337</a></p>
+<p id="n338" class="stm run hide_run"><a href="#n338">338</a></p>
+<p id="n339" class="pln"><a href="#n339">339</a></p>
+<p id="n340" class="stm run hide_run"><a href="#n340">340</a></p>
+<p id="n341" class="pln"><a href="#n341">341</a></p>
+<p id="n342" class="pln"><a href="#n342">342</a></p>
+<p id="n343" class="stm run hide_run"><a href="#n343">343</a></p>
+<p id="n344" class="pln"><a href="#n344">344</a></p>
+<p id="n345" class="pln"><a href="#n345">345</a></p>
+<p id="n346" class="pln"><a href="#n346">346</a></p>
+<p id="n347" class="stm run hide_run"><a href="#n347">347</a></p>
+<p id="n348" class="stm run hide_run"><a href="#n348">348</a></p>
+<p id="n349" class="stm run hide_run"><a href="#n349">349</a></p>
+<p id="n350" class="pln"><a href="#n350">350</a></p>
+<p id="n351" class="pln"><a href="#n351">351</a></p>
+<p id="n352" class="pln"><a href="#n352">352</a></p>
+<p id="n353" class="stm run hide_run"><a href="#n353">353</a></p>
+<p id="n354" class="stm mis"><a href="#n354">354</a></p>
+<p id="n355" class="stm mis"><a href="#n355">355</a></p>
+<p id="n356" class="pln"><a href="#n356">356</a></p>
+<p id="n357" class="pln"><a href="#n357">357</a></p>
+<p id="n358" class="stm run hide_run"><a href="#n358">358</a></p>
+<p id="n359" class="stm run hide_run"><a href="#n359">359</a></p>
+<p id="n360" class="pln"><a href="#n360">360</a></p>
+<p id="n361" class="pln"><a href="#n361">361</a></p>
+<p id="n362" class="stm run hide_run"><a href="#n362">362</a></p>
+<p id="n363" class="pln"><a href="#n363">363</a></p>
+<p id="n364" class="pln"><a href="#n364">364</a></p>
+<p id="n365" class="stm run hide_run"><a href="#n365">365</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""rest module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">import</span> <span class="nam">wsme</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsme</span> <span class="key">import</span> <span class="nam">types</span> <span class="key">as</span> <span class="nam">wtypes</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">model</span> <span class="key">import</span> <span class="nam">url_parm</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">model</span> <span class="key">import</span> <span class="nam">model</span> <span class="key">as</span> <span class="nam">PythonModel</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">error_base</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">services</span> <span class="key">as</span> <span class="nam">RegionService</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v2</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">resources</span><span class="op">.</span><span class="nam">metadata</span> <span class="key">import</span> <span class="nam">RegionMetadataController</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v2</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">resources</span><span class="op">.</span><span class="nam">status</span> <span class="key">import</span> <span class="nam">RegionStatusController</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">policy</span> <span class="key">import</span> <span class="nam">policy</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run"><span class="key">class</span> <span class="nam">Address</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln">    <span class="str">"""wsme class for address json."""</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">    <span class="nam">country</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="stm run hide_run">    <span class="nam">state</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">    <span class="nam">city</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">    <span class="nam">street</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">    <span class="nam">zip</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">country</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">state</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">city</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln">                 <span class="nam">street</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">zip</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln"><span class="str">        :param country:</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln"><span class="str">        :param state:</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln"><span class="str">        :param city:</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln"><span class="str">        :param street:</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="pln"><span class="str">        :param zip:</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">country</span> <span class="op">=</span> <span class="nam">country</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">state</span> <span class="op">=</span> <span class="nam">state</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">city</span> <span class="op">=</span> <span class="nam">city</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">street</span> <span class="op">=</span> <span class="nam">street</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">zip</span> <span class="op">=</span> <span class="nam">zip</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_to_clean_python_obj</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="stm run hide_run">        <span class="nam">obj</span> <span class="op">=</span> <span class="nam">PythonModel</span><span class="op">.</span><span class="nam">Address</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">country</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">country</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">state</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">state</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">city</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">city</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">street</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">street</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">zip</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">zip</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm run hide_run">        <span class="key">return</span> <span class="nam">obj</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t61" class="stm run hide_run"><span class="key">class</span> <span class="nam">EndPoint</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln">    <span class="str">"""class method endpoints body."""</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t64" class="stm run hide_run">    <span class="nam">publicurl</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"publicURL"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="stm run hide_run">    <span class="nam">type</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">publicurl</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">type</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="pln">        <span class="str">"""init function.</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t70" class="pln"><span class="str">        :param publicURL: field</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="pln"><span class="str">        :param typee: field</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">type</span> <span class="op">=</span> <span class="nam">type</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">publicurl</span> <span class="op">=</span> <span class="nam">publicurl</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t77" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_to_clean_python_obj</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">        <span class="nam">obj</span> <span class="op">=</span> <span class="nam">PythonModel</span><span class="op">.</span><span class="nam">EndPoint</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">publicurl</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">publicurl</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">type</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">type</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="stm run hide_run">        <span class="key">return</span> <span class="nam">obj</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t83" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm run hide_run"><span class="key">class</span> <span class="nam">RegionsData</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="pln">    <span class="str">"""class method json header."""</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t87" class="stm run hide_run">    <span class="nam">status</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="stm run hide_run">    <span class="nam">id</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="stm run hide_run">    <span class="nam">name</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="stm run hide_run">    <span class="nam">ranger_agent_version</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"rangerAgentVersion"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm run hide_run">    <span class="nam">open_stack_version</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"OSVersion"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="stm run hide_run">    <span class="nam">clli</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"CLLI"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="stm run hide_run">    <span class="nam">metadata</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">{</span><span class="nam">str</span><span class="op">:</span> <span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">}</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="stm run hide_run">    <span class="nam">endpoints</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">EndPoint</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="stm run hide_run">    <span class="nam">address</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">Address</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="stm run hide_run">    <span class="nam">design_type</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"designType"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="stm run hide_run">    <span class="nam">location_type</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"locationType"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="stm run hide_run">    <span class="nam">vlcp_name</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"vlcpName"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="stm run hide_run">    <span class="nam">is_ecomp</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">bool</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"is_ecomp"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln">                           <span class="nam">default</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="stm run hide_run">    <span class="nam">is_ssp</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">bool</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"is_ssp"</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="pln">                         <span class="nam">default</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="stm run hide_run">    <span class="nam">purpose_of_region</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">text</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"purpose_of_region"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t105" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">status</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">clli</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">design_type</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="pln">                 <span class="nam">location_type</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">vlcp_name</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">open_stack_version</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="pln">                 <span class="nam">address</span><span class="op">=</span><span class="nam">Address</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">ranger_agent_version</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">=</span><span class="op">{</span><span class="op">}</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="pln">                 <span class="nam">endpoint</span><span class="op">=</span><span class="op">[</span><span class="nam">EndPoint</span><span class="op">(</span><span class="op">)</span><span class="op">]</span><span class="op">,</span> <span class="nam">is_ecomp</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">is_ssp</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="pln">                 <span class="nam">purpose_of_region</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t112" class="pln"><span class="str">        :param status:</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="pln"><span class="str">        :param id:</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="pln"><span class="str">        :param name:</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="pln"><span class="str">        :param clli:</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="pln"><span class="str">        :param design_type:</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="pln"><span class="str">        :param location_type:</span><span class="strut">&nbsp;</span></p>
+<p id="t118" class="pln"><span class="str">        :param vlcp_name:</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="pln"><span class="str">        :param open_stack_version:</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="pln"><span class="str">        :param address:</span><span class="strut">&nbsp;</span></p>
+<p id="t121" class="pln"><span class="str">        :param ranger_agent_version:</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="pln"><span class="str">        :param metadata:</span><span class="strut">&nbsp;</span></p>
+<p id="t123" class="pln"><span class="str">        :param endpoint:</span><span class="strut">&nbsp;</span></p>
+<p id="t124" class="pln"><span class="str">        :param is_ecomp:</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="pln"><span class="str">        :param is_ssp:</span><span class="strut">&nbsp;</span></p>
+<p id="t126" class="pln"><span class="str">        :param purpose_of_region</span><span class="strut">&nbsp;</span></p>
+<p id="t127" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t128" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status</span> <span class="op">=</span> <span class="nam">status</span><span class="strut">&nbsp;</span></p>
+<p id="t129" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t131" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">clli</span> <span class="op">=</span> <span class="nam">clli</span><span class="strut">&nbsp;</span></p>
+<p id="t132" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">ranger_agent_version</span> <span class="op">=</span> <span class="nam">ranger_agent_version</span><span class="strut">&nbsp;</span></p>
+<p id="t133" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">metadata</span> <span class="op">=</span> <span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t134" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">endpoint</span> <span class="op">=</span> <span class="nam">endpoint</span><span class="strut">&nbsp;</span></p>
+<p id="t135" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">design_type</span> <span class="op">=</span> <span class="nam">design_type</span><span class="strut">&nbsp;</span></p>
+<p id="t136" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">location_type</span> <span class="op">=</span> <span class="nam">location_type</span><span class="strut">&nbsp;</span></p>
+<p id="t137" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">vlcp_name</span> <span class="op">=</span> <span class="nam">vlcp_name</span><span class="strut">&nbsp;</span></p>
+<p id="t138" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">address</span> <span class="op">=</span> <span class="nam">address</span><span class="strut">&nbsp;</span></p>
+<p id="t139" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">open_stack_version</span> <span class="op">=</span> <span class="nam">open_stack_version</span><span class="strut">&nbsp;</span></p>
+<p id="t140" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">is_ecomp</span> <span class="op">=</span> <span class="nam">is_ecomp</span><span class="strut">&nbsp;</span></p>
+<p id="t141" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">is_ssp</span> <span class="op">=</span> <span class="nam">is_ssp</span><span class="strut">&nbsp;</span></p>
+<p id="t142" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">purpose_of_region</span> <span class="op">=</span> <span class="nam">purpose_of_region</span><span class="strut">&nbsp;</span></p>
+<p id="t143" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t144" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_to_clean_python_obj</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t145" class="stm run hide_run">        <span class="nam">obj</span> <span class="op">=</span> <span class="nam">PythonModel</span><span class="op">.</span><span class="nam">RegionData</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t146" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">endpoints</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t147" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">status</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">status</span><span class="strut">&nbsp;</span></p>
+<p id="t148" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t149" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t150" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">ranger_agent_version</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">ranger_agent_version</span><span class="strut">&nbsp;</span></p>
+<p id="t151" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">clli</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">clli</span><span class="strut">&nbsp;</span></p>
+<p id="t152" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">metadata</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t153" class="stm run hide_run">        <span class="key">for</span> <span class="nam">endpoint</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">endpoints</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t154" class="stm run hide_run">            <span class="nam">obj</span><span class="op">.</span><span class="nam">endpoints</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">endpoint</span><span class="op">.</span><span class="nam">_to_clean_python_obj</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t155" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">address</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">address</span><span class="op">.</span><span class="nam">_to_clean_python_obj</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t156" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">design_type</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">design_type</span><span class="strut">&nbsp;</span></p>
+<p id="t157" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">location_type</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">location_type</span><span class="strut">&nbsp;</span></p>
+<p id="t158" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">vlcp_name</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">vlcp_name</span><span class="strut">&nbsp;</span></p>
+<p id="t159" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">open_stack_version</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">open_stack_version</span><span class="strut">&nbsp;</span></p>
+<p id="t160" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">is_ecomp</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">is_ecomp</span><span class="strut">&nbsp;</span></p>
+<p id="t161" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">is_ssp</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">is_ssp</span><span class="strut">&nbsp;</span></p>
+<p id="t162" class="stm run hide_run">        <span class="nam">obj</span><span class="op">.</span><span class="nam">purpose_of_region</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">purpose_of_region</span><span class="strut">&nbsp;</span></p>
+<p id="t163" class="stm run hide_run">        <span class="key">return</span> <span class="nam">obj</span><span class="strut">&nbsp;</span></p>
+<p id="t164" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t165" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t166" class="stm run hide_run"><span class="key">class</span> <span class="nam">Regions</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t167" class="pln">    <span class="str">"""main json header."""</span><span class="strut">&nbsp;</span></p>
+<p id="t168" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t169" class="stm run hide_run">    <span class="nam">regions</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">[</span><span class="nam">RegionsData</span><span class="op">]</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t170" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t171" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">regions</span><span class="op">=</span><span class="op">[</span><span class="nam">RegionsData</span><span class="op">(</span><span class="op">)</span><span class="op">]</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t172" class="pln">        <span class="str">"""init function.</span><span class="strut">&nbsp;</span></p>
+<p id="t173" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t174" class="pln"><span class="str">        :param regions:</span><span class="strut">&nbsp;</span></p>
+<p id="t175" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t176" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t177" class="stm mis">        <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span> <span class="op">=</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t178" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t179" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t180" class="stm run hide_run"><span class="key">class</span> <span class="nam">RegionsController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t181" class="pln">    <span class="str">"""controller get resource."""</span><span class="strut">&nbsp;</span></p>
+<p id="t182" class="stm run hide_run">    <span class="nam">metadata</span> <span class="op">=</span> <span class="nam">RegionMetadataController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t183" class="stm run hide_run">    <span class="nam">status</span> <span class="op">=</span> <span class="nam">RegionStatusController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t184" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t185" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">Regions</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t186" class="pln">              <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t187" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_all</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">type</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">status</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">rangerAgentVersion</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t188" class="pln">                <span class="nam">clli</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">regionname</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">osversion</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">valet</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t189" class="pln">                <span class="nam">state</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">country</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">city</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">street</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">zip</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t190" class="pln">                <span class="nam">is_ecomp</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">is_ssp</span><span class="op">=</span><span class="nam">False</span><span class="op">,</span> <span class="nam">purpose_of_region</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t191" class="pln">        <span class="str">"""get regions.</span><span class="strut">&nbsp;</span></p>
+<p id="t192" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t193" class="pln"><span class="str">        :param type: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t194" class="pln"><span class="str">        :param status: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t195" class="pln"><span class="str">        :param metadata: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t196" class="pln"><span class="str">        :param rangerAgentVersion: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t197" class="pln"><span class="str">        :param clli: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t198" class="pln"><span class="str">        :param regionname: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t199" class="pln"><span class="str">        :param osversion: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t200" class="pln"><span class="str">        :param valet: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t201" class="pln"><span class="str">        :param state: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t202" class="pln"><span class="str">        :param country: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t203" class="pln"><span class="str">        :param city: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t204" class="pln"><span class="str">        :param street: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t205" class="pln"><span class="str">        :param zip: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t206" class="pln"><span class="str">        :param is_ecomp: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t207" class="pln"><span class="str">        :param is_ssp: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t208" class="pln"><span class="str">        :param purpose_of_region: query field</span><span class="strut">&nbsp;</span></p>
+<p id="t209" class="pln"><span class="str">        :return: json from db</span><span class="strut">&nbsp;</span></p>
+<p id="t210" class="pln"><span class="str">        :exception: EntityNotFoundError 404</span><span class="strut">&nbsp;</span></p>
+<p id="t211" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t212" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Entered Get Regions"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t213" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'region:get_all'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t214" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t215" class="stm run hide_run">        <span class="nam">url_args</span> <span class="op">=</span> <span class="op">{</span><span class="str">'type'</span><span class="op">:</span> <span class="nam">type</span><span class="op">,</span> <span class="str">'status'</span><span class="op">:</span> <span class="nam">status</span><span class="op">,</span> <span class="str">'metadata'</span><span class="op">:</span> <span class="nam">metadata</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t216" class="pln">                    <span class="str">'rangerAgentVersion'</span><span class="op">:</span> <span class="nam">rangerAgentVersion</span><span class="op">,</span> <span class="str">'clli'</span><span class="op">:</span> <span class="nam">clli</span><span class="op">,</span> <span class="str">'regionname'</span><span class="op">:</span> <span class="nam">regionname</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t217" class="pln">                    <span class="str">'osversion'</span><span class="op">:</span> <span class="nam">osversion</span><span class="op">,</span> <span class="str">'valet'</span><span class="op">:</span> <span class="nam">valet</span><span class="op">,</span> <span class="str">'state'</span><span class="op">:</span> <span class="nam">state</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t218" class="pln">                    <span class="str">'country'</span><span class="op">:</span> <span class="nam">country</span><span class="op">,</span> <span class="str">'city'</span><span class="op">:</span> <span class="nam">city</span><span class="op">,</span> <span class="str">'street'</span><span class="op">:</span> <span class="nam">street</span><span class="op">,</span> <span class="str">'zip'</span><span class="op">:</span> <span class="nam">zip</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t219" class="pln">                    <span class="str">'is_ecomp'</span><span class="op">:</span> <span class="nam">is_ecomp</span><span class="op">,</span> <span class="str">'is_ssp'</span><span class="op">:</span> <span class="nam">is_ssp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t220" class="pln">                    <span class="str">'purpose_of_region'</span><span class="op">:</span> <span class="nam">purpose_of_region</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t221" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Parameters: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">url_args</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t222" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t223" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t224" class="stm run hide_run">            <span class="nam">url_args</span> <span class="op">=</span> <span class="nam">url_parm</span><span class="op">.</span><span class="nam">UrlParms</span><span class="op">(</span><span class="op">**</span><span class="nam">url_args</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t225" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t226" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">get_regions_data</span><span class="op">(</span><span class="nam">url_args</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t227" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t228" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Returning regions: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="str">', '</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t229" class="pln">                <span class="op">[</span><span class="nam">region</span><span class="op">.</span><span class="nam">name</span> <span class="key">for</span> <span class="nam">region</span> <span class="key">in</span> <span class="nam">result</span><span class="op">.</span><span class="nam">regions</span><span class="op">]</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t230" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t231" class="stm run hide_run">            <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t232" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t233" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t234" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"RegionsController {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t235" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t236" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t237" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t238" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t239" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t240" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t241" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t242" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t243" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t244" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t245" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">RegionsData</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t246" class="pln">    <span class="key">def</span> <span class="nam">get_one</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">id_or_name</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t247" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"API: Entered get region by id or name: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">id_or_name</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t248" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'region:get_one'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t249" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t250" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t251" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">get_region_by_id_or_name</span><span class="op">(</span><span class="nam">id_or_name</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t252" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"API: Got region {} success: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">id_or_name</span><span class="op">,</span> <span class="nam">result</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t253" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t254" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"RegionsController {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t255" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t256" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t257" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t258" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t259" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t260" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t261" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t262" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t263" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t264" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t265" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t266" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">RegionsData</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">RegionsData</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t267" class="pln">    <span class="key">def</span> <span class="nam">post</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">full_region_input</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t268" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"API: CreateRegion"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t269" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'region:create'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t270" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t271" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t272" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"API: create region .. data = : {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">full_region_input</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t273" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">create_full_region</span><span class="op">(</span><span class="nam">full_region_input</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t274" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"API: region created : {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t275" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t276" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region {} {} created: AICversion {}, OSversion {}, CLLI {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t277" class="pln">                <span class="nam">full_region_input</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span> <span class="nam">full_region_input</span><span class="op">.</span><span class="nam">design_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t278" class="pln">                <span class="nam">full_region_input</span><span class="op">.</span><span class="nam">ranger_agent_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t279" class="pln">                <span class="nam">full_region_input</span><span class="op">.</span><span class="nam">open_stack_version</span><span class="op">,</span> <span class="nam">full_region_input</span><span class="op">.</span><span class="nam">clli</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t280" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'create region'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t281" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">full_region_input</span><span class="op">.</span><span class="nam">id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t282" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t283" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t284" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Error in save region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t285" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t286" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">status_code</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t287" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t288" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t289" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ConflictError</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t290" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Conflict error {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t291" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t292" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t293" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t294" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t295" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t296" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Error in creating region .. reason:- {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t297" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t298" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t299" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t300" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t301" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t302" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t303" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">None</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">204</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t304" class="pln">    <span class="key">def</span> <span class="nam">delete</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t305" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Delete Region"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t306" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'region:delete'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t307" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t308" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t309" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t310" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"delete region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t311" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">delete_region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t312" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"region deleted"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t313" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t314" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region {} deleted'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t315" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'delete region'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t316" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t317" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t318" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t319" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t320" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t321" class="pln">                <span class="str">"error in deleting region .. reason:- {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t322" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t323" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t324" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t325" class="stm run hide_run">        <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t326" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t327" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">RegionsData</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">RegionsData</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t328" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t329" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">region</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t330" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"API: update region"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t331" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'region:update'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t332" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t333" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t334" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t335" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t336" class="pln">                <span class="str">"region to update {} with{}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">region</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t337" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">update_region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t338" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"API: region {} updated"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t339" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t340" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region {} {} modified: AICversion {}, OSversion {}, CLLI {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t341" class="pln">                <span class="nam">region</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span> <span class="nam">region</span><span class="op">.</span><span class="nam">design_type</span><span class="op">,</span> <span class="nam">region</span><span class="op">.</span><span class="nam">ranger_agent_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t342" class="pln">                <span class="nam">region</span><span class="op">.</span><span class="nam">open_stack_version</span><span class="op">,</span> <span class="nam">region</span><span class="op">.</span><span class="nam">clli</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t343" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'update region'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t344" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t345" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t346" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t347" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t348" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"region {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t349" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t350" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">status_code</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t351" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t352" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t353" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t354" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"not valid input {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t355" class="stm mis">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t356" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">status_code</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t357" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t358" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t359" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t360" class="pln">                <span class="str">"API: error in updating region {}.. reason:- {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t361" class="pln">                                                                        <span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t362" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t363" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t364" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t365" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-13 01:58
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_resources_status_py.html b/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_resources_status_py.html
new file mode 100644
index 00000000..f719798a
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_resources_status_py.html
@@ -0,0 +1,299 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/orm/resources/status.py: 94%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/orm/resources/status.py</b> :
+            <span class="pc_cov">94%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            47 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">44 run</span>
+            <span class="mis shortkey_m button_toggle_mis">3 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p>
+<p id="n25" class="stm run hide_run"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="pln"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="pln"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="stm run hide_run"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="pln"><a href="#n58">58</a></p>
+<p id="n59" class="stm run hide_run"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="stm run hide_run"><a href="#n64">64</a></p>
+<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p>
+<p id="n66" class="pln"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="pln"><a href="#n68">68</a></p>
+<p id="n69" class="stm run hide_run"><a href="#n69">69</a></p>
+<p id="n70" class="pln"><a href="#n70">70</a></p>
+<p id="n71" class="pln"><a href="#n71">71</a></p>
+<p id="n72" class="stm run hide_run"><a href="#n72">72</a></p>
+<p id="n73" class="pln"><a href="#n73">73</a></p>
+<p id="n74" class="stm run hide_run"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="pln"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="pln"><a href="#n79">79</a></p>
+<p id="n80" class="stm run hide_run"><a href="#n80">80</a></p>
+<p id="n81" class="stm run hide_run"><a href="#n81">81</a></p>
+<p id="n82" class="stm run hide_run"><a href="#n82">82</a></p>
+<p id="n83" class="pln"><a href="#n83">83</a></p>
+<p id="n84" class="pln"><a href="#n84">84</a></p>
+<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p>
+<p id="n87" class="stm run hide_run"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="pln"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="stm run hide_run"><a href="#n91">91</a></p>
+<p id="n92" class="pln"><a href="#n92">92</a></p>
+<p id="n93" class="stm mis"><a href="#n93">93</a></p>
+<p id="n94" class="pln"><a href="#n94">94</a></p>
+<p id="n95" class="pln"><a href="#n95">95</a></p>
+<p id="n96" class="stm run hide_run"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="pln"><a href="#n98">98</a></p>
+<p id="n99" class="stm mis"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="pln"><a href="#n101">101</a></p>
+<p id="n102" class="stm run hide_run"><a href="#n102">102</a></p>
+<p id="n103" class="pln"><a href="#n103">103</a></p>
+<p id="n104" class="stm mis"><a href="#n104">104</a></p>
+<p id="n105" class="pln"><a href="#n105">105</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">import</span> <span class="nam">pecan</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">rest</span><span class="op">,</span> <span class="nam">request</span><span class="op">,</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">import</span> <span class="nam">wsme</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsme</span> <span class="key">import</span> <span class="nam">types</span> <span class="key">as</span> <span class="nam">wtypes</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">wsmeext</span><span class="op">.</span><span class="nam">pecan</span> <span class="key">import</span> <span class="nam">wsexpose</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">utils</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">error_base</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">services</span> <span class="key">as</span> <span class="nam">RegionService</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">authentication</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run"><span class="key">class</span> <span class="nam">RegionStatus</span><span class="op">(</span><span class="nam">wtypes</span><span class="op">.</span><span class="nam">DynamicBase</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">    <span class="str">"""main json header."""</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm run hide_run">    <span class="nam">status</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="nam">str</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">True</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="stm run hide_run">    <span class="nam">links</span> <span class="op">=</span> <span class="nam">wsme</span><span class="op">.</span><span class="nam">wsattr</span><span class="op">(</span><span class="op">{</span><span class="nam">str</span><span class="op">:</span> <span class="nam">str</span><span class="op">}</span><span class="op">,</span> <span class="nam">mandatory</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">status</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">links</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln"><span class="str">        RegionStatus wrapper</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="str">        :param status:</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status</span> <span class="op">=</span> <span class="nam">status</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">links</span> <span class="op">=</span> <span class="nam">links</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm run hide_run"><span class="key">class</span> <span class="nam">RegionStatusController</span><span class="op">(</span><span class="nam">rest</span><span class="op">.</span><span class="nam">RestController</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">RegionStatus</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">RegionStatus</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">201</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln">    <span class="key">def</span> <span class="nam">put</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">new_status</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln"><span class="str">        Handle put request to modify region status</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="pln"><span class="str">        :param region_id:</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln"><span class="str">        :param new_status:</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="pln"><span class="str">        :return: 200 for updated, 404 for region not found</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln"><span class="str">        400 invalid status</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Entered update region status"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Got status: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">new_status</span><span class="op">.</span><span class="nam">status</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm run hide_run">        <span class="nam">authentication</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="str">'status:put'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">            <span class="nam">allowed_status</span> <span class="op">=</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">region_options</span><span class="op">.</span><span class="nam">allowed_status_values</span><span class="op">[</span><span class="op">:</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">            <span class="key">if</span> <span class="nam">new_status</span><span class="op">.</span><span class="nam">status</span> <span class="key">not</span> <span class="key">in</span> <span class="nam">allowed_status</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">                <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Invalid status. Region status "</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="pln">                             <span class="str">"must be one of {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">allowed_status</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="stm run hide_run">                <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln">                    <span class="nam">message</span><span class="op">=</span><span class="str">"Invalid status. Region status "</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln">                            <span class="str">"must be one of {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">allowed_status</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln">            <span class="com"># May raise an exception which will return status code 400</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="stm run hide_run">            <span class="nam">status</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">update_region_status</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">new_status</span><span class="op">.</span><span class="nam">status</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="stm run hide_run">            <span class="nam">base_link</span> <span class="op">=</span> <span class="str">'https://{0}:{1}{2}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">conf</span><span class="op">.</span><span class="nam">server</span><span class="op">.</span><span class="nam">host</span><span class="op">,</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">server</span><span class="op">.</span><span class="nam">port</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="pln">                                                    <span class="nam">pecan</span><span class="op">.</span><span class="nam">request</span><span class="op">.</span><span class="nam">path</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">            <span class="nam">link</span> <span class="op">=</span> <span class="op">{</span><span class="str">'self'</span><span class="op">:</span> <span class="nam">base_link</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t69" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Region status for region id {}, was successfully "</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="pln">                         <span class="str">"changed to: {}."</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">new_status</span><span class="op">.</span><span class="nam">status</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t72" class="stm run hide_run">            <span class="nam">event_details</span> <span class="op">=</span> <span class="str">'Region {} status updated to {}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="pln">                <span class="nam">region_id</span><span class="op">,</span> <span class="nam">new_status</span><span class="op">.</span><span class="nam">status</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="stm run hide_run">            <span class="nam">utils</span><span class="op">.</span><span class="nam">audit_trail</span><span class="op">(</span><span class="str">'Update status'</span><span class="op">,</span> <span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln">                              <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln">                              <span class="nam">event_details</span><span class="op">=</span><span class="nam">event_details</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">            <span class="key">return</span> <span class="nam">RegionStatus</span><span class="op">(</span><span class="nam">status</span><span class="op">,</span> <span class="nam">link</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t80" class="stm run hide_run">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ErrorStatus</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="pln">                                      <span class="nam">message</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">message</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="nam">e</span><span class="op">.</span><span class="nam">status_code</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln">                                      <span class="nam">status_code</span><span class="op">=</span><span class="num">500</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="pln">                                      <span class="nam">error_details</span><span class="op">=</span><span class="nam">exception</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="pln">    <span class="key">def</span> <span class="nam">get</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="stm mis">        <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="pln">                                  <span class="nam">status_code</span><span class="op">=</span><span class="num">405</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t96" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">RegionStatus</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">body</span><span class="op">=</span><span class="nam">RegionStatus</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">200</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln">              <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="pln">    <span class="key">def</span> <span class="nam">post</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">status</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="stm mis">        <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln">                                  <span class="nam">status_code</span><span class="op">=</span><span class="num">405</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t102" class="stm run hide_run">    <span class="op">@</span><span class="nam">wsexpose</span><span class="op">(</span><span class="nam">str</span><span class="op">,</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">rest_content_types</span><span class="op">=</span><span class="str">'json'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="pln">    <span class="key">def</span> <span class="nam">delete</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="stm mis">        <span class="key">raise</span> <span class="nam">err_utils</span><span class="op">.</span><span class="nam">get_error</span><span class="op">(</span><span class="nam">request</span><span class="op">.</span><span class="nam">transaction_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="pln">                                  <span class="nam">status_code</span><span class="op">=</span><span class="num">405</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_root_py.html b/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_root_py.html
new file mode 100644
index 00000000..df7c358c
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_controllers_v2_orm_root_py.html
@@ -0,0 +1,109 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/orm/root.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/orm/root.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            5 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">5 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""ORM controller module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v2</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">resources</span> <span class="key">import</span> <span class="nam">groups</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v2</span><span class="op">.</span><span class="nam">orm</span><span class="op">.</span><span class="nam">resources</span> <span class="key">import</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">class</span> <span class="nam">OrmController</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln">    <span class="str">"""ORM controller class."""</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run">    <span class="nam">regions</span> <span class="op">=</span> <span class="nam">regions</span><span class="op">.</span><span class="nam">RegionsController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run">    <span class="nam">groups</span> <span class="op">=</span> <span class="nam">groups</span><span class="op">.</span><span class="nam">GroupsController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_controllers_v2_root_py.html b/orm/services/region_manager/htmlcov/rms_controllers_v2_root_py.html
new file mode 100644
index 00000000..addd8179
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_controllers_v2_root_py.html
@@ -0,0 +1,105 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/controllers/v2/root.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/controllers/v2/root.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            3 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">3 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""V2 root controller module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">controllers</span><span class="op">.</span><span class="nam">v2</span><span class="op">.</span><span class="nam">orm</span> <span class="key">import</span> <span class="nam">root</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">class</span> <span class="nam">V2Controller</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln">    <span class="str">"""V2 root controller class."""</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run">    <span class="nam">orm</span> <span class="op">=</span> <span class="nam">root</span><span class="op">.</span><span class="nam">OrmController</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_external_mock___init___py.html b/orm/services/region_manager/htmlcov/rms_external_mock___init___py.html
new file mode 100644
index 00000000..301a20c8
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_external_mock___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_external_mock_audit_client___init___py.html b/orm/services/region_manager/htmlcov/rms_external_mock_audit_client___init___py.html
new file mode 100644
index 00000000..0ba1d066
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_external_mock_audit_client___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/audit_client/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/audit_client/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_external_mock_audit_client_api___init___py.html b/orm/services/region_manager/htmlcov/rms_external_mock_audit_client_api___init___py.html
new file mode 100644
index 00000000..9415cc4a
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_external_mock_audit_client_api___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/audit_client/api/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/audit_client/api/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_external_mock_audit_client_api_audit_py.html b/orm/services/region_manager/htmlcov/rms_external_mock_audit_client_api_audit_py.html
new file mode 100644
index 00000000..92fe9996
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_external_mock_audit_client_api_audit_py.html
@@ -0,0 +1,101 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/audit_client/api/audit.py: 0%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/audit_client/api/audit.py</b> :
+            <span class="pc_cov">0%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            4 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">4 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm mis"><a href="#n1">1</a></p>
+<p id="n2" class="stm mis"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm mis"><a href="#n5">5</a></p>
+<p id="n6" class="stm mis"><a href="#n6">6</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm mis"><span class="key">def</span> <span class="nam">audit</span><span class="op">(</span><span class="op">*</span><span class="nam">args</span><span class="op">,</span> <span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm mis">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm mis"><span class="key">def</span> <span class="nam">init</span><span class="op">(</span><span class="op">*</span><span class="nam">args</span><span class="op">,</span> <span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm mis">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_external_mock_keystone_utils___init___py.html b/orm/services/region_manager/htmlcov/rms_external_mock_keystone_utils___init___py.html
new file mode 100644
index 00000000..c91da3f1
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_external_mock_keystone_utils___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/keystone_utils/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/keystone_utils/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_external_mock_keystone_utils_tokens_py.html b/orm/services/region_manager/htmlcov/rms_external_mock_keystone_utils_tokens_py.html
new file mode 100644
index 00000000..b833593b
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_external_mock_keystone_utils_tokens_py.html
@@ -0,0 +1,103 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/keystone_utils/tokens.py: 80%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/keystone_utils/tokens.py</b> :
+            <span class="pc_cov">80%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            5 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">4 run</span>
+            <span class="mis shortkey_m button_toggle_mis">1 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm mis"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_token_user</span><span class="op">(</span><span class="op">*</span><span class="nam">a</span><span class="op">,</span> <span class="op">**</span><span class="nam">k</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm mis">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">class</span> <span class="nam">TokenConf</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="op">*</span><span class="nam">a</span><span class="op">,</span> <span class="op">**</span><span class="nam">kw</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run">        <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_external_mock_orm_common___init___py.html b/orm/services/region_manager/htmlcov/rms_external_mock_orm_common___init___py.html
new file mode 100644
index 00000000..9d0575ed
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_external_mock_orm_common___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/orm_common/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/orm_common/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_external_mock_orm_common_policy___init___py.html b/orm/services/region_manager/htmlcov/rms_external_mock_orm_common_policy___init___py.html
new file mode 100644
index 00000000..4367b302
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_external_mock_orm_common_policy___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/orm_common/policy/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/orm_common/policy/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_external_mock_orm_common_policy_policy_py.html b/orm/services/region_manager/htmlcov/rms_external_mock_orm_common_policy_policy_py.html
new file mode 100644
index 00000000..972d1dcf
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_external_mock_orm_common_policy_policy_py.html
@@ -0,0 +1,109 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/orm_common/policy/policy.py: 67%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/orm_common/policy/policy.py</b> :
+            <span class="pc_cov">67%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            6 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">4 run</span>
+            <span class="mis shortkey_m button_toggle_mis">2 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm mis"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm mis"><a href="#n10">10</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">def</span> <span class="nam">init</span><span class="op">(</span><span class="op">*</span><span class="nam">a</span><span class="op">,</span> <span class="op">**</span><span class="nam">kw</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">def</span> <span class="nam">enforce</span><span class="op">(</span><span class="op">*</span><span class="nam">a</span><span class="op">,</span> <span class="op">**</span><span class="nam">kw</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm mis">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">def</span> <span class="nam">authorize</span><span class="op">(</span><span class="op">*</span><span class="nam">a</span><span class="op">,</span> <span class="op">**</span><span class="nam">kw</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm mis">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_external_mock_orm_common_utils___init___py.html b/orm/services/region_manager/htmlcov/rms_external_mock_orm_common_utils___init___py.html
new file mode 100644
index 00000000..e339ed1a
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_external_mock_orm_common_utils___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/orm_common/utils/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/orm_common/utils/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_external_mock_orm_common_utils_api_error_utils_py.html b/orm/services/region_manager/htmlcov/rms_external_mock_orm_common_utils_api_error_utils_py.html
new file mode 100644
index 00000000..9979bae3
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_external_mock_orm_common_utils_api_error_utils_py.html
@@ -0,0 +1,93 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/orm_common/utils/api_error_utils.py: 50%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/orm_common/utils/api_error_utils.py</b> :
+            <span class="pc_cov">50%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            2 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">1 run</span>
+            <span class="mis shortkey_m button_toggle_mis">1 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="stm mis"><a href="#n2">2</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_error</span><span class="op">(</span><span class="op">*</span><span class="nam">args</span><span class="op">,</span> <span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm mis">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_external_mock_orm_common_utils_utils_py.html b/orm/services/region_manager/htmlcov/rms_external_mock_orm_common_utils_utils_py.html
new file mode 100644
index 00000000..fa2be4b5
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_external_mock_orm_common_utils_utils_py.html
@@ -0,0 +1,119 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/external_mock/orm_common/utils/utils.py: 83%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/external_mock/orm_common/utils/utils.py</b> :
+            <span class="pc_cov">83%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            6 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">5 run</span>
+            <span class="mis shortkey_m button_toggle_mis">1 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="stm mis"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="stm run hide_run"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""Utils module mock."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">def</span> <span class="nam">report_config</span><span class="op">(</span><span class="nam">conf</span><span class="op">,</span> <span class="nam">dump</span><span class="op">=</span><span class="nam">False</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln">    <span class="str">"""Mock report_config function."""</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm mis">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">def</span> <span class="nam">set_utils_conf</span><span class="op">(</span><span class="nam">conf</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln">    <span class="str">"""Mock set_utils_conf function."""</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t14" class="stm run hide_run"><span class="key">def</span> <span class="nam">audit_trail</span><span class="op">(</span><span class="op">*</span><span class="nam">args</span><span class="op">,</span> <span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_model___init___py.html b/orm/services/region_manager/htmlcov/rms_model___init___py.html
new file mode 100644
index 00000000..dd0a069f
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_model___init___py.html
@@ -0,0 +1,119 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/model/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/model/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            3 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">3 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span>  <span class="com"># noqa</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">def</span> <span class="nam">init_model</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="str">    This is a stub method which is called at application startup time.</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="str">    If you need to bind to a parsed database configuration, set up tables or</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="str">    ORM classes, or perform any database initialization, this is the</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln"><span class="str">    recommended place to do it.</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="str">    For more information working with databases, and some common recipes,</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="str">    see http://pecan.readthedocs.org/en/latest/databases.html</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_model_model_py.html b/orm/services/region_manager/htmlcov/rms_model_model_py.html
new file mode 100644
index 00000000..d4a4be2a
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_model_model_py.html
@@ -0,0 +1,475 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/model/model.py: 93%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/model/model.py</b> :
+            <span class="pc_cov">93%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            100 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">93 run</span>
+            <span class="mis shortkey_m button_toggle_mis">7 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="stm run hide_run"><a href="#n22">22</a></p>
+<p id="n23" class="stm run hide_run"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="stm run hide_run"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="pln"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="pln"><a href="#n48">48</a></p>
+<p id="n49" class="pln"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="pln"><a href="#n53">53</a></p>
+<p id="n54" class="pln"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="pln"><a href="#n56">56</a></p>
+<p id="n57" class="pln"><a href="#n57">57</a></p>
+<p id="n58" class="pln"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="pln"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="pln"><a href="#n68">68</a></p>
+<p id="n69" class="stm run hide_run"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="stm run hide_run"><a href="#n71">71</a></p>
+<p id="n72" class="stm run hide_run"><a href="#n72">72</a></p>
+<p id="n73" class="stm run hide_run"><a href="#n73">73</a></p>
+<p id="n74" class="stm run hide_run"><a href="#n74">74</a></p>
+<p id="n75" class="stm run hide_run"><a href="#n75">75</a></p>
+<p id="n76" class="stm run hide_run"><a href="#n76">76</a></p>
+<p id="n77" class="stm run hide_run"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="stm run hide_run"><a href="#n79">79</a></p>
+<p id="n80" class="stm run hide_run"><a href="#n80">80</a></p>
+<p id="n81" class="stm run hide_run"><a href="#n81">81</a></p>
+<p id="n82" class="pln"><a href="#n82">82</a></p>
+<p id="n83" class="stm run hide_run"><a href="#n83">83</a></p>
+<p id="n84" class="stm run hide_run"><a href="#n84">84</a></p>
+<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p>
+<p id="n87" class="stm run hide_run"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="stm mis"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="pln"><a href="#n91">91</a></p>
+<p id="n92" class="stm run hide_run"><a href="#n92">92</a></p>
+<p id="n93" class="stm run hide_run"><a href="#n93">93</a></p>
+<p id="n94" class="stm run hide_run"><a href="#n94">94</a></p>
+<p id="n95" class="stm run hide_run"><a href="#n95">95</a></p>
+<p id="n96" class="stm run hide_run"><a href="#n96">96</a></p>
+<p id="n97" class="stm run hide_run"><a href="#n97">97</a></p>
+<p id="n98" class="pln"><a href="#n98">98</a></p>
+<p id="n99" class="pln"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="stm run hide_run"><a href="#n101">101</a></p>
+<p id="n102" class="stm run hide_run"><a href="#n102">102</a></p>
+<p id="n103" class="stm run hide_run"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="pln"><a href="#n105">105</a></p>
+<p id="n106" class="stm run hide_run"><a href="#n106">106</a></p>
+<p id="n107" class="pln"><a href="#n107">107</a></p>
+<p id="n108" class="stm run hide_run"><a href="#n108">108</a></p>
+<p id="n109" class="stm run hide_run"><a href="#n109">109</a></p>
+<p id="n110" class="stm run hide_run"><a href="#n110">110</a></p>
+<p id="n111" class="stm run hide_run"><a href="#n111">111</a></p>
+<p id="n112" class="stm run hide_run"><a href="#n112">112</a></p>
+<p id="n113" class="stm run hide_run"><a href="#n113">113</a></p>
+<p id="n114" class="pln"><a href="#n114">114</a></p>
+<p id="n115" class="stm run hide_run"><a href="#n115">115</a></p>
+<p id="n116" class="stm run hide_run"><a href="#n116">116</a></p>
+<p id="n117" class="pln"><a href="#n117">117</a></p>
+<p id="n118" class="stm run hide_run"><a href="#n118">118</a></p>
+<p id="n119" class="stm run hide_run"><a href="#n119">119</a></p>
+<p id="n120" class="stm run hide_run"><a href="#n120">120</a></p>
+<p id="n121" class="stm run hide_run"><a href="#n121">121</a></p>
+<p id="n122" class="stm run hide_run"><a href="#n122">122</a></p>
+<p id="n123" class="pln"><a href="#n123">123</a></p>
+<p id="n124" class="stm run hide_run"><a href="#n124">124</a></p>
+<p id="n125" class="stm run hide_run"><a href="#n125">125</a></p>
+<p id="n126" class="stm run hide_run"><a href="#n126">126</a></p>
+<p id="n127" class="stm run hide_run"><a href="#n127">127</a></p>
+<p id="n128" class="stm run hide_run"><a href="#n128">128</a></p>
+<p id="n129" class="stm run hide_run"><a href="#n129">129</a></p>
+<p id="n130" class="stm run hide_run"><a href="#n130">130</a></p>
+<p id="n131" class="stm run hide_run"><a href="#n131">131</a></p>
+<p id="n132" class="stm run hide_run"><a href="#n132">132</a></p>
+<p id="n133" class="stm run hide_run"><a href="#n133">133</a></p>
+<p id="n134" class="stm run hide_run"><a href="#n134">134</a></p>
+<p id="n135" class="stm run hide_run"><a href="#n135">135</a></p>
+<p id="n136" class="stm run hide_run"><a href="#n136">136</a></p>
+<p id="n137" class="stm run hide_run"><a href="#n137">137</a></p>
+<p id="n138" class="stm run hide_run"><a href="#n138">138</a></p>
+<p id="n139" class="stm run hide_run"><a href="#n139">139</a></p>
+<p id="n140" class="stm run hide_run"><a href="#n140">140</a></p>
+<p id="n141" class="stm run hide_run"><a href="#n141">141</a></p>
+<p id="n142" class="stm run hide_run"><a href="#n142">142</a></p>
+<p id="n143" class="stm run hide_run"><a href="#n143">143</a></p>
+<p id="n144" class="stm run hide_run"><a href="#n144">144</a></p>
+<p id="n145" class="pln"><a href="#n145">145</a></p>
+<p id="n146" class="pln"><a href="#n146">146</a></p>
+<p id="n147" class="stm run hide_run"><a href="#n147">147</a></p>
+<p id="n148" class="pln"><a href="#n148">148</a></p>
+<p id="n149" class="pln"><a href="#n149">149</a></p>
+<p id="n150" class="stm run hide_run"><a href="#n150">150</a></p>
+<p id="n151" class="pln"><a href="#n151">151</a></p>
+<p id="n152" class="pln"><a href="#n152">152</a></p>
+<p id="n153" class="pln"><a href="#n153">153</a></p>
+<p id="n154" class="pln"><a href="#n154">154</a></p>
+<p id="n155" class="pln"><a href="#n155">155</a></p>
+<p id="n156" class="stm run hide_run"><a href="#n156">156</a></p>
+<p id="n157" class="pln"><a href="#n157">157</a></p>
+<p id="n158" class="pln"><a href="#n158">158</a></p>
+<p id="n159" class="stm run hide_run"><a href="#n159">159</a></p>
+<p id="n160" class="pln"><a href="#n160">160</a></p>
+<p id="n161" class="pln"><a href="#n161">161</a></p>
+<p id="n162" class="stm run hide_run"><a href="#n162">162</a></p>
+<p id="n163" class="pln"><a href="#n163">163</a></p>
+<p id="n164" class="pln"><a href="#n164">164</a></p>
+<p id="n165" class="pln"><a href="#n165">165</a></p>
+<p id="n166" class="pln"><a href="#n166">166</a></p>
+<p id="n167" class="pln"><a href="#n167">167</a></p>
+<p id="n168" class="pln"><a href="#n168">168</a></p>
+<p id="n169" class="stm run hide_run"><a href="#n169">169</a></p>
+<p id="n170" class="stm run hide_run"><a href="#n170">170</a></p>
+<p id="n171" class="stm run hide_run"><a href="#n171">171</a></p>
+<p id="n172" class="stm run hide_run"><a href="#n172">172</a></p>
+<p id="n173" class="pln"><a href="#n173">173</a></p>
+<p id="n174" class="stm run hide_run"><a href="#n174">174</a></p>
+<p id="n175" class="stm mis"><a href="#n175">175</a></p>
+<p id="n176" class="stm mis"><a href="#n176">176</a></p>
+<p id="n177" class="stm mis"><a href="#n177">177</a></p>
+<p id="n178" class="stm mis"><a href="#n178">178</a></p>
+<p id="n179" class="stm mis"><a href="#n179">179</a></p>
+<p id="n180" class="pln"><a href="#n180">180</a></p>
+<p id="n181" class="pln"><a href="#n181">181</a></p>
+<p id="n182" class="stm run hide_run"><a href="#n182">182</a></p>
+<p id="n183" class="pln"><a href="#n183">183</a></p>
+<p id="n184" class="pln"><a href="#n184">184</a></p>
+<p id="n185" class="stm run hide_run"><a href="#n185">185</a></p>
+<p id="n186" class="pln"><a href="#n186">186</a></p>
+<p id="n187" class="pln"><a href="#n187">187</a></p>
+<p id="n188" class="pln"><a href="#n188">188</a></p>
+<p id="n189" class="pln"><a href="#n189">189</a></p>
+<p id="n190" class="stm run hide_run"><a href="#n190">190</a></p>
+<p id="n191" class="stm run hide_run"><a href="#n191">191</a></p>
+<p id="n192" class="pln"><a href="#n192">192</a></p>
+<p id="n193" class="stm mis"><a href="#n193">193</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""model module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">error_base</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">class</span> <span class="nam">Address</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln">    <span class="str">"""address class."""</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">country</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">state</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">city</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln">                 <span class="nam">street</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">zip</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="str">        :param country:</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="str">        :param state:</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln"><span class="str">        :param city:</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="str">        :param street:</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="str">        :param zip:</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">country</span> <span class="op">=</span> <span class="nam">country</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">state</span> <span class="op">=</span> <span class="nam">state</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">city</span> <span class="op">=</span> <span class="nam">city</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">street</span> <span class="op">=</span> <span class="nam">street</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">zip</span> <span class="op">=</span> <span class="nam">zip</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run"><span class="key">class</span> <span class="nam">EndPoint</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln">    <span class="str">"""class method endpoints body."""</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">publicurl</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">type</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln">        <span class="str">"""init function.</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln"><span class="str">        :param public_url: field</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln"><span class="str">        :param type: field</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">type</span> <span class="op">=</span> <span class="nam">type</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">publicurl</span> <span class="op">=</span> <span class="nam">publicurl</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm run hide_run"><span class="key">class</span> <span class="nam">RegionData</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln">    <span class="str">"""class method json header."""</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">status</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">clli</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln">                 <span class="nam">ranger_agent_version</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">design_type</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">location_type</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="pln">                 <span class="nam">vlcp_name</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">open_stack_version</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln">                 <span class="nam">address</span><span class="op">=</span><span class="nam">Address</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">is_ecomp</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">is_ssp</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln">                 <span class="nam">purpose_of_region</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">=</span><span class="op">{</span><span class="op">}</span><span class="op">,</span> <span class="nam">endpoints</span><span class="op">=</span><span class="op">[</span><span class="nam">EndPoint</span><span class="op">(</span><span class="op">)</span><span class="op">]</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln"><span class="str">        :param status:</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln"><span class="str">        :param id:</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln"><span class="str">        :param name:</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="pln"><span class="str">        :param clli:</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="pln"><span class="str">        :param ranger_agent_version:</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln"><span class="str">        :param design_type:</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="pln"><span class="str">        :param location_type:</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="pln"><span class="str">        :param vlcp_name:</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="pln"><span class="str">        :param open_stack_version:</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln"><span class="str">        :param address:</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln"><span class="str">        :param is_ecomp</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln"><span class="str">        :param is_ssp</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln"><span class="str">        :param purpose_of_region</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln"><span class="str">        :param metadata:</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln"><span class="str">        :param endpoints:</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status</span> <span class="op">=</span> <span class="nam">status</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="pln">        <span class="com"># make id and name always the same</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">clli</span> <span class="op">=</span> <span class="nam">clli</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">ranger_agent_version</span> <span class="op">=</span> <span class="nam">ranger_agent_version</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">metadata</span> <span class="op">=</span> <span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">endpoints</span> <span class="op">=</span> <span class="nam">endpoints</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">design_type</span> <span class="op">=</span> <span class="nam">design_type</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">location_type</span> <span class="op">=</span> <span class="nam">location_type</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">vlcp_name</span> <span class="op">=</span> <span class="nam">vlcp_name</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">open_stack_version</span> <span class="op">=</span> <span class="nam">open_stack_version</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">address</span> <span class="op">=</span> <span class="nam">address</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">is_ecomp</span> <span class="op">=</span> <span class="nam">is_ecomp</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">is_ssp</span> <span class="op">=</span> <span class="nam">is_ssp</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">purpose_of_region</span> <span class="op">=</span> <span class="nam">purpose_of_region</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t83" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_validate_end_points</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">endpoints_types_must_have</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm run hide_run">        <span class="nam">ep_duplicate</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm run hide_run">        <span class="key">for</span> <span class="nam">endpoint</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">endpoints</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm run hide_run">            <span class="key">if</span> <span class="nam">endpoint</span><span class="op">.</span><span class="nam">type</span> <span class="key">not</span> <span class="key">in</span> <span class="nam">ep_duplicate</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="stm run hide_run">                <span class="nam">ep_duplicate</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">endpoint</span><span class="op">.</span><span class="nam">type</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln">            <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="stm mis">                <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln">                    <span class="nam">message</span><span class="op">=</span><span class="str">"Invalid endpoints. Duplicate endpoint "</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="pln">                            <span class="str">"type {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">endpoint</span><span class="op">.</span><span class="nam">type</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="stm run hide_run">            <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="stm run hide_run">                <span class="nam">endpoints_types_must_have</span><span class="op">.</span><span class="nam">remove</span><span class="op">(</span><span class="nam">endpoint</span><span class="op">.</span><span class="nam">type</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="stm run hide_run">            <span class="key">except</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="stm run hide_run">                <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="stm run hide_run">        <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">endpoints_types_must_have</span><span class="op">)</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="pln">                <span class="nam">message</span><span class="op">=</span><span class="str">"Invalid endpoints. Endpoint type '{}' "</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="pln">                        <span class="str">"is missing"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">endpoints_types_must_have</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t101" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_validate_status</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">allowed_status</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="stm run hide_run">        <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">status</span> <span class="key">not</span> <span class="key">in</span> <span class="nam">allowed_status</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln">                <span class="nam">message</span><span class="op">=</span><span class="str">"Invalid status. Region status must be "</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="pln">                        <span class="str">"one of {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">allowed_status</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="stm run hide_run">        <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t108" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_validate_model</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="stm run hide_run">        <span class="nam">allowed_status</span> <span class="op">=</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">region_options</span><span class="op">.</span><span class="nam">allowed_status_values</span><span class="op">[</span><span class="op">:</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="stm run hide_run">        <span class="nam">endpoints_types_must_have</span> <span class="op">=</span> <span class="nam">conf</span><span class="op">.</span><span class="nam">region_options</span><span class="op">.</span><span class="nam">endpoints_types_must_have</span><span class="op">[</span><span class="op">:</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">_validate_status</span><span class="op">(</span><span class="nam">allowed_status</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t112" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">_validate_end_points</span><span class="op">(</span><span class="nam">endpoints_types_must_have</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="stm run hide_run">        <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t115" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_to_db_model_dict</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="stm run hide_run">        <span class="nam">end_points</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t118" class="stm run hide_run">        <span class="key">for</span> <span class="nam">endpoint</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">endpoints</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="stm run hide_run">            <span class="nam">ep</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="stm run hide_run">            <span class="nam">ep</span><span class="op">[</span><span class="str">'type'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">endpoint</span><span class="op">.</span><span class="nam">type</span><span class="strut">&nbsp;</span></p>
+<p id="t121" class="stm run hide_run">            <span class="nam">ep</span><span class="op">[</span><span class="str">'url'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">endpoint</span><span class="op">.</span><span class="nam">publicurl</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="stm run hide_run">            <span class="nam">end_points</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">ep</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t123" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t124" class="stm run hide_run">        <span class="nam">db_model_dict</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'region_id'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t126" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'name'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t127" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'address_state'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">address</span><span class="op">.</span><span class="nam">state</span><span class="strut">&nbsp;</span></p>
+<p id="t128" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'address_country'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">address</span><span class="op">.</span><span class="nam">country</span><span class="strut">&nbsp;</span></p>
+<p id="t129" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'address_city'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">address</span><span class="op">.</span><span class="nam">city</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'address_street'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">address</span><span class="op">.</span><span class="nam">street</span><span class="strut">&nbsp;</span></p>
+<p id="t131" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'address_zip'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">address</span><span class="op">.</span><span class="nam">zip</span><span class="strut">&nbsp;</span></p>
+<p id="t132" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'region_status'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">status</span><span class="strut">&nbsp;</span></p>
+<p id="t133" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'ranger_agent_version'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">ranger_agent_version</span><span class="strut">&nbsp;</span></p>
+<p id="t134" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'open_stack_version'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">open_stack_version</span><span class="strut">&nbsp;</span></p>
+<p id="t135" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'design_type'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">design_type</span><span class="strut">&nbsp;</span></p>
+<p id="t136" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'location_type'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">location_type</span><span class="strut">&nbsp;</span></p>
+<p id="t137" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'vlcp_name'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">location_type</span><span class="strut">&nbsp;</span></p>
+<p id="t138" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'clli'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">clli</span><span class="strut">&nbsp;</span></p>
+<p id="t139" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'is_ecomp'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">is_ecomp</span> <span class="op">*</span> <span class="num">1</span><span class="strut">&nbsp;</span></p>
+<p id="t140" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'is_ssp'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">is_ssp</span> <span class="op">*</span> <span class="num">1</span><span class="strut">&nbsp;</span></p>
+<p id="t141" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'purpose_of_region'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">purpose_of_region</span><span class="strut">&nbsp;</span></p>
+<p id="t142" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'end_point_list'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">end_points</span><span class="strut">&nbsp;</span></p>
+<p id="t143" class="stm run hide_run">        <span class="nam">db_model_dict</span><span class="op">[</span><span class="str">'meta_data_dict'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t144" class="stm run hide_run">        <span class="key">return</span> <span class="nam">db_model_dict</span><span class="strut">&nbsp;</span></p>
+<p id="t145" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t146" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t147" class="stm run hide_run"><span class="key">class</span> <span class="nam">Regions</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t148" class="pln">    <span class="str">"""main json header."""</span><span class="strut">&nbsp;</span></p>
+<p id="t149" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t150" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">regions</span><span class="op">=</span><span class="op">[</span><span class="nam">RegionData</span><span class="op">(</span><span class="op">)</span><span class="op">]</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t151" class="pln">        <span class="str">"""init function.</span><span class="strut">&nbsp;</span></p>
+<p id="t152" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t153" class="pln"><span class="str">        :param regions:</span><span class="strut">&nbsp;</span></p>
+<p id="t154" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t155" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t156" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span> <span class="op">=</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t157" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t158" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t159" class="stm run hide_run"><span class="key">class</span> <span class="nam">Groups</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t160" class="pln">    <span class="str">"""main json header."""</span><span class="strut">&nbsp;</span></p>
+<p id="t161" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t162" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t163" class="pln">                 <span class="nam">description</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">regions</span><span class="op">=</span><span class="op">[</span><span class="op">]</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t164" class="pln">        <span class="str">"""init function.</span><span class="strut">&nbsp;</span></p>
+<p id="t165" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t166" class="pln"><span class="str">        :param regions:</span><span class="strut">&nbsp;</span></p>
+<p id="t167" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t168" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t169" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">id</span><span class="strut">&nbsp;</span></p>
+<p id="t170" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t171" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">description</span><span class="strut">&nbsp;</span></p>
+<p id="t172" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span> <span class="op">=</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t173" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t174" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_to_db_model_dict</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t175" class="stm mis">        <span class="nam">db_dict</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t176" class="stm mis">        <span class="nam">db_dict</span><span class="op">[</span><span class="str">'group_name'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t177" class="stm mis">        <span class="nam">db_dict</span><span class="op">[</span><span class="str">'group_description'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">description</span><span class="strut">&nbsp;</span></p>
+<p id="t178" class="stm mis">        <span class="nam">db_dict</span><span class="op">[</span><span class="str">'group_regions'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t179" class="stm mis">        <span class="key">return</span> <span class="nam">db_dict</span><span class="strut">&nbsp;</span></p>
+<p id="t180" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t181" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t182" class="stm run hide_run"><span class="key">class</span> <span class="nam">GroupsWrraper</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t183" class="pln">    <span class="str">"""list of groups."""</span><span class="strut">&nbsp;</span></p>
+<p id="t184" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t185" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">groups</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t186" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t187" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t188" class="pln"><span class="str">        :param groups:</span><span class="strut">&nbsp;</span></p>
+<p id="t189" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t190" class="stm run hide_run">        <span class="key">if</span> <span class="nam">groups</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t191" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">groups</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t192" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t193" class="stm mis">            <span class="nam">self</span><span class="op">.</span><span class="nam">groups</span> <span class="op">=</span> <span class="nam">groups</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-12 23:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_model_url_parm_py.html b/orm/services/region_manager/htmlcov/rms_model_url_parm_py.html
new file mode 100644
index 00000000..c8234f07
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_model_url_parm_py.html
@@ -0,0 +1,307 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/model/url_parm.py: 94%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/model/url_parm.py</b> :
+            <span class="pc_cov">94%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            63 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">59 run</span>
+            <span class="mis shortkey_m button_toggle_mis">4 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="stm run hide_run"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="stm run hide_run"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="stm run hide_run"><a href="#n39">39</a></p>
+<p id="n40" class="stm run hide_run"><a href="#n40">40</a></p>
+<p id="n41" class="stm run hide_run"><a href="#n41">41</a></p>
+<p id="n42" class="stm run hide_run"><a href="#n42">42</a></p>
+<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p>
+<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="stm run hide_run"><a href="#n46">46</a></p>
+<p id="n47" class="stm run hide_run"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="stm run hide_run"><a href="#n50">50</a></p>
+<p id="n51" class="stm run hide_run"><a href="#n51">51</a></p>
+<p id="n52" class="stm run hide_run"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="stm run hide_run"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="stm mis"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="stm run hide_run"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p>
+<p id="n69" class="stm run hide_run"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="pln"><a href="#n71">71</a></p>
+<p id="n72" class="stm run hide_run"><a href="#n72">72</a></p>
+<p id="n73" class="pln"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="stm run hide_run"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="stm run hide_run"><a href="#n79">79</a></p>
+<p id="n80" class="pln"><a href="#n80">80</a></p>
+<p id="n81" class="stm run hide_run"><a href="#n81">81</a></p>
+<p id="n82" class="stm run hide_run"><a href="#n82">82</a></p>
+<p id="n83" class="stm run hide_run"><a href="#n83">83</a></p>
+<p id="n84" class="stm run hide_run"><a href="#n84">84</a></p>
+<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="pln"><a href="#n86">86</a></p>
+<p id="n87" class="pln"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="stm mis"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="stm run hide_run"><a href="#n91">91</a></p>
+<p id="n92" class="stm run hide_run"><a href="#n92">92</a></p>
+<p id="n93" class="stm mis"><a href="#n93">93</a></p>
+<p id="n94" class="stm mis"><a href="#n94">94</a></p>
+<p id="n95" class="pln"><a href="#n95">95</a></p>
+<p id="n96" class="stm run hide_run"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="stm run hide_run"><a href="#n98">98</a></p>
+<p id="n99" class="pln"><a href="#n99">99</a></p>
+<p id="n100" class="stm run hide_run"><a href="#n100">100</a></p>
+<p id="n101" class="pln"><a href="#n101">101</a></p>
+<p id="n102" class="pln"><a href="#n102">102</a></p>
+<p id="n103" class="pln"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="stm run hide_run"><a href="#n105">105</a></p>
+<p id="n106" class="stm run hide_run"><a href="#n106">106</a></p>
+<p id="n107" class="stm run hide_run"><a href="#n107">107</a></p>
+<p id="n108" class="stm run hide_run"><a href="#n108">108</a></p>
+<p id="n109" class="stm run hide_run"><a href="#n109">109</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">class</span> <span class="nam">UrlParms</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln">    <span class="str">"""class method."""</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">type</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">status</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">metadata</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">rangerAgentVersion</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln">                 <span class="nam">clli</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">regionname</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">osversion</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">valet</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln">                 <span class="nam">state</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">country</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">city</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">street</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">zip</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln">                 <span class="nam">is_ecomp</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">is_ssp</span><span class="op">=</span><span class="nam">None</span><span class="op">,</span> <span class="nam">purpose_of_region</span><span class="op">=</span><span class="nam">None</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln">        <span class="str">"""init method.</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="str">        :param type:</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="str">        :param status:</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln"><span class="str">        :param metadata:</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="str">        :param rangerAgentVersion:</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="str">        :param clli:</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="str">        :param regionname:</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln"><span class="str">        :param osversion:</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="str">        :param valet:</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln"><span class="str">        :param state:</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln"><span class="str">        :param country:</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="str">        :param city:</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln"><span class="str">        :param street:</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="str">        :param zip:</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run">        <span class="key">if</span> <span class="nam">type</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">location_type</span> <span class="op">=</span> <span class="nam">type</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">        <span class="key">if</span> <span class="nam">status</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">region_status</span> <span class="op">=</span> <span class="nam">status</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">        <span class="key">if</span> <span class="nam">metadata</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">metadata</span> <span class="op">=</span> <span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">        <span class="key">if</span> <span class="nam">rangerAgentVersion</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">ranger_agent_version</span> <span class="op">=</span> <span class="nam">rangerAgentVersion</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">        <span class="key">if</span> <span class="nam">clli</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">clli</span> <span class="op">=</span> <span class="nam">clli</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">        <span class="key">if</span> <span class="nam">regionname</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">regionname</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="stm run hide_run">        <span class="key">if</span> <span class="nam">osversion</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">open_stack_version</span> <span class="op">=</span> <span class="nam">osversion</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="stm run hide_run">        <span class="key">if</span> <span class="nam">valet</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">valet</span> <span class="op">=</span> <span class="nam">valet</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm run hide_run">        <span class="key">if</span> <span class="nam">state</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">address_state</span> <span class="op">=</span> <span class="nam">state</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">        <span class="key">if</span> <span class="nam">country</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">address_country</span> <span class="op">=</span> <span class="nam">country</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="stm run hide_run">        <span class="key">if</span> <span class="nam">city</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">address_city</span> <span class="op">=</span> <span class="nam">city</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run">        <span class="key">if</span> <span class="nam">street</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">address_street</span> <span class="op">=</span> <span class="nam">street</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm run hide_run">        <span class="key">if</span> <span class="nam">zip</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">address_zip</span> <span class="op">=</span> <span class="nam">zip</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">        <span class="key">if</span> <span class="nam">is_ecomp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">is_ecomp</span> <span class="op">=</span> <span class="nam">is_ecomp</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="stm run hide_run">        <span class="key">if</span> <span class="nam">is_ssp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">            <span class="nam">self</span><span class="op">.</span><span class="nam">is_ssp</span> <span class="op">=</span> <span class="nam">is_ssp</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">        <span class="key">if</span> <span class="nam">purpose_of_region</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm mis">            <span class="nam">self</span><span class="op">.</span><span class="nam">purpose_of_region</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t60" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_build_query</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln">        <span class="str">"""nuild db query.</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="stm run hide_run">        <span class="nam">metadatadict</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">        <span class="nam">regiondict</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">        <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">__dict__</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm run hide_run">            <span class="nam">metadatadict</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_build_metadata_dict</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="stm run hide_run">            <span class="nam">regiondict</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_build_region_dict</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">        <span class="key">return</span> <span class="nam">regiondict</span><span class="op">,</span> <span class="nam">metadatadict</span><span class="op">,</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t72" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_build_metadata_dict</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="pln">        <span class="str">"""meta_data dict.</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln"><span class="str">        :return: metadata dict</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="stm run hide_run">        <span class="nam">metadata</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">        <span class="key">if</span> <span class="str">'metadata'</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">__dict__</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm run hide_run">            <span class="nam">metadata</span> <span class="op">=</span> <span class="op">{</span><span class="str">'ref_keys'</span><span class="op">:</span> <span class="op">[</span><span class="op">]</span><span class="op">,</span> <span class="str">'meta_data_pairs'</span><span class="op">:</span> <span class="op">[</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="pln">                        <span class="str">'meta_data_keys'</span><span class="op">:</span> <span class="op">[</span><span class="op">]</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="stm run hide_run">            <span class="key">for</span> <span class="nam">metadata_item</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">metadata</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="stm run hide_run">                <span class="key">if</span> <span class="str">':'</span> <span class="key">in</span> <span class="nam">metadata_item</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="stm run hide_run">                    <span class="nam">key</span> <span class="op">=</span> <span class="nam">metadata_item</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">':'</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm run hide_run">                    <span class="nam">metadata</span><span class="op">[</span><span class="str">'ref_keys'</span><span class="op">]</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">key</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm run hide_run">                    <span class="nam">metadata</span><span class="op">[</span><span class="str">'meta_data_pairs'</span><span class="op">]</span><span class="op">.</span><span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="pln">                        <span class="nam">append</span><span class="op">(</span><span class="op">{</span><span class="str">'metadata_key'</span><span class="op">:</span> <span class="nam">key</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="pln">                                <span class="str">'metadata_value'</span><span class="op">:</span> <span class="nam">metadata_item</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">':'</span><span class="op">)</span><span class="op">[</span><span class="num">1</span><span class="op">]</span><span class="op">}</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln">                <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="stm mis">                    <span class="nam">metadata</span><span class="op">[</span><span class="str">'meta_data_keys'</span><span class="op">]</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">metadata_item</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln">            <span class="com"># Now clean irrelevant values</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm run hide_run">            <span class="nam">keys_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="stm run hide_run">            <span class="key">for</span> <span class="nam">item</span> <span class="key">in</span> <span class="nam">metadata</span><span class="op">[</span><span class="str">'meta_data_keys'</span><span class="op">]</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="stm mis">                <span class="key">if</span> <span class="nam">item</span> <span class="key">not</span> <span class="key">in</span> <span class="nam">metadata</span><span class="op">[</span><span class="str">'ref_keys'</span><span class="op">]</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="stm mis">                    <span class="nam">keys_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">item</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t96" class="stm run hide_run">            <span class="nam">metadata</span><span class="op">[</span><span class="str">'meta_data_keys'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">keys_list</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t98" class="stm run hide_run">        <span class="key">return</span> <span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t100" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_build_region_dict</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="pln">        <span class="str">"""region dict.</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t103" class="pln"><span class="str">        :return:regin dict</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="stm run hide_run">        <span class="nam">regiondict</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="stm run hide_run">        <span class="key">for</span> <span class="nam">key</span><span class="op">,</span> <span class="nam">value</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">__dict__</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="stm run hide_run">            <span class="key">if</span> <span class="nam">key</span> <span class="op">!=</span> <span class="str">'metadata'</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="stm run hide_run">                <span class="nam">regiondict</span><span class="op">[</span><span class="nam">key</span><span class="op">]</span> <span class="op">=</span> <span class="nam">value</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="stm run hide_run">        <span class="key">return</span> <span class="nam">regiondict</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-12 23:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_services___init___py.html b/orm/services/region_manager/htmlcov/rms_services___init___py.html
new file mode 100644
index 00000000..430566d0
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_services___init___py.html
@@ -0,0 +1,91 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/services/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/services/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""services package."""</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_services_error_base_py.html b/orm/services/region_manager/htmlcov/rms_services_error_base_py.html
new file mode 100644
index 00000000..3488d3a4
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_services_error_base_py.html
@@ -0,0 +1,155 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/services/error_base.py: 89%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/services/error_base.py</b> :
+            <span class="pc_cov">89%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            18 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">16 run</span>
+            <span class="mis shortkey_m button_toggle_mis">2 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm mis"><a href="#n11">11</a></p>
+<p id="n12" class="stm mis"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="stm run hide_run"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="stm run hide_run"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p>
+<p id="n25" class="stm run hide_run"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""Exceptions module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">class</span> <span class="nam">Error</span><span class="op">(</span><span class="nam">Exception</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">class</span> <span class="nam">ErrorStatus</span><span class="op">(</span><span class="nam">Error</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="str">""</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm mis">        <span class="nam">self</span><span class="op">.</span><span class="nam">status_code</span> <span class="op">=</span> <span class="nam">status_code</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm mis">        <span class="nam">self</span><span class="op">.</span><span class="nam">message</span> <span class="op">=</span> <span class="nam">message</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="key">class</span> <span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">ErrorStatus</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">404</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="str">"Not found"</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status_code</span> <span class="op">=</span> <span class="nam">status_code</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">message</span> <span class="op">=</span> <span class="nam">message</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t22" class="stm run hide_run"><span class="key">class</span> <span class="nam">ConflictError</span><span class="op">(</span><span class="nam">ErrorStatus</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">409</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="str">"Conflict error"</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status_code</span> <span class="op">=</span> <span class="nam">status_code</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">message</span> <span class="op">=</span> <span class="nam">message</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run"><span class="key">class</span> <span class="nam">InputValueError</span><span class="op">(</span><span class="nam">ErrorStatus</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">status_code</span><span class="op">=</span><span class="num">400</span><span class="op">,</span> <span class="nam">message</span><span class="op">=</span><span class="str">"value not allowed"</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">status_code</span> <span class="op">=</span> <span class="nam">status_code</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">message</span> <span class="op">=</span> <span class="nam">message</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_services_services_py.html b/orm/services/region_manager/htmlcov/rms_services_services_py.html
new file mode 100644
index 00000000..0192f62f
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_services_services_py.html
@@ -0,0 +1,661 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/services/services.py: 68%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/services/services.py</b> :
+            <span class="pc_cov">68%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            170 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">115 run</span>
+            <span class="mis shortkey_m button_toggle_mis">55 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="stm run hide_run"><a href="#n22">22</a></p>
+<p id="n23" class="stm run hide_run"><a href="#n23">23</a></p>
+<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p>
+<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="stm run hide_run"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="stm run hide_run"><a href="#n41">41</a></p>
+<p id="n42" class="stm run hide_run"><a href="#n42">42</a></p>
+<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="pln"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="stm run hide_run"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="stm run hide_run"><a href="#n60">60</a></p>
+<p id="n61" class="stm run hide_run"><a href="#n61">61</a></p>
+<p id="n62" class="stm run hide_run"><a href="#n62">62</a></p>
+<p id="n63" class="stm run hide_run"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p>
+<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p>
+<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p>
+<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p>
+<p id="n69" class="stm run hide_run"><a href="#n69">69</a></p>
+<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p>
+<p id="n71" class="stm run hide_run"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="pln"><a href="#n73">73</a></p>
+<p id="n74" class="stm run hide_run"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="pln"><a href="#n77">77</a></p>
+<p id="n78" class="pln"><a href="#n78">78</a></p>
+<p id="n79" class="pln"><a href="#n79">79</a></p>
+<p id="n80" class="stm run hide_run"><a href="#n80">80</a></p>
+<p id="n81" class="stm run hide_run"><a href="#n81">81</a></p>
+<p id="n82" class="stm run hide_run"><a href="#n82">82</a></p>
+<p id="n83" class="stm run hide_run"><a href="#n83">83</a></p>
+<p id="n84" class="stm run hide_run"><a href="#n84">84</a></p>
+<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p>
+<p id="n87" class="stm run hide_run"><a href="#n87">87</a></p>
+<p id="n88" class="stm run hide_run"><a href="#n88">88</a></p>
+<p id="n89" class="pln"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="stm run hide_run"><a href="#n91">91</a></p>
+<p id="n92" class="pln"><a href="#n92">92</a></p>
+<p id="n93" class="pln"><a href="#n93">93</a></p>
+<p id="n94" class="pln"><a href="#n94">94</a></p>
+<p id="n95" class="pln"><a href="#n95">95</a></p>
+<p id="n96" class="pln"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="stm run hide_run"><a href="#n98">98</a></p>
+<p id="n99" class="stm run hide_run"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="stm run hide_run"><a href="#n101">101</a></p>
+<p id="n102" class="stm run hide_run"><a href="#n102">102</a></p>
+<p id="n103" class="pln"><a href="#n103">103</a></p>
+<p id="n104" class="stm run hide_run"><a href="#n104">104</a></p>
+<p id="n105" class="stm run hide_run"><a href="#n105">105</a></p>
+<p id="n106" class="stm run hide_run"><a href="#n106">106</a></p>
+<p id="n107" class="stm run hide_run"><a href="#n107">107</a></p>
+<p id="n108" class="stm run hide_run"><a href="#n108">108</a></p>
+<p id="n109" class="stm run hide_run"><a href="#n109">109</a></p>
+<p id="n110" class="pln"><a href="#n110">110</a></p>
+<p id="n111" class="stm run hide_run"><a href="#n111">111</a></p>
+<p id="n112" class="stm run hide_run"><a href="#n112">112</a></p>
+<p id="n113" class="stm run hide_run"><a href="#n113">113</a></p>
+<p id="n114" class="stm run hide_run"><a href="#n114">114</a></p>
+<p id="n115" class="stm run hide_run"><a href="#n115">115</a></p>
+<p id="n116" class="stm run hide_run"><a href="#n116">116</a></p>
+<p id="n117" class="stm run hide_run"><a href="#n117">117</a></p>
+<p id="n118" class="stm run hide_run"><a href="#n118">118</a></p>
+<p id="n119" class="stm run hide_run"><a href="#n119">119</a></p>
+<p id="n120" class="pln"><a href="#n120">120</a></p>
+<p id="n121" class="stm run hide_run"><a href="#n121">121</a></p>
+<p id="n122" class="pln"><a href="#n122">122</a></p>
+<p id="n123" class="pln"><a href="#n123">123</a></p>
+<p id="n124" class="stm run hide_run"><a href="#n124">124</a></p>
+<p id="n125" class="stm mis"><a href="#n125">125</a></p>
+<p id="n126" class="pln"><a href="#n126">126</a></p>
+<p id="n127" class="stm mis"><a href="#n127">127</a></p>
+<p id="n128" class="stm mis"><a href="#n128">128</a></p>
+<p id="n129" class="stm mis"><a href="#n129">129</a></p>
+<p id="n130" class="stm mis"><a href="#n130">130</a></p>
+<p id="n131" class="stm mis"><a href="#n131">131</a></p>
+<p id="n132" class="pln"><a href="#n132">132</a></p>
+<p id="n133" class="stm mis"><a href="#n133">133</a></p>
+<p id="n134" class="pln"><a href="#n134">134</a></p>
+<p id="n135" class="stm mis"><a href="#n135">135</a></p>
+<p id="n136" class="stm mis"><a href="#n136">136</a></p>
+<p id="n137" class="stm mis"><a href="#n137">137</a></p>
+<p id="n138" class="pln"><a href="#n138">138</a></p>
+<p id="n139" class="pln"><a href="#n139">139</a></p>
+<p id="n140" class="stm run hide_run"><a href="#n140">140</a></p>
+<p id="n141" class="stm mis"><a href="#n141">141</a></p>
+<p id="n142" class="pln"><a href="#n142">142</a></p>
+<p id="n143" class="stm mis"><a href="#n143">143</a></p>
+<p id="n144" class="stm mis"><a href="#n144">144</a></p>
+<p id="n145" class="stm mis"><a href="#n145">145</a></p>
+<p id="n146" class="stm mis"><a href="#n146">146</a></p>
+<p id="n147" class="stm mis"><a href="#n147">147</a></p>
+<p id="n148" class="pln"><a href="#n148">148</a></p>
+<p id="n149" class="pln"><a href="#n149">149</a></p>
+<p id="n150" class="stm mis"><a href="#n150">150</a></p>
+<p id="n151" class="pln"><a href="#n151">151</a></p>
+<p id="n152" class="stm mis"><a href="#n152">152</a></p>
+<p id="n153" class="stm mis"><a href="#n153">153</a></p>
+<p id="n154" class="stm mis"><a href="#n154">154</a></p>
+<p id="n155" class="pln"><a href="#n155">155</a></p>
+<p id="n156" class="pln"><a href="#n156">156</a></p>
+<p id="n157" class="stm run hide_run"><a href="#n157">157</a></p>
+<p id="n158" class="stm mis"><a href="#n158">158</a></p>
+<p id="n159" class="pln"><a href="#n159">159</a></p>
+<p id="n160" class="stm mis"><a href="#n160">160</a></p>
+<p id="n161" class="stm mis"><a href="#n161">161</a></p>
+<p id="n162" class="stm mis"><a href="#n162">162</a></p>
+<p id="n163" class="pln"><a href="#n163">163</a></p>
+<p id="n164" class="stm mis"><a href="#n164">164</a></p>
+<p id="n165" class="stm mis"><a href="#n165">165</a></p>
+<p id="n166" class="stm mis"><a href="#n166">166</a></p>
+<p id="n167" class="pln"><a href="#n167">167</a></p>
+<p id="n168" class="pln"><a href="#n168">168</a></p>
+<p id="n169" class="stm run hide_run"><a href="#n169">169</a></p>
+<p id="n170" class="pln"><a href="#n170">170</a></p>
+<p id="n171" class="pln"><a href="#n171">171</a></p>
+<p id="n172" class="pln"><a href="#n172">172</a></p>
+<p id="n173" class="pln"><a href="#n173">173</a></p>
+<p id="n174" class="pln"><a href="#n174">174</a></p>
+<p id="n175" class="pln"><a href="#n175">175</a></p>
+<p id="n176" class="stm run hide_run"><a href="#n176">176</a></p>
+<p id="n177" class="stm run hide_run"><a href="#n177">177</a></p>
+<p id="n178" class="stm run hide_run"><a href="#n178">178</a></p>
+<p id="n179" class="stm run hide_run"><a href="#n179">179</a></p>
+<p id="n180" class="stm run hide_run"><a href="#n180">180</a></p>
+<p id="n181" class="pln"><a href="#n181">181</a></p>
+<p id="n182" class="pln"><a href="#n182">182</a></p>
+<p id="n183" class="stm run hide_run"><a href="#n183">183</a></p>
+<p id="n184" class="pln"><a href="#n184">184</a></p>
+<p id="n185" class="pln"><a href="#n185">185</a></p>
+<p id="n186" class="pln"><a href="#n186">186</a></p>
+<p id="n187" class="pln"><a href="#n187">187</a></p>
+<p id="n188" class="stm run hide_run"><a href="#n188">188</a></p>
+<p id="n189" class="stm run hide_run"><a href="#n189">189</a></p>
+<p id="n190" class="stm run hide_run"><a href="#n190">190</a></p>
+<p id="n191" class="stm run hide_run"><a href="#n191">191</a></p>
+<p id="n192" class="stm run hide_run"><a href="#n192">192</a></p>
+<p id="n193" class="pln"><a href="#n193">193</a></p>
+<p id="n194" class="stm run hide_run"><a href="#n194">194</a></p>
+<p id="n195" class="stm run hide_run"><a href="#n195">195</a></p>
+<p id="n196" class="stm run hide_run"><a href="#n196">196</a></p>
+<p id="n197" class="stm run hide_run"><a href="#n197">197</a></p>
+<p id="n198" class="pln"><a href="#n198">198</a></p>
+<p id="n199" class="stm run hide_run"><a href="#n199">199</a></p>
+<p id="n200" class="pln"><a href="#n200">200</a></p>
+<p id="n201" class="pln"><a href="#n201">201</a></p>
+<p id="n202" class="stm run hide_run"><a href="#n202">202</a></p>
+<p id="n203" class="pln"><a href="#n203">203</a></p>
+<p id="n204" class="pln"><a href="#n204">204</a></p>
+<p id="n205" class="pln"><a href="#n205">205</a></p>
+<p id="n206" class="pln"><a href="#n206">206</a></p>
+<p id="n207" class="pln"><a href="#n207">207</a></p>
+<p id="n208" class="stm run hide_run"><a href="#n208">208</a></p>
+<p id="n209" class="stm run hide_run"><a href="#n209">209</a></p>
+<p id="n210" class="pln"><a href="#n210">210</a></p>
+<p id="n211" class="stm run hide_run"><a href="#n211">211</a></p>
+<p id="n212" class="stm run hide_run"><a href="#n212">212</a></p>
+<p id="n213" class="stm run hide_run"><a href="#n213">213</a></p>
+<p id="n214" class="pln"><a href="#n214">214</a></p>
+<p id="n215" class="stm run hide_run"><a href="#n215">215</a></p>
+<p id="n216" class="stm run hide_run"><a href="#n216">216</a></p>
+<p id="n217" class="stm run hide_run"><a href="#n217">217</a></p>
+<p id="n218" class="stm run hide_run"><a href="#n218">218</a></p>
+<p id="n219" class="pln"><a href="#n219">219</a></p>
+<p id="n220" class="pln"><a href="#n220">220</a></p>
+<p id="n221" class="stm run hide_run"><a href="#n221">221</a></p>
+<p id="n222" class="pln"><a href="#n222">222</a></p>
+<p id="n223" class="pln"><a href="#n223">223</a></p>
+<p id="n224" class="pln"><a href="#n224">224</a></p>
+<p id="n225" class="pln"><a href="#n225">225</a></p>
+<p id="n226" class="pln"><a href="#n226">226</a></p>
+<p id="n227" class="pln"><a href="#n227">227</a></p>
+<p id="n228" class="pln"><a href="#n228">228</a></p>
+<p id="n229" class="pln"><a href="#n229">229</a></p>
+<p id="n230" class="stm run hide_run"><a href="#n230">230</a></p>
+<p id="n231" class="stm run hide_run"><a href="#n231">231</a></p>
+<p id="n232" class="stm run hide_run"><a href="#n232">232</a></p>
+<p id="n233" class="stm run hide_run"><a href="#n233">233</a></p>
+<p id="n234" class="stm run hide_run"><a href="#n234">234</a></p>
+<p id="n235" class="stm run hide_run"><a href="#n235">235</a></p>
+<p id="n236" class="pln"><a href="#n236">236</a></p>
+<p id="n237" class="stm run hide_run"><a href="#n237">237</a></p>
+<p id="n238" class="stm run hide_run"><a href="#n238">238</a></p>
+<p id="n239" class="stm run hide_run"><a href="#n239">239</a></p>
+<p id="n240" class="pln"><a href="#n240">240</a></p>
+<p id="n241" class="pln"><a href="#n241">241</a></p>
+<p id="n242" class="pln"><a href="#n242">242</a></p>
+<p id="n243" class="stm run hide_run"><a href="#n243">243</a></p>
+<p id="n244" class="stm mis"><a href="#n244">244</a></p>
+<p id="n245" class="stm mis"><a href="#n245">245</a></p>
+<p id="n246" class="stm mis"><a href="#n246">246</a></p>
+<p id="n247" class="stm mis"><a href="#n247">247</a></p>
+<p id="n248" class="stm mis"><a href="#n248">248</a></p>
+<p id="n249" class="stm mis"><a href="#n249">249</a></p>
+<p id="n250" class="stm mis"><a href="#n250">250</a></p>
+<p id="n251" class="stm mis"><a href="#n251">251</a></p>
+<p id="n252" class="pln"><a href="#n252">252</a></p>
+<p id="n253" class="stm mis"><a href="#n253">253</a></p>
+<p id="n254" class="pln"><a href="#n254">254</a></p>
+<p id="n255" class="stm mis"><a href="#n255">255</a></p>
+<p id="n256" class="stm mis"><a href="#n256">256</a></p>
+<p id="n257" class="stm mis"><a href="#n257">257</a></p>
+<p id="n258" class="stm mis"><a href="#n258">258</a></p>
+<p id="n259" class="stm mis"><a href="#n259">259</a></p>
+<p id="n260" class="stm mis"><a href="#n260">260</a></p>
+<p id="n261" class="pln"><a href="#n261">261</a></p>
+<p id="n262" class="stm mis"><a href="#n262">262</a></p>
+<p id="n263" class="stm mis"><a href="#n263">263</a></p>
+<p id="n264" class="stm mis"><a href="#n264">264</a></p>
+<p id="n265" class="stm mis"><a href="#n265">265</a></p>
+<p id="n266" class="pln"><a href="#n266">266</a></p>
+<p id="n267" class="stm mis"><a href="#n267">267</a></p>
+<p id="n268" class="pln"><a href="#n268">268</a></p>
+<p id="n269" class="pln"><a href="#n269">269</a></p>
+<p id="n270" class="stm run hide_run"><a href="#n270">270</a></p>
+<p id="n271" class="pln"><a href="#n271">271</a></p>
+<p id="n272" class="pln"><a href="#n272">272</a></p>
+<p id="n273" class="pln"><a href="#n273">273</a></p>
+<p id="n274" class="pln"><a href="#n274">274</a></p>
+<p id="n275" class="pln"><a href="#n275">275</a></p>
+<p id="n276" class="pln"><a href="#n276">276</a></p>
+<p id="n277" class="stm mis"><a href="#n277">277</a></p>
+<p id="n278" class="pln"><a href="#n278">278</a></p>
+<p id="n279" class="stm mis"><a href="#n279">279</a></p>
+<p id="n280" class="stm mis"><a href="#n280">280</a></p>
+<p id="n281" class="stm mis"><a href="#n281">281</a></p>
+<p id="n282" class="stm mis"><a href="#n282">282</a></p>
+<p id="n283" class="pln"><a href="#n283">283</a></p>
+<p id="n284" class="stm mis"><a href="#n284">284</a></p>
+<p id="n285" class="stm mis"><a href="#n285">285</a></p>
+<p id="n286" class="stm mis"><a href="#n286">286</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="str">"""DB actions wrapper module."""</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">model</span><span class="op">.</span><span class="nam">model</span> <span class="key">import</span> <span class="nam">Groups</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">model</span><span class="op">.</span><span class="nam">model</span> <span class="key">import</span> <span class="nam">Regions</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">error_base</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">storage</span> <span class="key">import</span> <span class="nam">base_data_manager</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">storage</span> <span class="key">import</span> <span class="nam">data_manager_factory</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="nam">LOG</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_regions_data</span><span class="op">(</span><span class="nam">url_parms</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln">    <span class="str">"""get region from db.</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln"><span class="str">    :param url_parms: the parameters got in the url to make the query</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln"><span class="str">    :return: region model for json output</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="str">    :raise: NoContentError( status code 404)</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run">    <span class="nam">region_dict</span><span class="op">,</span> <span class="nam">metadata_dict</span><span class="op">,</span> <span class="nam">end_point</span> <span class="op">=</span> <span class="nam">url_parms</span><span class="op">.</span><span class="nam">_build_query</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run">    <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run">    <span class="nam">regions</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">get_regions</span><span class="op">(</span><span class="nam">region_dict</span><span class="op">,</span> <span class="nam">metadata_dict</span><span class="op">,</span> <span class="nam">end_point</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="stm run hide_run">    <span class="key">if</span> <span class="key">not</span> <span class="nam">regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="str">"No regions found for the given search parameters"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="stm run hide_run">    <span class="key">return</span> <span class="nam">Regions</span><span class="op">(</span><span class="nam">regions</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_region_by_id_or_name</span><span class="op">(</span><span class="nam">region_id_or_name</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln"><span class="str">    :param region_id_or_name:</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln"><span class="str">    :return: region object (wsme format)</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="stm run hide_run">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"LOGIC:- get region data by id or name {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id_or_name</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="stm run hide_run">        <span class="nam">region</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">get_region_by_id_or_name</span><span class="op">(</span><span class="nam">region_id_or_name</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">        <span class="key">if</span> <span class="key">not</span> <span class="nam">region</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="str">"Region {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id_or_name</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t41" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"error in get region by id/name"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="stm run hide_run">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">    <span class="key">return</span> <span class="nam">region</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run"><span class="key">def</span> <span class="nam">update_region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">region</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln"><span class="str">    :param region:</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln"><span class="str">    :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"logic:- update region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">        <span class="nam">region</span> <span class="op">=</span> <span class="nam">region</span><span class="op">.</span><span class="nam">_to_clean_python_obj</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">        <span class="nam">region</span><span class="op">.</span><span class="nam">_validate_model</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm run hide_run">        <span class="nam">region_dict</span> <span class="op">=</span> <span class="nam">region</span><span class="op">.</span><span class="nam">_to_db_model_dict</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t60" class="stm run hide_run">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="stm run hide_run">        <span class="nam">db</span><span class="op">.</span><span class="nam">update_region</span><span class="op">(</span><span class="nam">region_to_update</span><span class="op">=</span><span class="nam">region_id</span><span class="op">,</span> <span class="op">**</span><span class="nam">region_dict</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"region {} updated"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="stm run hide_run">        <span class="nam">result</span> <span class="op">=</span> <span class="nam">get_region_by_id_or_name</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t65" class="stm run hide_run">    <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"fail to update region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="stm run hide_run">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"fail to update region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="stm run hide_run">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="stm run hide_run">    <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t73" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t74" class="stm run hide_run"><span class="key">def</span> <span class="nam">delete_region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t77" class="pln"><span class="str">    :param region_id:</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="pln"><span class="str">    :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="stm run hide_run">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"logic:- delete region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="stm run hide_run">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="stm run hide_run">        <span class="nam">db</span><span class="op">.</span><span class="nam">delete_region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"region deleted"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"fail to delete region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="stm run hide_run">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="stm run hide_run">    <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t91" class="stm run hide_run"><span class="key">def</span> <span class="nam">create_full_region</span><span class="op">(</span><span class="nam">full_region</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t92" class="pln">    <span class="str">"""create region logic.</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t94" class="pln"><span class="str">    :param full_region obj:</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="pln"><span class="str">    :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="pln"><span class="str">    :raise: input value error(status code 400)</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t98" class="stm run hide_run">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"logic:- save region "</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t101" class="stm run hide_run">        <span class="nam">full_region</span> <span class="op">=</span> <span class="nam">full_region</span><span class="op">.</span><span class="nam">_to_clean_python_obj</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="stm run hide_run">        <span class="nam">full_region</span><span class="op">.</span><span class="nam">_validate_model</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t104" class="stm run hide_run">        <span class="nam">full_region_db_dict</span> <span class="op">=</span> <span class="nam">full_region</span><span class="op">.</span><span class="nam">_to_db_model_dict</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"region to save {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">full_region_db_dict</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="stm run hide_run">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="stm run hide_run">        <span class="nam">db</span><span class="op">.</span><span class="nam">add_region</span><span class="op">(</span><span class="op">**</span><span class="nam">full_region_db_dict</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"region added"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="stm run hide_run">        <span class="nam">result</span> <span class="op">=</span> <span class="nam">get_region_by_id_or_name</span><span class="op">(</span><span class="nam">full_region</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t111" class="stm run hide_run">    <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t112" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"error in save region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="stm run hide_run">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="stm run hide_run">    <span class="key">except</span> <span class="nam">base_data_manager</span><span class="op">.</span><span class="nam">DuplicateEntryError</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"error in save region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ConflictError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t118" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"error in save region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="stm run hide_run">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t121" class="stm run hide_run">    <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t123" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t124" class="stm run hide_run"><span class="key">def</span> <span class="nam">add_region_metadata</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_dict</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="stm mis">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Add metadata: {} to region id : {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">metadata_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t126" class="pln">                                                          <span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t127" class="stm mis">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t128" class="stm mis">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t129" class="stm mis">        <span class="nam">result</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">add_meta_data_to_region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_dict</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="stm mis">        <span class="key">if</span> <span class="key">not</span> <span class="nam">result</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t131" class="stm mis">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="str">"Region {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t132" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t133" class="stm mis">            <span class="key">return</span> <span class="nam">result</span><span class="op">.</span><span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t134" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t135" class="stm mis">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t136" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Error getting metadata for region id:"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t137" class="stm mis">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t138" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t139" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t140" class="stm run hide_run"><span class="key">def</span> <span class="nam">update_region_metadata</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_dict</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t141" class="stm mis">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Update metadata to region id : {}. "</span><span class="strut">&nbsp;</span></p>
+<p id="t142" class="pln">              <span class="str">"New metadata: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_dict</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t143" class="stm mis">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t144" class="stm mis">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t145" class="stm mis">        <span class="nam">result</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">update_region_meta_data</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_dict</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t146" class="stm mis">        <span class="key">if</span> <span class="key">not</span> <span class="nam">result</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t147" class="stm mis">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="str">"Region {} not "</span><span class="strut">&nbsp;</span></p>
+<p id="t148" class="pln">                                                   <span class="str">"found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t149" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t150" class="stm mis">            <span class="key">return</span> <span class="nam">result</span><span class="op">.</span><span class="nam">metadata</span><span class="strut">&nbsp;</span></p>
+<p id="t151" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t152" class="stm mis">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t153" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Error getting metadata for region id:"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t154" class="stm mis">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t155" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t156" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t157" class="stm run hide_run"><span class="key">def</span> <span class="nam">delete_metadata_from_region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_key</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t158" class="stm mis">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"Delete metadata key: {} from region id : {}."</span><span class="strut">&nbsp;</span></p>
+<p id="t159" class="pln">             <span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">metadata_key</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t160" class="stm mis">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t161" class="stm mis">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t162" class="stm mis">        <span class="nam">db</span><span class="op">.</span><span class="nam">delete_region_metadata</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">metadata_key</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t163" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t164" class="stm mis">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t165" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Error getting metadata for region id:"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t166" class="stm mis">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t167" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t168" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t169" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_groups_data</span><span class="op">(</span><span class="nam">name</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t170" class="pln">    <span class="str">"""get group from db.</span><span class="strut">&nbsp;</span></p>
+<p id="t171" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t172" class="pln"><span class="str">    :param name: groupe name</span><span class="strut">&nbsp;</span></p>
+<p id="t173" class="pln"><span class="str">    :return: groupe object with its regions</span><span class="strut">&nbsp;</span></p>
+<p id="t174" class="pln"><span class="str">    :raise: NoContentError( status code 404)</span><span class="strut">&nbsp;</span></p>
+<p id="t175" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t176" class="stm run hide_run">    <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t177" class="stm run hide_run">    <span class="nam">groups</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">get_group</span><span class="op">(</span><span class="nam">name</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t178" class="stm run hide_run">    <span class="key">if</span> <span class="key">not</span> <span class="nam">groups</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t179" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="str">"Group {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">name</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t180" class="stm run hide_run">    <span class="key">return</span> <span class="nam">Groups</span><span class="op">(</span><span class="op">**</span><span class="nam">groups</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t181" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t182" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t183" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_all_groups</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t184" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t185" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t186" class="pln"><span class="str">    :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t187" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t188" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t189" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"logic - get all groups"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t190" class="stm run hide_run">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t191" class="stm run hide_run">        <span class="nam">all_groups</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">get_all_groups</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t192" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"logic - got all groups {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">all_groups</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t193" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t194" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t195" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"fail to get all groups"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t196" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t197" class="stm run hide_run">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t198" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t199" class="stm run hide_run">    <span class="key">return</span> <span class="nam">all_groups</span><span class="strut">&nbsp;</span></p>
+<p id="t200" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t201" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t202" class="stm run hide_run"><span class="key">def</span> <span class="nam">delete_group</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t203" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t204" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t205" class="pln"><span class="str">    :param group_id:</span><span class="strut">&nbsp;</span></p>
+<p id="t206" class="pln"><span class="str">    :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t207" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t208" class="stm run hide_run">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"delete group logic"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t209" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t210" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t211" class="stm run hide_run">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t212" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"delete group id {} from db"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t213" class="stm run hide_run">        <span class="nam">db</span><span class="op">.</span><span class="nam">delete_group</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t214" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t215" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t216" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t217" class="stm run hide_run">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t218" class="stm run hide_run">    <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t219" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t220" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t221" class="stm run hide_run"><span class="key">def</span> <span class="nam">create_group_in_db</span><span class="op">(</span><span class="nam">group_id</span><span class="op">,</span> <span class="nam">group_name</span><span class="op">,</span> <span class="nam">description</span><span class="op">,</span> <span class="nam">regions</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t222" class="pln">    <span class="str">"""Create a region group in the database.</span><span class="strut">&nbsp;</span></p>
+<p id="t223" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t224" class="pln"><span class="str">    :param group_id: The ID of the group to create</span><span class="strut">&nbsp;</span></p>
+<p id="t225" class="pln"><span class="str">    :param group_name: The name of the group to create</span><span class="strut">&nbsp;</span></p>
+<p id="t226" class="pln"><span class="str">    :param description: The group description</span><span class="strut">&nbsp;</span></p>
+<p id="t227" class="pln"><span class="str">    :param regions: A list of regions inside the group</span><span class="strut">&nbsp;</span></p>
+<p id="t228" class="pln"><span class="str">    :raise: GroupExistsError (status code 400) if the group already exists</span><span class="strut">&nbsp;</span></p>
+<p id="t229" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t230" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t231" class="stm run hide_run">        <span class="nam">manager</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t232" class="stm run hide_run">        <span class="nam">manager</span><span class="op">.</span><span class="nam">add_group</span><span class="op">(</span><span class="nam">group_id</span><span class="op">,</span> <span class="nam">group_name</span><span class="op">,</span> <span class="nam">description</span><span class="op">,</span> <span class="nam">regions</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t233" class="stm run hide_run">    <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ConflictError</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t234" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Group {} already exists"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t235" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ConflictError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t236" class="pln">            <span class="nam">message</span><span class="op">=</span><span class="str">"Group {} already exists"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t237" class="stm run hide_run">    <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t238" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Some of the regions not found"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t239" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t240" class="pln">            <span class="nam">message</span><span class="op">=</span><span class="str">"Some of the regions not found"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t241" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t242" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t243" class="stm run hide_run"><span class="key">def</span> <span class="nam">update_group</span><span class="op">(</span><span class="nam">group</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t244" class="stm mis">    <span class="nam">result</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t245" class="stm mis">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"update group logic"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t246" class="stm mis">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t247" class="stm mis">        <span class="nam">group</span> <span class="op">=</span> <span class="nam">group</span><span class="op">.</span><span class="nam">_to_python_obj</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t248" class="stm mis">        <span class="nam">db_manager</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t249" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"update group to {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group</span><span class="op">.</span><span class="nam">_to_db_model_dict</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t250" class="stm mis">        <span class="nam">db_manager</span><span class="op">.</span><span class="nam">update_group</span><span class="op">(</span><span class="nam">group_id</span><span class="op">=</span><span class="nam">group_id</span><span class="op">,</span> <span class="op">**</span><span class="nam">group</span><span class="op">.</span><span class="nam">_to_db_model_dict</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t251" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"group updated"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t252" class="pln">        <span class="com"># make sure it updated</span><span class="strut">&nbsp;</span></p>
+<p id="t253" class="stm mis">        <span class="nam">groups</span> <span class="op">=</span> <span class="nam">db_manager</span><span class="op">.</span><span class="nam">get_group</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t254" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t255" class="stm mis">    <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t256" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Group {} not found"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t257" class="stm mis">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t258" class="stm mis">    <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t259" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Some of the regions not found"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t260" class="stm mis">        <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t261" class="pln">            <span class="nam">message</span><span class="op">=</span><span class="str">"Some of the regions not found"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t262" class="stm mis">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t263" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Failed to update group {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group</span><span class="op">.</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t264" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t265" class="stm mis">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t266" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t267" class="stm mis">    <span class="key">return</span> <span class="nam">Groups</span><span class="op">(</span><span class="op">**</span><span class="nam">groups</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t268" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t269" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t270" class="stm run hide_run"><span class="key">def</span> <span class="nam">update_region_status</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">new_status</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t271" class="pln">    <span class="str">"""Update region.</span><span class="strut">&nbsp;</span></p>
+<p id="t272" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t273" class="pln"><span class="str">    :param region_id:</span><span class="strut">&nbsp;</span></p>
+<p id="t274" class="pln"><span class="str">    :param new_status:</span><span class="strut">&nbsp;</span></p>
+<p id="t275" class="pln"><span class="str">    :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t276" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t277" class="stm mis">    <span class="nam">LOG</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Update region id: {} status to: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t278" class="pln">                                                          <span class="nam">new_status</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t279" class="stm mis">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t280" class="stm mis">        <span class="nam">db</span> <span class="op">=</span> <span class="nam">data_manager_factory</span><span class="op">.</span><span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t281" class="stm mis">        <span class="nam">result</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">update_region_status</span><span class="op">(</span><span class="nam">region_id</span><span class="op">,</span> <span class="nam">new_status</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t282" class="stm mis">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t283" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t284" class="stm mis">    <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t285" class="stm mis">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"Error updating status for region id:"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t286" class="stm mis">        <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_storage___init___py.html b/orm/services/region_manager/htmlcov/rms_storage___init___py.html
new file mode 100644
index 00000000..b9e43969
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_storage___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/storage/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/storage/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_storage_base_data_manager_py.html b/orm/services/region_manager/htmlcov/rms_storage_base_data_manager_py.html
new file mode 100644
index 00000000..c3b0d045
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_storage_base_data_manager_py.html
@@ -0,0 +1,331 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/storage/base_data_manager.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/storage/base_data_manager.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            24 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">24 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="pln"><a href="#n1">1</a></p>
+<p id="n2" class="stm run hide_run"><a href="#n2">2</a></p>
+<p id="n3" class="pln"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="pln"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="pln"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="pln"><a href="#n15">15</a></p>
+<p id="n16" class="pln"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="pln"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="pln"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="pln"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="stm run hide_run"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="stm run hide_run"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="stm run hide_run"><a href="#n42">42</a></p>
+<p id="n43" class="pln"><a href="#n43">43</a></p>
+<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="pln"><a href="#n48">48</a></p>
+<p id="n49" class="pln"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="pln"><a href="#n53">53</a></p>
+<p id="n54" class="pln"><a href="#n54">54</a></p>
+<p id="n55" class="pln"><a href="#n55">55</a></p>
+<p id="n56" class="pln"><a href="#n56">56</a></p>
+<p id="n57" class="pln"><a href="#n57">57</a></p>
+<p id="n58" class="pln"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="pln"><a href="#n65">65</a></p>
+<p id="n66" class="pln"><a href="#n66">66</a></p>
+<p id="n67" class="pln"><a href="#n67">67</a></p>
+<p id="n68" class="pln"><a href="#n68">68</a></p>
+<p id="n69" class="pln"><a href="#n69">69</a></p>
+<p id="n70" class="pln"><a href="#n70">70</a></p>
+<p id="n71" class="pln"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="stm run hide_run"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="pln"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="pln"><a href="#n79">79</a></p>
+<p id="n80" class="pln"><a href="#n80">80</a></p>
+<p id="n81" class="pln"><a href="#n81">81</a></p>
+<p id="n82" class="pln"><a href="#n82">82</a></p>
+<p id="n83" class="pln"><a href="#n83">83</a></p>
+<p id="n84" class="pln"><a href="#n84">84</a></p>
+<p id="n85" class="pln"><a href="#n85">85</a></p>
+<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p>
+<p id="n87" class="stm run hide_run"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="stm run hide_run"><a href="#n89">89</a></p>
+<p id="n90" class="stm run hide_run"><a href="#n90">90</a></p>
+<p id="n91" class="pln"><a href="#n91">91</a></p>
+<p id="n92" class="stm run hide_run"><a href="#n92">92</a></p>
+<p id="n93" class="pln"><a href="#n93">93</a></p>
+<p id="n94" class="pln"><a href="#n94">94</a></p>
+<p id="n95" class="pln"><a href="#n95">95</a></p>
+<p id="n96" class="pln"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="pln"><a href="#n98">98</a></p>
+<p id="n99" class="pln"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="pln"><a href="#n101">101</a></p>
+<p id="n102" class="pln"><a href="#n102">102</a></p>
+<p id="n103" class="pln"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="stm run hide_run"><a href="#n105">105</a></p>
+<p id="n106" class="stm run hide_run"><a href="#n106">106</a></p>
+<p id="n107" class="pln"><a href="#n107">107</a></p>
+<p id="n108" class="pln"><a href="#n108">108</a></p>
+<p id="n109" class="stm run hide_run"><a href="#n109">109</a></p>
+<p id="n110" class="pln"><a href="#n110">110</a></p>
+<p id="n111" class="stm run hide_run"><a href="#n111">111</a></p>
+<p id="n112" class="pln"><a href="#n112">112</a></p>
+<p id="n113" class="pln"><a href="#n113">113</a></p>
+<p id="n114" class="stm run hide_run"><a href="#n114">114</a></p>
+<p id="n115" class="pln"><a href="#n115">115</a></p>
+<p id="n116" class="stm run hide_run"><a href="#n116">116</a></p>
+<p id="n117" class="pln"><a href="#n117">117</a></p>
+<p id="n118" class="pln"><a href="#n118">118</a></p>
+<p id="n119" class="stm run hide_run"><a href="#n119">119</a></p>
+<p id="n120" class="pln"><a href="#n120">120</a></p>
+<p id="n121" class="stm run hide_run"><a href="#n121">121</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t2" class="stm run hide_run"><span class="key">class</span> <span class="nam">BaseDataManager</span><span class="op">(</span><span class="nam">object</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">url</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="pln">                 <span class="nam">max_retries</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln">                 <span class="nam">retry_interval</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run">        <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_region</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln">                   <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln">                   <span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="pln">                   <span class="nam">address_state</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln">                   <span class="nam">address_country</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln">                   <span class="nam">address_city</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="pln">                   <span class="nam">address_street</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="pln">                   <span class="nam">address_zip</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln">                   <span class="nam">region_status</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln">                   <span class="nam">ranger_agent_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="pln">                   <span class="nam">open_stack_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln">                   <span class="nam">design_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln">                   <span class="nam">location_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="pln">                   <span class="nam">vlcp_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln">                   <span class="nam">clli</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln">                   <span class="nam">description</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln">                   <span class="nam">meta_data_list</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="pln">                   <span class="nam">end_point_list</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln">                   <span class="nam">is_ecomp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln">                   <span class="nam">is_ssp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln">                   <span class="nam">purpose_of_region</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">"Please Implement this method"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln"><span class="str">    def delete_region(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln"><span class="str">                      region_id):</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln"><span class="str">        raise NotImplementedError("Please Implement this method")</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t38" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_regions</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln">                    <span class="nam">region_filters_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln">                    <span class="nam">meta_data_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln">                    <span class="nam">end_point_dict</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">"Please Implement this method"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_all_regions</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">"Please Implement this method"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="pln"><span class="str">    def add_meta_data_to_region(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="pln"><span class="str">                                region_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln"><span class="str">                                key,</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln"><span class="str">                                value,</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln"><span class="str">                                description):</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="pln"><span class="str">        raise NotImplementedError("Please Implement this method")</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t55" class="pln"><span class="str">    def remove_meta_data_from_region(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="pln"><span class="str">                                     region_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="pln"><span class="str">                                     key):</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="pln"><span class="str">        raise NotImplementedError("Please Implement this method")</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln"><span class="str">    def add_end_point_to_region(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln"><span class="str">                                region_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln"><span class="str">                                end_point_type,</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln"><span class="str">                                end_point_url,</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln"><span class="str">                                description):</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="pln"><span class="str">        raise NotImplementedError("Please Implement this method")</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t67" class="pln"><span class="str">    def remove_end_point_from_region(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="pln"><span class="str">                                     region_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="pln"><span class="str">                                     end_point_type):</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="pln"><span class="str">        raise NotImplementedError("Please Implement this method")</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t73" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_group</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln">                  <span class="nam">group_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln">                  <span class="nam">group_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln">                  <span class="nam">group_description</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t77" class="pln">                  <span class="nam">region_ids_list</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">"Please Implement this method"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t80" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="pln"><span class="str">    def delete_group(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="pln"><span class="str">                     group_name):</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="pln"><span class="str">        raise NotImplementedError("Please Implement this method")</span><span class="strut">&nbsp;</span></p>
+<p id="t84" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_group</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">"Please Implement this method"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t89" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_all_groups</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">NotImplementedError</span><span class="op">(</span><span class="str">"Please Implement this method"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t92" class="stm run hide_run">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="pln"><span class="str">    def add_region_to_group(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="pln"><span class="str">                            group_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="pln"><span class="str">                            region_id):</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="pln"><span class="str">        raise NotImplementedError("Please Implement this method")</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t98" class="pln"><span class="str">    def remove_region_from_group(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="pln"><span class="str">                                 group_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln"><span class="str">                                 region_id):</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="pln"><span class="str">        raise NotImplementedError("Please Implement this method")</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t105" class="stm run hide_run"><span class="key">class</span> <span class="nam">SQLDBError</span><span class="op">(</span><span class="nam">Exception</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t108" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t109" class="stm run hide_run"><span class="key">class</span> <span class="nam">EntityNotFound</span><span class="op">(</span><span class="nam">Exception</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="pln">    <span class="str">"""if item not found in DB."""</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t112" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t113" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t114" class="stm run hide_run"><span class="key">class</span> <span class="nam">DuplicateEntryError</span><span class="op">(</span><span class="nam">Exception</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="pln">    <span class="str">"""A group already exists."""</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t118" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t119" class="stm run hide_run"><span class="key">class</span> <span class="nam">InputValueError</span><span class="op">(</span><span class="nam">Exception</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="pln">    <span class="str">""" unvalid input from user"""</span><span class="strut">&nbsp;</span></p>
+<p id="t121" class="stm run hide_run">    <span class="key">pass</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_storage_data_manager_factory_py.html b/orm/services/region_manager/htmlcov/rms_storage_data_manager_factory_py.html
new file mode 100644
index 00000000..87d1ef0d
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_storage_data_manager_factory_py.html
@@ -0,0 +1,129 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/storage/data_manager_factory.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/storage/data_manager_factory.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            12 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">12 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="pln"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="pln"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p>
+<p id="n17" class="stm run hide_run"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">storage</span><span class="op">.</span><span class="nam">my_sql</span><span class="op">.</span><span class="nam">data_manager</span> <span class="key">import</span> <span class="nam">DataManager</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="nam">LOG</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_data_manager</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run">        <span class="nam">dm</span> <span class="op">=</span> <span class="nam">DataManager</span><span class="op">(</span><span class="nam">url</span><span class="op">=</span><span class="nam">conf</span><span class="op">.</span><span class="nam">database</span><span class="op">.</span><span class="nam">url</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln">                         <span class="nam">max_retries</span><span class="op">=</span><span class="nam">conf</span><span class="op">.</span><span class="nam">database</span><span class="op">.</span><span class="nam">max_retries</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln">                         <span class="nam">retries_interval</span><span class="op">=</span><span class="nam">conf</span><span class="op">.</span><span class="nam">database</span><span class="op">.</span><span class="nam">retries_interval</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run">        <span class="key">return</span> <span class="nam">dm</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm run hide_run">        <span class="nam">nagios_message</span> <span class="op">=</span> <span class="str">"CRITICAL|CONDB001 - Could not establish "</span> <span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln">                         <span class="str">"database connection"</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run">        <span class="nam">LOG</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">nagios_message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="stm run hide_run">        <span class="key">raise</span> <span class="nam">Exception</span><span class="op">(</span><span class="str">"Could not establish database connection"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_storage_my_sql___init___py.html b/orm/services/region_manager/htmlcov/rms_storage_my_sql___init___py.html
new file mode 100644
index 00000000..a6e95539
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_storage_my_sql___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/storage/my_sql/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/storage/my_sql/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_storage_my_sql_data_manager_py.html b/orm/services/region_manager/htmlcov/rms_storage_my_sql_data_manager_py.html
new file mode 100644
index 00000000..589a433b
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_storage_my_sql_data_manager_py.html
@@ -0,0 +1,1147 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/storage/my_sql/data_manager.py: 89%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/storage/my_sql/data_manager.py</b> :
+            <span class="pc_cov">89%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            270 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">239 run</span>
+            <span class="mis shortkey_m button_toggle_mis">31 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
+<p id="n7" class="pln"><a href="#n7">7</a></p>
+<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="stm run hide_run"><a href="#n10">10</a></p>
+<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p>
+<p id="n17" class="pln"><a href="#n17">17</a></p>
+<p id="n18" class="pln"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p>
+<p id="n22" class="stm run hide_run"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="pln"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="pln"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="pln"><a href="#n29">29</a></p>
+<p id="n30" class="pln"><a href="#n30">30</a></p>
+<p id="n31" class="pln"><a href="#n31">31</a></p>
+<p id="n32" class="pln"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="pln"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="pln"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="pln"><a href="#n40">40</a></p>
+<p id="n41" class="pln"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="pln"><a href="#n43">43</a></p>
+<p id="n44" class="pln"><a href="#n44">44</a></p>
+<p id="n45" class="pln"><a href="#n45">45</a></p>
+<p id="n46" class="pln"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="pln"><a href="#n48">48</a></p>
+<p id="n49" class="pln"><a href="#n49">49</a></p>
+<p id="n50" class="pln"><a href="#n50">50</a></p>
+<p id="n51" class="pln"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="pln"><a href="#n53">53</a></p>
+<p id="n54" class="pln"><a href="#n54">54</a></p>
+<p id="n55" class="stm run hide_run"><a href="#n55">55</a></p>
+<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p>
+<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p>
+<p id="n58" class="stm run hide_run"><a href="#n58">58</a></p>
+<p id="n59" class="pln"><a href="#n59">59</a></p>
+<p id="n60" class="pln"><a href="#n60">60</a></p>
+<p id="n61" class="pln"><a href="#n61">61</a></p>
+<p id="n62" class="pln"><a href="#n62">62</a></p>
+<p id="n63" class="pln"><a href="#n63">63</a></p>
+<p id="n64" class="pln"><a href="#n64">64</a></p>
+<p id="n65" class="pln"><a href="#n65">65</a></p>
+<p id="n66" class="pln"><a href="#n66">66</a></p>
+<p id="n67" class="pln"><a href="#n67">67</a></p>
+<p id="n68" class="pln"><a href="#n68">68</a></p>
+<p id="n69" class="pln"><a href="#n69">69</a></p>
+<p id="n70" class="pln"><a href="#n70">70</a></p>
+<p id="n71" class="pln"><a href="#n71">71</a></p>
+<p id="n72" class="pln"><a href="#n72">72</a></p>
+<p id="n73" class="pln"><a href="#n73">73</a></p>
+<p id="n74" class="pln"><a href="#n74">74</a></p>
+<p id="n75" class="pln"><a href="#n75">75</a></p>
+<p id="n76" class="pln"><a href="#n76">76</a></p>
+<p id="n77" class="stm run hide_run"><a href="#n77">77</a></p>
+<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p>
+<p id="n79" class="stm run hide_run"><a href="#n79">79</a></p>
+<p id="n80" class="pln"><a href="#n80">80</a></p>
+<p id="n81" class="pln"><a href="#n81">81</a></p>
+<p id="n82" class="stm run hide_run"><a href="#n82">82</a></p>
+<p id="n83" class="pln"><a href="#n83">83</a></p>
+<p id="n84" class="stm run hide_run"><a href="#n84">84</a></p>
+<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p>
+<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p>
+<p id="n87" class="stm run hide_run"><a href="#n87">87</a></p>
+<p id="n88" class="pln"><a href="#n88">88</a></p>
+<p id="n89" class="pln"><a href="#n89">89</a></p>
+<p id="n90" class="pln"><a href="#n90">90</a></p>
+<p id="n91" class="pln"><a href="#n91">91</a></p>
+<p id="n92" class="stm run hide_run"><a href="#n92">92</a></p>
+<p id="n93" class="stm run hide_run"><a href="#n93">93</a></p>
+<p id="n94" class="stm run hide_run"><a href="#n94">94</a></p>
+<p id="n95" class="stm run hide_run"><a href="#n95">95</a></p>
+<p id="n96" class="pln"><a href="#n96">96</a></p>
+<p id="n97" class="pln"><a href="#n97">97</a></p>
+<p id="n98" class="stm run hide_run"><a href="#n98">98</a></p>
+<p id="n99" class="pln"><a href="#n99">99</a></p>
+<p id="n100" class="pln"><a href="#n100">100</a></p>
+<p id="n101" class="pln"><a href="#n101">101</a></p>
+<p id="n102" class="pln"><a href="#n102">102</a></p>
+<p id="n103" class="pln"><a href="#n103">103</a></p>
+<p id="n104" class="pln"><a href="#n104">104</a></p>
+<p id="n105" class="pln"><a href="#n105">105</a></p>
+<p id="n106" class="pln"><a href="#n106">106</a></p>
+<p id="n107" class="pln"><a href="#n107">107</a></p>
+<p id="n108" class="pln"><a href="#n108">108</a></p>
+<p id="n109" class="pln"><a href="#n109">109</a></p>
+<p id="n110" class="pln"><a href="#n110">110</a></p>
+<p id="n111" class="pln"><a href="#n111">111</a></p>
+<p id="n112" class="pln"><a href="#n112">112</a></p>
+<p id="n113" class="pln"><a href="#n113">113</a></p>
+<p id="n114" class="pln"><a href="#n114">114</a></p>
+<p id="n115" class="pln"><a href="#n115">115</a></p>
+<p id="n116" class="pln"><a href="#n116">116</a></p>
+<p id="n117" class="pln"><a href="#n117">117</a></p>
+<p id="n118" class="pln"><a href="#n118">118</a></p>
+<p id="n119" class="pln"><a href="#n119">119</a></p>
+<p id="n120" class="pln"><a href="#n120">120</a></p>
+<p id="n121" class="pln"><a href="#n121">121</a></p>
+<p id="n122" class="pln"><a href="#n122">122</a></p>
+<p id="n123" class="pln"><a href="#n123">123</a></p>
+<p id="n124" class="pln"><a href="#n124">124</a></p>
+<p id="n125" class="pln"><a href="#n125">125</a></p>
+<p id="n126" class="pln"><a href="#n126">126</a></p>
+<p id="n127" class="pln"><a href="#n127">127</a></p>
+<p id="n128" class="stm run hide_run"><a href="#n128">128</a></p>
+<p id="n129" class="stm run hide_run"><a href="#n129">129</a></p>
+<p id="n130" class="stm run hide_run"><a href="#n130">130</a></p>
+<p id="n131" class="pln"><a href="#n131">131</a></p>
+<p id="n132" class="stm run hide_run"><a href="#n132">132</a></p>
+<p id="n133" class="stm run hide_run"><a href="#n133">133</a></p>
+<p id="n134" class="pln"><a href="#n134">134</a></p>
+<p id="n135" class="stm run hide_run"><a href="#n135">135</a></p>
+<p id="n136" class="stm run hide_run"><a href="#n136">136</a></p>
+<p id="n137" class="pln"><a href="#n137">137</a></p>
+<p id="n138" class="pln"><a href="#n138">138</a></p>
+<p id="n139" class="stm run hide_run"><a href="#n139">139</a></p>
+<p id="n140" class="stm run hide_run"><a href="#n140">140</a></p>
+<p id="n141" class="stm run hide_run"><a href="#n141">141</a></p>
+<p id="n142" class="stm run hide_run"><a href="#n142">142</a></p>
+<p id="n143" class="stm run hide_run"><a href="#n143">143</a></p>
+<p id="n144" class="stm run hide_run"><a href="#n144">144</a></p>
+<p id="n145" class="stm run hide_run"><a href="#n145">145</a></p>
+<p id="n146" class="stm run hide_run"><a href="#n146">146</a></p>
+<p id="n147" class="stm run hide_run"><a href="#n147">147</a></p>
+<p id="n148" class="stm run hide_run"><a href="#n148">148</a></p>
+<p id="n149" class="stm run hide_run"><a href="#n149">149</a></p>
+<p id="n150" class="stm run hide_run"><a href="#n150">150</a></p>
+<p id="n151" class="stm run hide_run"><a href="#n151">151</a></p>
+<p id="n152" class="stm run hide_run"><a href="#n152">152</a></p>
+<p id="n153" class="stm run hide_run"><a href="#n153">153</a></p>
+<p id="n154" class="stm run hide_run"><a href="#n154">154</a></p>
+<p id="n155" class="pln"><a href="#n155">155</a></p>
+<p id="n156" class="stm run hide_run"><a href="#n156">156</a></p>
+<p id="n157" class="stm run hide_run"><a href="#n157">157</a></p>
+<p id="n158" class="stm run hide_run"><a href="#n158">158</a></p>
+<p id="n159" class="pln"><a href="#n159">159</a></p>
+<p id="n160" class="pln"><a href="#n160">160</a></p>
+<p id="n161" class="pln"><a href="#n161">161</a></p>
+<p id="n162" class="stm run hide_run"><a href="#n162">162</a></p>
+<p id="n163" class="pln"><a href="#n163">163</a></p>
+<p id="n164" class="stm run hide_run"><a href="#n164">164</a></p>
+<p id="n165" class="stm run hide_run"><a href="#n165">165</a></p>
+<p id="n166" class="stm run hide_run"><a href="#n166">166</a></p>
+<p id="n167" class="stm run hide_run"><a href="#n167">167</a></p>
+<p id="n168" class="pln"><a href="#n168">168</a></p>
+<p id="n169" class="pln"><a href="#n169">169</a></p>
+<p id="n170" class="pln"><a href="#n170">170</a></p>
+<p id="n171" class="pln"><a href="#n171">171</a></p>
+<p id="n172" class="stm run hide_run"><a href="#n172">172</a></p>
+<p id="n173" class="pln"><a href="#n173">173</a></p>
+<p id="n174" class="stm run hide_run"><a href="#n174">174</a></p>
+<p id="n175" class="stm run hide_run"><a href="#n175">175</a></p>
+<p id="n176" class="pln"><a href="#n176">176</a></p>
+<p id="n177" class="pln"><a href="#n177">177</a></p>
+<p id="n178" class="stm run hide_run"><a href="#n178">178</a></p>
+<p id="n179" class="stm run hide_run"><a href="#n179">179</a></p>
+<p id="n180" class="stm run hide_run"><a href="#n180">180</a></p>
+<p id="n181" class="stm run hide_run"><a href="#n181">181</a></p>
+<p id="n182" class="pln"><a href="#n182">182</a></p>
+<p id="n183" class="stm run hide_run"><a href="#n183">183</a></p>
+<p id="n184" class="pln"><a href="#n184">184</a></p>
+<p id="n185" class="pln"><a href="#n185">185</a></p>
+<p id="n186" class="stm run hide_run"><a href="#n186">186</a></p>
+<p id="n187" class="stm run hide_run"><a href="#n187">187</a></p>
+<p id="n188" class="stm run hide_run"><a href="#n188">188</a></p>
+<p id="n189" class="pln"><a href="#n189">189</a></p>
+<p id="n190" class="stm run hide_run"><a href="#n190">190</a></p>
+<p id="n191" class="stm run hide_run"><a href="#n191">191</a></p>
+<p id="n192" class="pln"><a href="#n192">192</a></p>
+<p id="n193" class="stm run hide_run"><a href="#n193">193</a></p>
+<p id="n194" class="pln"><a href="#n194">194</a></p>
+<p id="n195" class="pln"><a href="#n195">195</a></p>
+<p id="n196" class="pln"><a href="#n196">196</a></p>
+<p id="n197" class="stm run hide_run"><a href="#n197">197</a></p>
+<p id="n198" class="stm run hide_run"><a href="#n198">198</a></p>
+<p id="n199" class="stm run hide_run"><a href="#n199">199</a></p>
+<p id="n200" class="stm run hide_run"><a href="#n200">200</a></p>
+<p id="n201" class="stm run hide_run"><a href="#n201">201</a></p>
+<p id="n202" class="stm run hide_run"><a href="#n202">202</a></p>
+<p id="n203" class="stm run hide_run"><a href="#n203">203</a></p>
+<p id="n204" class="pln"><a href="#n204">204</a></p>
+<p id="n205" class="stm run hide_run"><a href="#n205">205</a></p>
+<p id="n206" class="stm run hide_run"><a href="#n206">206</a></p>
+<p id="n207" class="pln"><a href="#n207">207</a></p>
+<p id="n208" class="stm run hide_run"><a href="#n208">208</a></p>
+<p id="n209" class="stm run hide_run"><a href="#n209">209</a></p>
+<p id="n210" class="stm run hide_run"><a href="#n210">210</a></p>
+<p id="n211" class="pln"><a href="#n211">211</a></p>
+<p id="n212" class="stm run hide_run"><a href="#n212">212</a></p>
+<p id="n213" class="stm run hide_run"><a href="#n213">213</a></p>
+<p id="n214" class="pln"><a href="#n214">214</a></p>
+<p id="n215" class="stm run hide_run"><a href="#n215">215</a></p>
+<p id="n216" class="stm run hide_run"><a href="#n216">216</a></p>
+<p id="n217" class="stm run hide_run"><a href="#n217">217</a></p>
+<p id="n218" class="stm run hide_run"><a href="#n218">218</a></p>
+<p id="n219" class="pln"><a href="#n219">219</a></p>
+<p id="n220" class="stm run hide_run"><a href="#n220">220</a></p>
+<p id="n221" class="stm run hide_run"><a href="#n221">221</a></p>
+<p id="n222" class="stm run hide_run"><a href="#n222">222</a></p>
+<p id="n223" class="stm run hide_run"><a href="#n223">223</a></p>
+<p id="n224" class="pln"><a href="#n224">224</a></p>
+<p id="n225" class="stm run hide_run"><a href="#n225">225</a></p>
+<p id="n226" class="stm run hide_run"><a href="#n226">226</a></p>
+<p id="n227" class="stm run hide_run"><a href="#n227">227</a></p>
+<p id="n228" class="stm mis"><a href="#n228">228</a></p>
+<p id="n229" class="stm run hide_run"><a href="#n229">229</a></p>
+<p id="n230" class="stm run hide_run"><a href="#n230">230</a></p>
+<p id="n231" class="stm run hide_run"><a href="#n231">231</a></p>
+<p id="n232" class="stm mis"><a href="#n232">232</a></p>
+<p id="n233" class="pln"><a href="#n233">233</a></p>
+<p id="n234" class="pln"><a href="#n234">234</a></p>
+<p id="n235" class="stm mis"><a href="#n235">235</a></p>
+<p id="n236" class="stm mis"><a href="#n236">236</a></p>
+<p id="n237" class="stm mis"><a href="#n237">237</a></p>
+<p id="n238" class="stm mis"><a href="#n238">238</a></p>
+<p id="n239" class="stm mis"><a href="#n239">239</a></p>
+<p id="n240" class="stm mis"><a href="#n240">240</a></p>
+<p id="n241" class="pln"><a href="#n241">241</a></p>
+<p id="n242" class="stm run hide_run"><a href="#n242">242</a></p>
+<p id="n243" class="stm run hide_run"><a href="#n243">243</a></p>
+<p id="n244" class="stm run hide_run"><a href="#n244">244</a></p>
+<p id="n245" class="stm run hide_run"><a href="#n245">245</a></p>
+<p id="n246" class="stm run hide_run"><a href="#n246">246</a></p>
+<p id="n247" class="pln"><a href="#n247">247</a></p>
+<p id="n248" class="stm mis"><a href="#n248">248</a></p>
+<p id="n249" class="stm run hide_run"><a href="#n249">249</a></p>
+<p id="n250" class="stm run hide_run"><a href="#n250">250</a></p>
+<p id="n251" class="pln"><a href="#n251">251</a></p>
+<p id="n252" class="stm run hide_run"><a href="#n252">252</a></p>
+<p id="n253" class="stm run hide_run"><a href="#n253">253</a></p>
+<p id="n254" class="stm run hide_run"><a href="#n254">254</a></p>
+<p id="n255" class="pln"><a href="#n255">255</a></p>
+<p id="n256" class="stm run hide_run"><a href="#n256">256</a></p>
+<p id="n257" class="stm run hide_run"><a href="#n257">257</a></p>
+<p id="n258" class="stm run hide_run"><a href="#n258">258</a></p>
+<p id="n259" class="stm run hide_run"><a href="#n259">259</a></p>
+<p id="n260" class="pln"><a href="#n260">260</a></p>
+<p id="n261" class="stm run hide_run"><a href="#n261">261</a></p>
+<p id="n262" class="stm run hide_run"><a href="#n262">262</a></p>
+<p id="n263" class="stm run hide_run"><a href="#n263">263</a></p>
+<p id="n264" class="pln"><a href="#n264">264</a></p>
+<p id="n265" class="stm run hide_run"><a href="#n265">265</a></p>
+<p id="n266" class="stm run hide_run"><a href="#n266">266</a></p>
+<p id="n267" class="stm run hide_run"><a href="#n267">267</a></p>
+<p id="n268" class="pln"><a href="#n268">268</a></p>
+<p id="n269" class="stm run hide_run"><a href="#n269">269</a></p>
+<p id="n270" class="pln"><a href="#n270">270</a></p>
+<p id="n271" class="pln"><a href="#n271">271</a></p>
+<p id="n272" class="pln"><a href="#n272">272</a></p>
+<p id="n273" class="pln"><a href="#n273">273</a></p>
+<p id="n274" class="pln"><a href="#n274">274</a></p>
+<p id="n275" class="pln"><a href="#n275">275</a></p>
+<p id="n276" class="stm run hide_run"><a href="#n276">276</a></p>
+<p id="n277" class="stm run hide_run"><a href="#n277">277</a></p>
+<p id="n278" class="stm run hide_run"><a href="#n278">278</a></p>
+<p id="n279" class="stm run hide_run"><a href="#n279">279</a></p>
+<p id="n280" class="pln"><a href="#n280">280</a></p>
+<p id="n281" class="pln"><a href="#n281">281</a></p>
+<p id="n282" class="stm run hide_run"><a href="#n282">282</a></p>
+<p id="n283" class="stm run hide_run"><a href="#n283">283</a></p>
+<p id="n284" class="stm run hide_run"><a href="#n284">284</a></p>
+<p id="n285" class="stm run hide_run"><a href="#n285">285</a></p>
+<p id="n286" class="stm run hide_run"><a href="#n286">286</a></p>
+<p id="n287" class="pln"><a href="#n287">287</a></p>
+<p id="n288" class="pln"><a href="#n288">288</a></p>
+<p id="n289" class="stm run hide_run"><a href="#n289">289</a></p>
+<p id="n290" class="stm run hide_run"><a href="#n290">290</a></p>
+<p id="n291" class="pln"><a href="#n291">291</a></p>
+<p id="n292" class="stm run hide_run"><a href="#n292">292</a></p>
+<p id="n293" class="pln"><a href="#n293">293</a></p>
+<p id="n294" class="stm run hide_run"><a href="#n294">294</a></p>
+<p id="n295" class="pln"><a href="#n295">295</a></p>
+<p id="n296" class="stm run hide_run"><a href="#n296">296</a></p>
+<p id="n297" class="stm run hide_run"><a href="#n297">297</a></p>
+<p id="n298" class="stm run hide_run"><a href="#n298">298</a></p>
+<p id="n299" class="pln"><a href="#n299">299</a></p>
+<p id="n300" class="pln"><a href="#n300">300</a></p>
+<p id="n301" class="stm run hide_run"><a href="#n301">301</a></p>
+<p id="n302" class="pln"><a href="#n302">302</a></p>
+<p id="n303" class="pln"><a href="#n303">303</a></p>
+<p id="n304" class="pln"><a href="#n304">304</a></p>
+<p id="n305" class="pln"><a href="#n305">305</a></p>
+<p id="n306" class="pln"><a href="#n306">306</a></p>
+<p id="n307" class="pln"><a href="#n307">307</a></p>
+<p id="n308" class="pln"><a href="#n308">308</a></p>
+<p id="n309" class="stm run hide_run"><a href="#n309">309</a></p>
+<p id="n310" class="stm run hide_run"><a href="#n310">310</a></p>
+<p id="n311" class="pln"><a href="#n311">311</a></p>
+<p id="n312" class="stm run hide_run"><a href="#n312">312</a></p>
+<p id="n313" class="pln"><a href="#n313">313</a></p>
+<p id="n314" class="stm run hide_run"><a href="#n314">314</a></p>
+<p id="n315" class="stm run hide_run"><a href="#n315">315</a></p>
+<p id="n316" class="stm run hide_run"><a href="#n316">316</a></p>
+<p id="n317" class="stm run hide_run"><a href="#n317">317</a></p>
+<p id="n318" class="pln"><a href="#n318">318</a></p>
+<p id="n319" class="stm run hide_run"><a href="#n319">319</a></p>
+<p id="n320" class="pln"><a href="#n320">320</a></p>
+<p id="n321" class="pln"><a href="#n321">321</a></p>
+<p id="n322" class="stm run hide_run"><a href="#n322">322</a></p>
+<p id="n323" class="stm run hide_run"><a href="#n323">323</a></p>
+<p id="n324" class="stm run hide_run"><a href="#n324">324</a></p>
+<p id="n325" class="stm run hide_run"><a href="#n325">325</a></p>
+<p id="n326" class="pln"><a href="#n326">326</a></p>
+<p id="n327" class="pln"><a href="#n327">327</a></p>
+<p id="n328" class="pln"><a href="#n328">328</a></p>
+<p id="n329" class="stm run hide_run"><a href="#n329">329</a></p>
+<p id="n330" class="stm run hide_run"><a href="#n330">330</a></p>
+<p id="n331" class="pln"><a href="#n331">331</a></p>
+<p id="n332" class="stm run hide_run"><a href="#n332">332</a></p>
+<p id="n333" class="stm run hide_run"><a href="#n333">333</a></p>
+<p id="n334" class="stm run hide_run"><a href="#n334">334</a></p>
+<p id="n335" class="stm run hide_run"><a href="#n335">335</a></p>
+<p id="n336" class="pln"><a href="#n336">336</a></p>
+<p id="n337" class="pln"><a href="#n337">337</a></p>
+<p id="n338" class="stm run hide_run"><a href="#n338">338</a></p>
+<p id="n339" class="stm run hide_run"><a href="#n339">339</a></p>
+<p id="n340" class="stm run hide_run"><a href="#n340">340</a></p>
+<p id="n341" class="stm run hide_run"><a href="#n341">341</a></p>
+<p id="n342" class="pln"><a href="#n342">342</a></p>
+<p id="n343" class="stm run hide_run"><a href="#n343">343</a></p>
+<p id="n344" class="pln"><a href="#n344">344</a></p>
+<p id="n345" class="pln"><a href="#n345">345</a></p>
+<p id="n346" class="stm run hide_run"><a href="#n346">346</a></p>
+<p id="n347" class="stm run hide_run"><a href="#n347">347</a></p>
+<p id="n348" class="stm run hide_run"><a href="#n348">348</a></p>
+<p id="n349" class="stm run hide_run"><a href="#n349">349</a></p>
+<p id="n350" class="pln"><a href="#n350">350</a></p>
+<p id="n351" class="stm run hide_run"><a href="#n351">351</a></p>
+<p id="n352" class="stm run hide_run"><a href="#n352">352</a></p>
+<p id="n353" class="stm run hide_run"><a href="#n353">353</a></p>
+<p id="n354" class="pln"><a href="#n354">354</a></p>
+<p id="n355" class="stm run hide_run"><a href="#n355">355</a></p>
+<p id="n356" class="stm run hide_run"><a href="#n356">356</a></p>
+<p id="n357" class="stm run hide_run"><a href="#n357">357</a></p>
+<p id="n358" class="stm run hide_run"><a href="#n358">358</a></p>
+<p id="n359" class="pln"><a href="#n359">359</a></p>
+<p id="n360" class="stm run hide_run"><a href="#n360">360</a></p>
+<p id="n361" class="stm run hide_run"><a href="#n361">361</a></p>
+<p id="n362" class="stm run hide_run"><a href="#n362">362</a></p>
+<p id="n363" class="pln"><a href="#n363">363</a></p>
+<p id="n364" class="pln"><a href="#n364">364</a></p>
+<p id="n365" class="pln"><a href="#n365">365</a></p>
+<p id="n366" class="pln"><a href="#n366">366</a></p>
+<p id="n367" class="pln"><a href="#n367">367</a></p>
+<p id="n368" class="pln"><a href="#n368">368</a></p>
+<p id="n369" class="pln"><a href="#n369">369</a></p>
+<p id="n370" class="pln"><a href="#n370">370</a></p>
+<p id="n371" class="pln"><a href="#n371">371</a></p>
+<p id="n372" class="pln"><a href="#n372">372</a></p>
+<p id="n373" class="pln"><a href="#n373">373</a></p>
+<p id="n374" class="pln"><a href="#n374">374</a></p>
+<p id="n375" class="pln"><a href="#n375">375</a></p>
+<p id="n376" class="pln"><a href="#n376">376</a></p>
+<p id="n377" class="pln"><a href="#n377">377</a></p>
+<p id="n378" class="pln"><a href="#n378">378</a></p>
+<p id="n379" class="pln"><a href="#n379">379</a></p>
+<p id="n380" class="pln"><a href="#n380">380</a></p>
+<p id="n381" class="pln"><a href="#n381">381</a></p>
+<p id="n382" class="pln"><a href="#n382">382</a></p>
+<p id="n383" class="pln"><a href="#n383">383</a></p>
+<p id="n384" class="pln"><a href="#n384">384</a></p>
+<p id="n385" class="pln"><a href="#n385">385</a></p>
+<p id="n386" class="pln"><a href="#n386">386</a></p>
+<p id="n387" class="pln"><a href="#n387">387</a></p>
+<p id="n388" class="pln"><a href="#n388">388</a></p>
+<p id="n389" class="pln"><a href="#n389">389</a></p>
+<p id="n390" class="pln"><a href="#n390">390</a></p>
+<p id="n391" class="pln"><a href="#n391">391</a></p>
+<p id="n392" class="pln"><a href="#n392">392</a></p>
+<p id="n393" class="pln"><a href="#n393">393</a></p>
+<p id="n394" class="pln"><a href="#n394">394</a></p>
+<p id="n395" class="pln"><a href="#n395">395</a></p>
+<p id="n396" class="pln"><a href="#n396">396</a></p>
+<p id="n397" class="pln"><a href="#n397">397</a></p>
+<p id="n398" class="pln"><a href="#n398">398</a></p>
+<p id="n399" class="stm run hide_run"><a href="#n399">399</a></p>
+<p id="n400" class="pln"><a href="#n400">400</a></p>
+<p id="n401" class="pln"><a href="#n401">401</a></p>
+<p id="n402" class="pln"><a href="#n402">402</a></p>
+<p id="n403" class="pln"><a href="#n403">403</a></p>
+<p id="n404" class="stm run hide_run"><a href="#n404">404</a></p>
+<p id="n405" class="stm run hide_run"><a href="#n405">405</a></p>
+<p id="n406" class="stm run hide_run"><a href="#n406">406</a></p>
+<p id="n407" class="stm run hide_run"><a href="#n407">407</a></p>
+<p id="n408" class="pln"><a href="#n408">408</a></p>
+<p id="n409" class="pln"><a href="#n409">409</a></p>
+<p id="n410" class="pln"><a href="#n410">410</a></p>
+<p id="n411" class="stm run hide_run"><a href="#n411">411</a></p>
+<p id="n412" class="pln"><a href="#n412">412</a></p>
+<p id="n413" class="stm run hide_run"><a href="#n413">413</a></p>
+<p id="n414" class="stm run hide_run"><a href="#n414">414</a></p>
+<p id="n415" class="stm run hide_run"><a href="#n415">415</a></p>
+<p id="n416" class="stm run hide_run"><a href="#n416">416</a></p>
+<p id="n417" class="pln"><a href="#n417">417</a></p>
+<p id="n418" class="stm run hide_run"><a href="#n418">418</a></p>
+<p id="n419" class="stm run hide_run"><a href="#n419">419</a></p>
+<p id="n420" class="stm run hide_run"><a href="#n420">420</a></p>
+<p id="n421" class="stm run hide_run"><a href="#n421">421</a></p>
+<p id="n422" class="stm run hide_run"><a href="#n422">422</a></p>
+<p id="n423" class="stm run hide_run"><a href="#n423">423</a></p>
+<p id="n424" class="stm run hide_run"><a href="#n424">424</a></p>
+<p id="n425" class="pln"><a href="#n425">425</a></p>
+<p id="n426" class="stm run hide_run"><a href="#n426">426</a></p>
+<p id="n427" class="stm run hide_run"><a href="#n427">427</a></p>
+<p id="n428" class="stm run hide_run"><a href="#n428">428</a></p>
+<p id="n429" class="stm run hide_run"><a href="#n429">429</a></p>
+<p id="n430" class="pln"><a href="#n430">430</a></p>
+<p id="n431" class="stm run hide_run"><a href="#n431">431</a></p>
+<p id="n432" class="stm run hide_run"><a href="#n432">432</a></p>
+<p id="n433" class="stm run hide_run"><a href="#n433">433</a></p>
+<p id="n434" class="stm run hide_run"><a href="#n434">434</a></p>
+<p id="n435" class="stm run hide_run"><a href="#n435">435</a></p>
+<p id="n436" class="stm run hide_run"><a href="#n436">436</a></p>
+<p id="n437" class="stm run hide_run"><a href="#n437">437</a></p>
+<p id="n438" class="stm mis"><a href="#n438">438</a></p>
+<p id="n439" class="stm mis"><a href="#n439">439</a></p>
+<p id="n440" class="stm mis"><a href="#n440">440</a></p>
+<p id="n441" class="stm mis"><a href="#n441">441</a></p>
+<p id="n442" class="stm mis"><a href="#n442">442</a></p>
+<p id="n443" class="stm mis"><a href="#n443">443</a></p>
+<p id="n444" class="pln"><a href="#n444">444</a></p>
+<p id="n445" class="stm mis"><a href="#n445">445</a></p>
+<p id="n446" class="stm mis"><a href="#n446">446</a></p>
+<p id="n447" class="pln"><a href="#n447">447</a></p>
+<p id="n448" class="stm mis"><a href="#n448">448</a></p>
+<p id="n449" class="stm mis"><a href="#n449">449</a></p>
+<p id="n450" class="stm run hide_run"><a href="#n450">450</a></p>
+<p id="n451" class="pln"><a href="#n451">451</a></p>
+<p id="n452" class="stm run hide_run"><a href="#n452">452</a></p>
+<p id="n453" class="pln"><a href="#n453">453</a></p>
+<p id="n454" class="stm run hide_run"><a href="#n454">454</a></p>
+<p id="n455" class="stm run hide_run"><a href="#n455">455</a></p>
+<p id="n456" class="stm run hide_run"><a href="#n456">456</a></p>
+<p id="n457" class="pln"><a href="#n457">457</a></p>
+<p id="n458" class="stm run hide_run"><a href="#n458">458</a></p>
+<p id="n459" class="pln"><a href="#n459">459</a></p>
+<p id="n460" class="pln"><a href="#n460">460</a></p>
+<p id="n461" class="stm run hide_run"><a href="#n461">461</a></p>
+<p id="n462" class="pln"><a href="#n462">462</a></p>
+<p id="n463" class="stm run hide_run"><a href="#n463">463</a></p>
+<p id="n464" class="stm mis"><a href="#n464">464</a></p>
+<p id="n465" class="pln"><a href="#n465">465</a></p>
+<p id="n466" class="pln"><a href="#n466">466</a></p>
+<p id="n467" class="stm run hide_run"><a href="#n467">467</a></p>
+<p id="n468" class="stm run hide_run"><a href="#n468">468</a></p>
+<p id="n469" class="stm run hide_run"><a href="#n469">469</a></p>
+<p id="n470" class="stm run hide_run"><a href="#n470">470</a></p>
+<p id="n471" class="stm run hide_run"><a href="#n471">471</a></p>
+<p id="n472" class="pln"><a href="#n472">472</a></p>
+<p id="n473" class="stm run hide_run"><a href="#n473">473</a></p>
+<p id="n474" class="pln"><a href="#n474">474</a></p>
+<p id="n475" class="stm mis"><a href="#n475">475</a></p>
+<p id="n476" class="stm mis"><a href="#n476">476</a></p>
+<p id="n477" class="stm mis"><a href="#n477">477</a></p>
+<p id="n478" class="stm mis"><a href="#n478">478</a></p>
+<p id="n479" class="stm mis"><a href="#n479">479</a></p>
+<p id="n480" class="stm mis"><a href="#n480">480</a></p>
+<p id="n481" class="stm mis"><a href="#n481">481</a></p>
+<p id="n482" class="stm mis"><a href="#n482">482</a></p>
+<p id="n483" class="stm mis"><a href="#n483">483</a></p>
+<p id="n484" class="stm mis"><a href="#n484">484</a></p>
+<p id="n485" class="stm run hide_run"><a href="#n485">485</a></p>
+<p id="n486" class="pln"><a href="#n486">486</a></p>
+<p id="n487" class="stm run hide_run"><a href="#n487">487</a></p>
+<p id="n488" class="stm run hide_run"><a href="#n488">488</a></p>
+<p id="n489" class="stm run hide_run"><a href="#n489">489</a></p>
+<p id="n490" class="stm run hide_run"><a href="#n490">490</a></p>
+<p id="n491" class="stm run hide_run"><a href="#n491">491</a></p>
+<p id="n492" class="stm run hide_run"><a href="#n492">492</a></p>
+<p id="n493" class="pln"><a href="#n493">493</a></p>
+<p id="n494" class="stm run hide_run"><a href="#n494">494</a></p>
+<p id="n495" class="stm run hide_run"><a href="#n495">495</a></p>
+<p id="n496" class="pln"><a href="#n496">496</a></p>
+<p id="n497" class="pln"><a href="#n497">497</a></p>
+<p id="n498" class="stm run hide_run"><a href="#n498">498</a></p>
+<p id="n499" class="stm run hide_run"><a href="#n499">499</a></p>
+<p id="n500" class="pln"><a href="#n500">500</a></p>
+<p id="n501" class="stm run hide_run"><a href="#n501">501</a></p>
+<p id="n502" class="stm mis"><a href="#n502">502</a></p>
+<p id="n503" class="stm run hide_run"><a href="#n503">503</a></p>
+<p id="n504" class="stm run hide_run"><a href="#n504">504</a></p>
+<p id="n505" class="pln"><a href="#n505">505</a></p>
+<p id="n506" class="stm run hide_run"><a href="#n506">506</a></p>
+<p id="n507" class="pln"><a href="#n507">507</a></p>
+<p id="n508" class="pln"><a href="#n508">508</a></p>
+<p id="n509" class="pln"><a href="#n509">509</a></p>
+<p id="n510" class="pln"><a href="#n510">510</a></p>
+<p id="n511" class="pln"><a href="#n511">511</a></p>
+<p id="n512" class="pln"><a href="#n512">512</a></p>
+<p id="n513" class="pln"><a href="#n513">513</a></p>
+<p id="n514" class="pln"><a href="#n514">514</a></p>
+<p id="n515" class="pln"><a href="#n515">515</a></p>
+<p id="n516" class="pln"><a href="#n516">516</a></p>
+<p id="n517" class="pln"><a href="#n517">517</a></p>
+<p id="n518" class="pln"><a href="#n518">518</a></p>
+<p id="n519" class="pln"><a href="#n519">519</a></p>
+<p id="n520" class="pln"><a href="#n520">520</a></p>
+<p id="n521" class="pln"><a href="#n521">521</a></p>
+<p id="n522" class="pln"><a href="#n522">522</a></p>
+<p id="n523" class="pln"><a href="#n523">523</a></p>
+<p id="n524" class="pln"><a href="#n524">524</a></p>
+<p id="n525" class="pln"><a href="#n525">525</a></p>
+<p id="n526" class="pln"><a href="#n526">526</a></p>
+<p id="n527" class="pln"><a href="#n527">527</a></p>
+<p id="n528" class="pln"><a href="#n528">528</a></p>
+<p id="n529" class="pln"><a href="#n529">529</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">import</span> <span class="nam">oslo_db</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">oslo_db</span><span class="op">.</span><span class="nam">sqlalchemy</span> <span class="key">import</span> <span class="nam">session</span> <span class="key">as</span> <span class="nam">db_session</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">sqlalchemy</span><span class="op">.</span><span class="nam">ext</span><span class="op">.</span><span class="nam">declarative</span><span class="op">.</span><span class="nam">api</span> <span class="key">import</span> <span class="nam">declarative_base</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="stm run hide_run"><span class="key">from</span> <span class="nam">sqlalchemy</span><span class="op">.</span><span class="nam">sql</span> <span class="key">import</span> <span class="nam">or_</span><span class="strut">&nbsp;</span></p>
+<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t8" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">error_base</span> <span class="key">as</span> <span class="nam">ServiceBase</span><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">data_models</span> <span class="key">import</span> <span class="nam">Region</span><span class="op">,</span> <span class="nam">RegionEndPoint</span><span class="op">,</span> <span class="nam">Group</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="nam">data_models</span> <span class="key">import</span> <span class="nam">RegionMetaData</span><span class="op">,</span> <span class="nam">GroupRegion</span><span class="strut">&nbsp;</span></p>
+<p id="t11" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">error_base</span><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">storage</span><span class="op">.</span><span class="nam">base_data_manager</span> <span class="key">import</span> <span class="nam">BaseDataManager</span><span class="op">,</span> <span class="nam">DuplicateEntryError</span><span class="op">,</span> <span class="nam">EntityNotFound</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">model</span> <span class="key">import</span> <span class="nam">model</span> <span class="key">as</span> <span class="nam">PythonModels</span><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="nam">Base</span> <span class="op">=</span> <span class="nam">declarative_base</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t18" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run"><span class="key">class</span> <span class="nam">DataManager</span><span class="op">(</span><span class="nam">BaseDataManager</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t21" class="stm run hide_run">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">url</span><span class="op">,</span> <span class="nam">max_retries</span><span class="op">,</span> <span class="nam">retries_interval</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="stm run hide_run">        <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span> <span class="op">=</span> <span class="nam">db_session</span><span class="op">.</span><span class="nam">EngineFacade</span><span class="op">(</span><span class="nam">url</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln">                                                      <span class="nam">max_retries</span><span class="op">=</span><span class="nam">max_retries</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln">                                                      <span class="nam">retry_interval</span><span class="op">=</span><span class="nam">retries_interval</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_region</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="pln">                   <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln">                   <span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t29" class="pln">                   <span class="nam">address_state</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="pln">                   <span class="nam">address_country</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="pln">                   <span class="nam">address_city</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="pln">                   <span class="nam">address_street</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln">                   <span class="nam">address_zip</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln">                   <span class="nam">region_status</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="pln">                   <span class="nam">ranger_agent_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln">                   <span class="nam">open_stack_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t37" class="pln">                   <span class="nam">design_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln">                   <span class="nam">location_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln">                   <span class="nam">vlcp_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t40" class="pln">                   <span class="nam">clli</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="pln">                   <span class="com"># a list of dictionaries of format</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln">                   <span class="com"># {"type":"", "url":"", "description":""</span><span class="strut">&nbsp;</span></p>
+<p id="t43" class="pln">                   <span class="nam">end_point_list</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t44" class="pln">                   <span class="com"># a dictionary of key,value pairs</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="pln">                   <span class="com"># {"key":"value", }</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="pln">                   <span class="nam">meta_data_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln">                   <span class="nam">is_ecomp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="pln">                   <span class="nam">is_ssp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="pln">                   <span class="nam">purpose_of_region</span><span class="op">=</span><span class="str">""</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="pln">                   <span class="nam">description</span><span class="op">=</span><span class="str">""</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="pln">        <span class="str">""" add a new region to the `region` table</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln"><span class="str">        add also the regions give meta_data and end_points to the `region_end_point` and</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="pln"><span class="str">        `region_meta_data` tables if given.</span><span class="strut">&nbsp;</span></p>
+<p id="t54" class="pln"><span class="str">        handle duplicate errors if raised"""</span><span class="strut">&nbsp;</span></p>
+<p id="t55" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t56" class="stm run hide_run">            <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t57" class="stm run hide_run">            <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t58" class="stm run hide_run">                <span class="nam">region</span> <span class="op">=</span> <span class="nam">Region</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t59" class="pln">                                <span class="nam">name</span><span class="op">=</span><span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t60" class="pln">                                <span class="nam">address_state</span><span class="op">=</span><span class="nam">address_state</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t61" class="pln">                                <span class="nam">address_country</span><span class="op">=</span><span class="nam">address_country</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t62" class="pln">                                <span class="nam">address_city</span><span class="op">=</span><span class="nam">address_city</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t63" class="pln">                                <span class="nam">address_street</span><span class="op">=</span><span class="nam">address_street</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t64" class="pln">                                <span class="nam">address_zip</span><span class="op">=</span><span class="nam">address_zip</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t65" class="pln">                                <span class="nam">region_status</span><span class="op">=</span><span class="nam">region_status</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t66" class="pln">                                <span class="nam">ranger_agent_version</span><span class="op">=</span><span class="nam">ranger_agent_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t67" class="pln">                                <span class="nam">open_stack_version</span><span class="op">=</span><span class="nam">open_stack_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t68" class="pln">                                <span class="nam">design_type</span><span class="op">=</span><span class="nam">design_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t69" class="pln">                                <span class="nam">location_type</span><span class="op">=</span><span class="nam">location_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t70" class="pln">                                <span class="nam">vlcp_name</span><span class="op">=</span><span class="nam">vlcp_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t71" class="pln">                                <span class="nam">clli</span><span class="op">=</span><span class="nam">clli</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t72" class="pln">                                <span class="nam">description</span><span class="op">=</span><span class="nam">description</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t73" class="pln">                                <span class="nam">is_ecomp</span><span class="op">=</span><span class="nam">is_ecomp</span> <span class="op">*</span> <span class="num">1</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t74" class="pln">                                <span class="nam">is_ssp</span><span class="op">=</span><span class="nam">is_ssp</span> <span class="op">*</span> <span class="num">1</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t75" class="pln">                                <span class="nam">purpose_of_region</span><span class="op">=</span><span class="nam">purpose_of_region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t76" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t77" class="stm run hide_run">                <span class="key">if</span> <span class="nam">end_point_list</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t78" class="stm run hide_run">                    <span class="key">for</span> <span class="nam">end_point</span> <span class="key">in</span> <span class="nam">end_point_list</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t79" class="stm run hide_run">                        <span class="nam">region_end_point</span> <span class="op">=</span> <span class="nam">RegionEndPoint</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t80" class="pln">                            <span class="nam">end_point_type</span><span class="op">=</span><span class="nam">end_point</span><span class="op">[</span><span class="str">"type"</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t81" class="pln">                            <span class="nam">public_url</span><span class="op">=</span><span class="nam">end_point</span><span class="op">[</span><span class="str">"url"</span><span class="op">]</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t82" class="stm run hide_run">                        <span class="nam">region</span><span class="op">.</span><span class="nam">end_points</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">region_end_point</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t83" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t84" class="stm run hide_run">                <span class="key">if</span> <span class="nam">meta_data_dict</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t85" class="stm run hide_run">                    <span class="key">for</span> <span class="nam">k</span><span class="op">,</span> <span class="nam">v</span> <span class="key">in</span> <span class="nam">meta_data_dict</span><span class="op">.</span><span class="nam">iteritems</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t86" class="stm run hide_run">                        <span class="key">for</span> <span class="nam">list_item</span> <span class="key">in</span> <span class="nam">v</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t87" class="stm run hide_run">                            <span class="nam">region</span><span class="op">.</span><span class="nam">meta_data</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t88" class="pln">                                <span class="nam">RegionMetaData</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t89" class="pln">                                               <span class="nam">meta_data_key</span><span class="op">=</span><span class="nam">k</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t90" class="pln">                                               <span class="nam">meta_data_value</span><span class="op">=</span><span class="nam">list_item</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t91" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t92" class="stm run hide_run">                <span class="nam">session</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t93" class="stm run hide_run">        <span class="key">except</span> <span class="nam">oslo_db</span><span class="op">.</span><span class="nam">exception</span><span class="op">.</span><span class="nam">DBDuplicateEntry</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t94" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">warning</span><span class="op">(</span><span class="str">"Duplicate entry: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">e</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t95" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">DuplicateEntryError</span><span class="op">(</span><span class="str">"Region {} already "</span><span class="strut">&nbsp;</span></p>
+<p id="t96" class="pln">                                      <span class="str">"exist"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t97" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t98" class="stm run hide_run">    <span class="key">def</span> <span class="nam">update_region</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t99" class="pln">                      <span class="nam">region_to_update</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t100" class="pln">                      <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t101" class="pln">                      <span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t102" class="pln">                      <span class="nam">address_state</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t103" class="pln">                      <span class="nam">address_country</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t104" class="pln">                      <span class="nam">address_city</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t105" class="pln">                      <span class="nam">address_street</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t106" class="pln">                      <span class="nam">address_zip</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t107" class="pln">                      <span class="nam">region_status</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t108" class="pln">                      <span class="nam">ranger_agent_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t109" class="pln">                      <span class="nam">open_stack_version</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t110" class="pln">                      <span class="nam">design_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t111" class="pln">                      <span class="nam">location_type</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t112" class="pln">                      <span class="nam">vlcp_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t113" class="pln">                      <span class="nam">clli</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t114" class="pln">                      <span class="com"># a list of dictionaries of format</span><span class="strut">&nbsp;</span></p>
+<p id="t115" class="pln">                      <span class="com"># {"type":"", "url":"", "description":""</span><span class="strut">&nbsp;</span></p>
+<p id="t116" class="pln">                      <span class="nam">end_point_list</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t117" class="pln">                      <span class="com"># a list of dictionaries of format</span><span class="strut">&nbsp;</span></p>
+<p id="t118" class="pln">                      <span class="com"># {"key":"", "value":"", "description":""</span><span class="strut">&nbsp;</span></p>
+<p id="t119" class="pln">                      <span class="nam">meta_data_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t120" class="pln">                      <span class="nam">is_ecomp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t121" class="pln">                      <span class="nam">is_ssp</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t122" class="pln">                      <span class="nam">purpose_of_region</span><span class="op">=</span><span class="str">""</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t123" class="pln">                      <span class="nam">description</span><span class="op">=</span><span class="str">""</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t124" class="pln">        <span class="str">""" add a new region to the `region` table</span><span class="strut">&nbsp;</span></p>
+<p id="t125" class="pln"><span class="str">        add also the regions give meta_data and end_points to the `region_end_point` and</span><span class="strut">&nbsp;</span></p>
+<p id="t126" class="pln"><span class="str">        `region_meta_data` tables if given.</span><span class="strut">&nbsp;</span></p>
+<p id="t127" class="pln"><span class="str">        handle duplicate errors if raised"""</span><span class="strut">&nbsp;</span></p>
+<p id="t128" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t129" class="stm run hide_run">            <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t130" class="stm run hide_run">            <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t131" class="pln">                <span class="com"># remove all childs as with update need to replace them</span><span class="strut">&nbsp;</span></p>
+<p id="t132" class="stm run hide_run">                <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_to_update</span><span class="op">)</span><span class="op">.</span><span class="nam">delete</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t133" class="stm run hide_run">                <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">RegionEndPoint</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_to_update</span><span class="op">)</span><span class="op">.</span><span class="nam">delete</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t134" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t135" class="stm run hide_run">                <span class="nam">record</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Region</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_to_update</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t136" class="stm run hide_run">                <span class="key">if</span> <span class="nam">record</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t137" class="pln">                    <span class="com">#   record.region_id = region_id  # ignore id and name when update</span><span class="strut">&nbsp;</span></p>
+<p id="t138" class="pln">                    <span class="com">#   record.name = name</span><span class="strut">&nbsp;</span></p>
+<p id="t139" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">address_state</span> <span class="op">=</span> <span class="nam">address_state</span><span class="strut">&nbsp;</span></p>
+<p id="t140" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">address_country</span> <span class="op">=</span> <span class="nam">address_country</span><span class="strut">&nbsp;</span></p>
+<p id="t141" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">address_city</span> <span class="op">=</span> <span class="nam">address_city</span><span class="strut">&nbsp;</span></p>
+<p id="t142" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">address_street</span> <span class="op">=</span> <span class="nam">address_street</span><span class="strut">&nbsp;</span></p>
+<p id="t143" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">address_zip</span> <span class="op">=</span> <span class="nam">address_zip</span><span class="strut">&nbsp;</span></p>
+<p id="t144" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">region_status</span> <span class="op">=</span> <span class="nam">region_status</span><span class="strut">&nbsp;</span></p>
+<p id="t145" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">ranger_agent_version</span> <span class="op">=</span> <span class="nam">ranger_agent_version</span><span class="strut">&nbsp;</span></p>
+<p id="t146" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">open_stack_version</span> <span class="op">=</span> <span class="nam">open_stack_version</span><span class="strut">&nbsp;</span></p>
+<p id="t147" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">design_type</span> <span class="op">=</span> <span class="nam">design_type</span><span class="strut">&nbsp;</span></p>
+<p id="t148" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">location_type</span> <span class="op">=</span> <span class="nam">location_type</span><span class="strut">&nbsp;</span></p>
+<p id="t149" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">vlcp_name</span> <span class="op">=</span> <span class="nam">vlcp_name</span><span class="strut">&nbsp;</span></p>
+<p id="t150" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">clli</span> <span class="op">=</span> <span class="nam">clli</span><span class="strut">&nbsp;</span></p>
+<p id="t151" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">description</span><span class="strut">&nbsp;</span></p>
+<p id="t152" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">is_ecomp</span> <span class="op">=</span> <span class="nam">is_ecomp</span> <span class="op">*</span> <span class="num">1</span><span class="strut">&nbsp;</span></p>
+<p id="t153" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">is_ssp</span> <span class="op">=</span> <span class="nam">is_ssp</span> <span class="op">*</span> <span class="num">1</span><span class="strut">&nbsp;</span></p>
+<p id="t154" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">purpose_of_region</span> <span class="op">=</span> <span class="nam">purpose_of_region</span><span class="strut">&nbsp;</span></p>
+<p id="t155" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t156" class="stm run hide_run">                    <span class="key">if</span> <span class="nam">end_point_list</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t157" class="stm run hide_run">                        <span class="key">for</span> <span class="nam">end_point</span> <span class="key">in</span> <span class="nam">end_point_list</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t158" class="stm run hide_run">                            <span class="nam">region_end_point</span> <span class="op">=</span> <span class="nam">RegionEndPoint</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t159" class="pln">                                <span class="nam">end_point_type</span><span class="op">=</span><span class="nam">end_point</span><span class="op">[</span><span class="str">"type"</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t160" class="pln">                                <span class="nam">public_url</span><span class="op">=</span><span class="nam">end_point</span><span class="op">[</span><span class="str">"url"</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t161" class="pln">                            <span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t162" class="stm run hide_run">                            <span class="nam">record</span><span class="op">.</span><span class="nam">end_points</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">region_end_point</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t163" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t164" class="stm run hide_run">                    <span class="key">if</span> <span class="nam">meta_data_dict</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t165" class="stm run hide_run">                        <span class="key">for</span> <span class="nam">k</span><span class="op">,</span> <span class="nam">v</span> <span class="key">in</span> <span class="nam">meta_data_dict</span><span class="op">.</span><span class="nam">iteritems</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t166" class="stm run hide_run">                            <span class="key">for</span> <span class="nam">list_item</span> <span class="key">in</span> <span class="nam">v</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t167" class="stm run hide_run">                                <span class="nam">record</span><span class="op">.</span><span class="nam">meta_data</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t168" class="pln">                                    <span class="nam">RegionMetaData</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t169" class="pln">                                                   <span class="nam">meta_data_key</span><span class="op">=</span><span class="nam">k</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t170" class="pln">                                                   <span class="nam">meta_data_value</span><span class="op">=</span><span class="nam">list_item</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t171" class="pln">                <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t172" class="stm run hide_run">                    <span class="key">raise</span> <span class="nam">EntityNotFound</span><span class="op">(</span><span class="str">"Region {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t173" class="pln">                        <span class="nam">region_to_update</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t174" class="stm run hide_run">        <span class="key">except</span> <span class="nam">EntityNotFound</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t175" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t176" class="pln">                <span class="str">"fail to update entity with id {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t177" class="pln">                    <span class="nam">region_to_update</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t178" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">ServiceBase</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t179" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t180" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"fail to update region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t181" class="stm run hide_run">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t182" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t183" class="stm run hide_run">    <span class="key">def</span> <span class="nam">delete_region</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t184" class="pln">        <span class="com"># delete a region from `region` table and also the region's</span><span class="strut">&nbsp;</span></p>
+<p id="t185" class="pln">        <span class="com"># entries from `region_meta_data` and `region_end_points` tables</span><span class="strut">&nbsp;</span></p>
+<p id="t186" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t187" class="stm run hide_run">        <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t188" class="stm run hide_run">            <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Region</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">)</span><span class="op">.</span><span class="nam">delete</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t189" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t190" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_all_regions</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t191" class="stm run hide_run">        <span class="key">return</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get_regions</span><span class="op">(</span><span class="nam">None</span><span class="op">,</span> <span class="nam">None</span><span class="op">,</span> <span class="nam">None</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t192" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t193" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_regions</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t194" class="pln">                    <span class="nam">region_filters_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t195" class="pln">                    <span class="nam">meta_data_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t196" class="pln">                    <span class="nam">end_point_dict</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t197" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Get regions"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t198" class="stm run hide_run">        <span class="nam">records_model</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t199" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t200" class="stm run hide_run">        <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t201" class="stm run hide_run">            <span class="nam">records</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t202" class="stm run hide_run">            <span class="key">if</span> <span class="nam">region_filters_dict</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t203" class="stm run hide_run">                <span class="nam">records</span> <span class="op">=</span> <span class="nam">records</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="op">**</span><span class="nam">region_filters_dict</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t204" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t205" class="stm run hide_run">            <span class="key">if</span> <span class="nam">meta_data_dict</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t206" class="stm run hide_run">                <span class="nam">regions</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_get_regions_for_meta_data_dict</span><span class="op">(</span><span class="nam">meta_data_dict</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t207" class="pln">                                                               <span class="nam">session</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t208" class="stm run hide_run">                <span class="nam">query</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t209" class="stm run hide_run">                <span class="nam">query</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">(</span><span class="nam">Region</span><span class="op">.</span><span class="nam">region_id</span><span class="op">.</span><span class="nam">in_</span><span class="op">(</span><span class="nam">regions</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t210" class="stm run hide_run">                <span class="nam">records</span> <span class="op">=</span> <span class="nam">records</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="op">*</span><span class="nam">query</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t211" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t212" class="stm run hide_run">            <span class="key">if</span> <span class="nam">end_point_dict</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t213" class="stm run hide_run">                <span class="nam">records</span> <span class="op">=</span> <span class="nam">records</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">RegionEndPoint</span><span class="op">)</span><span class="op">.</span><span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t214" class="pln">                    <span class="nam">filter_by</span><span class="op">(</span><span class="op">**</span><span class="nam">end_point_dict</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t215" class="stm run hide_run">            <span class="key">if</span> <span class="nam">records</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t216" class="stm run hide_run">                <span class="key">for</span> <span class="nam">record</span> <span class="key">in</span> <span class="nam">records</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t217" class="stm run hide_run">                    <span class="nam">records_model</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">record</span><span class="op">.</span><span class="nam">to_wsme</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t218" class="stm run hide_run">            <span class="key">return</span> <span class="nam">records_model</span><span class="strut">&nbsp;</span></p>
+<p id="t219" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t220" class="stm run hide_run">    <span class="key">def</span> <span class="nam">_get_regions_for_meta_data_dict</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">meta_data_dict</span><span class="op">,</span> <span class="nam">session</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t221" class="stm run hide_run">        <span class="nam">result_lists</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t222" class="stm run hide_run">        <span class="key">for</span> <span class="nam">key</span> <span class="key">in</span> <span class="nam">meta_data_dict</span><span class="op">[</span><span class="str">'meta_data_keys'</span><span class="op">]</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t223" class="stm run hide_run">            <span class="nam">md_q</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">)</span><span class="op">.</span> <span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t224" class="pln">                <span class="nam">filter</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">.</span><span class="nam">meta_data_key</span> <span class="op">==</span> <span class="nam">key</span><span class="op">)</span><span class="op">.</span><span class="nam">all</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t225" class="stm run hide_run">            <span class="nam">temp_result_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t226" class="stm run hide_run">            <span class="key">if</span> <span class="nam">md_q</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t227" class="stm run hide_run">                <span class="key">for</span> <span class="nam">record</span> <span class="key">in</span> <span class="nam">md_q</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t228" class="stm mis">                    <span class="nam">temp_result_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">record</span><span class="op">.</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t229" class="stm run hide_run">            <span class="nam">result_lists</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">set</span><span class="op">(</span><span class="nam">temp_result_list</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t230" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="nam">set</span><span class="op">(</span><span class="nam">temp_result_list</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t231" class="stm run hide_run">        <span class="key">for</span> <span class="nam">item</span> <span class="key">in</span> <span class="nam">meta_data_dict</span><span class="op">[</span><span class="str">'meta_data_pairs'</span><span class="op">]</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t232" class="stm mis">            <span class="nam">md_q</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">)</span><span class="op">.</span> <span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t233" class="pln">                <span class="nam">filter</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">.</span><span class="nam">meta_data_key</span> <span class="op">==</span> <span class="nam">item</span><span class="op">[</span><span class="str">'metadata_key'</span><span class="op">]</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t234" class="pln">                       <span class="nam">RegionMetaData</span><span class="op">.</span><span class="nam">meta_data_value</span> <span class="op">==</span> <span class="nam">item</span><span class="op">[</span><span class="str">'metadata_value'</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">all</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t235" class="stm mis">            <span class="nam">temp_result_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t236" class="stm mis">            <span class="key">if</span> <span class="nam">md_q</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t237" class="stm mis">                <span class="key">for</span> <span class="nam">record</span> <span class="key">in</span> <span class="nam">md_q</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t238" class="stm mis">                    <span class="nam">temp_result_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">record</span><span class="op">.</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t239" class="stm mis">            <span class="nam">result_lists</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">set</span><span class="op">(</span><span class="nam">temp_result_list</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t240" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="nam">set</span><span class="op">(</span><span class="nam">temp_result_list</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t241" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t242" class="stm run hide_run">        <span class="nam">result</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t243" class="stm run hide_run">        <span class="key">if</span> <span class="nam">result_lists</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t244" class="stm run hide_run">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">result_lists</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t245" class="stm run hide_run">            <span class="key">for</span> <span class="nam">l</span> <span class="key">in</span> <span class="nam">result_lists</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t246" class="stm run hide_run">                <span class="nam">result</span> <span class="op">=</span> <span class="nam">result</span><span class="op">.</span><span class="nam">intersection</span><span class="op">(</span><span class="nam">l</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t247" class="pln">        <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t248" class="stm mis">            <span class="nam">result</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t249" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t250" class="stm run hide_run">        <span class="key">return</span> <span class="nam">result</span><span class="strut">&nbsp;</span></p>
+<p id="t251" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t252" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_region_by_id_or_name</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id_or_name</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t253" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Get region by id or name: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id_or_name</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t254" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t255" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t256" class="stm run hide_run">            <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t257" class="stm run hide_run">            <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t258" class="stm run hide_run">                <span class="nam">record</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t259" class="stm run hide_run">                <span class="nam">record</span> <span class="op">=</span> <span class="nam">record</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="nam">or_</span><span class="op">(</span><span class="nam">Region</span><span class="op">.</span><span class="nam">region_id</span> <span class="op">==</span> <span class="nam">region_id_or_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t260" class="pln">                                           <span class="nam">Region</span><span class="op">.</span><span class="nam">name</span> <span class="op">==</span> <span class="nam">region_id_or_name</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t261" class="stm run hide_run">                <span class="key">if</span> <span class="nam">record</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t262" class="stm run hide_run">                    <span class="key">return</span> <span class="nam">record</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">to_wsme</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t263" class="stm run hide_run">                <span class="key">return</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t264" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t265" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t266" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"DB error filtering by id/name"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t267" class="stm run hide_run">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t268" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t269" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_meta_data_to_region</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t270" class="pln">                                <span class="nam">metadata_dict</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t271" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t272" class="pln"><span class="str">        :param region_id:</span><span class="strut">&nbsp;</span></p>
+<p id="t273" class="pln"><span class="str">        :param metadata_dict:</span><span class="strut">&nbsp;</span></p>
+<p id="t274" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t275" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t276" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t277" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t278" class="stm run hide_run">            <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t279" class="stm run hide_run">                <span class="nam">record</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Region</span><span class="op">)</span><span class="op">.</span><span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t280" class="pln">                    <span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t281" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t282" class="stm run hide_run">                <span class="key">if</span> <span class="nam">record</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t283" class="stm run hide_run">                    <span class="nam">region_metadata</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t284" class="stm run hide_run">                    <span class="key">for</span> <span class="nam">k</span><span class="op">,</span> <span class="nam">v</span> <span class="key">in</span> <span class="nam">metadata_dict</span><span class="op">.</span><span class="nam">iteritems</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t285" class="stm run hide_run">                        <span class="key">for</span> <span class="nam">list_item</span> <span class="key">in</span> <span class="nam">v</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t286" class="stm run hide_run">                            <span class="nam">region_metadata</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t287" class="pln">                                                                  <span class="nam">meta_data_key</span><span class="op">=</span><span class="nam">k</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t288" class="pln">                                                                  <span class="nam">meta_data_value</span><span class="op">=</span><span class="nam">list_item</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t289" class="stm run hide_run">                    <span class="nam">session</span><span class="op">.</span><span class="nam">add_all</span><span class="op">(</span><span class="nam">region_metadata</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t290" class="stm run hide_run">                    <span class="key">return</span> <span class="nam">record</span><span class="op">.</span><span class="nam">to_wsme</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t291" class="pln">                <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t292" class="stm run hide_run">                    <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Region {} does not exist. "</span><span class="strut">&nbsp;</span></p>
+<p id="t293" class="pln">                                 <span class="str">"Meta Data was not added!"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t294" class="stm run hide_run">                    <span class="key">return</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t295" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t296" class="stm run hide_run">        <span class="key">except</span> <span class="nam">oslo_db</span><span class="op">.</span><span class="nam">exception</span><span class="op">.</span><span class="nam">DBDuplicateEntry</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t297" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">warning</span><span class="op">(</span><span class="str">"Duplicate entry: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">e</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t298" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ConflictError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="str">"Duplicate metadata value "</span><span class="strut">&nbsp;</span></p>
+<p id="t299" class="pln">                                           <span class="str">"in region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t300" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t301" class="stm run hide_run">    <span class="key">def</span> <span class="nam">update_region_meta_data</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t302" class="pln">                                <span class="nam">metadata_dict</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t303" class="pln">        <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t304" class="pln"><span class="str">        Replace existing metadata for given region_id</span><span class="strut">&nbsp;</span></p>
+<p id="t305" class="pln"><span class="str">        :param region_id:</span><span class="strut">&nbsp;</span></p>
+<p id="t306" class="pln"><span class="str">        :param metadata_dict:</span><span class="strut">&nbsp;</span></p>
+<p id="t307" class="pln"><span class="str">        :return:</span><span class="strut">&nbsp;</span></p>
+<p id="t308" class="pln"><span class="str">        """</span><span class="strut">&nbsp;</span></p>
+<p id="t309" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t310" class="stm run hide_run">        <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t311" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t312" class="stm run hide_run">            <span class="nam">record</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Region</span><span class="op">)</span><span class="op">.</span> <span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t313" class="pln">                <span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t314" class="stm run hide_run">            <span class="key">if</span> <span class="key">not</span> <span class="nam">record</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t315" class="stm run hide_run">                <span class="nam">msg</span> <span class="op">=</span> <span class="str">"Region {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t316" class="stm run hide_run">                <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="nam">msg</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t317" class="stm run hide_run">                <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="nam">msg</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t318" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t319" class="stm run hide_run">            <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">)</span><span class="op">.</span><span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t320" class="pln">                <span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">)</span><span class="op">.</span><span class="nam">delete</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t321" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t322" class="stm run hide_run">            <span class="nam">region_metadata</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t323" class="stm run hide_run">            <span class="key">for</span> <span class="nam">k</span><span class="op">,</span> <span class="nam">v</span> <span class="key">in</span> <span class="nam">metadata_dict</span><span class="op">.</span><span class="nam">iteritems</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t324" class="stm run hide_run">                <span class="key">for</span> <span class="nam">list_item</span> <span class="key">in</span> <span class="nam">v</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t325" class="stm run hide_run">                    <span class="nam">region_metadata</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t326" class="pln">                                                          <span class="nam">meta_data_key</span><span class="op">=</span><span class="nam">k</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t327" class="pln">                                                          <span class="nam">meta_data_value</span><span class="op">=</span><span class="nam">list_item</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t328" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t329" class="stm run hide_run">            <span class="nam">session</span><span class="op">.</span><span class="nam">add_all</span><span class="op">(</span><span class="nam">region_metadata</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t330" class="stm run hide_run">            <span class="key">return</span> <span class="nam">record</span><span class="op">.</span><span class="nam">to_wsme</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t331" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t332" class="stm run hide_run">    <span class="key">def</span> <span class="nam">delete_region_metadata</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">key</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t333" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t334" class="stm run hide_run">        <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t335" class="stm run hide_run">            <span class="nam">record</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Region</span><span class="op">)</span><span class="op">.</span> <span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t336" class="pln">                <span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t337" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t338" class="stm run hide_run">            <span class="key">if</span> <span class="key">not</span> <span class="nam">record</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t339" class="stm run hide_run">                <span class="nam">msg</span> <span class="op">=</span> <span class="str">"Region {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t340" class="stm run hide_run">                <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="nam">msg</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t341" class="stm run hide_run">                <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="nam">msg</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t342" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t343" class="stm run hide_run">            <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">RegionMetaData</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t344" class="pln">                                                    <span class="nam">meta_data_key</span><span class="op">=</span><span class="nam">key</span><span class="op">)</span><span class="op">.</span><span class="nam">delete</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t345" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t346" class="stm run hide_run">    <span class="key">def</span> <span class="nam">update_region_status</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">region_id</span><span class="op">,</span> <span class="nam">region_status</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t347" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t348" class="stm run hide_run">            <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t349" class="stm run hide_run">            <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t350" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t351" class="stm run hide_run">                <span class="nam">record</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Region</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t352" class="stm run hide_run">                <span class="key">if</span> <span class="nam">record</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t353" class="stm run hide_run">                    <span class="nam">record</span><span class="op">.</span><span class="nam">region_status</span> <span class="op">=</span> <span class="nam">region_status</span><span class="strut">&nbsp;</span></p>
+<p id="t354" class="pln">                <span class="key">else</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t355" class="stm run hide_run">                    <span class="nam">msg</span> <span class="op">=</span> <span class="str">"Region {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t356" class="stm run hide_run">                    <span class="nam">logger</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="nam">msg</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t357" class="stm run hide_run">                    <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="nam">message</span><span class="op">=</span><span class="nam">msg</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t358" class="stm run hide_run">                <span class="key">return</span> <span class="nam">record</span><span class="op">.</span><span class="nam">region_status</span><span class="strut">&nbsp;</span></p>
+<p id="t359" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t360" class="stm run hide_run">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t361" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="str">"failed to update region {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t362" class="stm run hide_run">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t363" class="pln">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t364" class="pln"><span class="str">    def add_end_point_to_region(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t365" class="pln"><span class="str">                                region_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t366" class="pln"><span class="str">                                end_point_type,</span><span class="strut">&nbsp;</span></p>
+<p id="t367" class="pln"><span class="str">                                end_point_url,</span><span class="strut">&nbsp;</span></p>
+<p id="t368" class="pln"><span class="str">                                description):</span><span class="strut">&nbsp;</span></p>
+<p id="t369" class="pln"><span class="str">        session = self._engine_facade.get_session()</span><span class="strut">&nbsp;</span></p>
+<p id="t370" class="pln"><span class="str">        try:</span><span class="strut">&nbsp;</span></p>
+<p id="t371" class="pln"><span class="str">            with session.begin():</span><span class="strut">&nbsp;</span></p>
+<p id="t372" class="pln"><span class="str">                record = session.query(Region).filter_by(region_id=region_id).\</span><span class="strut">&nbsp;</span></p>
+<p id="t373" class="pln"><span class="str">                    first()</span><span class="strut">&nbsp;</span></p>
+<p id="t374" class="pln"><span class="str">                if record is not None:</span><span class="strut">&nbsp;</span></p>
+<p id="t375" class="pln"><span class="str">                        session.add(</span><span class="strut">&nbsp;</span></p>
+<p id="t376" class="pln"><span class="str">                            RegionEndPoint(region_id=region_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t377" class="pln"><span class="str">                                           end_point_type=end_point_type,</span><span class="strut">&nbsp;</span></p>
+<p id="t378" class="pln"><span class="str">                                           public_url=end_point_url,</span><span class="strut">&nbsp;</span></p>
+<p id="t379" class="pln"><span class="str">                                           description=description))</span><span class="strut">&nbsp;</span></p>
+<p id="t380" class="pln"><span class="str">                else:</span><span class="strut">&nbsp;</span></p>
+<p id="t381" class="pln"><span class="str">                    logger.error("Region {} does not exist. "</span><span class="strut">&nbsp;</span></p>
+<p id="t382" class="pln"><span class="str">                                 "End point was not added !".format(region_id))</span><span class="strut">&nbsp;</span></p>
+<p id="t383" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t384" class="pln"><span class="str">        except oslo_db.exception.DBDuplicateEntry as e:</span><span class="strut">&nbsp;</span></p>
+<p id="t385" class="pln"><span class="str">            logger.warning("Duplicate entry: {}".format(str(e)))</span><span class="strut">&nbsp;</span></p>
+<p id="t386" class="pln"><span class="str">            raise SQLDBError("Duplicate entry error")</span><span class="strut">&nbsp;</span></p>
+<p id="t387" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t388" class="pln"><span class="str">    def remove_end_point_from_region(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t389" class="pln"><span class="str">                                     region_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t390" class="pln"><span class="str">                                     end_point_type):</span><span class="strut">&nbsp;</span></p>
+<p id="t391" class="pln"><span class="str">        session = self._engine_facade.get_session()</span><span class="strut">&nbsp;</span></p>
+<p id="t392" class="pln"><span class="str">        with session.begin():</span><span class="strut">&nbsp;</span></p>
+<p id="t393" class="pln"><span class="str">            session.query(Region).filter_by(region_id=region_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t394" class="pln"><span class="str">                                            end_point_type=end_point_type).\</span><span class="strut">&nbsp;</span></p>
+<p id="t395" class="pln"><span class="str">                delete()</span><span class="strut">&nbsp;</span></p>
+<p id="t396" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+<p id="t397" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t398" class="pln">    <span class="com"># Handle group management operations</span><span class="strut">&nbsp;</span></p>
+<p id="t399" class="stm run hide_run">    <span class="key">def</span> <span class="nam">add_group</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t400" class="pln">                  <span class="nam">group_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t401" class="pln">                  <span class="nam">group_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t402" class="pln">                  <span class="nam">group_description</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t403" class="pln">                  <span class="nam">region_ids_list</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t404" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t405" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t406" class="stm run hide_run">            <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t407" class="stm run hide_run">                <span class="nam">session</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">Group</span><span class="op">(</span><span class="nam">group_id</span><span class="op">=</span><span class="nam">group_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t408" class="pln">                                  <span class="nam">name</span><span class="op">=</span><span class="nam">group_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t409" class="pln">                                  <span class="nam">description</span><span class="op">=</span><span class="nam">group_description</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t410" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t411" class="stm run hide_run">                <span class="nam">session</span><span class="op">.</span><span class="nam">flush</span><span class="op">(</span><span class="op">)</span>  <span class="com"># add the groupe if not rollback</span><span class="strut">&nbsp;</span></p>
+<p id="t412" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t413" class="stm run hide_run">                <span class="key">if</span> <span class="nam">region_ids_list</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t414" class="stm run hide_run">                    <span class="nam">group_regions</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t415" class="stm run hide_run">                    <span class="key">for</span> <span class="nam">region_id</span> <span class="key">in</span> <span class="nam">region_ids_list</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t416" class="stm run hide_run">                        <span class="nam">group_regions</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">GroupRegion</span><span class="op">(</span><span class="nam">group_id</span><span class="op">=</span><span class="nam">group_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t417" class="pln">                                                         <span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t418" class="stm run hide_run">                    <span class="nam">session</span><span class="op">.</span><span class="nam">add_all</span><span class="op">(</span><span class="nam">group_regions</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t419" class="stm run hide_run">        <span class="key">except</span> <span class="nam">oslo_db</span><span class="op">.</span><span class="nam">exception</span><span class="op">.</span><span class="nam">DBReferenceError</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t420" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Reference error: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">e</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t421" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span><span class="op">(</span><span class="str">"Reference error"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t422" class="stm run hide_run">        <span class="key">except</span> <span class="nam">oslo_db</span><span class="op">.</span><span class="nam">exception</span><span class="op">.</span><span class="nam">DBDuplicateEntry</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t423" class="stm run hide_run">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Duplicate entry: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">e</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t424" class="stm run hide_run">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">ConflictError</span><span class="op">(</span><span class="str">"Duplicate entry error"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t425" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t426" class="stm run hide_run">    <span class="key">def</span> <span class="nam">delete_group</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t427" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t428" class="stm run hide_run">        <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t429" class="stm run hide_run">            <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Group</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">group_id</span><span class="op">=</span><span class="nam">group_id</span><span class="op">)</span><span class="op">.</span><span class="nam">delete</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t430" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t431" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_all_groups</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t432" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"DB- Get all groups"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t433" class="stm run hide_run">        <span class="nam">records_model</span> <span class="op">=</span> <span class="nam">PythonModels</span><span class="op">.</span><span class="nam">GroupsWrraper</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t434" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t435" class="stm run hide_run">        <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t436" class="stm run hide_run">            <span class="nam">groups</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Group</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t437" class="stm run hide_run">            <span class="key">for</span> <span class="nam">a_group</span> <span class="key">in</span> <span class="nam">groups</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t438" class="stm mis">                <span class="nam">group_model</span> <span class="op">=</span> <span class="nam">PythonModels</span><span class="op">.</span><span class="nam">Groups</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t439" class="stm mis">                <span class="nam">group_model</span><span class="op">.</span><span class="nam">id</span> <span class="op">=</span> <span class="nam">a_group</span><span class="op">.</span><span class="nam">group_id</span><span class="strut">&nbsp;</span></p>
+<p id="t440" class="stm mis">                <span class="nam">group_model</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">a_group</span><span class="op">.</span><span class="nam">name</span><span class="strut">&nbsp;</span></p>
+<p id="t441" class="stm mis">                <span class="nam">group_model</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">a_group</span><span class="op">.</span><span class="nam">description</span><span class="strut">&nbsp;</span></p>
+<p id="t442" class="stm mis">                <span class="nam">regions</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t443" class="stm mis">                <span class="nam">group_regions</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">GroupRegion</span><span class="op">)</span><span class="op">.</span><span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t444" class="pln">                    <span class="nam">filter_by</span><span class="op">(</span><span class="nam">group_id</span><span class="op">=</span><span class="nam">a_group</span><span class="op">.</span><span class="nam">group_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t445" class="stm mis">                <span class="key">for</span> <span class="nam">group_region</span> <span class="key">in</span> <span class="nam">group_regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t446" class="stm mis">                    <span class="nam">regions</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">group_region</span><span class="op">.</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t447" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t448" class="stm mis">                <span class="nam">group_model</span><span class="op">.</span><span class="nam">regions</span> <span class="op">=</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t449" class="stm mis">                <span class="nam">records_model</span><span class="op">.</span><span class="nam">groups</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">group_model</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t450" class="stm run hide_run">            <span class="key">return</span> <span class="nam">records_model</span><span class="strut">&nbsp;</span></p>
+<p id="t451" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t452" class="stm run hide_run">    <span class="key">def</span> <span class="nam">update_group</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">,</span> <span class="nam">group_name</span><span class="op">,</span> <span class="nam">group_description</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t453" class="pln">                     <span class="nam">group_regions</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t454" class="stm run hide_run">        <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t455" class="stm run hide_run">            <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t456" class="stm run hide_run">            <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t457" class="pln">                <span class="com"># in update scenario delete all child records</span><span class="strut">&nbsp;</span></p>
+<p id="t458" class="stm run hide_run">                <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">GroupRegion</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t459" class="pln">                    <span class="nam">group_id</span><span class="op">=</span><span class="nam">group_id</span><span class="op">)</span><span class="op">.</span><span class="nam">delete</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t460" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t461" class="stm run hide_run">                <span class="nam">group_record</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Group</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t462" class="pln">                    <span class="nam">group_id</span><span class="op">=</span><span class="nam">group_id</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t463" class="stm run hide_run">                <span class="key">if</span> <span class="nam">group_record</span> <span class="key">is</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t464" class="stm mis">                    <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span><span class="op">(</span><span class="strut">&nbsp;</span></p>
+<p id="t465" class="pln">                        <span class="nam">message</span><span class="op">=</span><span class="str">"Group {} not found"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t466" class="pln">                <span class="com"># only desc and regions can be changed</span><span class="strut">&nbsp;</span></p>
+<p id="t467" class="stm run hide_run">                <span class="nam">group_record</span><span class="op">.</span><span class="nam">description</span> <span class="op">=</span> <span class="nam">group_description</span><span class="strut">&nbsp;</span></p>
+<p id="t468" class="stm run hide_run">                <span class="nam">group_record</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">group_name</span><span class="strut">&nbsp;</span></p>
+<p id="t469" class="stm run hide_run">                <span class="nam">regions</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t470" class="stm run hide_run">                <span class="key">for</span> <span class="nam">region_id</span> <span class="key">in</span> <span class="nam">group_regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t471" class="stm run hide_run">                    <span class="nam">regions</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">GroupRegion</span><span class="op">(</span><span class="nam">region_id</span><span class="op">=</span><span class="nam">region_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t472" class="pln">                                               <span class="nam">group_id</span><span class="op">=</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t473" class="stm run hide_run">                <span class="nam">session</span><span class="op">.</span><span class="nam">add_all</span><span class="op">(</span><span class="nam">regions</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t474" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t475" class="stm mis">        <span class="key">except</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">NotFoundError</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t476" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="nam">exp</span><span class="op">.</span><span class="nam">message</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t477" class="stm mis">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t478" class="stm mis">        <span class="key">except</span> <span class="nam">oslo_db</span><span class="op">.</span><span class="nam">exception</span><span class="op">.</span><span class="nam">DBReferenceError</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t479" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"Reference error: {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">e</span><span class="op">)</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t480" class="stm mis">            <span class="key">raise</span> <span class="nam">error_base</span><span class="op">.</span><span class="nam">InputValueError</span><span class="op">(</span><span class="str">"Reference error"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t481" class="stm mis">        <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">exp</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t482" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">error</span><span class="op">(</span><span class="str">"failed to update group {}"</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">group_id</span><span class="op">)</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t483" class="stm mis">            <span class="nam">logger</span><span class="op">.</span><span class="nam">exception</span><span class="op">(</span><span class="nam">exp</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t484" class="stm mis">            <span class="key">raise</span><span class="strut">&nbsp;</span></p>
+<p id="t485" class="stm run hide_run">        <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t486" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t487" class="stm run hide_run">    <span class="key">def</span> <span class="nam">get_group</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">group_id</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t488" class="stm run hide_run">        <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="str">"Get group by name"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t489" class="stm run hide_run">        <span class="nam">group_model</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t490" class="stm run hide_run">        <span class="nam">session</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_engine_facade</span><span class="op">.</span><span class="nam">get_session</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t491" class="stm run hide_run">        <span class="key">with</span> <span class="nam">session</span><span class="op">.</span><span class="nam">begin</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t492" class="stm run hide_run">            <span class="nam">a_group</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">Group</span><span class="op">)</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">group_id</span><span class="op">=</span><span class="nam">group_id</span><span class="op">)</span><span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t493" class="pln">                <span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t494" class="stm run hide_run">            <span class="key">if</span> <span class="nam">a_group</span> <span class="key">is</span> <span class="key">not</span> <span class="nam">None</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t495" class="stm run hide_run">                <span class="nam">group_model</span> <span class="op">=</span> <span class="op">{</span><span class="str">"id"</span><span class="op">:</span> <span class="nam">a_group</span><span class="op">.</span><span class="nam">group_id</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t496" class="pln">                               <span class="str">"name"</span><span class="op">:</span> <span class="nam">a_group</span><span class="op">.</span><span class="nam">name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t497" class="pln">                               <span class="str">"description"</span><span class="op">:</span> <span class="nam">a_group</span><span class="op">.</span><span class="nam">description</span><span class="op">}</span><span class="strut">&nbsp;</span></p>
+<p id="t498" class="stm run hide_run">                <span class="nam">regions</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span><span class="strut">&nbsp;</span></p>
+<p id="t499" class="stm run hide_run">                <span class="nam">group_regions</span> <span class="op">=</span> <span class="nam">session</span><span class="op">.</span><span class="nam">query</span><span class="op">(</span><span class="nam">GroupRegion</span><span class="op">)</span><span class="op">.</span> <span class="xx">\</span><span class="strut">&nbsp;</span></p>
+<p id="t500" class="pln">                    <span class="nam">filter_by</span><span class="op">(</span><span class="nam">group_id</span><span class="op">=</span><span class="nam">a_group</span><span class="op">.</span><span class="nam">group_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t501" class="stm run hide_run">                <span class="key">for</span> <span class="nam">group_region</span> <span class="key">in</span> <span class="nam">group_regions</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t502" class="stm mis">                    <span class="nam">regions</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">group_region</span><span class="op">.</span><span class="nam">region_id</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t503" class="stm run hide_run">                <span class="nam">group_model</span><span class="op">[</span><span class="str">"regions"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">regions</span><span class="strut">&nbsp;</span></p>
+<p id="t504" class="stm run hide_run">            <span class="key">return</span> <span class="nam">group_model</span><span class="strut">&nbsp;</span></p>
+<p id="t505" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t506" class="stm run hide_run">    <span class="str">"""</span><span class="strut">&nbsp;</span></p>
+<p id="t507" class="pln"><span class="str">    def add_region_to_group(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t508" class="pln"><span class="str">                            group_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t509" class="pln"><span class="str">                            region_id):</span><span class="strut">&nbsp;</span></p>
+<p id="t510" class="pln"><span class="str">        session = self._engine_facade.get_session()</span><span class="strut">&nbsp;</span></p>
+<p id="t511" class="pln"><span class="str">        try:</span><span class="strut">&nbsp;</span></p>
+<p id="t512" class="pln"><span class="str">            with session.begin():</span><span class="strut">&nbsp;</span></p>
+<p id="t513" class="pln"><span class="str">                session.add(GroupRegion(group_id=group_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t514" class="pln"><span class="str">                                        region_id=region_id))</span><span class="strut">&nbsp;</span></p>
+<p id="t515" class="pln"><span class="str">        except oslo_db.exception.DBReferenceError as e:</span><span class="strut">&nbsp;</span></p>
+<p id="t516" class="pln"><span class="str">            logger.error("Refernce error: {}".format(str(e)))</span><span class="strut">&nbsp;</span></p>
+<p id="t517" class="pln"><span class="str">            raise SQLDBError("Reference error")</span><span class="strut">&nbsp;</span></p>
+<p id="t518" class="pln"><span class="str">        except oslo_db.exception.DBDuplicateEntry as e:</span><span class="strut">&nbsp;</span></p>
+<p id="t519" class="pln"><span class="str">            logger.error("Duplicate entry: {}".format(str(e)))</span><span class="strut">&nbsp;</span></p>
+<p id="t520" class="pln"><span class="str">            raise SQLDBError("Duplicate entry error")</span><span class="strut">&nbsp;</span></p>
+<p id="t521" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t522" class="pln"><span class="str">    def remove_region_from_group(self,</span><span class="strut">&nbsp;</span></p>
+<p id="t523" class="pln"><span class="str">                                 group_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t524" class="pln"><span class="str">                                 region_id):</span><span class="strut">&nbsp;</span></p>
+<p id="t525" class="pln"><span class="str">        session = self._engine_facade.get_session()</span><span class="strut">&nbsp;</span></p>
+<p id="t526" class="pln"><span class="str">        with session.begin():</span><span class="strut">&nbsp;</span></p>
+<p id="t527" class="pln"><span class="str">            session.query(GroupRegion).filter_by(group_id=group_id,</span><span class="strut">&nbsp;</span></p>
+<p id="t528" class="pln"><span class="str">                                                 region_id=region_id).delete()</span><span class="strut">&nbsp;</span></p>
+<p id="t529" class="pln"><span class="str">    """</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-12 23:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_utils___init___py.html b/orm/services/region_manager/htmlcov/rms_utils___init___py.html
new file mode 100644
index 00000000..e9506082
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_utils___init___py.html
@@ -0,0 +1,89 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/utils/__init__.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/utils/__init__.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            0 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+
+            </td>
+            <td class="text">
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/rms_utils_authentication_py.html b/orm/services/region_manager/htmlcov/rms_utils_authentication_py.html
new file mode 100644
index 00000000..70124848
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/rms_utils_authentication_py.html
@@ -0,0 +1,195 @@
+
+
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    
+    
+    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
+    <title>Coverage for rms/utils/authentication.py: 100%</title>
+    <link rel="stylesheet" href="style.css" type="text/css">
+    
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="jquery.hotkeys.js"></script>
+    <script type="text/javascript" src="jquery.isonscreen.js"></script>
+    <script type="text/javascript" src="coverage_html.js"></script>
+    <script type="text/javascript">
+        jQuery(document).ready(coverage.pyfile_ready);
+    </script>
+</head>
+<body class="pyfile">
+
+<div id="header">
+    <div class="content">
+        <h1>Coverage for <b>rms/utils/authentication.py</b> :
+            <span class="pc_cov">100%</span>
+        </h1>
+
+        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
+
+        <h2 class="stats">
+            32 statements &nbsp;
+            <span class="run hide_run shortkey_r button_toggle_run">32 run</span>
+            <span class="mis shortkey_m button_toggle_mis">0 missing</span>
+            <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
+
+            
+        </h2>
+    </div>
+</div>
+
+<div class="help_panel">
+    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
+    <p class="legend">Hot-keys on this page</p>
+    <div>
+    <p class="keyhelp">
+        <span class="key">r</span>
+        <span class="key">m</span>
+        <span class="key">x</span>
+        <span class="key">p</span> &nbsp; toggle line displays
+    </p>
+    <p class="keyhelp">
+        <span class="key">j</span>
+        <span class="key">k</span> &nbsp; next/prev highlighted chunk
+    </p>
+    <p class="keyhelp">
+        <span class="key">0</span> &nbsp; (zero) top of page
+    </p>
+    <p class="keyhelp">
+        <span class="key">1</span> &nbsp; (one) first highlighted chunk
+    </p>
+    </div>
+</div>
+
+<div id="source">
+    <table>
+        <tr>
+            <td class="linenos">
+<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
+<p id="n2" class="pln"><a href="#n2">2</a></p>
+<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
+<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
+<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
+<p id="n6" class="pln"><a href="#n6">6</a></p>
+<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p>
+<p id="n8" class="pln"><a href="#n8">8</a></p>
+<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p>
+<p id="n10" class="pln"><a href="#n10">10</a></p>
+<p id="n11" class="pln"><a href="#n11">11</a></p>
+<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p>
+<p id="n13" class="pln"><a href="#n13">13</a></p>
+<p id="n14" class="pln"><a href="#n14">14</a></p>
+<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p>
+<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p>
+<p id="n17" class="stm run hide_run"><a href="#n17">17</a></p>
+<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p>
+<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p>
+<p id="n20" class="pln"><a href="#n20">20</a></p>
+<p id="n21" class="pln"><a href="#n21">21</a></p>
+<p id="n22" class="stm run hide_run"><a href="#n22">22</a></p>
+<p id="n23" class="pln"><a href="#n23">23</a></p>
+<p id="n24" class="pln"><a href="#n24">24</a></p>
+<p id="n25" class="stm run hide_run"><a href="#n25">25</a></p>
+<p id="n26" class="stm run hide_run"><a href="#n26">26</a></p>
+<p id="n27" class="stm run hide_run"><a href="#n27">27</a></p>
+<p id="n28" class="pln"><a href="#n28">28</a></p>
+<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p>
+<p id="n30" class="stm run hide_run"><a href="#n30">30</a></p>
+<p id="n31" class="stm run hide_run"><a href="#n31">31</a></p>
+<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p>
+<p id="n33" class="pln"><a href="#n33">33</a></p>
+<p id="n34" class="pln"><a href="#n34">34</a></p>
+<p id="n35" class="stm run hide_run"><a href="#n35">35</a></p>
+<p id="n36" class="pln"><a href="#n36">36</a></p>
+<p id="n37" class="stm run hide_run"><a href="#n37">37</a></p>
+<p id="n38" class="pln"><a href="#n38">38</a></p>
+<p id="n39" class="pln"><a href="#n39">39</a></p>
+<p id="n40" class="stm run hide_run"><a href="#n40">40</a></p>
+<p id="n41" class="stm run hide_run"><a href="#n41">41</a></p>
+<p id="n42" class="pln"><a href="#n42">42</a></p>
+<p id="n43" class="pln"><a href="#n43">43</a></p>
+<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p>
+<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p>
+<p id="n46" class="stm run hide_run"><a href="#n46">46</a></p>
+<p id="n47" class="pln"><a href="#n47">47</a></p>
+<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p>
+<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p>
+<p id="n50" class="stm run hide_run"><a href="#n50">50</a></p>
+<p id="n51" class="stm run hide_run"><a href="#n51">51</a></p>
+<p id="n52" class="pln"><a href="#n52">52</a></p>
+<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p>
+
+            </td>
+            <td class="text">
+<p id="t1" class="stm run hide_run"><span class="key">import</span> <span class="nam">logging</span><span class="strut">&nbsp;</span></p>
+<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">keystone_utils</span> <span class="key">import</span> <span class="nam">tokens</span><span class="strut">&nbsp;</span></p>
+<p id="t4" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">policy</span> <span class="key">import</span> <span class="nam">policy</span><span class="strut">&nbsp;</span></p>
+<p id="t5" class="stm run hide_run"><span class="key">from</span> <span class="nam">orm_common</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">api_error_utils</span> <span class="key">as</span> <span class="nam">err_utils</span><span class="strut">&nbsp;</span></p>
+<p id="t6" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t7" class="stm run hide_run"><span class="key">from</span> <span class="nam">pecan</span> <span class="key">import</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="nam">rms</span><span class="op">.</span><span class="nam">services</span> <span class="key">import</span> <span class="nam">services</span> <span class="key">as</span> <span class="nam">RegionService</span><span class="strut">&nbsp;</span></p>
+<p id="t10" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t11" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t12" class="stm run hide_run"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">__name__</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t13" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t14" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t15" class="stm run hide_run"><span class="key">def</span> <span class="nam">_get_keystone_ep</span><span class="op">(</span><span class="nam">auth_region</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t16" class="stm run hide_run">    <span class="nam">result</span> <span class="op">=</span> <span class="nam">RegionService</span><span class="op">.</span><span class="nam">get_region_by_id_or_name</span><span class="op">(</span><span class="nam">auth_region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t17" class="stm run hide_run">    <span class="key">for</span> <span class="nam">ep</span> <span class="key">in</span> <span class="nam">result</span><span class="op">.</span><span class="nam">endpoints</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t18" class="stm run hide_run">        <span class="key">if</span> <span class="nam">ep</span><span class="op">.</span><span class="nam">type</span> <span class="op">==</span> <span class="str">'identity'</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t19" class="stm run hide_run">            <span class="key">return</span> <span class="nam">ep</span><span class="op">.</span><span class="nam">publicurl</span><span class="strut">&nbsp;</span></p>
+<p id="t20" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t21" class="pln">    <span class="com"># Keystone EP not found</span><span class="strut">&nbsp;</span></p>
+<p id="t22" class="stm run hide_run">    <span class="key">return</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t23" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t24" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t25" class="stm run hide_run"><span class="key">def</span> <span class="nam">authorize</span><span class="op">(</span><span class="nam">request</span><span class="op">,</span> <span class="nam">action</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t26" class="stm run hide_run">    <span class="key">if</span> <span class="key">not</span> <span class="nam">_is_authorization_enabled</span><span class="op">(</span><span class="nam">conf</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t27" class="stm run hide_run">        <span class="key">return</span><span class="strut">&nbsp;</span></p>
+<p id="t28" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t29" class="stm run hide_run">    <span class="nam">auth_region</span> <span class="op">=</span> <span class="nam">request</span><span class="op">.</span><span class="nam">headers</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'X-Auth-Region'</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t30" class="stm run hide_run">    <span class="key">try</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t31" class="stm run hide_run">        <span class="nam">keystone_ep</span> <span class="op">=</span> <span class="nam">_get_keystone_ep</span><span class="op">(</span><span class="nam">auth_region</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t32" class="stm run hide_run">    <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t33" class="pln">        <span class="com"># Failed to find Keystone EP - we'll set it to None instead of failing</span><span class="strut">&nbsp;</span></p>
+<p id="t34" class="pln">        <span class="com"># because the rule might be to let everyone pass</span><span class="strut">&nbsp;</span></p>
+<p id="t35" class="stm run hide_run">        <span class="nam">keystone_ep</span> <span class="op">=</span> <span class="nam">None</span><span class="strut">&nbsp;</span></p>
+<p id="t36" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t37" class="stm run hide_run">    <span class="nam">policy</span><span class="op">.</span><span class="nam">authorize</span><span class="op">(</span><span class="nam">action</span><span class="op">,</span> <span class="nam">request</span><span class="op">,</span> <span class="nam">conf</span><span class="op">,</span> <span class="nam">keystone_ep</span><span class="op">=</span><span class="nam">keystone_ep</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t38" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t39" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t40" class="stm run hide_run"><span class="key">def</span> <span class="nam">_is_authorization_enabled</span><span class="op">(</span><span class="nam">app_conf</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t41" class="stm run hide_run">    <span class="key">return</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">enabled</span><span class="strut">&nbsp;</span></p>
+<p id="t42" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t43" class="pln"><span class="strut">&nbsp;</span></p>
+<p id="t44" class="stm run hide_run"><span class="key">def</span> <span class="nam">get_token_conf</span><span class="op">(</span><span class="nam">app_conf</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
+<p id="t45" class="stm run hide_run">    <span class="nam">mech_id</span> <span class="op">=</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">mech_id</span><span class="strut">&nbsp;</span></p>
+<p id="t46" class="stm run hide_run">    <span class="nam">mech_password</span> <span class="op">=</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">mech_pass</span><span class="strut">&nbsp;</span></p>
+<p id="t47" class="pln">    <span class="com"># RMS URL is not necessary since this service is RMS</span><span class="strut">&nbsp;</span></p>
+<p id="t48" class="stm run hide_run">    <span class="nam">rms_url</span> <span class="op">=</span> <span class="str">''</span><span class="strut">&nbsp;</span></p>
+<p id="t49" class="stm run hide_run">    <span class="nam">tenant_name</span> <span class="op">=</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">tenant_name</span><span class="strut">&nbsp;</span></p>
+<p id="t50" class="stm run hide_run">    <span class="nam">keystone_version</span> <span class="op">=</span> <span class="nam">app_conf</span><span class="op">.</span><span class="nam">authentication</span><span class="op">.</span><span class="nam">keystone_version</span><span class="strut">&nbsp;</span></p>
+<p id="t51" class="stm run hide_run">    <span class="nam">conf</span> <span class="op">=</span> <span class="nam">tokens</span><span class="op">.</span><span class="nam">TokenConf</span><span class="op">(</span><span class="nam">mech_id</span><span class="op">,</span> <span class="nam">mech_password</span><span class="op">,</span> <span class="nam">rms_url</span><span class="op">,</span> <span class="nam">tenant_name</span><span class="op">,</span><span class="strut">&nbsp;</span></p>
+<p id="t52" class="pln">                            <span class="nam">keystone_version</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
+<p id="t53" class="stm run hide_run">    <span class="key">return</span> <span class="nam">conf</span><span class="strut">&nbsp;</span></p>
+
+            </td>
+        </tr>
+    </table>
+</div>
+
+<div id="footer">
+    <div class="content">
+        <p>
+            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.3.4</a>,
+            created at 2017-03-07 01:34
+        </p>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/orm/services/region_manager/htmlcov/status.json b/orm/services/region_manager/htmlcov/status.json
new file mode 100644
index 00000000..1ce63b3c
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/status.json
@@ -0,0 +1 @@
+{"files":{"rms_controllers_v2_orm_resources___init___py":{"index":{"relative_filename":"rms/controllers/v2/orm/resources/__init__.py","html_filename":"rms_controllers_v2_orm_resources___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"103b3a1826780f920626a4f622bcee7c"},"rms___init___py":{"index":{"relative_filename":"rms/__init__.py","html_filename":"rms___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"},"rms_external_mock_audit_client_api___init___py":{"index":{"relative_filename":"rms/external_mock/audit_client/api/__init__.py","html_filename":"rms_external_mock_audit_client_api___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"19a064df3967067a2ec86c467e92d140"},"rms_controllers_lcp_controller_py":{"index":{"relative_filename":"rms/controllers/lcp_controller.py","html_filename":"rms_controllers_lcp_controller_py.html","nums":[1,56,0,0,0,0,0]},"hash":"a032e4765d0af628116fb4a525003601"},"rms_utils_authentication_py":{"index":{"relative_filename":"rms/utils/authentication.py","html_filename":"rms_utils_authentication_py.html","nums":[1,32,0,0,0,0,0]},"hash":"9816983ff8e57e8d1a9ed68b7c30ff50"},"rms_external_mock_orm_common___init___py":{"index":{"relative_filename":"rms/external_mock/orm_common/__init__.py","html_filename":"rms_external_mock_orm_common___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"},"rms_model___init___py":{"index":{"relative_filename":"rms/model/__init__.py","html_filename":"rms_model___init___py.html","nums":[1,3,0,0,0,0,0]},"hash":"cf7982d8674fcb1858c46e0ed829f1e2"},"rms_storage_my_sql___init___py":{"index":{"relative_filename":"rms/storage/my_sql/__init__.py","html_filename":"rms_storage_my_sql___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"},"rms_model_url_parm_py":{"index":{"relative_filename":"rms/model/url_parm.py","html_filename":"rms_model_url_parm_py.html","nums":[1,63,0,4,0,0,0]},"hash":"554a5d26967309c0321bb2d5ca4de2d0"},"rms_controllers_root_py":{"index":{"relative_filename":"rms/controllers/root.py","html_filename":"rms_controllers_root_py.html","nums":[1,12,0,1,0,0,0]},"hash":"22b13e705390f352b9e7a78c2f83d7b9"},"rms_external_mock_keystone_utils___init___py":{"index":{"relative_filename":"rms/external_mock/keystone_utils/__init__.py","html_filename":"rms_external_mock_keystone_utils___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"},"rms_controllers_v2_orm_resources_groups_py":{"index":{"relative_filename":"rms/controllers/v2/orm/resources/groups.py","html_filename":"rms_controllers_v2_orm_resources_groups_py.html","nums":[1,124,0,22,0,0,0]},"hash":"38e755d11e73209da31ce4c4faff8d49"},"rms_controllers_v2_orm_resources_status_py":{"index":{"relative_filename":"rms/controllers/v2/orm/resources/status.py","html_filename":"rms_controllers_v2_orm_resources_status_py.html","nums":[1,47,0,3,0,0,0]},"hash":"afc1e6ecd339095ff57e6b9c7c9c819d"},"rms_services_error_base_py":{"index":{"relative_filename":"rms/services/error_base.py","html_filename":"rms_services_error_base_py.html","nums":[1,18,0,2,0,0,0]},"hash":"9cf5cf89d59dd8f73527b7bec0f6f11d"},"rms_external_mock_orm_common_policy_policy_py":{"index":{"relative_filename":"rms/external_mock/orm_common/policy/policy.py","html_filename":"rms_external_mock_orm_common_policy_policy_py.html","nums":[1,6,0,2,0,0,0]},"hash":"7ea56b6475a95231ec2271c5fb347853"},"rms_storage___init___py":{"index":{"relative_filename":"rms/storage/__init__.py","html_filename":"rms_storage___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"},"rms_external_mock_orm_common_policy___init___py":{"index":{"relative_filename":"rms/external_mock/orm_common/policy/__init__.py","html_filename":"rms_external_mock_orm_common_policy___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"},"rms_controllers_v2_orm___init___py":{"index":{"relative_filename":"rms/controllers/v2/orm/__init__.py","html_filename":"rms_controllers_v2_orm___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"f820fd7cab97fc8512bec0556f3f002c"},"rms_controllers_v2___init___py":{"index":{"relative_filename":"rms/controllers/v2/__init__.py","html_filename":"rms_controllers_v2___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"103b3a1826780f920626a4f622bcee7c"},"rms_controllers_v2_orm_resources_regions_py":{"index":{"relative_filename":"rms/controllers/v2/orm/resources/regions.py","html_filename":"rms_controllers_v2_orm_resources_regions_py.html","nums":[1,187,0,5,0,0,0]},"hash":"31c3b8e26317be7b0c19896d4f008617"},"rms_model_model_py":{"index":{"relative_filename":"rms/model/model.py","html_filename":"rms_model_model_py.html","nums":[1,100,0,7,0,0,0]},"hash":"29463d225fbe8d7a76bd2c96fc854ea9"},"rms_external_mock_orm_common_utils_utils_py":{"index":{"relative_filename":"rms/external_mock/orm_common/utils/utils.py","html_filename":"rms_external_mock_orm_common_utils_utils_py.html","nums":[1,6,0,1,0,0,0]},"hash":"3fd1f8e4472126ea5ccdbf31e97d61ea"},"rms_services___init___py":{"index":{"relative_filename":"rms/services/__init__.py","html_filename":"rms_services___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"8ac99c36cc7a0f004e5b32bd37a07666"},"rms_controllers_configuration_py":{"index":{"relative_filename":"rms/controllers/configuration.py","html_filename":"rms_controllers_configuration_py.html","nums":[1,17,0,0,0,0,0]},"hash":"b26d7e4d8662a3399ee6bfcca7910f6a"},"rms_storage_data_manager_factory_py":{"index":{"relative_filename":"rms/storage/data_manager_factory.py","html_filename":"rms_storage_data_manager_factory_py.html","nums":[1,12,0,0,0,0,0]},"hash":"187c41f6ce3b54925ae87043fbd31c9d"},"rms_storage_base_data_manager_py":{"index":{"relative_filename":"rms/storage/base_data_manager.py","html_filename":"rms_storage_base_data_manager_py.html","nums":[1,24,0,0,0,0,0]},"hash":"161f32081cdb26e50f07e76b8b1a9a5d"},"rms_controllers_v2_orm_resources_metadata_py":{"index":{"relative_filename":"rms/controllers/v2/orm/resources/metadata.py","html_filename":"rms_controllers_v2_orm_resources_metadata_py.html","nums":[1,85,0,19,0,0,0]},"hash":"7bb73ee1f834e6f8998371ce19f77ade"},"rms_external_mock___init___py":{"index":{"relative_filename":"rms/external_mock/__init__.py","html_filename":"rms_external_mock___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"19a064df3967067a2ec86c467e92d140"},"rms_storage_my_sql_data_manager_py":{"index":{"relative_filename":"rms/storage/my_sql/data_manager.py","html_filename":"rms_storage_my_sql_data_manager_py.html","nums":[1,270,0,31,0,0,0]},"hash":"5a1cbfe3ec7b9c95011d5586e27057cb"},"rms_external_mock_keystone_utils_tokens_py":{"index":{"relative_filename":"rms/external_mock/keystone_utils/tokens.py","html_filename":"rms_external_mock_keystone_utils_tokens_py.html","nums":[1,5,0,1,0,0,0]},"hash":"9e3b83a68d18e91870ada743cc6e8aaf"},"rms_controllers_v2_root_py":{"index":{"relative_filename":"rms/controllers/v2/root.py","html_filename":"rms_controllers_v2_root_py.html","nums":[1,3,0,0,0,0,0]},"hash":"a6ab4c4b9cc373374c0cdf71e05f92b2"},"rms_external_mock_orm_common_utils_api_error_utils_py":{"index":{"relative_filename":"rms/external_mock/orm_common/utils/api_error_utils.py","html_filename":"rms_external_mock_orm_common_utils_api_error_utils_py.html","nums":[1,2,0,1,0,0,0]},"hash":"5b097d36789f1b7dea3d91b3b8d3718a"},"rms_services_services_py":{"index":{"relative_filename":"rms/services/services.py","html_filename":"rms_services_services_py.html","nums":[1,170,0,55,0,0,0]},"hash":"ee882c9e5fa6c871e813a62a7126e7f8"},"rms_external_mock_audit_client_api_audit_py":{"index":{"relative_filename":"rms/external_mock/audit_client/api/audit.py","html_filename":"rms_external_mock_audit_client_api_audit_py.html","nums":[1,4,0,4,0,0,0]},"hash":"b0c363258cf77b3628c98037bd768ab4"},"rms_controllers___init___py":{"index":{"relative_filename":"rms/controllers/__init__.py","html_filename":"rms_controllers___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"},"rms_controllers_logs_py":{"index":{"relative_filename":"rms/controllers/logs.py","html_filename":"rms_controllers_logs_py.html","nums":[1,36,0,2,0,0,0]},"hash":"8e5e06cf27f60958af7f39bc4c28a5b9"},"rms_external_mock_audit_client___init___py":{"index":{"relative_filename":"rms/external_mock/audit_client/__init__.py","html_filename":"rms_external_mock_audit_client___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"19a064df3967067a2ec86c467e92d140"},"rms_controllers_v2_orm_root_py":{"index":{"relative_filename":"rms/controllers/v2/orm/root.py","html_filename":"rms_controllers_v2_orm_root_py.html","nums":[1,5,0,0,0,0,0]},"hash":"7d9f45649dfaa9de7107f13e60452b2e"},"rms_external_mock_orm_common_utils___init___py":{"index":{"relative_filename":"rms/external_mock/orm_common/utils/__init__.py","html_filename":"rms_external_mock_orm_common_utils___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"},"rms_utils___init___py":{"index":{"relative_filename":"rms/utils/__init__.py","html_filename":"rms_utils___init___py.html","nums":[1,0,0,0,0,0,0]},"hash":"eef1bc6a4630e20d1fc10b7474fc01f8"}},"version":"4.3.4","settings":"38064b61f52503ec7d8e083087b27b2f","format":1}
\ No newline at end of file
diff --git a/orm/services/region_manager/htmlcov/style.css b/orm/services/region_manager/htmlcov/style.css
new file mode 100644
index 00000000..86b82091
--- /dev/null
+++ b/orm/services/region_manager/htmlcov/style.css
@@ -0,0 +1,375 @@
+/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */
+/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */
+
+/* CSS styles for coverage.py. */
+
+/* Page-wide styles */
+html, body, h1, h2, h3, p, table, td, th {
+    margin: 0;
+    padding: 0;
+    border: 0;
+    outline: 0;
+    font-weight: inherit;
+    font-style: inherit;
+    font-size: 100%;
+    font-family: inherit;
+    vertical-align: baseline;
+    }
+
+/* Set baseline grid to 16 pt. */
+body {
+    font-family: georgia, serif;
+    font-size: 1em;
+    }
+
+html>body {
+    font-size: 16px;
+    }
+
+/* Set base font size to 12/16 */
+p {
+    font-size: .75em;           /* 12/16 */
+    line-height: 1.33333333em;  /* 16/12 */
+    }
+
+table {
+    border-collapse: collapse;
+    }
+td {
+    vertical-align: top;
+}
+table tr.hidden {
+    display: none !important;
+    }
+
+p#no_rows {
+    display: none;
+    font-size: 1.2em;
+    }
+
+a.nav {
+    text-decoration: none;
+    color: inherit;
+    }
+a.nav:hover {
+    text-decoration: underline;
+    color: inherit;
+    }
+
+/* Page structure */
+#header {
+    background: #f8f8f8;
+    width: 100%;
+    border-bottom: 1px solid #eee;
+    }
+
+#source {
+    padding: 1em;
+    font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
+    }
+
+.indexfile #footer {
+    margin: 1em 3em;
+    }
+
+.pyfile #footer {
+    margin: 1em 1em;
+    }
+
+#footer .content {
+    padding: 0;
+    font-size: 85%;
+    font-family: verdana, sans-serif;
+    color: #666666;
+    font-style: italic;
+    }
+
+#index {
+    margin: 1em 0 0 3em;
+    }
+
+/* Header styles */
+#header .content {
+    padding: 1em 3em;
+    }
+
+h1 {
+    font-size: 1.25em;
+    display: inline-block;
+}
+
+#filter_container {
+    display: inline-block;
+    float: right;
+    margin: 0 2em 0 0;
+}
+#filter_container input {
+    width: 10em;
+}
+
+h2.stats {
+    margin-top: .5em;
+    font-size: 1em;
+}
+.stats span {
+    border: 1px solid;
+    padding: .1em .25em;
+    margin: 0 .1em;
+    cursor: pointer;
+    border-color: #999 #ccc #ccc #999;
+}
+.stats span.hide_run, .stats span.hide_exc,
+.stats span.hide_mis, .stats span.hide_par,
+.stats span.par.hide_run.hide_par {
+    border-color: #ccc #999 #999 #ccc;
+}
+.stats span.par.hide_run {
+    border-color: #999 #ccc #ccc #999;
+}
+
+.stats span.run {
+    background: #ddffdd;
+}
+.stats span.exc {
+    background: #eeeeee;
+}
+.stats span.mis {
+    background: #ffdddd;
+}
+.stats span.hide_run {
+    background: #eeffee;
+}
+.stats span.hide_exc {
+    background: #f5f5f5;
+}
+.stats span.hide_mis {
+    background: #ffeeee;
+}
+.stats span.par {
+    background: #ffffaa;
+}
+.stats span.hide_par {
+    background: #ffffcc;
+}
+
+/* Help panel */
+#keyboard_icon {
+    float: right;
+    margin: 5px;
+    cursor: pointer;
+}
+
+.help_panel {
+    position: absolute;
+    background: #ffffcc;
+    padding: .5em;
+    border: 1px solid #883;
+    display: none;
+}
+
+.indexfile .help_panel {
+    width: 20em; height: 4em;
+}
+
+.pyfile .help_panel {
+    width: 16em; height: 8em;
+}
+
+.help_panel .legend {
+    font-style: italic;
+    margin-bottom: 1em;
+}
+
+#panel_icon {
+    float: right;
+    cursor: pointer;
+}
+
+.keyhelp {
+    margin: .75em;
+}
+
+.keyhelp .key {
+    border: 1px solid black;
+    border-color: #888 #333 #333 #888;
+    padding: .1em .35em;
+    font-family: monospace;
+    font-weight: bold;
+    background: #eee;
+}
+
+/* Source file styles */
+.linenos p {
+    text-align: right;
+    margin: 0;
+    padding: 0 .5em;
+    color: #999999;
+    font-family: verdana, sans-serif;
+    font-size: .625em;   /* 10/16 */
+    line-height: 1.6em;  /* 16/10 */
+    }
+.linenos p.highlight {
+    background: #ffdd00;
+    }
+.linenos p a {
+    text-decoration: none;
+    color: #999999;
+    }
+.linenos p a:hover {
+    text-decoration: underline;
+    color: #999999;
+    }
+
+td.text {
+    width: 100%;
+    }
+.text p {
+    margin: 0;
+    padding: 0 0 0 .5em;
+    border-left: 2px solid #ffffff;
+    white-space: pre;
+    position: relative;
+    }
+
+.text p.mis {
+    background: #ffdddd;
+    border-left: 2px solid #ff0000;
+    }
+.text p.run, .text p.run.hide_par {
+    background: #ddffdd;
+    border-left: 2px solid #00ff00;
+    }
+.text p.exc {
+    background: #eeeeee;
+    border-left: 2px solid #808080;
+    }
+.text p.par, .text p.par.hide_run {
+    background: #ffffaa;
+    border-left: 2px solid #eeee99;
+    }
+.text p.hide_run, .text p.hide_exc, .text p.hide_mis, .text p.hide_par,
+.text p.hide_run.hide_par {
+    background: inherit;
+    }
+
+.text span.annotate {
+    font-family: georgia;
+    color: #666;
+    float: right;
+    padding-right: .5em;
+    }
+.text p.hide_par span.annotate {
+    display: none;
+    }
+.text span.annotate.long {
+    display: none;
+    }
+.text p:hover span.annotate.long {
+    display: block;
+    max-width: 50%;
+    white-space: normal;
+    float: right;
+    position: absolute;
+    top: 1.75em;
+    right: 1em;
+    width: 30em;
+    height: auto;
+    color: #333;
+    background: #ffffcc;
+    border: 1px solid #888;
+    padding: .25em .5em;
+    z-index: 999;
+    border-radius: .2em;
+    box-shadow: #cccccc .2em .2em .2em;
+    }
+
+/* Syntax coloring */
+.text .com {
+    color: green;
+    font-style: italic;
+    line-height: 1px;
+    }
+.text .key {
+    font-weight: bold;
+    line-height: 1px;
+    }
+.text .str {
+    color: #000080;
+    }
+
+/* index styles */
+#index td, #index th {
+    text-align: right;
+    width: 5em;
+    padding: .25em .5em;
+    border-bottom: 1px solid #eee;
+    }
+#index th {
+    font-style: italic;
+    color: #333;
+    border-bottom: 1px solid #ccc;
+    cursor: pointer;
+    }
+#index th:hover {
+    background: #eee;
+    border-bottom: 1px solid #999;
+    }
+#index td.left, #index th.left {
+    padding-left: 0;
+    }
+#index td.right, #index th.right {
+    padding-right: 0;
+    }
+#index th.headerSortDown, #index th.headerSortUp {
+    border-bottom: 1px solid #000;
+    white-space: nowrap;
+    background: #eee;
+    }
+#index th.headerSortDown:after {
+    content: " ↓";
+}
+#index th.headerSortUp:after {
+    content: " ↑";
+}
+#index td.name, #index th.name {
+    text-align: left;
+    width: auto;
+    }
+#index td.name a {
+    text-decoration: none;
+    color: #000;
+    }
+#index tr.total,
+#index tr.total_dynamic {
+    }
+#index tr.total td,
+#index tr.total_dynamic td {
+    font-weight: bold;
+    border-top: 1px solid #ccc;
+    border-bottom: none;
+    }
+#index tr.file:hover {
+    background: #eeeeee;
+    }
+#index tr.file:hover td.name {
+    text-decoration: underline;
+    color: #000;
+    }
+
+/* scroll marker styles */
+#scroll_marker {
+    position: fixed;
+    right: 0;
+    top: 0;
+    width: 16px;
+    height: 100%;
+    background: white;
+    border-left: 1px solid #eee;
+    }
+
+#scroll_marker .marker {
+    background: #eedddd;
+    position: absolute;
+    min-height: 3px;
+    width: 100%;
+    }
diff --git a/orm/services/region_manager/public/css/style.css b/orm/services/region_manager/public/css/style.css
new file mode 100755
index 00000000..55c9db54
--- /dev/null
+++ b/orm/services/region_manager/public/css/style.css
@@ -0,0 +1,43 @@
+body {
+  background: #311F00;
+  color: white;
+  font-family: 'Helvetica Neue', 'Helvetica', 'Verdana', sans-serif;
+  padding: 1em 2em;
+}
+
+a {
+  color: #FAFF78;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+div#content  {
+  width: 800px;
+  margin: 0 auto;
+}
+
+form {
+  margin: 0;
+  padding: 0;
+  border: 0;
+}
+
+fieldset {
+  border: 0;
+}
+
+input.error {
+  background: #FAFF78;
+}
+
+header {
+  text-align: center;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  font-family: 'Futura-CondensedExtraBold', 'Futura', 'Helvetica', sans-serif;
+  text-transform: uppercase;
+}
diff --git a/orm/services/region_manager/public/images/logo.png b/orm/services/region_manager/public/images/logo.png
new file mode 100755
index 00000000..a8f403e4
Binary files /dev/null and b/orm/services/region_manager/public/images/logo.png differ
diff --git a/orm/services/region_manager/readme.md b/orm/services/region_manager/readme.md
new file mode 100644
index 00000000..b8a2af36
--- /dev/null
+++ b/orm/services/region_manager/readme.md
@@ -0,0 +1,35 @@
+# ORM discovery readme file
+
+This document includes the following topics
+1. Dev environment installation process
+1. Code style guide
+1. Python tips and tricks
+
+
+## Dev Environment installation process
+This project is python based so you need to have python 2.7 installed before continuing
+
+
+_TBD_
+
+## Code style guide
+First of all please read two of the following documents:
+1. [Pythons PEP8](https://www.python.org/dev/peps/pep-0008/)
+1. [Openstack hacking](http://docs.openstack.org/developer/hacking/)
+
+__After reading this please read it 3 more times__
+
+### Folders
+Folders names should be lowercase, if needed delimited by underscore
+
+do:
+```
+business_logic
+```
+not
+```
+BusinessLogic
+```
+## Python tips and tricks
+
+# test header
\ No newline at end of file
diff --git a/orm/services/region_manager/revert_csv2db.py b/orm/services/region_manager/revert_csv2db.py
new file mode 100644
index 00000000..7f25849a
--- /dev/null
+++ b/orm/services/region_manager/revert_csv2db.py
@@ -0,0 +1,32 @@
+import logging
+import csv
+
+from rms.storage.base_data_manager import SQLDBError
+
+from rms.storage.my_sql.data_manager import DataManager
+import config
+
+logger = logging.getLogger(__name__)
+
+
+def revert_csv2db(data_manager):
+    logger.info('revert csv to db..')
+
+    try:
+
+        with open('rms/resources/regions.csv') as csvfile:
+            reader = csv.DictReader(csvfile)
+            for row in reader:
+                data_manager.delete_region(row["region_id"])
+
+    except SQLDBError as e:
+        logger.error("SQL error raised {}".format(e.message))
+
+
+def main():
+    db_url = config.database['url']
+    data_manager = DataManager(db_url)
+    revert_csv2db(data_manager)
+
+if __name__ == "__main__":
+    main()
diff --git a/orm/services/region_manager/rms.conf b/orm/services/region_manager/rms.conf
new file mode 100644
index 00000000..7912de6a
--- /dev/null
+++ b/orm/services/region_manager/rms.conf
@@ -0,0 +1,26 @@
+Listen 8080
+ 
+<VirtualHost *:8080>
+ 
+    WSGIDaemonProcess rms user=orm group=orm threads=5
+    WSGIScriptAlias / /opt/app/orm/rms/rms.wsgi
+	
+	<Location /logs>
+		Order deny,allow
+		Deny from all
+		Allow from localhost
+	</Location>
+
+	<Location /configuration>
+		Order deny,allow
+		Deny from all
+		Allow from localhost
+	</Location>
+ 
+    <Directory /opt/app/orm/rms/>
+        WSGIProcessGroup rms
+        WSGIApplicationGroup %{GLOBAL}
+                Require all granted
+        Allow from all
+    </Directory>
+</VirtualHost>
diff --git a/orm/services/region_manager/rms.wsgi b/orm/services/region_manager/rms.wsgi
new file mode 100644
index 00000000..dc62cf7e
--- /dev/null
+++ b/orm/services/region_manager/rms.wsgi
@@ -0,0 +1,2 @@
+from pecan.deploy import deploy
+application = deploy('/opt/app/orm/rms/config.py')
diff --git a/orm/services/region_manager/rms/__init__.py b/orm/services/region_manager/rms/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/app.py b/orm/services/region_manager/rms/app.py
new file mode 100755
index 00000000..a03c6ae9
--- /dev/null
+++ b/orm/services/region_manager/rms/app.py
@@ -0,0 +1,40 @@
+import logging
+import os
+
+from pecan import make_app
+from pecan.commands import CommandRunner
+
+from orm_common.utils import utils
+from orm_common.policy import policy
+
+from rms import model
+from rms.utils import authentication
+
+
+logger = logging.getLogger(__name__)
+
+
+def setup_app(config):
+    model.init_model()
+    token_conf = authentication.get_token_conf(config)
+    policy.init(config.authentication.policy_file, token_conf)
+    app_conf = dict(config.app)
+
+    utils.set_utils_conf(config)
+
+    app = make_app(
+        app_conf.pop('root'),
+        logging=getattr(config, 'logging', {}),
+        **app_conf
+    )
+
+    logger.info('Starting RMS...')
+    return app
+
+
+def main():
+    dir_name = os.path.dirname(__file__)
+    drive, path_and_file = os.path.splitdrive(dir_name)
+    path, filename = os.path.split(path_and_file)
+    runner = CommandRunner()
+    runner.run(['serve', path+'/config.py'])
diff --git a/orm/services/region_manager/rms/controllers/__init__.py b/orm/services/region_manager/rms/controllers/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/controllers/configuration.py b/orm/services/region_manager/rms/controllers/configuration.py
new file mode 100755
index 00000000..e570a282
--- /dev/null
+++ b/orm/services/region_manager/rms/controllers/configuration.py
@@ -0,0 +1,34 @@
+"""Configuration rest API input module."""
+
+import logging
+
+from orm_common.utils import utils
+
+from pecan import conf
+from pecan import request
+from pecan import rest
+from wsmeext.pecan import wsexpose
+
+from rms.utils import authentication
+
+logger = logging.getLogger(__name__)
+
+
+class ConfigurationController(rest.RestController):
+    """Configuration controller."""
+
+    @wsexpose(str, str, status_code=200)
+    def get(self, dump_to_log='false'):
+        """get method.
+
+        :param dump_to_log: A boolean string that says whether the
+        configuration should be written to log
+        :return: A pretty string that contains the service's configuration
+        """
+        logger.info("Get configuration...")
+        authentication.authorize(request, 'configuration:get')
+
+        dump = dump_to_log.lower() == 'true'
+        utils.set_utils_conf(conf)
+        result = utils.report_config(conf, dump, logger)
+        return result
diff --git a/orm/services/region_manager/rms/controllers/lcp_controller.py b/orm/services/region_manager/rms/controllers/lcp_controller.py
new file mode 100755
index 00000000..dacb8a57
--- /dev/null
+++ b/orm/services/region_manager/rms/controllers/lcp_controller.py
@@ -0,0 +1,120 @@
+import logging
+
+from pecan import rest, request
+from pecan import conf
+
+from wsme import types as wtypes
+from wsmeext.pecan import wsexpose
+from rms.model import url_parm
+from rms.services.error_base import ErrorStatus
+from rms.services import services
+from rms.utils import authentication
+
+from orm_common.utils import api_error_utils as err_utils
+
+logger = logging.getLogger(__name__)
+
+
+class LcpController(rest.RestController):
+
+    @wsexpose(wtypes.text, rest_content_types='json')
+    def get_all(self):
+        """
+            This function is called when receiving /lcp without a parameter.
+            parameter:
+                None.
+            return: entire list of lcp.
+        """
+        logger.info('Received a GET request for all LCPs')
+        authentication.authorize(request, 'lcp:get_all')
+
+        zones = []
+
+        try:
+            zones = get_zones()
+            logger.debug('Returning LCP list: %s' % (zones,))
+            return zones
+
+        except Exception as exception:
+            logger.error(exception.message)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+    @wsexpose(wtypes.text, str, rest_content_types='json')
+    def get_one(self, lcp_id):
+
+        logger.info('Received a GET request for LCP %s' % (id,))
+        authentication.authorize(request, 'lcp:get_one')
+
+        zones = []
+        try:
+
+            zones = get_zones()
+
+        except Exception as exception:
+            logger.error(exception.message)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+        for zone in zones:
+            if zone["id"] == lcp_id:
+                logger.debug('Returning: %s' % (zone,))
+                return zone
+
+        error_msg = 'LCP %s not found' % (lcp_id,)
+        logger.info(error_msg)
+        raise err_utils.get_error(request.transaction_id,
+                                  message=error_msg,
+                                  status_code=404)
+
+
+def get_zones():
+    """
+    This function returns the lcp list from CSV file.
+    parameter:
+        None.
+    return:
+        zone list in json format.
+    """
+    logger.debug('Enter get_zones function')
+    result = []
+
+    try:
+        url_args = url_parm.UrlParms()
+        zones = services.get_regions_data(url_args)
+
+        for zone in zones.regions:
+            result.append(build_zone_response(zone))
+
+        logger.debug("Available regions: {}".format(', '.join(
+            [region["zone_name"] for region in result])))
+
+    except ErrorStatus as e:
+        logger.debug(e.message)
+    finally:
+        return result
+
+
+def build_zone_response(zone):
+
+    end_points_dict = {"identity": "",
+                       "dashboard": "",
+                       "ord": ""}
+    for end_point in zone.endpoints:
+        end_points_dict[end_point.type] = end_point.publicurl
+
+    return dict(
+        zone_name=zone.name,
+        id=zone.id,
+        status="1" if zone.status == "functional" else "0",
+        design_type=zone.design_type,
+        location_type=zone.location_type,
+        vLCP_name=zone.vlcp_name,
+        AIC_version=zone.ranger_agent_version,
+        OS_version=zone.open_stack_version,
+        keystone_EP=end_points_dict["identity"],
+        horizon_EP=end_points_dict["dashboard"],
+        ORD_EP=end_points_dict["ord"]
+    )
diff --git a/orm/services/region_manager/rms/controllers/logs.py b/orm/services/region_manager/rms/controllers/logs.py
new file mode 100755
index 00000000..7cd4dafe
--- /dev/null
+++ b/orm/services/region_manager/rms/controllers/logs.py
@@ -0,0 +1,74 @@
+import logging
+from pecan import rest, request
+import wsme
+from wsmeext.pecan import wsexpose
+
+from orm_common.utils import api_error_utils as err_utils
+
+from rms.utils import authentication
+
+logger = logging.getLogger(__name__)
+
+
+class LogChangeResultWSME(wsme.types.DynamicBase):
+    """log change result wsme type."""
+
+    result = wsme.wsattr(str, mandatory=True, default=None)
+
+    def __init__(self, **kwargs):
+        """"init method."""
+        super(LogChangeResult, self).__init__(**kwargs)
+
+
+class LogChangeResult(object):
+    """log change result type."""
+
+    def __init__(self, result):
+        """"init method."""
+        self.result = result
+
+
+class LogsController(rest.RestController):
+    """Logs Audit controller."""
+
+    @wsexpose(LogChangeResultWSME, str, status_code=201,
+              rest_content_types='json')
+    def put(self, level):
+        """update log level.
+
+        :param level: the log level text name
+        :return:
+        """
+
+        logger.info("Changing log level to [{}]".format(level))
+        authentication.authorize(request, 'log:update')
+
+        try:
+            log_level = logging._levelNames.get(level.upper())
+            if log_level is not None:
+                self._change_log_level(log_level)
+                result = "Log level changed to {}.".format(level)
+                logger.info(result)
+            else:
+                raise Exception(
+                    "The given log level [{}] doesn't exist.".format(level))
+
+            return LogChangeResult(result)
+
+        except Exception as exception:
+            logger.error("Fail to change log_level. Reason: {}".format(
+                exception.message))
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+    @staticmethod
+    def _change_log_level(log_level):
+        path = __name__.split('.')
+        if len(path) > 0:
+            root = path[0]
+            root_logger = logging.getLogger(root)
+            root_logger.setLevel(log_level)
+        else:
+            logger.info("Fail to change log_level to [{}]. "
+                        "the given log level doesn't exist.".format(log_level))
diff --git a/orm/services/region_manager/rms/controllers/root.py b/orm/services/region_manager/rms/controllers/root.py
new file mode 100755
index 00000000..863ac35e
--- /dev/null
+++ b/orm/services/region_manager/rms/controllers/root.py
@@ -0,0 +1,35 @@
+from pecan import expose
+from lcp_controller import LcpController
+from logs import LogsController
+from configuration import ConfigurationController
+from rms.controllers.v2 import root
+
+
+class RootController(object):
+    lcp = LcpController()
+    logs = LogsController()
+    configuration = ConfigurationController()
+    v2 = root.V2Controller()
+
+    @expose(template='json')
+    def _default(self):
+        """
+            Method to handle GET /
+            parameters: None
+            return: dict describing lcp rest version information
+        """
+        return {
+            "versions": {
+                "values": [
+                    {
+                        "status": "stable",
+                        "id": "v2",
+                        "links": [
+                            {
+                                "href": "http://localhost:8080/"
+                            }
+                        ]
+                    }
+                ]
+            }
+        }
diff --git a/orm/services/region_manager/rms/controllers/v2/__init__.py b/orm/services/region_manager/rms/controllers/v2/__init__.py
new file mode 100644
index 00000000..a53d8cf9
--- /dev/null
+++ b/orm/services/region_manager/rms/controllers/v2/__init__.py
@@ -0,0 +1 @@
+"""orm package."""
diff --git a/orm/services/region_manager/rms/controllers/v2/orm/__init__.py b/orm/services/region_manager/rms/controllers/v2/orm/__init__.py
new file mode 100644
index 00000000..1e27d7e7
--- /dev/null
+++ b/orm/services/region_manager/rms/controllers/v2/orm/__init__.py
@@ -0,0 +1 @@
+"""resource package."""
diff --git a/orm/services/region_manager/rms/controllers/v2/orm/resources/__init__.py b/orm/services/region_manager/rms/controllers/v2/orm/resources/__init__.py
new file mode 100644
index 00000000..6d88728d
--- /dev/null
+++ b/orm/services/region_manager/rms/controllers/v2/orm/resources/__init__.py
@@ -0,0 +1 @@
+"""orm package."""
diff --git a/orm/services/region_manager/rms/controllers/v2/orm/resources/groups.py b/orm/services/region_manager/rms/controllers/v2/orm/resources/groups.py
new file mode 100755
index 00000000..b3a74d2d
--- /dev/null
+++ b/orm/services/region_manager/rms/controllers/v2/orm/resources/groups.py
@@ -0,0 +1,254 @@
+"""rest module."""
+import logging
+import time
+import wsme
+
+from orm_common.utils import api_error_utils as err_utils
+from orm_common.utils import utils
+
+from rms.services import error_base
+from rms.services import services as GroupService
+from rms.utils import authentication
+from pecan import rest, request
+from wsme import types as wtypes
+from wsmeext.pecan import wsexpose
+from rms.model import model as PythonModel
+
+
+logger = logging.getLogger(__name__)
+
+
+class Groups(wtypes.DynamicBase):
+    """main json header."""
+
+    id = wsme.wsattr(wtypes.text, mandatory=True)
+    name = wsme.wsattr(wtypes.text, mandatory=True)
+    description = wsme.wsattr(wtypes.text, mandatory=True)
+    regions = wsme.wsattr([str], mandatory=True)
+
+    def __init__(self, id=None, name=None, description=None, regions=[]):
+        """init function.
+
+        :param regions:
+        :return:
+        """
+        self.id = id
+        self.name = name
+        self.description = description
+        self.regions = regions
+
+    def _to_python_obj(self):
+        obj = PythonModel.Groups()
+        obj.id = self.id
+        obj.name = self.name
+        obj.description = self.description
+        obj.regions = self.regions
+        return obj
+
+
+class GroupWrapper(wtypes.DynamicBase):
+    """main cotain lis of groups."""
+
+    groups = wsme.wsattr([Groups], mandatory=True)
+
+    def __init__(self, groups=[]):
+        """
+
+        :param group:
+        """
+        self.groups = groups
+
+
+class OutputResource(wtypes.DynamicBase):
+    """class method returned json body."""
+
+    id = wsme.wsattr(wtypes.text, mandatory=True)
+    name = wsme.wsattr(wtypes.text, mandatory=True)
+    created = wsme.wsattr(wtypes.text, mandatory=True)
+    links = wsme.wsattr({str: str}, mandatory=True)
+
+    def __init__(self, id=None, name=None, created=None, links={}):
+        """init function.
+
+        :param id:
+        :param created:
+        :param links:
+        """
+        self.id = id
+        self.name = name
+        self.created = created
+        self.links = links
+
+
+class Result(wtypes.DynamicBase):
+    """class method json headers."""
+
+    group = wsme.wsattr(OutputResource, mandatory=True)
+
+    def __init__(self, group=OutputResource()):
+        """init dunction.
+
+        :param group: The created group
+        """
+        self.group = group
+
+
+class GroupsController(rest.RestController):
+    """controller get resource."""
+
+    @wsexpose(Groups, str, status_code=200,
+              rest_content_types='json')
+    def get(self, id=None):
+        """Handle get request.
+
+        :param id: Group ID
+        :return: 200 OK on success, 404 Not Found otherwise.
+        """
+        logger.info("Entered Get Group: id = {}".format(id))
+        authentication.authorize(request, 'group:get_one')
+
+        try:
+
+            result = GroupService.get_groups_data(id)
+            logger.debug('Returning group, regions: {}'.format(result.regions))
+            return result
+
+        except error_base.NotFoundError as e:
+            logger.error("GroupsController - Group not found")
+            raise err_utils.get_error(request.transaction_id,
+                                      message=e.message,
+                                      status_code=404)
+        except Exception as exception:
+            logger.error(exception.message)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+    @wsexpose(GroupWrapper, status_code=200, rest_content_types='json')
+    def get_all(self):
+        logger.info("gett all groups")
+        authentication.authorize(request, 'group:get_all')
+        try:
+
+            logger.debug("api-get all groups")
+            groups_wrraper = GroupService.get_all_groups()
+            logger.debug("got groups {}".format(groups_wrraper))
+
+        except Exception as exp:
+            logger.error("api--fail to get all groups")
+            logger.exception(exp)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+        return groups_wrraper
+
+    @wsexpose(Result, body=Groups, status_code=201, rest_content_types='json')
+    def post(self, group_input):
+        """Handle post request.
+
+        :param group_input: json data
+        :return: 201 created on success, 409 otherwise.
+        """
+        logger.info("Entered Create Group")
+        logger.debug("id = {}, name = {}, description = {}, regions = {}".format(
+            group_input.id,
+            group_input.name,
+            group_input.description,
+            group_input.regions))
+        authentication.authorize(request, 'group:create')
+
+        try:
+            # May raise an exception which will return status code 400
+            GroupService.create_group_in_db(group_input.id,
+                                            group_input.name,
+                                            group_input.description,
+                                            group_input.regions)
+            logger.debug("Group created successfully in DB")
+
+            # Create the group output data with the correct timestamp and link
+            group = OutputResource(group_input.id,
+                                   group_input.name,
+                                   repr(int(time.time() * 1000)),
+                                   {'self': '{}/v2/orm/groups/{}'.format(
+                                       request.application_url,
+                                       group_input.id)})
+
+            event_details = 'Region group {} {} created with regions: {}'.format(
+                group_input.id, group_input.name, group_input.regions)
+            utils.audit_trail('create group', request.transaction_id,
+                              request.headers, group_input.id,
+                              event_details=event_details)
+            return Result(group)
+
+        except error_base.ErrorStatus as e:
+            logger.error("GroupsController - {}".format(e.message))
+            raise err_utils.get_error(request.transaction_id,
+                                      message=e.message,
+                                      status_code=e.status_code)
+        except Exception as exception:
+            logger.error(exception.message)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+    @wsexpose(None, str, status_code=204, rest_content_types='json')
+    def delete(self, group_id):
+        logger.info("delete group")
+        authentication.authorize(request, 'group:delete')
+
+        try:
+
+            logger.debug("delete group with id {}".format(group_id))
+            GroupService.delete_group(group_id)
+            logger.debug("done")
+
+            event_details = 'Region group {} deleted'.format(group_id)
+            utils.audit_trail('delete group', request.transaction_id,
+                              request.headers, group_id,
+                              event_details=event_details)
+
+        except Exception as exp:
+
+            logger.exception("fail to delete group :- {}".format(exp))
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exp.message)
+        return
+
+    @wsexpose(Result, str, body=Groups, status_code=201,
+              rest_content_types='json')
+    def put(self, group_id, group):
+        logger.info("update group")
+        authentication.authorize(request, 'group:update')
+
+        try:
+            logger.debug("update group - id {}".format(group_id))
+            result = GroupService.update_group(group, group_id)
+            logger.debug("group updated to :- {}".format(result))
+
+            # build result
+            group_result = OutputResource(result.id, result.name,
+                                          repr(int(time.time() * 1000)), {
+                                              'self': '{}/v2/orm/groups/{}'.format(
+                                                  request.application_url,
+                                                  result.id)})
+
+            event_details = 'Region group {} {} updated with regions: {}'.format(
+                group_id, group.name, group.regions)
+            utils.audit_trail('update group', request.transaction_id,
+                              request.headers, group_id,
+                              event_details=event_details)
+
+        except error_base.ErrorStatus as exp:
+            logger.error("group to update not found {}".format(exp))
+            logger.exception(exp)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exp.message,
+                                      status_code=exp.status_code)
+        except Exception as exp:
+            logger.error("fail to update groupt -- id {}".format(group_id))
+            logger.exception(exp)
+            raise
+
+        return Result(group_result)
diff --git a/orm/services/region_manager/rms/controllers/v2/orm/resources/metadata.py b/orm/services/region_manager/rms/controllers/v2/orm/resources/metadata.py
new file mode 100755
index 00000000..604ffcfc
--- /dev/null
+++ b/orm/services/region_manager/rms/controllers/v2/orm/resources/metadata.py
@@ -0,0 +1,174 @@
+import json
+
+import logging
+
+from pecan import rest, request
+import wsme
+from wsme import types as wtypes
+from wsmeext.pecan import wsexpose
+
+from rms.services import error_base
+from rms.services import services as RegionService
+
+from rms.utils import authentication
+
+from orm_common.utils import api_error_utils as err_utils
+from orm_common.utils import utils
+
+logger = logging.getLogger(__name__)
+
+
+class MetaData(wtypes.DynamicBase):
+    """main json header."""
+
+    metadata = wsme.wsattr({str: [str]}, mandatory=True)
+
+    def __init__(self, metadata={}):
+        """init function.
+
+        :param regions:
+        :return:
+        """
+        self.metadata = metadata
+
+
+class RegionMetadataController(rest.RestController):
+
+    @wsexpose(MetaData, str, status_code=200, rest_content_types='json')
+    def get(self, region_id):
+        logger.info("Get metadata for region id: {}".format(region_id))
+        authentication.authorize(request, 'metadata:get')
+
+        try:
+            region = RegionService.get_region_by_id_or_name(region_id)
+            logger.debug("Got region metadata: {}".format(region.metadata))
+            return MetaData(region.metadata)
+
+        except error_base.ErrorStatus as exp:
+            logger.error("RegionsController - {}".format(exp.message))
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exp.message,
+                                      status_code=exp.status_code)
+        except Exception as exp:
+            logger.exception(exp.message)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exp.message)
+
+    @wsexpose(MetaData, str, body=MetaData, status_code=201,
+              rest_content_types='json')
+    def post(self, region_id, metadata_input):
+        """Handle post request.
+        :param region_id: region_id to add metadata to.
+        :param metadata_input: json data
+        :return: 201 created on success, 409 duplicate entry, 404 not found
+        """
+        logger.info("Entered Create region metadata")
+        logger.debug("Got metadata: {}".format(metadata_input))
+        authentication.authorize(request, 'metadata:create')
+
+        try:
+            self._validate_request_input()
+            # May raise an exception which will return status code 400
+            result = RegionService.add_region_metadata(region_id,
+                                                       metadata_input.metadata)
+            logger.debug("Metadata was successfully added to "
+                         "region: {}. New metadata: {}".format(region_id, result))
+
+            event_details = 'Region {} metadata added'.format(region_id)
+            utils.audit_trail('create metadata', request.transaction_id,
+                              request.headers, region_id,
+                              event_details=event_details)
+            return MetaData(result)
+
+        except error_base.ErrorStatus as e:
+            logger.error(e.message)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=e.message,
+                                      status_code=e.status_code)
+        except Exception as exception:
+            logger.error(exception.message)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+    @wsexpose(MetaData, str, body=MetaData, status_code=201,
+              rest_content_types='json')
+    def put(self, region_id, metadata_input):
+        """Handle put request.
+        :param region_id: region_id to update metadata to.
+        :param metadata_input: json data
+        :return: 201 created on success, 404 not found
+        """
+        logger.info("Entered update region metadata")
+        logger.debug("Got metadata: {}".format(metadata_input))
+        authentication.authorize(request, 'metadata:update')
+
+        try:
+            self._validate_request_input()
+            # May raise an exception which will return status code 400
+            result = RegionService.update_region_metadata(region_id,
+                                                          metadata_input.metadata)
+            logger.debug("Metadata was successfully added to "
+                         "region: {}. New metadata: {}".format(region_id, result))
+
+            event_details = 'Region {} metadata updated'.format(region_id)
+            utils.audit_trail('update metadata', request.transaction_id,
+                              request.headers, region_id,
+                              event_details=event_details)
+            return MetaData(result)
+
+        except error_base.ErrorStatus as e:
+            logger.error(e.message)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=e.message,
+                                      status_code=e.status_code)
+        except Exception as exception:
+            logger.error(exception.message)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+    @wsexpose(None, str, str, status_code=204, rest_content_types='json')
+    def delete(self, region_id, metadata_key):
+        """Handle delete request.
+        :param region_id: region_id to update metadata to.
+        :param metadata_key: metadata key to be deleted
+        :return: 204 deleted
+        """
+        logger.info("Entered delete region metadata with "
+                    "key: {}".format(metadata_key))
+        authentication.authorize(request, 'metadata:delete')
+
+        try:
+            # May raise an exception which will return status code 400
+            result = RegionService.delete_metadata_from_region(region_id,
+                                                               metadata_key)
+            logger.debug("Metadata was successfully deleted.")
+
+            event_details = 'Region {} metadata {} deleted'.format(
+                region_id, metadata_key)
+            utils.audit_trail('delete metadata', request.transaction_id,
+                              request.headers, region_id,
+                              event_details=event_details)
+
+        except error_base.ErrorStatus as e:
+            logger.error(e.message)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=e.message,
+                                      status_code=e.status_code)
+        except Exception as exception:
+            logger.error(exception.message)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+    def _validate_request_input(self):
+        data_dict = json.loads(request.body)
+        logger.debug("Got {}".format(data_dict))
+        for k, v in data_dict['metadata'].iteritems():
+            if isinstance(v, basestring):
+                logger.error("Invalid json. value type list is expected, "
+                             "received string, for metadata key {}".format(k))
+                raise error_base.ErrorStatus(400, "Invalid json. Expecting list "
+                                                  "of metadata values, got string")
diff --git a/orm/services/region_manager/rms/controllers/v2/orm/resources/regions.py b/orm/services/region_manager/rms/controllers/v2/orm/resources/regions.py
new file mode 100755
index 00000000..15f57e6e
--- /dev/null
+++ b/orm/services/region_manager/rms/controllers/v2/orm/resources/regions.py
@@ -0,0 +1,344 @@
+"""rest module."""
+import logging
+
+from pecan import rest, request
+import wsme
+from wsme import types as wtypes
+from wsmeext.pecan import wsexpose
+
+from rms.model import url_parm
+from rms.model import model as PythonModel
+from rms.services import error_base
+from rms.services import services as RegionService
+
+from rms.controllers.v2.orm.resources.metadata import RegionMetadataController
+from rms.controllers.v2.orm.resources.status import RegionStatusController
+
+from rms.utils import authentication
+
+from orm_common.policy import policy
+from orm_common.utils import api_error_utils as err_utils
+from orm_common.utils import utils
+
+logger = logging.getLogger(__name__)
+
+
+class Address(wtypes.DynamicBase):
+    """wsme class for address json."""
+
+    country = wsme.wsattr(wtypes.text, mandatory=True)
+    state = wsme.wsattr(wtypes.text, mandatory=True)
+    city = wsme.wsattr(wtypes.text, mandatory=True)
+    street = wsme.wsattr(wtypes.text, mandatory=True)
+    zip = wsme.wsattr(wtypes.text, mandatory=True)
+
+    def __init__(self, country=None, state=None, city=None,
+                 street=None, zip=None):
+        """
+
+        :param country:
+        :param state:
+        :param city:
+        :param street:
+        :param zip:
+        """
+        self.country = country
+        self.state = state
+        self.city = city
+        self.street = street
+        self.zip = zip
+
+    def _to_clean_python_obj(self):
+        obj = PythonModel.Address()
+        obj.country = self.country
+        obj.state = self.state
+        obj.city = self.city
+        obj.street = self.street
+        obj.zip = self.zip
+        return obj
+
+
+class EndPoint(wtypes.DynamicBase):
+    """class method endpoints body."""
+
+    publicurl = wsme.wsattr(wtypes.text, mandatory=True, name="publicURL")
+    type = wsme.wsattr(wtypes.text, mandatory=True)
+
+    def __init__(self, publicurl=None, type=None):
+        """init function.
+
+        :param publicURL: field
+        :param typee: field
+        :return:
+        """
+        self.type = type
+        self.publicurl = publicurl
+
+    def _to_clean_python_obj(self):
+        obj = PythonModel.EndPoint()
+        obj.publicurl = self.publicurl
+        obj.type = self.type
+        return obj
+
+
+class RegionsData(wtypes.DynamicBase):
+    """class method json header."""
+
+    status = wsme.wsattr(wtypes.text, mandatory=True)
+    id = wsme.wsattr(wtypes.text, mandatory=True)
+    name = wsme.wsattr(wtypes.text, mandatory=False)
+    ranger_agent_version = wsme.wsattr(wtypes.text, mandatory=True, name="rangerAgentVersion")
+    open_stack_version = wsme.wsattr(wtypes.text, mandatory=True, name="OSVersion")
+    clli = wsme.wsattr(wtypes.text, mandatory=True, name="CLLI")
+    metadata = wsme.wsattr({str: [str]}, mandatory=True)
+    endpoints = wsme.wsattr([EndPoint], mandatory=True)
+    address = wsme.wsattr(Address, mandatory=True)
+    design_type = wsme.wsattr(wtypes.text, mandatory=True, name="designType")
+    location_type = wsme.wsattr(wtypes.text, mandatory=True, name="locationType")
+    vlcp_name = wsme.wsattr(wtypes.text, mandatory=True, name="vlcpName")
+
+    def __init__(self, status=None, id=None, name=None, clli=None, design_type=None,
+                 location_type=None, vlcp_name=None, open_stack_version=None,
+                 address=Address(), ranger_agent_version=None, metadata={},
+                 endpoint=[EndPoint()]):
+        """
+
+        :param status:
+        :param id:
+        :param name:
+        :param clli:
+        :param design_type:
+        :param location_type:
+        :param vlcp_name:
+        :param open_stack_version:
+        :param address:
+        :param ranger_agent_version:
+        :param metadata:
+        :param endpoint:
+        """
+        self.status = status
+        self.id = id
+        self.name = self.id
+        self.clli = clli
+        self.ranger_agent_version = ranger_agent_version
+        self.metadata = metadata
+        self.endpoint = endpoint
+        self.design_type = design_type
+        self.location_type = location_type
+        self.vlcp_name = vlcp_name
+        self.address = address
+        self.open_stack_version = open_stack_version
+
+    def _to_clean_python_obj(self):
+        obj = PythonModel.RegionData()
+        obj.endpoints = []
+        obj.status = self.status
+        obj.id = self.id
+        obj.name = self.id
+        obj.ranger_agent_version = self.ranger_agent_version
+        obj.clli = self.clli
+        obj.metadata = self.metadata
+        for endpoint in self.endpoints:
+            obj.endpoints.append(endpoint._to_clean_python_obj())
+        obj.address = self.address._to_clean_python_obj()
+        obj.design_type = self.design_type
+        obj.location_type = self.location_type
+        obj.vlcp_name = self.vlcp_name
+        obj.open_stack_version = self.open_stack_version
+        return obj
+
+
+class Regions(wtypes.DynamicBase):
+    """main json header."""
+
+    regions = wsme.wsattr([RegionsData], mandatory=True)
+
+    def __init__(self, regions=[RegionsData()]):
+        """init function.
+
+        :param regions:
+        :return:
+        """
+        self.regions = regions
+
+
+class RegionsController(rest.RestController):
+    """controller get resource."""
+    metadata = RegionMetadataController()
+    status = RegionStatusController()
+
+    @wsexpose(Regions, str, str, [str], str, str, str, str, str, str, str,
+              str, str, str, status_code=200, rest_content_types='json')
+    def get_all(self, type=None, status=None, metadata=None, rangerAgentVersion=None,
+                clli=None, regionname=None, osversion=None, valet=None,
+                state=None, country=None, city=None, street=None, zip=None):
+        """get regions.
+
+        :param type: query field
+        :param status: query field
+        :param metadata: query field
+        :param rangerAgentVersion: query field
+        :param clli: query field
+        :param regionname: query field
+        :param osversion: query field
+        :param valet: query field
+        :param state: query field
+        :param country: query field
+        :param city: query field
+        :param street: query field
+        :param zip: query field
+        :return: json from db
+        :exception: EntityNotFoundError 404
+        """
+        logger.info("Entered Get Regions")
+        authentication.authorize(request, 'region:get_all')
+
+        url_args = {'type': type, 'status': status, 'metadata': metadata,
+                    'rangerAgentVersion': rangerAgentVersion, 'clli': clli, 'regionname': regionname,
+                    'osversion': osversion, 'valet': valet, 'state': state,
+                    'country': country, 'city': city, 'street': street, 'zip': zip}
+        logger.debug("Parameters: {}".format(str(url_args)))
+
+        try:
+            url_args = url_parm.UrlParms(**url_args)
+
+            result = RegionService.get_regions_data(url_args)
+
+            logger.debug("Returning regions: {}".format(', '.join(
+                [region.name for region in result.regions])))
+
+            return result
+
+        except error_base.ErrorStatus as e:
+            logger.error("RegionsController {}".format(e.message))
+            raise err_utils.get_error(request.transaction_id,
+                                      message=e.message,
+                                      status_code=e.status_code)
+
+        except Exception as exception:
+            logger.error(exception.message)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      message=exception.message)
+
+    @wsexpose(RegionsData, str, status_code=200, rest_content_types='json')
+    def get_one(self, id_or_name):
+        logger.info("API: Entered get region by id or name: {}".format(id_or_name))
+        authentication.authorize(request, 'region:get_one')
+
+        try:
+            result = RegionService.get_region_by_id_or_name(id_or_name)
+            logger.debug("API: Got region {} success: {}".format(id_or_name, result))
+        except error_base.ErrorStatus as exp:
+            logger.error("RegionsController {}".format(exp.message))
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exp.message,
+                                      status_code=exp.status_code)
+        except Exception as exp:
+            logger.exception(exp.message)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exp.message)
+
+        return result
+
+    @wsexpose(RegionsData, body=RegionsData, status_code=201, rest_content_types='json')
+    def post(self, full_region_input):
+        logger.info("API: CreateRegion")
+        authentication.authorize(request, 'region:create')
+
+        try:
+            logger.debug("API: create region .. data = : {}".format(full_region_input))
+            result = RegionService.create_full_region(full_region_input)
+            logger.debug("API: region created : {}".format(result))
+
+            event_details = 'Region {} {} created: AICversion {}, OSversion {}, CLLI {}'.format(
+                full_region_input.name, full_region_input.design_type,
+                full_region_input.ranger_agent_version,
+                full_region_input.open_stack_version, full_region_input.clli)
+            utils.audit_trail('create region', request.transaction_id,
+                              request.headers, full_region_input.id,
+                              event_details=event_details)
+        except error_base.InputValueError as exp:
+            logger.exception("Error in save region {}".format(exp.message))
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=exp.status_code,
+                                      message=exp.message)
+
+        except error_base.ConflictError as exp:
+            logger.exception("Conflict error {}".format(exp.message))
+            raise err_utils.get_error(request.transaction_id,
+                                      message=exp.message,
+                                      status_code=exp.status_code)
+
+        except Exception as exp:
+            logger.exception("Error in creating region .. reason:- {}".format(exp))
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      message=exp.message)
+
+        return result
+
+    @wsexpose(None, str, rest_content_types='json', status_code=204)
+    def delete(self, region_id):
+        logger.info("Delete Region")
+        authentication.authorize(request, 'region:delete')
+
+        try:
+
+            logger.debug("delete region {}".format(region_id))
+            result = RegionService.delete_region(region_id)
+            logger.debug("region deleted")
+
+            event_details = 'Region {} deleted'.format(region_id)
+            utils.audit_trail('delete region', request.transaction_id,
+                              request.headers, region_id,
+                              event_details=event_details)
+
+        except Exception as exp:
+            logger.exception(
+                "error in deleting region .. reason:- {}".format(exp))
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      message=exp.message)
+        return
+
+    @wsexpose(RegionsData, str, body=RegionsData, status_code=201,
+              rest_content_types='json')
+    def put(self, region_id, region):
+        logger.info("API: update region")
+        authentication.authorize(request, 'region:update')
+
+        try:
+
+            logger.debug(
+                "region to update {} with{}".format(region_id, region))
+            result = RegionService.update_region(region_id, region)
+            logger.debug("API: region {} updated".format(region_id))
+
+            event_details = 'Region {} {} modified: AICversion {}, OSversion {}, CLLI {}'.format(
+                region.name, region.design_type, region.ranger_agent_version,
+                region.open_stack_version, region.clli)
+            utils.audit_trail('update region', request.transaction_id,
+                              request.headers, region_id,
+                              event_details=event_details)
+
+        except error_base.NotFoundError as exp:
+            logger.exception("region {} not found".format(region_id))
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=exp.status_code,
+                                      message=exp.message)
+
+        except error_base.InputValueError as exp:
+            logger.exception("not valid input {}".format(exp.message))
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=exp.status_code,
+                                      message=exp.message)
+        except Exception as exp:
+            logger.exception(
+                "API: error in updating region {}.. reason:- {}".format(region_id,
+                                                                        exp))
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      message=exp.message)
+        return result
diff --git a/orm/services/region_manager/rms/controllers/v2/orm/resources/status.py b/orm/services/region_manager/rms/controllers/v2/orm/resources/status.py
new file mode 100755
index 00000000..85a877c4
--- /dev/null
+++ b/orm/services/region_manager/rms/controllers/v2/orm/resources/status.py
@@ -0,0 +1,105 @@
+import logging
+
+import pecan
+from pecan import rest, request, conf
+
+import wsme
+from wsme import types as wtypes
+from wsmeext.pecan import wsexpose
+
+from orm_common.utils import api_error_utils as err_utils
+from orm_common.utils import utils
+
+from rms.services import error_base
+from rms.services import services as RegionService
+from rms.utils import authentication
+
+
+logger = logging.getLogger(__name__)
+
+
+class RegionStatus(wtypes.DynamicBase):
+    """main json header."""
+
+    status = wsme.wsattr(str, mandatory=True)
+    links = wsme.wsattr({str: str}, mandatory=False)
+
+    def __init__(self, status=None, links=None):
+        """
+        RegionStatus wrapper
+        :param status:
+        """
+        self.status = status
+        self.links = links
+
+
+class RegionStatusController(rest.RestController):
+
+    @wsexpose(RegionStatus, str, body=RegionStatus, status_code=201,
+              rest_content_types='json')
+    def put(self, region_id, new_status):
+        """
+        Handle put request to modify region status
+        :param region_id:
+        :param new_status:
+        :return: 200 for updated, 404 for region not found
+        400 invalid status
+        """
+        logger.info("Entered update region status")
+        logger.debug("Got status: {}".format(new_status.status))
+
+        authentication.authorize(request, 'status:put')
+
+        try:
+            allowed_status = conf.region_options.allowed_status_values[:]
+
+            if new_status.status not in allowed_status:
+                logger.error("Invalid status. Region status "
+                             "must be one of {}".format(allowed_status))
+                raise error_base.InputValueError(
+                    message="Invalid status. Region status "
+                            "must be one of {}".format(allowed_status))
+
+            # May raise an exception which will return status code 400
+            status = RegionService.update_region_status(region_id, new_status.status)
+            base_link = 'https://{0}:{1}{2}'.format(conf.server.host, conf.server.port,
+                                                    pecan.request.path)
+            link = {'self': base_link}
+
+            logger.debug("Region status for region id {}, was successfully "
+                         "changed to: {}.".format(region_id, new_status.status))
+
+            event_details = 'Region {} status updated to {}'.format(
+                region_id, new_status.status)
+            utils.audit_trail('Update status', request.transaction_id,
+                              request.headers, region_id,
+                              event_details=event_details)
+
+            return RegionStatus(status, link)
+
+        except error_base.ErrorStatus as e:
+            logger.error(e.message)
+            raise err_utils.get_error(request.transaction_id,
+                                      message=e.message,
+                                      status_code=e.status_code)
+        except Exception as exception:
+            logger.error(exception.message)
+            raise err_utils.get_error(request.transaction_id,
+                                      status_code=500,
+                                      error_details=exception.message)
+
+    @wsexpose(str, str, rest_content_types='json')
+    def get(self, region_id):
+        raise err_utils.get_error(request.transaction_id,
+                                  status_code=405)
+
+    @wsexpose(RegionStatus, str, body=RegionStatus, status_code=200,
+              rest_content_types='json')
+    def post(self, region_id, status):
+        raise err_utils.get_error(request.transaction_id,
+                                  status_code=405)
+
+    @wsexpose(str, str, rest_content_types='json')
+    def delete(self, region_id):
+        raise err_utils.get_error(request.transaction_id,
+                                  status_code=405)
diff --git a/orm/services/region_manager/rms/controllers/v2/orm/root.py b/orm/services/region_manager/rms/controllers/v2/orm/root.py
new file mode 100755
index 00000000..c23aee09
--- /dev/null
+++ b/orm/services/region_manager/rms/controllers/v2/orm/root.py
@@ -0,0 +1,10 @@
+"""ORM controller module."""
+from rms.controllers.v2.orm.resources import groups
+from rms.controllers.v2.orm.resources import regions
+
+
+class OrmController(object):
+    """ORM controller class."""
+
+    regions = regions.RegionsController()
+    groups = groups.GroupsController()
diff --git a/orm/services/region_manager/rms/controllers/v2/root.py b/orm/services/region_manager/rms/controllers/v2/root.py
new file mode 100755
index 00000000..45108cd1
--- /dev/null
+++ b/orm/services/region_manager/rms/controllers/v2/root.py
@@ -0,0 +1,8 @@
+"""V2 root controller module."""
+from rms.controllers.v2.orm import root
+
+
+class V2Controller(object):
+    """V2 root controller class."""
+
+    orm = root.OrmController()
diff --git a/orm/services/region_manager/rms/etc/policy.json b/orm/services/region_manager/rms/etc/policy.json
new file mode 100755
index 00000000..753964ee
--- /dev/null
+++ b/orm/services/region_manager/rms/etc/policy.json
@@ -0,0 +1,24 @@
+{
+    "default": "!",
+    "orm_admin": "role:admin and tenant:admin",
+
+    "lcp:get_one": "",
+    "lcp:get_all": "",
+    "region:get_one": "",
+    "region:get_all": "",
+    "region:create": "rule:orm_admin",
+    "region:update": "rule:orm_admin",
+    "region:delete": "rule:orm_admin",
+    "group:get_one": "",
+    "group:get_all": "",
+    "group:create": "rule:orm_admin",
+    "group:update": "rule:orm_admin",
+    "group:delete": "rule:orm_admin",
+    "configuration:get": "rule:orm_admin",
+    "log:update": "rule:orm_admin",
+    "metadata:get": "rule:orm_admin",
+    "metadata:create": "rule:orm_admin",
+    "metadata:update": "rule:orm_admin",
+    "metadata:delete": "rule:orm_admin",
+    "status:put": "rule:orm_admin"
+}
\ No newline at end of file
diff --git a/orm/services/region_manager/rms/external_mock/__init__.py b/orm/services/region_manager/rms/external_mock/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/external_mock/audit_client/__init__.py b/orm/services/region_manager/rms/external_mock/audit_client/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/external_mock/audit_client/api/__init__.py b/orm/services/region_manager/rms/external_mock/audit_client/api/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/external_mock/audit_client/api/audit.py b/orm/services/region_manager/rms/external_mock/audit_client/api/audit.py
new file mode 100644
index 00000000..ec483bdd
--- /dev/null
+++ b/orm/services/region_manager/rms/external_mock/audit_client/api/audit.py
@@ -0,0 +1,6 @@
+def audit(*args, **kwargs):
+    pass
+
+
+def init(*args, **kwargs):
+    pass
diff --git a/orm/services/region_manager/rms/external_mock/keystone_utils/__init__.py b/orm/services/region_manager/rms/external_mock/keystone_utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/external_mock/keystone_utils/tokens.py b/orm/services/region_manager/rms/external_mock/keystone_utils/tokens.py
new file mode 100644
index 00000000..52ef992f
--- /dev/null
+++ b/orm/services/region_manager/rms/external_mock/keystone_utils/tokens.py
@@ -0,0 +1,7 @@
+def get_token_user(*a, **k):
+    pass
+
+
+class TokenConf(object):
+    def __init__(self, *a, **kw):
+        pass
diff --git a/orm/services/region_manager/rms/external_mock/orm_common/__init__.py b/orm/services/region_manager/rms/external_mock/orm_common/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/external_mock/orm_common/policy/__init__.py b/orm/services/region_manager/rms/external_mock/orm_common/policy/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/external_mock/orm_common/policy/policy.py b/orm/services/region_manager/rms/external_mock/orm_common/policy/policy.py
new file mode 100644
index 00000000..2953f204
--- /dev/null
+++ b/orm/services/region_manager/rms/external_mock/orm_common/policy/policy.py
@@ -0,0 +1,10 @@
+def init(*a, **kw):
+    pass
+
+
+def enforce(*a, **kw):
+    pass
+
+
+def authorize(*a, **kw):
+    pass
diff --git a/orm/services/region_manager/rms/external_mock/orm_common/utils/__init__.py b/orm/services/region_manager/rms/external_mock/orm_common/utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/external_mock/orm_common/utils/api_error_utils.py b/orm/services/region_manager/rms/external_mock/orm_common/utils/api_error_utils.py
new file mode 100644
index 00000000..653221e2
--- /dev/null
+++ b/orm/services/region_manager/rms/external_mock/orm_common/utils/api_error_utils.py
@@ -0,0 +1,2 @@
+def get_error(*args, **kwargs):
+    pass
diff --git a/orm/services/region_manager/rms/external_mock/orm_common/utils/utils.py b/orm/services/region_manager/rms/external_mock/orm_common/utils/utils.py
new file mode 100755
index 00000000..bf615fea
--- /dev/null
+++ b/orm/services/region_manager/rms/external_mock/orm_common/utils/utils.py
@@ -0,0 +1,15 @@
+"""Utils module mock."""
+
+
+def report_config(conf, dump=False):
+    """Mock report_config function."""
+    pass
+
+
+def set_utils_conf(conf):
+    """Mock set_utils_conf function."""
+    pass
+
+
+def audit_trail(*args, **kwargs):
+    pass
diff --git a/orm/services/region_manager/rms/logger/__init__.py b/orm/services/region_manager/rms/logger/__init__.py
new file mode 100644
index 00000000..1894cbbe
--- /dev/null
+++ b/orm/services/region_manager/rms/logger/__init__.py
@@ -0,0 +1,10 @@
+import logging
+
+
+def get_logger(name):
+    logger = logging.getLogger(name)
+    logger.log_exception = lambda msg, exception: logger.exception(msg + " Exception: " + str(exception))
+
+    return logger
+
+__all__ = ['get_logger']
diff --git a/orm/services/region_manager/rms/model/__init__.py b/orm/services/region_manager/rms/model/__init__.py
new file mode 100644
index 00000000..d983f7bc
--- /dev/null
+++ b/orm/services/region_manager/rms/model/__init__.py
@@ -0,0 +1,15 @@
+from pecan import conf  # noqa
+
+
+def init_model():
+    """
+    This is a stub method which is called at application startup time.
+
+    If you need to bind to a parsed database configuration, set up tables or
+    ORM classes, or perform any database initialization, this is the
+    recommended place to do it.
+
+    For more information working with databases, and some common recipes,
+    see http://pecan.readthedocs.org/en/latest/databases.html
+    """
+    pass
diff --git a/orm/services/region_manager/rms/model/model.py b/orm/services/region_manager/rms/model/model.py
new file mode 100755
index 00000000..b0875966
--- /dev/null
+++ b/orm/services/region_manager/rms/model/model.py
@@ -0,0 +1,183 @@
+"""model module."""
+from rms.services import error_base
+from pecan import conf
+
+
+class Address(object):
+    """address class."""
+
+    def __init__(self, country=None, state=None, city=None,
+                 street=None, zip=None):
+        """
+
+        :param country:
+        :param state:
+        :param city:
+        :param street:
+        :param zip:
+        """
+        self.country = country
+        self.state = state
+        self.city = city
+        self.street = street
+        self.zip = zip
+
+
+class EndPoint(object):
+    """class method endpoints body."""
+
+    def __init__(self, publicurl=None, type=None):
+        """init function.
+
+        :param public_url: field
+        :param type: field
+        :return:
+        """
+        self.type = type
+        self.publicurl = publicurl
+
+
+class RegionData(object):
+    """class method json header."""
+
+    def __init__(self, status=None, id=None, name=None, clli=None,
+                 ranger_agent_version=None, design_type=None, location_type=None,
+                 vlcp_name=None, open_stack_version=None,
+                 address=Address(), metadata={}, endpoints=[EndPoint()]):
+        """
+
+        :param status:
+        :param id:
+        :param name:
+        :param clli:
+        :param ranger_agent_version:
+        :param design_type:
+        :param location_type:
+        :param vlcp_name:
+        :param open_stack_version:
+        :param address:
+        :param metadata:
+        :param endpoints:
+        """
+        self.status = status
+        self.id = id
+        # make id and name always the same
+        self.name = self.id
+        self.clli = clli
+        self.ranger_agent_version = ranger_agent_version
+        self.metadata = metadata
+        self.endpoints = endpoints
+        self.design_type = design_type
+        self.location_type = location_type
+        self.vlcp_name = vlcp_name
+        self.open_stack_version = open_stack_version
+        self.address = address
+
+    def _validate_end_points(self, endpoints_types_must_have):
+        ep_duplicate = []
+        for endpoint in self.endpoints:
+            if endpoint.type not in ep_duplicate:
+                ep_duplicate.append(endpoint.type)
+            else:
+                raise error_base.InputValueError(
+                    message="Invalid endpoints. Duplicate endpoint "
+                            "type {}".format(endpoint.type))
+            try:
+                endpoints_types_must_have.remove(endpoint.type)
+            except:
+                pass
+        if len(endpoints_types_must_have) > 0:
+            raise error_base.InputValueError(
+                message="Invalid endpoints. Endpoint type '{}' "
+                        "is missing".format(endpoints_types_must_have))
+
+    def _validate_status(self, allowed_status):
+        if self.status not in allowed_status:
+            raise error_base.InputValueError(
+                message="Invalid status. Region status must be "
+                        "one of {}".format(allowed_status))
+        return
+
+    def _validate_model(self):
+        allowed_status = conf.region_options.allowed_status_values[:]
+        endpoints_types_must_have = conf.region_options.endpoints_types_must_have[:]
+        self._validate_status(allowed_status)
+        self._validate_end_points(endpoints_types_must_have)
+        return
+
+    def _to_db_model_dict(self):
+        end_points = []
+
+        for endpoint in self.endpoints:
+            ep = {}
+            ep['type'] = endpoint.type
+            ep['url'] = endpoint.publicurl
+            end_points.append(ep)
+
+        db_model_dict = {}
+        db_model_dict['region_id'] = self.id
+        db_model_dict['name'] = self.name
+        db_model_dict['address_state'] = self.address.state
+        db_model_dict['address_country'] = self.address.country
+        db_model_dict['address_city'] = self.address.city
+        db_model_dict['address_street'] = self.address.street
+        db_model_dict['address_zip'] = self.address.zip
+        db_model_dict['region_status'] = self.status
+        db_model_dict['ranger_agent_version'] = self.ranger_agent_version
+        db_model_dict['open_stack_version'] = self.open_stack_version
+        db_model_dict['design_type'] = self.design_type
+        db_model_dict['location_type'] = self.location_type
+        db_model_dict['vlcp_name'] = self.vlcp_name
+        db_model_dict['clli'] = self.clli
+        db_model_dict['end_point_list'] = end_points
+        db_model_dict['meta_data_dict'] = self.metadata
+        return db_model_dict
+
+
+class Regions(object):
+    """main json header."""
+
+    def __init__(self, regions=[RegionData()]):
+        """init function.
+
+        :param regions:
+        :return:
+        """
+        self.regions = regions
+
+
+class Groups(object):
+    """main json header."""
+
+    def __init__(self, id=None, name=None,
+                 description=None, regions=[]):
+        """init function.
+
+        :param regions:
+        :return:
+        """
+        self.id = id
+        self.name = name
+        self.description = description
+        self.regions = regions
+
+    def _to_db_model_dict(self):
+        db_dict = {}
+        db_dict['group_name'] = self.name
+        db_dict['group_description'] = self.description
+        db_dict['group_regions'] = self.regions
+        return db_dict
+
+
+class GroupsWrraper(object):
+    """list of groups."""
+
+    def __init__(self, groups=None):
+        """
+
+        :param groups:
+        """
+        if groups is None:
+            self.groups = []
+        else:
+            self.groups = groups
diff --git a/orm/services/region_manager/rms/model/url_parm.py b/orm/services/region_manager/rms/model/url_parm.py
new file mode 100755
index 00000000..1bfe86cf
--- /dev/null
+++ b/orm/services/region_manager/rms/model/url_parm.py
@@ -0,0 +1,102 @@
+"""module."""
+
+
+class UrlParms(object):
+    """class method."""
+
+    def __init__(self, type=None, status=None, metadata=None, rangerAgentVersion=None,
+                 clli=None, regionname=None, osversion=None, valet=None,
+                 state=None, country=None, city=None, street=None, zip=None):
+        """init method.
+
+        :param type:
+        :param status:
+        :param metadata:
+        :param rangerAgentVersion:
+        :param clli:
+        :param regionname:
+        :param osversion:
+        :param valet:
+        :param state:
+        :param country:
+        :param city:
+        :param street:
+        :param zip:
+        """
+        if type:
+            self.location_type = type
+        if status:
+            self.region_status = status
+        if metadata:
+            self.metadata = metadata
+        if rangerAgentVersion:
+            self.ranger_agent_version = rangerAgentVersion
+        if clli:
+            self.clli = clli
+        if regionname:
+            self.name = regionname
+        if osversion:
+            self.open_stack_version = osversion
+        if valet:
+            self.valet = valet
+        if state:
+            self.address_state = state
+        if country:
+            self.address_country = country
+        if city:
+            self.address_city = city
+        if street:
+            self.address_street = street
+        if zip:
+            self.address_zip = zip
+
+    def _build_query(self):
+        """nuild db query.
+
+        :return:
+        """
+        metadatadict = None
+        regiondict = None
+        if self.__dict__:
+            metadatadict = self._build_metadata_dict()
+            regiondict = self._build_region_dict()
+        return regiondict, metadatadict, None
+
+    def _build_metadata_dict(self):
+        """meta_data dict.
+
+        :return: metadata dict
+        """
+        metadata = None
+        if 'metadata' in self.__dict__:
+            metadata = {'ref_keys': [], 'meta_data_pairs': [],
+                        'meta_data_keys': []}
+            for metadata_item in self.metadata:
+                if ':' in metadata_item:
+                    key = metadata_item.split(':')[0]
+                    metadata['ref_keys'].append(key)
+                    metadata['meta_data_pairs'].\
+                        append({'metadata_key': key,
+                                'metadata_value': metadata_item.split(':')[1]})
+                else:
+                    metadata['meta_data_keys'].append(metadata_item)
+            # Now clean irrelevant values
+            keys_list = []
+            for item in metadata['meta_data_keys']:
+                if item not in metadata['ref_keys']:
+                    keys_list.append(item)
+
+            metadata['meta_data_keys'] = keys_list
+
+        return metadata
+
+    def _build_region_dict(self):
+        """region dict.
+
+        :return:regin dict
+        """
+        regiondict = {}
+        for key, value in self.__dict__.items():
+            if key != 'metadata':
+                regiondict[key] = value
+        return regiondict
diff --git a/orm/services/region_manager/rms/resources/regions.csv b/orm/services/region_manager/rms/resources/regions.csv
new file mode 100644
index 00000000..b63a9e01
--- /dev/null
+++ b/orm/services/region_manager/rms/resources/regions.csv
@@ -0,0 +1,4 @@
+region_id,region_name,address_state,address_country,address_city,address_street,address_zip,region_status,ranger_agent_version,open_stack_version,design_type,location_type,vlcp_name,clli,description,keystone_url,horizon_url,ord_url
+SNA1,SNA 1,CAL,US,LA,n/a,1111,functional,ranger_agent1.0,kilo,n/a,n/a,n/a,n/a,SNA1 lcp in CAL,http://identity1.com,http://horizon1.com,http://ord1.com
+SNA2,SNA 2,NY,US,NY City,n/a,2222,functional,ranger_agent1.5,kilo,n/a,n/a,n/a,n/a,SNA2 lcp in NYC,http://identity2.com,http://horizon2.com,http://ord2.com
+DPK,DPK,NY,US,FIL,n/a,3333,functional,ranger_agent1.0,kilo,n/a,n/a,n/a,n/a,DPK lcp in FIL,http://identity3.com,http://horizon3.com,http://ord3.com
\ No newline at end of file
diff --git a/orm/services/region_manager/rms/services/__init__.py b/orm/services/region_manager/rms/services/__init__.py
new file mode 100644
index 00000000..b57327ba
--- /dev/null
+++ b/orm/services/region_manager/rms/services/__init__.py
@@ -0,0 +1 @@
+"""services package."""
diff --git a/orm/services/region_manager/rms/services/error_base.py b/orm/services/region_manager/rms/services/error_base.py
new file mode 100755
index 00000000..162ecba5
--- /dev/null
+++ b/orm/services/region_manager/rms/services/error_base.py
@@ -0,0 +1,33 @@
+"""Exceptions module."""
+
+
+class Error(Exception):
+    pass
+
+
+class ErrorStatus(Error):
+
+    def __init__(self, status_code, message=""):
+        self.status_code = status_code
+        self.message = message
+
+
+class NotFoundError(ErrorStatus):
+
+    def __init__(self, status_code=404, message="Not found"):
+        self.status_code = status_code
+        self.message = message
+
+
+class ConflictError(ErrorStatus):
+
+    def __init__(self, status_code=409, message="Conflict error"):
+        self.status_code = status_code
+        self.message = message
+
+
+class InputValueError(ErrorStatus):
+
+    def __init__(self, status_code=400, message="value not allowed"):
+        self.status_code = status_code
+        self.message = message
diff --git a/orm/services/region_manager/rms/services/services.py b/orm/services/region_manager/rms/services/services.py
new file mode 100755
index 00000000..2ba2cd92
--- /dev/null
+++ b/orm/services/region_manager/rms/services/services.py
@@ -0,0 +1,286 @@
+"""DB actions wrapper module."""
+import logging
+from rms.model.model import Groups
+from rms.model.model import Regions
+from rms.services import error_base
+from rms.storage import base_data_manager
+from rms.storage import data_manager_factory
+
+LOG = logging.getLogger(__name__)
+
+
+def get_regions_data(url_parms):
+    """get region from db.
+
+    :param url_parms: the parameters got in the url to make the query
+    :return: region model for json output
+    :raise: NoContentError( status code 404)
+    """
+    region_dict, metadata_dict, end_point = url_parms._build_query()
+    db = data_manager_factory.get_data_manager()
+    regions = db.get_regions(region_dict, metadata_dict, end_point)
+    if not regions:
+        raise error_base.NotFoundError(message="No regions found for the given search parameters")
+    return Regions(regions)
+
+
+def get_region_by_id_or_name(region_id_or_name):
+    """
+
+    :param region_id_or_name:
+    :return: region object (wsme format)
+    """
+    LOG.debug("LOGIC:- get region data by id or name {}".format(region_id_or_name))
+    try:
+        db = data_manager_factory.get_data_manager()
+        region = db.get_region_by_id_or_name(region_id_or_name)
+
+        if not region:
+            raise error_base.NotFoundError(message="Region {} not found".format(region_id_or_name))
+
+    except Exception as exp:
+        LOG.exception("error in get region by id/name")
+        raise
+
+    return region
+
+
+def update_region(region_id, region):
+    """
+    :param region:
+    :return:
+    """
+    LOG.debug("logic:- update region {}".format(region))
+    try:
+
+        region = region._to_clean_python_obj()
+        region._validate_model()
+        region_dict = region._to_db_model_dict()
+
+        db = data_manager_factory.get_data_manager()
+        db.update_region(region_to_update=region_id, **region_dict)
+        LOG.debug("region {} updated".format(region_id))
+        result = get_region_by_id_or_name(region_id)
+
+    except error_base.NotFoundError as exp:
+        LOG.exception("fail to update region {}".format(exp.message))
+        raise
+    except Exception as exp:
+        LOG.exception("fail to update region {}".format(exp))
+        raise
+    return result
+
+
+def delete_region(region_id):
+    """
+
+    :param region_id:
+    :return:
+    """
+    LOG.debug("logic:- delete region {}".format(region_id))
+    try:
+        db = data_manager_factory.get_data_manager()
+        db.delete_region(region_id)
+        LOG.debug("region deleted")
+    except Exception as exp:
+        LOG.exception("fail to delete region {}".format(exp))
+        raise
+    return
+
+
+def create_full_region(full_region):
+    """create region logic.
+
+    :param full_region obj:
+    :return:
+    :raise: input value error(status code 400)
+    """
+    LOG.debug("logic:- save region ")
+    try:
+
+        full_region = full_region._to_clean_python_obj()
+        full_region._validate_model()
+
+        full_region_db_dict = full_region._to_db_model_dict()
+        LOG.debug("region to save {}".format(full_region_db_dict))
+        db = data_manager_factory.get_data_manager()
+        db.add_region(**full_region_db_dict)
+        LOG.debug("region added")
+        result = get_region_by_id_or_name(full_region.id)
+
+    except error_base.InputValueError as exp:
+        LOG.exception("error in save region {}".format(exp.message))
+        raise
+    except base_data_manager.DuplicateEntryError as exp:
+        LOG.exception("error in save region {}".format(exp.message))
+        raise error_base.ConflictError(message=exp.message)
+    except Exception as exp:
+        LOG.exception("error in save region {}".format(exp.message))
+        raise
+
+    return result
+
+
+def add_region_metadata(region_id, metadata_dict):
+    LOG.debug("Add metadata: {} to region id : {}".format(metadata_dict,
+                                                          region_id))
+    try:
+        db = data_manager_factory.get_data_manager()
+        result = db.add_meta_data_to_region(region_id, metadata_dict)
+        if not result:
+            raise error_base.NotFoundError(message="Region {} not found".format(region_id))
+        else:
+            return result.metadata
+
+    except Exception as exp:
+        LOG.exception("Error getting metadata for region id:".format(region_id))
+        raise
+
+
+def update_region_metadata(region_id, metadata_dict):
+    LOG.debug("Update metadata to region id : {}. "
+              "New metadata: {}".format(region_id, metadata_dict))
+    try:
+        db = data_manager_factory.get_data_manager()
+        result = db.update_region_meta_data(region_id, metadata_dict)
+        if not result:
+            raise error_base.NotFoundError(message="Region {} not "
+                                                   "found".format(region_id))
+        else:
+            return result.metadata
+
+    except Exception as exp:
+        LOG.exception("Error getting metadata for region id:".format(region_id))
+        raise
+
+
+def delete_metadata_from_region(region_id, metadata_key):
+    LOG.info("Delete metadata key: {} from region id : {}."
+             .format(metadata_key, region_id))
+    try:
+        db = data_manager_factory.get_data_manager()
+        db.delete_region_metadata(region_id, metadata_key)
+
+    except Exception as exp:
+        LOG.exception("Error getting metadata for region id:".format(region_id))
+        raise
+
+
+def get_groups_data(name):
+    """get group from db.
+
+    :param name: groupe name
+    :return: groupe object with its regions
+    :raise: NoContentError( status code 404)
+    """
+    db = data_manager_factory.get_data_manager()
+    groups = db.get_group(name)
+    if not groups:
+        raise error_base.NotFoundError(message="Group {} not found".format(name))
+    return Groups(**groups)
+
+
+def get_all_groups():
+    """
+
+    :return:
+    """
+    try:
+        LOG.debug("logic - get all groups")
+        db = data_manager_factory.get_data_manager()
+        all_groups = db.get_all_groups()
+        LOG.debug("logic - got all groups {}".format(all_groups))
+
+    except Exception as exp:
+        LOG.error("fail to get all groups")
+        LOG.exception(exp)
+        raise
+
+    return all_groups
+
+
+def delete_group(group_id):
+    """
+
+    :param group_id:
+    :return:
+    """
+    LOG.debug("delete group logic")
+    try:
+
+        db = data_manager_factory.get_data_manager()
+        LOG.debug("delete group id {} from db".format(group_id))
+        db.delete_group(group_id)
+
+    except Exception as exp:
+        LOG.exception(exp)
+        raise
+    return
+
+
+def create_group_in_db(group_id, group_name, description, regions):
+    """Create a region group in the database.
+
+    :param group_id: The ID of the group to create
+    :param group_name: The name of the group to create
+    :param description: The group description
+    :param regions: A list of regions inside the group
+    :raise: GroupExistsError (status code 400) if the group already exists
+    """
+    try:
+        manager = data_manager_factory.get_data_manager()
+        manager.add_group(group_id, group_name, description, regions)
+    except error_base.ConflictError:
+        LOG.exception("Group {} already exists".format(group_id))
+        raise error_base.ConflictError(
+            message="Group {} already exists".format(group_id))
+    except error_base.InputValueError:
+        LOG.exception("Some of the regions not found")
+        raise error_base.NotFoundError(
+            message="Some of the regions not found")
+
+
+def update_group(group, group_id):
+    result = None
+    LOG.debug("update group logic")
+    try:
+        group = group._to_python_obj()
+        db_manager = data_manager_factory.get_data_manager()
+        LOG.debug("update group to {}".format(group._to_db_model_dict()))
+        db_manager.update_group(group_id=group_id, **group._to_db_model_dict())
+        LOG.debug("group updated")
+        # make sure it updated
+        groups = db_manager.get_group(group_id)
+
+    except error_base.NotFoundError:
+        LOG.error("Group {} not found")
+        raise
+    except error_base.InputValueError:
+        LOG.exception("Some of the regions not found")
+        raise error_base.NotFoundError(
+            message="Some of the regions not found")
+    except Exception as exp:
+        LOG.error("Failed to update group {}".format(group.group_id))
+        LOG.exception(exp)
+        raise
+
+    return Groups(**groups)
+
+
+def update_region_status(region_id, new_status):
+    """Update region.
+
+    :param region_id:
+    :param new_status:
+    :return:
+    """
+    LOG.debug("Update region id: {} status to: {}".format(region_id,
+                                                          new_status))
+    try:
+        db = data_manager_factory.get_data_manager()
+        result = db.update_region_status(region_id, new_status)
+        return result
+
+    except Exception as exp:
+        LOG.exception("Error updating status for region id:".format(region_id))
+        raise
diff --git a/orm/services/region_manager/rms/storage/__init__.py b/orm/services/region_manager/rms/storage/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/storage/base_data_manager.py b/orm/services/region_manager/rms/storage/base_data_manager.py
new file mode 100755
index 00000000..c1928854
--- /dev/null
+++ b/orm/services/region_manager/rms/storage/base_data_manager.py
@@ -0,0 +1,118 @@
+
+class BaseDataManager(object):
+
+    def __init__(self, url,
+                 max_retries,
+                 retry_interval):
+        pass
+
+    def add_region(self,
+                   region_id,
+                   name,
+                   address_state,
+                   address_country,
+                   address_city,
+                   address_street,
+                   address_zip,
+                   region_status,
+                   ranger_agent_version,
+                   open_stack_version,
+                   design_type,
+                   location_type,
+                   vlcp_name,
+                   clli,
+                   description,
+                   meta_data_list,
+                   end_point_list):
+        raise NotImplementedError("Please Implement this method")
+
+    """
+    def delete_region(self,
+                      region_id):
+        raise NotImplementedError("Please Implement this method")
+    """
+
+    def get_regions(self,
+                    region_filters_dict,
+                    meta_data_dict,
+                    end_point_dict):
+        raise NotImplementedError("Please Implement this method")
+
+    def get_all_regions(self):
+        raise NotImplementedError("Please Implement this method")
+
+    """
+    def add_meta_data_to_region(self,
+                                region_id,
+                                key,
+                                value,
+                                description):
+        raise NotImplementedError("Please Implement this method")
+
+    def remove_meta_data_from_region(self,
+                                     region_id,
+                                     key):
+        raise NotImplementedError("Please Implement this method")
+
+    def add_end_point_to_region(self,
+                                region_id,
+                                end_point_type,
+                                end_point_url,
+                                description):
+        raise NotImplementedError("Please Implement this method")
+
+    def remove_end_point_from_region(self,
+                                     region_id,
+                                     end_point_type):
+        raise NotImplementedError("Please Implement this method")
+    """
+
+    def add_group(self,
+                  group_id,
+                  group_name,
+                  group_description,
+                  region_ids_list):
+        raise NotImplementedError("Please Implement this method")
+
+    """
+    def delete_group(self,
+                     group_name):
+        raise NotImplementedError("Please Implement this method")
+    """
+
+    def get_group(self, group_id):
+        raise NotImplementedError("Please Implement this method")
+
+    def get_all_groups(self):
+        raise NotImplementedError("Please Implement this method")
+
+    """
+    def add_region_to_group(self,
+                            group_id,
+                            region_id):
+        raise NotImplementedError("Please Implement this method")
+
+    def remove_region_from_group(self,
+                                 group_id,
+                                 region_id):
+        raise NotImplementedError("Please Implement this method")
+    """
+
+
+class SQLDBError(Exception):
+    pass
+
+
+class EntityNotFound(Exception):
+    """if item not found in DB."""
+    pass
+
+
+class DuplicateEntryError(Exception):
+    """A group already exists."""
+    pass
+
+
+class InputValueError(Exception):
+    """ unvalid input from user"""
+    pass
diff --git a/orm/services/region_manager/rms/storage/data_manager_factory.py b/orm/services/region_manager/rms/storage/data_manager_factory.py
new file mode 100644
index 00000000..4e6e0477
--- /dev/null
+++ b/orm/services/region_manager/rms/storage/data_manager_factory.py
@@ -0,0 +1,20 @@
+import logging
+
+from pecan import conf
+
+from rms.storage.my_sql.data_manager import DataManager
+
+LOG = logging.getLogger(__name__)
+
+
+def get_data_manager():
+    try:
+        dm = DataManager(url=conf.database.url,
+                         max_retries=conf.database.max_retries,
+                         retries_interval=conf.database.retries_interval)
+        return dm
+    except Exception:
+        nagios_message = "CRITICAL|CONDB001 - Could not establish " \
+                         "database connection"
+        LOG.error(nagios_message)
+        raise Exception("Could not establish database connection")
diff --git a/orm/services/region_manager/rms/storage/my_sql/__init__.py b/orm/services/region_manager/rms/storage/my_sql/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/storage/my_sql/data_manager.py b/orm/services/region_manager/rms/storage/my_sql/data_manager.py
new file mode 100755
index 00000000..1286697c
--- /dev/null
+++ b/orm/services/region_manager/rms/storage/my_sql/data_manager.py
@@ -0,0 +1,517 @@
+import logging
+
+import oslo_db
+from oslo_db.sqlalchemy import session as db_session
+from sqlalchemy.ext.declarative.api import declarative_base
+from sqlalchemy.sql import or_
+
+from rms.services import error_base as ServiceBase
+from data_models import Region, RegionEndPoint, Group
+from data_models import RegionMetaData, GroupRegion
+from rms.services import error_base
+from rms.storage.base_data_manager import BaseDataManager, DuplicateEntryError, EntityNotFound
+from rms.model import model as PythonModels
+
+Base = declarative_base()
+logger = logging.getLogger(__name__)
+
+
+class DataManager(BaseDataManager):
+
+    def __init__(self, url, max_retries, retries_interval):
+        self._engine_facade = db_session.EngineFacade(url,
+                                                      max_retries=max_retries,
+                                                      retry_interval=retries_interval)
+
+    def add_region(self,
+                   region_id,
+                   name,
+                   address_state,
+                   address_country,
+                   address_city,
+                   address_street,
+                   address_zip,
+                   region_status,
+                   ranger_agent_version,
+                   open_stack_version,
+                   design_type,
+                   location_type,
+                   vlcp_name,
+                   clli,
+                   # a list of dictionaries of format
+                   # {"type":"", "url":"", "description":""
+                   end_point_list,
+                   # a dictionary of key,value pairs
+                   # {"key":"value", }
+                   meta_data_dict,
+                   description=""):
+        """ add a new region to the `region` table
+        add also the regions give meta_data and end_points to the `region_end_point` and
+        `region_meta_data` tables if given.
+        handle duplicate errors if raised"""
+        try:
+            session = self._engine_facade.get_session()
+            with session.begin():
+                region = Region(region_id=region_id,
+                                name=name,
+                                address_state=address_state,
+                                address_country=address_country,
+                                address_city=address_city,
+                                address_street=address_street,
+                                address_zip=address_zip,
+                                region_status=region_status,
+                                ranger_agent_version=ranger_agent_version,
+                                open_stack_version=open_stack_version,
+                                design_type=design_type,
+                                location_type=location_type,
+                                vlcp_name=vlcp_name,
+                                clli=clli,
+                                description=description)
+
+                if end_point_list is not None:
+                    for end_point in end_point_list:
+                        region_end_point = RegionEndPoint(
+                            end_point_type=end_point["type"],
+                            public_url=end_point["url"])
+                        region.end_points.append(region_end_point)
+
+                if meta_data_dict is not None:
+                    for k, v in meta_data_dict.iteritems():
+                        for list_item in v:
+                            region.meta_data.append(
+                                RegionMetaData(region_id=region_id,
+                                               meta_data_key=k,
+                                               meta_data_value=list_item))
+
+                session.add(region)
+        except oslo_db.exception.DBDuplicateEntry as e:
+            logger.warning("Duplicate entry: {}".format(str(e)))
+            raise DuplicateEntryError("Region {} already "
+                                      "exist".format(region_id))
+
+    def update_region(self,
+                      region_to_update,
+                      region_id,
+                      name,
+                      address_state,
+                      address_country,
+                      address_city,
+                      address_street,
+                      address_zip,
+                      region_status,
+                      ranger_agent_version,
+                      open_stack_version,
+                      design_type,
+                      location_type,
+                      vlcp_name,
+                      clli,
+                      # a list of dictionaries of format
+                      # {"type":"", "url":"", "description":""
+                      end_point_list,
+                      # a list of dictionaries of format
+                      # {"key":"", "value":"", "description":""
+                      meta_data_dict,
+                      description=""):
+        """ add a new region to the `region` table
+        add also the regions give meta_data and end_points to the `region_end_point` and
+        `region_meta_data` tables if given.
+        handle duplicate errors if raised"""
+        try:
+            session = self._engine_facade.get_session()
+            with session.begin():
+                # remove all childs as with update need to replace them
+                session.query(RegionMetaData).filter_by(region_id=region_to_update).delete()
+                session.query(RegionEndPoint).filter_by(region_id=region_to_update).delete()
+
+                record = session.query(Region).filter_by(region_id=region_to_update).first()
+                if record is not None:
+                    #   record.region_id = region_id  # ignore id and name when update
+                    #   record.name = name
+                    record.address_state = address_state
+                    record.address_country = address_country
+                    record.address_city = address_city
+                    record.address_street = address_street
+                    record.address_zip = address_zip
+                    record.region_status = region_status
+                    record.ranger_agent_version = ranger_agent_version
+                    record.open_stack_version = open_stack_version
+                    record.design_type = design_type
+                    record.location_type = location_type
+                    record.vlcp_name = vlcp_name
+                    record.clli = clli
+                    record.description = description
+
+                    if end_point_list is not None:
+                        for end_point in end_point_list:
+                            region_end_point = RegionEndPoint(
+                                end_point_type=end_point["type"],
+                                public_url=end_point["url"]
+                            )
+                            record.end_points.append(region_end_point)
+
+                    if meta_data_dict is not None:
+                        for k, v in meta_data_dict.iteritems():
+                            for list_item in v:
+                                record.meta_data.append(
+                                    RegionMetaData(region_id=region_id,
+                                                   meta_data_key=k,
+                                                   meta_data_value=list_item))
+                else:
+                    raise EntityNotFound("Region {} not found".format(
+                        region_to_update))
+        except EntityNotFound as exp:
+            logger.exception(
+                "fail to update entity with id {} not found".format(
+                    region_to_update))
+            raise ServiceBase.NotFoundError(message=exp.message)
+        except Exception as exp:
+            logger.exception("fail to update region {}".format(str(exp)))
+            raise
+
+    def delete_region(self, region_id):
+        # delete a region from `region` table and also the region's
+        # entries from `region_meta_data` and `region_end_points` tables
+        session = self._engine_facade.get_session()
+        with session.begin():
+            session.query(Region).filter_by(region_id=region_id).delete()
+
+    def get_all_regions(self):
+        return self.get_regions(None, None, None)
+
+    def get_regions(self,
+                    region_filters_dict,
+                    meta_data_dict,
+                    end_point_dict):
+        logger.debug("Get regions")
+        records_model = []
+        session = self._engine_facade.get_session()
+        with session.begin():
+            records = session.query(Region)
+            if region_filters_dict is not None:
+                records = records.filter_by(**region_filters_dict)
+
+            if meta_data_dict is not None:
+                regions = self._get_regions_for_meta_data_dict(meta_data_dict,
+                                                               session)
+                query = []
+                query.append((Region.region_id.in_(regions)))
+                records = records.filter(*query)
+
+            if end_point_dict is not None:
+                records = records.join(RegionEndPoint).\
+                    filter_by(**end_point_dict)
+            if records is not None:
+                for record in records:
+                    records_model.append(record.to_wsme())
+            return records_model
+
+    def _get_regions_for_meta_data_dict(self, meta_data_dict, session):
+        result_lists = []
+        for key in meta_data_dict['meta_data_keys']:
+            md_q = session.query(RegionMetaData). \
+                filter(RegionMetaData.meta_data_key == key).all()
+            temp_result_list = []
+            if md_q is not None:
+                for record in md_q:
+                    temp_result_list.append(record.region_id)
+            result_lists.append(set(temp_result_list))
+            logger.debug(set(temp_result_list))
+        for item in meta_data_dict['meta_data_pairs']:
+            md_q = session.query(RegionMetaData). \
+                filter(RegionMetaData.meta_data_key == item['metadata_key'],
+                       RegionMetaData.meta_data_value == item['metadata_value']).all()
+            temp_result_list = []
+            if md_q is not None:
+                for record in md_q:
+                    temp_result_list.append(record.region_id)
+            result_lists.append(set(temp_result_list))
+            logger.debug(set(temp_result_list))
+
+        result = []
+        if result_lists:
+            result = result_lists[0]
+            for l in result_lists:
+                result = result.intersection(l)
+        else:
+            result = None
+        logger.debug(result)
+        return result
+
+    def get_region_by_id_or_name(self, region_id_or_name):
+        logger.debug("Get region by id or name: {}".format(region_id_or_name))
+        try:
+
+            session = self._engine_facade.get_session()
+            with session.begin():
+                record = session.query(Region)
+                record = record.filter(or_(Region.region_id == region_id_or_name,
+                                           Region.name == region_id_or_name))
+                if record.first():
+                    return record.first().to_wsme()
+                return None
+
+        except Exception as exp:
+            logger.exception("DB error filtering by id/name")
+            raise
+
+    def add_meta_data_to_region(self, region_id,
+                                metadata_dict):
+        """
+        :param region_id:
+        :param metadata_dict:
+        :return:
+        """
+        session = self._engine_facade.get_session()
+        try:
+            with session.begin():
+                record = session.query(Region).\
+                    filter_by(region_id=region_id).first()
+
+                if record is not None:
+                    region_metadata = []
+                    for k, v in metadata_dict.iteritems():
+                        for list_item in v:
+                            region_metadata.append(RegionMetaData(region_id=region_id,
+                                                                  meta_data_key=k,
+                                                                  meta_data_value=list_item))
+                    session.add_all(region_metadata)
+                    return record.to_wsme()
+                else:
+                    logger.error("Region {} does not exist. "
+                                 "Meta Data was not added!".format(region_id))
+                    return None
+
+        except oslo_db.exception.DBDuplicateEntry as e:
+            logger.warning("Duplicate entry: {}".format(str(e)))
+            raise error_base.ConflictError(message="Duplicate metadata value "
+                                           "in region {}".format(region_id))
+
+    def update_region_meta_data(self, region_id,
+                                metadata_dict):
+        """
+        Replace existing metadata for given region_id
+        :param region_id:
+        :param metadata_dict:
+        :return:
+        """
+        session = self._engine_facade.get_session()
+        with session.begin():
+
+            record = session.query(Region). \
+                filter_by(region_id=region_id).first()
+            if not record:
+                msg = "Region {} not found".format(region_id)
+                logger.info(msg)
+                raise error_base.NotFoundError(message=msg)
+
+            session.query(RegionMetaData).\
+                filter_by(region_id=region_id).delete()
+
+            region_metadata = []
+            for k, v in metadata_dict.iteritems():
+                for list_item in v:
+                    region_metadata.append(RegionMetaData(region_id=region_id,
+                                                          meta_data_key=k,
+                                                          meta_data_value=list_item))
+
+            session.add_all(region_metadata)
+            return record.to_wsme()
+
+    def delete_region_metadata(self, region_id, key):
+        session = self._engine_facade.get_session()
+        with session.begin():
+            record = session.query(Region). \
+                filter_by(region_id=region_id).first()
+
+            if not record:
+                msg = "Region {} not found".format(region_id)
+                logger.info(msg)
+                raise error_base.NotFoundError(message=msg)
+
+            session.query(RegionMetaData).filter_by(region_id=region_id,
+                                                    meta_data_key=key).delete()
+
+    def update_region_status(self, region_id, region_status):
+        try:
+            session = self._engine_facade.get_session()
+            with session.begin():
+
+                record = session.query(Region).filter_by(region_id=region_id).first()
+                if record is not None:
+                    record.region_status = region_status
+                else:
+                    msg = "Region {} not found".format(region_id)
+                    logger.info(msg)
+                    raise error_base.NotFoundError(message=msg)
+                return record.region_status
+
+        except Exception as exp:
+            logger.exception("failed to update region {}".format(str(exp)))
+            raise
+    """
+    def add_end_point_to_region(self,
+                                region_id,
+                                end_point_type,
+                                end_point_url,
+                                description):
+        session = self._engine_facade.get_session()
+        try:
+            with session.begin():
+                record = session.query(Region).filter_by(region_id=region_id).\
+                    first()
+                if record is not None:
+                        session.add(
+                            RegionEndPoint(region_id=region_id,
+                                           end_point_type=end_point_type,
+                                           public_url=end_point_url,
+                                           description=description))
+                else:
+                    logger.error("Region {} does not exist. "
+                                 "End point was not added !".format(region_id))
+
+        except oslo_db.exception.DBDuplicateEntry as e:
+            logger.warning("Duplicate entry: {}".format(str(e)))
+            raise SQLDBError("Duplicate entry error")
+
+    def remove_end_point_from_region(self,
+                                     region_id,
+                                     end_point_type):
+        session = self._engine_facade.get_session()
+        with session.begin():
+            session.query(Region).filter_by(region_id=region_id,
+                                            end_point_type=end_point_type).\
+                delete()
+    """
+
+    # Handle group management operations
+    def add_group(self,
+                  group_id,
+                  group_name,
+                  group_description,
+                  region_ids_list):
+        session = self._engine_facade.get_session()
+        try:
+            with session.begin():
+                session.add(Group(group_id=group_id,
+                                  name=group_name,
+                                  description=group_description))
+
+                session.flush()  # add the groupe if not rollback
+
+                if region_ids_list is not None:
+                    group_regions = []
+                    for region_id in region_ids_list:
+                        group_regions.append(GroupRegion(group_id=group_id,
+                                                         region_id=region_id))
+                    session.add_all(group_regions)
+        except oslo_db.exception.DBReferenceError as e:
+            logger.error("Reference error: {}".format(str(e)))
+            raise error_base.InputValueError("Reference error")
+        except oslo_db.exception.DBDuplicateEntry as e:
+            logger.error("Duplicate entry: {}".format(str(e)))
+            raise error_base.ConflictError("Duplicate entry error")
+
+    def delete_group(self, group_id):
+        session = self._engine_facade.get_session()
+        with session.begin():
+            session.query(Group).filter_by(group_id=group_id).delete()
+
+    def get_all_groups(self):
+        logger.debug("DB- Get all groups")
+        records_model = PythonModels.GroupsWrraper()
+        session = self._engine_facade.get_session()
+        with session.begin():
+            groups = session.query(Group)
+            for a_group in groups:
+                group_model = PythonModels.Groups()
+                group_model.id = a_group.group_id
+                group_model.name = a_group.name
+                group_model.description = a_group.description
+                regions = []
+                group_regions = session.query(GroupRegion).\
+                    filter_by(group_id=a_group.group_id)
+                for group_region in group_regions:
+                    regions.append(group_region.region_id)
+
+                group_model.regions = regions
+                records_model.groups.append(group_model)
+            return records_model
+
+    def update_group(self, group_id, group_name, group_description,
+                     group_regions):
+        try:
+            session = self._engine_facade.get_session()
+            with session.begin():
+                # in update scenario delete all child records
+                session.query(GroupRegion).filter_by(
+                    group_id=group_id).delete()
+
+                group_record = session.query(Group).filter_by(
+                    group_id=group_id).first()
+                if group_record is None:
+                    raise error_base.NotFoundError(
+                        message="Group {} not found".format(group_id))
+                # only desc and regions can be changed
+                group_record.description = group_description
+                group_record.name = group_name
+                regions = []
+                for region_id in group_regions:
+                    regions.append(GroupRegion(region_id=region_id,
+                                               group_id=group_id))
+                session.add_all(regions)
+
+        except error_base.NotFoundError as exp:
+            logger.error(exp.message)
+            raise
+        except oslo_db.exception.DBReferenceError as e:
+            logger.error("Reference error: {}".format(str(e)))
+            raise error_base.InputValueError("Reference error")
+        except Exception as exp:
+            logger.error("failed to update group {}".format(group_id))
+            logger.exception(exp)
+            raise
+        return
+
+    def get_group(self, group_id):
+        logger.debug("Get group by name")
+        group_model = None
+        session = self._engine_facade.get_session()
+        with session.begin():
+            a_group = session.query(Group).filter_by(group_id=group_id)\
+                .first()
+            if a_group is not None:
+                group_model = {"id": a_group.group_id,
+                               "name": a_group.name,
+                               "description": a_group.description}
+                regions = []
+                group_regions = session.query(GroupRegion). \
+                    filter_by(group_id=a_group.group_id)
+                for group_region in group_regions:
+                    regions.append(group_region.region_id)
+                group_model["regions"] = regions
+            return group_model
+
+    """
+    def add_region_to_group(self,
+                            group_id,
+                            region_id):
+        session = self._engine_facade.get_session()
+        try:
+            with session.begin():
+                session.add(GroupRegion(group_id=group_id,
+                                        region_id=region_id))
+        except oslo_db.exception.DBReferenceError as e:
+            logger.error("Refernce error: {}".format(str(e)))
+            raise SQLDBError("Reference error")
+        except oslo_db.exception.DBDuplicateEntry as e:
+            logger.error("Duplicate entry: {}".format(str(e)))
+            raise SQLDBError("Duplicate entry error")
+
+    def remove_region_from_group(self,
+                                 group_id,
+                                 region_id):
+        session = self._engine_facade.get_session()
+        with session.begin():
+            session.query(GroupRegion).filter_by(group_id=group_id,
+                                                 region_id=region_id).delete()
+    """
diff --git a/orm/services/region_manager/rms/storage/my_sql/data_models.py b/orm/services/region_manager/rms/storage/my_sql/data_models.py
new file mode 100755
index 00000000..b5b17561
--- /dev/null
+++ b/orm/services/region_manager/rms/storage/my_sql/data_models.py
@@ -0,0 +1,141 @@
+# coding: utf-8
+from sqlalchemy import Column, ForeignKey, Index, Integer, String, Table
+from sqlalchemy.orm import relationship
+from sqlalchemy.ext.declarative import declarative_base
+
+from rms.model.model import EndPoint, RegionData, Regions, Address
+
+Base = declarative_base()
+metadata = Base.metadata
+
+
+class Region(Base):
+    __tablename__ = 'region'
+
+    id = Column(Integer, primary_key=True)
+    region_id = Column(String(64), nullable=False, unique=True)
+    name = Column(String(64), nullable=False, unique=True)
+    address_state = Column(String(64), nullable=False)
+    address_country = Column(String(64), nullable=False)
+    address_city = Column(String(64), nullable=False)
+    address_street = Column(String(64), nullable=False)
+    address_zip = Column(String(64), nullable=False)
+    region_status = Column(String(64), nullable=False)
+    ranger_agent_version = Column(String(64), nullable=False)
+    open_stack_version = Column(String(64), nullable=False)
+    design_type = Column(String(64), nullable=False)
+    location_type = Column(String(64), nullable=False)
+    vlcp_name = Column(String(64), nullable=False)
+    clli = Column(String(64), nullable=False)
+    description = Column(String(255), nullable=False)
+
+    end_points = relationship(u'RegionEndPoint')
+    meta_data = relationship(u'RegionMetaData')
+
+    def __json__(self):
+        pass
+
+    def address_to_wsme(self):
+        return Address(
+            country=self.address_country,
+            state=self.address_state,
+            city=self.address_city,
+            street=self.address_street,
+            zip=self.address_zip
+        )
+
+    def to_wsme(self):
+        wsme_end_points = [end_point.to_wsme() for end_point in self.end_points]
+
+        wsme_meta_data = {}
+        for meta_data in self.meta_data:
+            # wsme_meta_data[meta_data.meta_data_key] = meta_data.meta_data_value
+            if meta_data.meta_data_key not in wsme_meta_data:
+                wsme_meta_data[meta_data.meta_data_key] = []
+            wsme_meta_data[meta_data.meta_data_key].append(meta_data.meta_data_value)
+
+        id = self.region_id
+        name = self.name
+        status = self.region_status
+        clli = self.clli
+        ranger_agent_version = self.ranger_agent_version
+        design_type = self.design_type
+        location_type = self.location_type
+        vlcp_name = self.vlcp_name
+        open_stack_version = self.open_stack_version
+        address = self.address_to_wsme()
+
+        return RegionData(status, id, name, clli, ranger_agent_version,
+                          design_type, location_type, vlcp_name,
+                          open_stack_version, address,
+                          metadata=wsme_meta_data,
+                          endpoints=wsme_end_points)
+
+
+class Group(Base):
+    __tablename__ = 'rms_groups'
+
+    id = Column(Integer, primary_key=True)
+    group_id = Column(String(64), nullable=False, unique=True)
+    name = Column(String(64), nullable=False, unique=True)
+    description = Column(String(255), nullable=False)
+
+    def __json__(self):
+        return dict(
+            group_id=self.group_id,
+            name=self.name,
+            description=self.description
+        )
+
+    def to_wsme(self):
+        pass
+
+
+class GroupRegion(Base):
+    __tablename__ = 'group_region'
+
+    group_id = Column(ForeignKey(u'rms_groups.group_id'), primary_key=True)
+    region_id = Column(ForeignKey(u'region.region_id'), primary_key=True)
+
+    def __json__(self):
+        return dict(
+            group_id=self.group_id,
+            region_id=self.region_id
+        )
+
+    def to_wsme(self):
+        pass
+
+
+class RegionEndPoint(Base):
+    __tablename__ = 'region_end_point'
+
+    region_id = Column(ForeignKey(u'region.region_id'), primary_key=True)
+    end_point_type = Column(String(64), primary_key=True)
+    public_url = Column(String(64), nullable=False)
+
+    def __json__(self):
+        return dict(
+            end_point_type=self.end_point_type,
+            public_url=self.public_url
+        )
+
+    def to_wsme(self):
+        url = self.public_url
+        atype = self.end_point_type
+        return EndPoint(url, atype)
+
+
+class RegionMetaData(Base):
+    __tablename__ = 'region_meta_data'
+
+    id = Column(Integer, primary_key=True)
+    region_id = Column(ForeignKey(u'region.region_id'), nullable=False)
+    meta_data_key = Column(String(64), nullable=False)
+    meta_data_value = Column(String(255), nullable=False)
+
+    def __json__(self):
+        return {self.meta_data_key: self.meta_data_value}
+
+    def to_wsme(self):
+        pass
diff --git a/orm/services/region_manager/rms/tests/__init__.py b/orm/services/region_manager/rms/tests/__init__.py
new file mode 100644
index 00000000..78ea5274
--- /dev/null
+++ b/orm/services/region_manager/rms/tests/__init__.py
@@ -0,0 +1,22 @@
+import os
+from unittest import TestCase
+from pecan import set_config
+from pecan.testing import load_test_app
+
+__all__ = ['FunctionalTest']
+
+
+class FunctionalTest(TestCase):
+    """
+    Used for functional tests where you need to test your
+    literal application and its integration with the framework.
+    """
+
+    def setUp(self):
+        self.app = load_test_app(os.path.join(
+            os.path.dirname(__file__),
+            'config.py'
+        ))
+
+    def tearDown(self):
+        set_config({}, overwrite=True)
diff --git a/orm/services/region_manager/rms/tests/config.py b/orm/services/region_manager/rms/tests/config.py
new file mode 100755
index 00000000..e2793a15
--- /dev/null
+++ b/orm/services/region_manager/rms/tests/config.py
@@ -0,0 +1,46 @@
+# Server Specific Configurations
+server = {
+    'port': '8080',
+    'host': '0.0.0.0'
+}
+
+# Pecan Application Configurations
+app = {
+    'root': 'rms.controllers.root.RootController',
+    'modules': ['rms'],
+    'static_root': '%(confdir)s/../../public',
+    'template_path': '%(confdir)s/../templates',
+    'debug': True,
+    'errors': {
+        '404': '/error/404',
+        '__force_dict__': True
+    }
+}
+
+endpoints = {
+    'lcp': 'http://127.0.0.1:8082/lcp'
+}
+
+# user input validations
+region_options = {
+    'allowed_status_values': [
+        'functional',
+        'maintenance',
+        'down'
+    ],
+    'endpoints_types_must_have': [
+        'dashboard',
+        'identity',
+        'ord'
+    ]
+}
+
+authentication = {
+    "enabled": True,
+    "mech_id": "admin",
+    "mech_pass": "stack",
+    "tenant_name": "admin",
+    # The Keystone version currently in use. Can be either "2.0" or "3"
+    "keystone_version": "2.0",
+    "policy_file": "/opt/app/orm/rms/rms/etc/policy.json"
+}
diff --git a/orm/services/region_manager/rms/tests/controllers/__init__.py b/orm/services/region_manager/rms/tests/controllers/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/tests/controllers/v1/__init__.py b/orm/services/region_manager/rms/tests/controllers/v1/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/tests/controllers/v1/orm/__init__.py b/orm/services/region_manager/rms/tests/controllers/v1/orm/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/tests/controllers/v1/orm/resources/__init__.py b/orm/services/region_manager/rms/tests/controllers/v1/orm/resources/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/tests/controllers/v1/orm/resources/test_groups.py b/orm/services/region_manager/rms/tests/controllers/v1/orm/resources/test_groups.py
new file mode 100755
index 00000000..95049555
--- /dev/null
+++ b/orm/services/region_manager/rms/tests/controllers/v1/orm/resources/test_groups.py
@@ -0,0 +1,213 @@
+"""get_groups unittests module."""
+import json
+
+from mock import patch, MagicMock
+from rms.controllers.v2.orm.resources import groups
+from rms.services import error_base
+
+from rms.tests import FunctionalTest
+
+from wsme.exc import ClientSideError
+
+res = {"regions": ["aaaa", "bbbb", "ccccc"],
+       "name": "mygroup", "id": "any",
+       "description": "this is my only for testing"}
+
+
+group_dict = {'id': 'noq', 'name': 'poq', 'description': 'b', 'regions': ['c']}
+
+
+class Groups(object):
+    """class method."""
+
+    def __init__(self, id=None, name=None, description=None,
+                 regions=[], any=None):
+        """init function.
+
+        :param regions:
+        :return:
+        """
+        self.id = id
+        self.name = name
+        self.description = description
+        self.regions = regions
+        if any:
+            self.any = any
+
+
+class GroupsList(object):
+    def __init__(self, groups):
+        self.groups = []
+        for group in groups:
+            self.groups.append(Groups(**group))
+
+
+class TestGetGroups(FunctionalTest):
+
+    # all success
+    @patch.object(groups.GroupService, 'get_groups_data', return_value=Groups(**res))
+    @patch.object(groups, 'authentication')
+    def test_get_success(self, mock_authentication, result):
+        response = self.app.get('/v2/orm/groups/1')
+        self.assertEqual(dict(response.json), res)
+
+    # raise exception no content
+    @patch.object(groups.GroupService, 'get_groups_data',
+                  side_effect=groups.error_base.NotFoundError("no content !!!?"))
+    @patch.object(groups.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 404,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '444',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=404))
+    @patch.object(groups, 'authentication')
+    def test_get_groups_not_found(self, mock_auth, get_err, result):
+        temp_request = groups.request
+        groups.request = MagicMock()
+
+        response = self.app.get('/v2/orm/groups/1', expect_errors=True)
+
+        groups.request = temp_request
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual('444', result_json['transaction_id'])
+        self.assertEqual(404, result_json['code'])
+
+    # raise general exception
+    @patch.object(groups.GroupService, 'get_groups_data', side_effect=Exception("unknown error"))
+    @patch.object(groups.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 500,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '555',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=500))
+    @patch.object(groups, 'authentication')
+    def test_get_groups_unknown_exception(self, mock_auth, get_err, result):
+        temp_request = groups.request
+        groups.request = MagicMock()
+
+        response = self.app.get('/v2/orm/groups/1', expect_errors=True)
+
+        groups.request = temp_request
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual('555', result_json['transaction_id'])
+        self.assertEqual(500, result_json['code'])
+
+
+class TestCreateGroup(FunctionalTest):
+    """Main create_group test case."""
+
+    @patch.object(groups, 'request')
+    @patch.object(groups.GroupService, 'create_group_in_db')
+    @patch.object(groups, 'authentication')
+    def test_post_success(self, mock_authentication, mock_create_group,
+                          mock_request):
+        """Test successful group creation."""
+        mock_request.application_url = 'http://localhost'
+        response = self.app.post_json('/v2/orm/groups',
+                                      {'id': 'd', 'name': 'a',
+                                       'description': 'b',
+                                       'regions': ['c']})
+        # Make sure all keys are in place
+        self.assertTrue(all([c in response.json['group'] for c in (
+            'created', 'id', 'links')]))
+
+        self.assertEqual(response.json['group']['id'], 'd')
+        self.assertEqual(response.json['group']['name'], 'a')
+        self.assertEqual(response.json['group']['links']['self'],
+                         'http://localhost/v2/orm/groups/d')
+
+    @patch.object(groups.GroupService, 'create_group_in_db', side_effect=groups.error_base.ConflictError)
+    @patch.object(groups.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 409,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '333',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=409))
+    @patch.object(groups, 'authentication')
+    def test_post_group_already_exists(self, mock_auth, get_err,
+                                       mock_create_group):
+        """Make sure the function returns status code 409 if group exists."""
+        temp_request = groups.request
+        groups.request = MagicMock()
+
+        response = self.app.post_json('/v2/orm/groups',
+                                      {'id': 'noq', 'name': 'poq',
+                                       'description': 'b',
+                                       'regions': ['c']}, expect_errors=True)
+
+        groups.request = temp_request
+        self.assertEqual(response.status_code, 409)
+
+
+class TestDeleteGroup(FunctionalTest):
+    """Main delete group."""
+
+    @patch.object(groups, 'request')
+    @patch.object(groups.GroupService, 'delete_group')
+    @patch.object(groups, 'authentication')
+    def test_delete_group_success(self, auth_mock, mock_delete_group,
+                                  mock_request):
+        response = self.app.delete('/v2/orm/groups/{id}')
+        self.assertEqual(response.status_code, 204)
+
+    @patch.object(groups.GroupService, 'delete_group', side_effect=Exception("any"))
+    @patch.object(groups, 'authentication')
+    def test_delete_group_error(self, auth_mock, mock_delete_group):
+        response = self.app.delete('/v2/orm/groups/{id}', expect_errors=True)
+        self.assertEqual(response.status_code, 500)
+
+
+class TestUpdateGroup(FunctionalTest):
+    """Main delete group."""
+
+    def get_error(self, transaction_id, status_code, error_details=None,
+                  message=None):
+        return ClientSideError(json.dumps({
+            'code': status_code,
+            'type': 'test',
+            'created': '0.0',
+            'transaction_id': transaction_id,
+            'message': message if message else error_details,
+            'details': 'test'
+        }), status_code=status_code)
+
+    @patch.object(groups, 'request')
+    @patch.object(groups.GroupService, 'update_group',
+                  return_value=Groups(**group_dict))
+    @patch.object(groups, 'authentication')
+    def test_update_group_success(self, auth_mock, mock_delete_group,
+                                  mock_request):
+        response = self.app.put_json('/v2/orm/groups/id', group_dict)
+        self.assertEqual(response.status_code, 201)
+        self.assertEqual(response.json['group']['id'], group_dict['id'])
+
+    # @patch.object(groups, 'err_utils')
+    # @patch.object(groups.GroupService, 'update_group',
+    #               side_effect=error_base.NotFoundError(message="any"))
+    # @patch.object(groups, 'authentication')
+    # def test_update_group_error(self, auth_mock, mock_delete_group,
+    #                             mock_err_utils):
+    #     mock_err_utils.get_error = self.get_error
+    #     response = self.app.put_json('/v2/orm/groups/{id}', group_dict,
+    #                                  expect_errors=True)
+    #     self.assertEqual(response.status_code, 404)
+
+    @patch.object(groups.GroupService, 'get_all_groups',
+                  return_value=GroupsList([res]))
+    @patch.object(groups, 'authentication')
+    def test_get_all_success(self, mock_authentication, result):
+        response = self.app.get('/v2/orm/groups')
+        self.assertEqual(dict(response.json), {'groups': [res]})
diff --git a/orm/services/region_manager/rms/tests/controllers/v1/orm/resources/test_metadata.py b/orm/services/region_manager/rms/tests/controllers/v1/orm/resources/test_metadata.py
new file mode 100755
index 00000000..ffb0c0b8
--- /dev/null
+++ b/orm/services/region_manager/rms/tests/controllers/v1/orm/resources/test_metadata.py
@@ -0,0 +1,336 @@
+import json
+
+from mock import patch, MagicMock
+
+from rms.controllers.v2.orm.resources import metadata
+from rms.model.model import *
+from rms.tests import FunctionalTest
+
+from wsme.exc import ClientSideError
+
+result_inst = RegionData("1", "2", "3", "4", "5", "6",
+                         endpoints=[
+                             EndPoint("http://www.example.co.il", "url")
+                         ],
+                         address=Address("US", "NY", "HANEGEV", "AIRPORT_CITY", "5"),
+                         metadata={"key1": ["value1"], "key2": ["value2"]})
+
+result_dict = {u'status': u'2', u'vlcpName': None, u'clli': u'5',
+               u'name': u'4', u'designType': None,
+               u'AicVersion': u'6', u'OSVersion': None, u'id': u'3',
+               u'address': {u'country': u'US', u'state': u'NY',
+                            u'street': u'AIRPORT_CITY',
+                            u'zip': u'5', u'city': u'HANEGEV'},
+               u'endpoints': [
+                   {u'type': u'url',
+                    u'publicURL': u'http://www.example.co.il'}],
+               u'locationType': None,
+               u'metadata': {u'key1': [u'value1'],
+                             u'key2': [u'value2']}
+               }
+
+metadata_input_dict = {
+    "metadata": {
+        "key1": ["value1"],
+        "key2": ["value2"]
+    }
+}
+
+
+metadata_result_dict = {u'metadata': {u'key1': [u'value1'],
+                                      u'key2': [u'value2']
+                                      }
+                        }
+
+metadata_result_empty_dict = {u'metadata': {}}
+
+
+class TestMetadataController(FunctionalTest):
+
+    ###############
+    # Test DELETE api
+    @patch.object(metadata, 'request')
+    @patch.object(metadata, 'authentication')
+    @patch.object(metadata.RegionService, 'delete_metadata_from_region')
+    def test_delete_success(self, result, mock_auth, mock_request):
+        response = self.app.delete('/v2/orm/regions/my_region/metadata/mykey',
+                                   expect_errors=True)
+        self.assertEqual(response.status_int, 204)
+
+    @patch.object(metadata, 'authentication')
+    @patch.object(metadata.RegionService, 'delete_metadata_from_region',
+                  side_effect=metadata.error_base.NotFoundError("region not found !!!?"))
+    @patch.object(metadata.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 404,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '774',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=404))
+    def test_delete_with_region_not_exist(self, get_err, result,
+                                          mock_auth):
+        temp_request = metadata.request
+        metadata.request = MagicMock()
+
+        response = self.app.delete('/v2/orm/regions/my_region/metadata/key',
+                                   expect_errors=True)
+
+        metadata.request = temp_request
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual('774', result_json['transaction_id'])
+        self.assertEqual(404, result_json['code'])
+
+    @patch.object(metadata, 'authentication')
+    @patch.object(metadata.RegionService, 'delete_metadata_from_region',
+                  side_effect=Exception("unknown error"))
+    @patch.object(metadata.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 500,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '771',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=500))
+    # @patch.object(metadata, 'authentication')
+    def test_delete_region_metadata_unknown_exception(self, err, result,
+                                                      mock_auth):
+        temp_request = metadata.request
+        metadata.request = MagicMock()
+
+        response = self.app.delete('/v2/orm/regions/my_region/metadata/key',
+                                   expect_errors=True)
+
+        metadata.request = temp_request
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual('771', result_json['transaction_id'])
+        self.assertEqual(500, result_json['code'])
+
+    ###############
+    # Test PUT api
+    # @patch.object(metadata, 'request')
+    # @patch.object(metadata, 'authentication')
+    # @patch.object(metadata.RegionService, 'update_region_metadata',
+    #               return_value=result_inst.metadata)
+    # def test_put_success(self, result, mock_auth, mock_request):
+    #     response = self.app.put_json('/v2/orm/regions/my_region/metadata',
+    #                                  metadata_input_dict)
+    #     self.assertEqual(dict(response.json), metadata_result_dict)
+
+    @patch.object(metadata, 'authentication')
+    @patch.object(metadata.RegionService, 'update_region_metadata',
+                  side_effect=metadata.error_base.NotFoundError("region not found !!!?"))
+    @patch.object(metadata.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 404,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '888',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=404))
+    def test_put_update_region_metadata_with_region_not_exist(self, get_err,
+                                                              result,
+                                                              mock_auth):
+        temp_request = metadata.request
+        metadata.request = MagicMock()
+
+        response = self.app.put_json('/v2/orm/regions/my_region/metadata',
+                                     metadata_input_dict, expect_errors=True)
+
+        metadata.request = temp_request
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual('888', result_json['transaction_id'])
+        self.assertEqual(404, result_json['code'])
+
+    @patch.object(metadata, 'authentication')
+    @patch.object(metadata.RegionService, 'update_region_metadata',
+                  side_effect=Exception("unknown error"))
+    @patch.object(metadata.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 500,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '777',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=500))
+    # @patch.object(metadata, 'authentication')
+    def test_put_update_region_metadata_unknown_exception(self, err, result,
+                                                          mock_auth):
+        temp_request = metadata.request
+        metadata.request = MagicMock()
+
+        response = self.app.put_json('/v2/orm/regions/my_region/metadata',
+                                     metadata_input_dict, expect_errors=True)
+
+        metadata.request = temp_request
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual('777', result_json['transaction_id'])
+        self.assertEqual(500, result_json['code'])
+
+    ###############
+    # Test POST api
+    # @patch.object(metadata, 'request')
+    # @patch.object(metadata, 'authentication')
+    # @patch.object(metadata.RegionService, 'add_region_metadata',
+    #               return_value=result_inst.metadata)
+    # def test_post_success(self, result, mock_auth, mock_request):
+    #     response = self.app.post_json('/v2/orm/regions/my_region/metadata',
+    #                                   metadata_input_dict)
+    #     self.assertEqual(dict(response.json), metadata_result_dict)
+
+    @patch.object(metadata, 'authentication')
+    @patch.object(metadata.RegionService, 'add_region_metadata',
+                  side_effect=metadata.error_base.NotFoundError("region not found !!!?"))
+    @patch.object(metadata.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 404,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '333',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=404))
+    def test_post_add_region_metadata_with_region_not_exist(self, get_err,
+                                                            result, mock_auth):
+        temp_request = metadata.request
+        metadata.request = MagicMock()
+
+        response = self.app.post_json('/v2/orm/regions/my_region/metadata',
+                                      metadata_input_dict, expect_errors=True)
+
+        metadata.request = temp_request
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual('333', result_json['transaction_id'])
+        self.assertEqual(404, result_json['code'])
+
+    @patch.object(metadata, 'authentication')
+    @patch.object(metadata.RegionService, 'add_region_metadata',
+                  side_effect=metadata.error_base.ConflictError("unknown error"))
+    @patch.object(metadata.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 409,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '999',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=409))
+    # @patch.object(metadata, 'authentication')
+    def test_post_add_region_metadata_with_duplicate(self, err, result,
+                                                     mock_auth):
+        temp_request = metadata.request
+        metadata.request = MagicMock()
+
+        response = self.app.post_json('/v2/orm/regions/my_region/metadata',
+                                      metadata_input_dict, expect_errors=True)
+
+        metadata.request = temp_request
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual('999', result_json['transaction_id'])
+        self.assertEqual(409, result_json['code'])
+
+    @patch.object(metadata, 'authentication')
+    @patch.object(metadata.RegionService, 'add_region_metadata',
+                  side_effect=Exception("unknown error"))
+    @patch.object(metadata.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 500,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '444',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=500))
+    # @patch.object(metadata, 'authentication')
+    def test_post_add_region_metadata_unknown_exception(self, err, result,
+                                                        mock_auth):
+        temp_request = metadata.request
+        metadata.request = MagicMock()
+
+        response = self.app.post_json('/v2/orm/regions/my_region/metadata',
+                                      metadata_input_dict, expect_errors=True)
+
+        metadata.request = temp_request
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual('444', result_json['transaction_id'])
+        self.assertEqual(500, result_json['code'])
+
+    ##############
+    # Test GET api
+    @patch.object(metadata, 'authentication')
+    @patch.object(metadata.RegionService, 'get_region_by_id_or_name',
+                  return_value=result_inst)
+    def test_get_success(self, result, mock_auth):
+        response = self.app.get('/v2/orm/regions/my_region/metadata')
+        self.assertEqual(dict(response.json), metadata_result_dict)
+
+    @patch.object(metadata, 'authentication')
+    @patch.object(metadata.RegionService, 'get_region_by_id_or_name',
+                  side_effect=Exception("unknown error"))
+    @patch.object(metadata.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 500,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '111',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=500))
+    # @patch.object(metadata, 'authentication')
+    def test_get_get_region_by_id_or_name_throws_exception(self, err, result,
+                                                           mock_auth):
+        temp_request = metadata.request
+        metadata.request = MagicMock()
+
+        response = self.app.get('/v2/orm/regions/my_region/metadata', expect_errors=True)
+
+        metadata.request = temp_request
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual('111', result_json['transaction_id'])
+        self.assertEqual(500, result_json['code'])
+
+    @patch.object(metadata, 'authentication')
+    @patch.object(metadata.RegionService, 'get_region_by_id_or_name',
+                  side_effect=metadata.error_base.NotFoundError("no content !!!?"))
+    @patch.object(metadata.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 404,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '222',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=404))
+    def test_get_get_region_by_id_or_name_region_not_found(self, get_err,
+                                                           result, mock_auth):
+        temp_request = metadata.request
+        metadata.request = MagicMock()
+
+        response = self.app.get('/v2/orm/regions/my_region/metadata', expect_errors=True)
+
+        metadata.request = temp_request
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual('222', result_json['transaction_id'])
+        self.assertEqual(404, result_json['code'])
diff --git a/orm/services/region_manager/rms/tests/controllers/v1/orm/resources/test_region.py b/orm/services/region_manager/rms/tests/controllers/v1/orm/resources/test_region.py
new file mode 100755
index 00000000..82e65b1c
--- /dev/null
+++ b/orm/services/region_manager/rms/tests/controllers/v1/orm/resources/test_region.py
@@ -0,0 +1,414 @@
+import json
+from mock import patch, MagicMock
+
+from rms.controllers.v2.orm.resources import regions
+from rms.model import model as PyModels
+from rms.tests import FunctionalTest
+
+from wsme.exc import ClientSideError
+
+
+result_inst = PyModels.Regions([PyModels.RegionData("2", "3", "4", "5", "6",
+                                                    address=PyModels.Address("US", "NY", "HANEGEV", "AIRPORT_CITY", "5"),
+                                                    endpoints=[
+                                                        PyModels.EndPoint("http://www.example.co.il", "url")
+                                                    ],
+                                                    metadata={"key1": ["value1"], "key2": ["value2"]}),
+                                PyModels.RegionData("2", "3", "4", "5", "6", endpoints=[
+                                    PyModels.EndPoint("http://www.example.co.il", "url")],
+                                address=PyModels.Address("US", "NY", "HANEGEV", "AIRPORT_CITY", "5"),
+                                metadata={"key3": ["value3"], "key4": ["value4"]})])
+
+
+result_dict = {u'regions': [{u'status': u'2', u'vlcpName': None, u'CLLI': u'5',
+                             u'name': u'3', u'designType': None,
+                             u'rangerAgentVersion': u'6', u'OSVersion': None, u'id': u'3',
+                             u'address': {u'country': u'US', u'state': u'NY',
+                                          u'street': u'AIRPORT_CITY',
+                                          u'zip': u'5', u'city': u'HANEGEV'},
+                             u'endpoints': [
+                                 {u'type': u'url',
+                                  u'publicURL': u'http://www.example.co.il'}],
+                             u'locationType': None,
+                             u'metadata': {u'key1': [u'value1'],
+                                           u'key2': [u'value2']}},
+                            {u'status': u'2', u'vlcpName': None, u'CLLI': u'5',
+                             u'name': u'3', u'designType': None,
+                             u'rangerAgentVersion': u'6', u'OSVersion': None,
+                             u'id': u'3',
+                             u'address': {u'country': u'US',
+                                          u'state': u'NY',
+                                          u'street': u'AIRPORT_CITY',
+                                          u'zip': u'5', u'city': u'HANEGEV'},
+                             u'endpoints': [{u'type': u'url',
+                                             u'publicURL': u'http://www.example.co.il'}],
+                             u'locationType': None,
+                             u'metadata': {u'key3': [u'value3'],
+                                           u'key4': [u'value4']}}]}
+
+
+db_full_region = {
+    'region_status': 'functional',
+    'address_city': 'LAb',
+    'CLLI': 'nn/a',
+    'region_id': 'SNA20',
+    'open_stack_version': 'kilo',
+    'address_country': 'US',
+    'design_type': 'n/a',
+    'ranger_agent_version': 'ranger_agent1.0',
+    'vlcp_name': 'n/a',
+    'end_point_list': [{
+        'url': 'http://horizon1.com',
+        'type': 'dashboard'
+    }, {
+        'url': 'http://identity1.com',
+        'type': 'identity'
+    }, {
+        'url': 'http://identity1.com',
+        'type': 'identity222333'
+    }, {
+        'url': 'http://ord1.com',
+        'type': 'ord'
+    }],
+    'meta_data_dict': {
+        'A': ['b']
+    },
+    'address_state': 'CAL',
+    'address_zip': '1111',
+    'address_street': 'n/a',
+    'location_type': 'n/a',
+    'name': 'SNA 18'
+}
+
+full_region = {
+    "status": "functional",
+    "endpoints":
+        [
+            {
+                "type": "dashboard",
+                "publicURL": "http://horizon1.com"
+            },
+
+            {
+                "type": "identity",
+                "publicURL": "http://identity1.com"
+            },
+            {
+                "type": "identity222333",
+                "publicURL": "http://identity1.com"
+            },
+            {
+                "type": "ord",
+                "publicURL": "http://ord1.com"
+            }
+        ],
+        "CLLI": "nn/a",
+        "name": "SNA20",
+        "designType": "n/a",
+        "locationType": "n/a",
+        "vlcpName": "n/a",
+        "address":
+            {
+                "country": "US",
+                "state": "CAL",
+                "street": "n/a",
+                "zip": "1111",
+                "city": "LAb"},
+        "rangerAgentVersion": "ranger_agent1.0",
+        "OSVersion": "kilo",
+        "id": "SNA20",
+        "metadata":
+            {"A": ["b"]}
+}
+
+
+class TestAddRegion(FunctionalTest):
+
+    def get_error(self, transaction_id, status_code, error_details=None, message=None):
+        return ClientSideError(json.dumps({
+            'code': status_code,
+            'type': 'test',
+            'created': '0.0',
+            'transaction_id': transaction_id,
+            'message': message if message else error_details,
+            'details': 'test'
+        }), status_code=status_code)
+
+    def _create_result_from_input(self, input):
+        obj = PyModels.RegionData()
+        obj.clli = full_region["CLLI"]
+        obj.name = full_region["id"]  # need to be same as id
+        obj.design_type = full_region["designType"]
+        obj.location_type = full_region["locationType"]
+        obj.vlcp_name = full_region["vlcpName"]
+        obj.id = full_region["id"]
+        obj.address.country = full_region["address"]["country"]
+        obj.address.city = full_region["address"]["city"]
+        obj.address.state = full_region["address"]["state"]
+        obj.address.street = full_region["address"]["street"]
+        obj.address.zip = full_region["address"]["zip"]
+        obj.ranger_agent_version = full_region["rangerAgentVersion"]
+        obj.open_stack_version = full_region["OSVersion"]
+        obj.metadata = full_region["metadata"]
+        obj.status = full_region["status"]
+        obj.endpoints = []
+        for endpoint in full_region["endpoints"]:
+            obj.endpoints.append(PyModels.EndPoint(type=endpoint["type"],
+                                                   publicurl=endpoint[
+                                                       "publicURL"]))
+        return obj
+
+    @patch.object(regions, 'request')
+    @patch.object(regions.RegionService, 'create_full_region')
+    @patch.object(regions.authentication, 'authorize', return_value=True)
+    def test_add_region_success(self, mock_auth, mock_create_logic,
+                                mock_request):
+        self.maxDiff = None
+        mock_create_logic.return_value = self._create_result_from_input(
+            full_region)
+        response = self.app.post_json('/v2/orm/regions', full_region)
+        self.assertEqual(response.status_code, 201)
+        self.assertEqual(response.json, full_region)
+
+    @patch.object(regions.RegionService, 'create_full_region')
+    @patch.object(regions.authentication, 'authorize', return_value=True)
+    def test_add_region_any_error(self, mock_auth, mock_create_logic):
+        self.maxDiff = None
+        mock_create_logic.side_effect = Exception("unknown error")
+        response = self.app.post_json('/v2/orm/regions', full_region,
+                                      expect_errors=True)
+        self.assertEqual(response.status_code, 500)
+
+    @patch.object(regions, 'request')
+    @patch.object(regions, 'err_utils')
+    @patch.object(regions.RegionService, 'create_full_region')
+    @patch.object(regions.authentication, 'authorize', return_value=True)
+    def test_add_region_value_error(self, mock_auth, mock_create_logic,
+                                    mock_get_error, request_mock):
+        mock_get_error.get_error = self.get_error
+        request_mock.transaction_id = "555"
+        mock_create_logic.side_effect = regions.error_base.InputValueError(message="value error")
+        response = self.app.post_json('/v2/orm/regions', full_region,
+                                      expect_errors=True)
+        self.assertEqual(response.status_code, 400)
+        self.assertEqual(json.loads(response.json['faultstring'])['message'], 'value error')
+
+    @patch.object(regions.RegionService, 'get_region_by_id_or_name')
+    @patch.object(regions.authentication, 'authorize', return_value=True)
+    def test_get_region_success(self, mock_auth, mock_create_logic):
+        self.maxDiff = None
+        mock_create_logic.return_value = self._create_result_from_input(
+            full_region)
+        response = self.app.get('/v2/orm/regions/id')
+        self.assertEqual(response.status_code, 200)
+        self.assertEqual(response.json, full_region)
+
+    @patch.object(regions, 'request')
+    @patch.object(regions, 'err_utils')
+    @patch.object(regions.RegionService, 'get_region_by_id_or_name')
+    @patch.object(regions.authentication, 'authorize', return_value=True)
+    def test_get_region_not_found(self, mock_auth, mock_get_logic,
+                                  mock_get_error, mock_request):
+        mock_get_error.get_error = self.get_error
+        mock_request.transaction_id = "555"
+        mock_get_logic.side_effect = regions.error_base.NotFoundError(message="not found", status_code=404)
+        response = self.app.get('/v2/orm/regions/id', expect_errors=True)
+        self.assertEqual(json.loads(response.json['faultstring'])['message'],
+                         'not found')
+        self.assertEqual(response.status_code, 404)
+
+    @patch.object(regions, 'request')
+    @patch.object(regions, 'err_utils')
+    @patch.object(regions.RegionService, 'delete_region')
+    @patch.object(regions.authentication, 'authorize', return_value=True)
+    def test_delete_region(self, mock_auth, mock_delete_logic,
+                           mock_get_error, mock_request):
+        mock_get_error.get_error = self.get_error
+        mock_request.transaction_id = "555"
+        mock_delete_logic.return_value = True
+        response = self.app.delete('/v2/orm/regions/id')
+        self.assertEqual(response.status_code, 204)
+
+    @patch.object(regions, 'request')
+    @patch.object(regions, 'err_utils')
+    @patch.object(regions.RegionService, 'delete_region')
+    @patch.object(regions.authentication, 'authorize', return_value=True)
+    def test_delete_region_error(self, mock_auth, mock_delete_logic,
+                                 mock_get_error, mock_request):
+        mock_get_error.get_error = self.get_error
+        mock_request.transaction_id = "555"
+        mock_delete_logic.side_effect = Exception("unknown error")
+        response = self.app.delete('/v2/orm/regions/id', expect_errors=True)
+        self.assertEqual(response.status_code, 500)
+        self.assertEqual(json.loads(response.json['faultstring'])['message'],
+                         'unknown error')
+
+    @patch.object(regions, 'request')
+    @patch.object(regions.RegionService, 'update_region')
+    @patch.object(regions.authentication, 'authorize', return_value=True)
+    def test_update_region_success(self, mock_auth, mock_update_logic,
+                                   mock_request):
+        mock_update_logic.return_value = self._create_result_from_input(
+            full_region)
+        response = self.app.put_json('/v2/orm/regions/id', full_region)
+        self.assertEqual(response.status_code, 201)
+        self.assertEqual(response.json, full_region)
+
+    @patch.object(regions, 'request')
+    @patch.object(regions, 'err_utils')
+    @patch.object(regions.RegionService, 'update_region')
+    @patch.object(regions.authentication, 'authorize', return_value=True)
+    def test_update_region_error(self, mock_auth, mock_update_logic,
+                                 mock_get_error, mock_request):
+        mock_get_error.get_error = self.get_error
+        mock_request.transaction_id = "555"
+        mock_update_logic.side_effect = Exception("unknown error2")
+        response = self.app.put_json('/v2/orm/regions/id', full_region,
+                                     expect_errors=True)
+        self.assertEqual(response.status_code, 500)
+        self.assertEqual(json.loads(response.json['faultstring'])['message'],
+                         'unknown error2')
+
+    @patch.object(regions, 'request')
+    @patch.object(regions, 'err_utils')
+    @patch.object(regions.RegionService, 'update_region')
+    @patch.object(regions.authentication, 'authorize', return_value=True)
+    def test_update_region_not_found_error(self, mock_auth, mock_update_logic,
+                                           mock_get_error, mock_request):
+        mock_get_error.get_error = self.get_error
+        mock_request.transaction_id = "555"
+        mock_update_logic.side_effect = regions.error_base.NotFoundError(
+            message="not found", status_code=404)
+        response = self.app.put_json('/v2/orm/regions/id', full_region,
+                                     expect_errors=True)
+        self.assertEqual(json.loads(response.json['faultstring'])['message'],
+                         'not found')
+        self.assertEqual(response.status_code, 404)
+
+
+class TestWsmeModelFunctions(TestAddRegion):
+
+    def _to_wsme_from_input(self, input):
+        obj = regions.RegionsData()
+        obj.clli = full_region["CLLI"]
+        obj.name = full_region["name"]
+        obj.design_type = full_region["designType"]
+        obj.location_type = full_region["locationType"]
+        obj.vlcp_name = full_region["vlcpName"]
+        obj.id = full_region["id"]
+        obj.address.country = full_region["address"]["country"]
+        obj.address.city = full_region["address"]["city"]
+        obj.address.state = full_region["address"]["state"]
+        obj.address.street = full_region["address"]["street"]
+        obj.address.zip = full_region["address"]["zip"]
+        obj.ranger_agent_version = full_region["rangerAgentVersion"]
+        obj.open_stack_version = full_region["OSVersion"]
+        obj.metadata = full_region["metadata"]
+        obj.status = full_region["status"]
+        obj.endpoints = []
+        for endpoint in full_region["endpoints"]:
+            obj.endpoints.append(regions.EndPoint(type=endpoint["type"],
+                                                  publicurl=endpoint[
+                                                  "publicURL"]))
+        return obj
+
+    def test_region_data_model(self):
+        self.maxDiff = None
+        wsme_to_python = self._to_wsme_from_input(full_region)._to_clean_python_obj()
+        python_obj_input = self._create_result_from_input(full_region)
+        self.assertEqual(wsme_to_python.__dict__.pop('address').__dict__,
+                         python_obj_input.__dict__.pop('address').__dict__)
+        self.assertEqual(wsme_to_python.__dict__.pop('endpoints')[0].__dict__,
+                         python_obj_input.__dict__.pop('endpoints')[0].__dict__)
+        self.assertEqual(wsme_to_python.__dict__, python_obj_input.__dict__)
+
+
+class TestGetRegionsController(FunctionalTest):
+
+    @patch.object(regions.RegionService, 'get_regions_data', return_value=result_inst)
+    @patch.object(regions, 'authentication')
+    def test_get_success(self, mock_authentication, result):
+        self.maxDiff = None
+        response = self.app.get('/v2/orm/regions')
+        self.assertEqual(dict(response.json), result_dict)
+
+    @patch.object(regions.RegionService, 'get_regions_data', side_effect=Exception("unknown error"))
+    @patch.object(regions.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 500,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '111',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=500))
+    @patch.object(regions, 'authentication')
+    def test_get_unknown_error(self, mock_auth, get_err, result):
+        temp_request = regions.request
+        regions.request = MagicMock()
+
+        response = self.app.get('/v2/orm/regions', expect_errors=True)
+
+        regions.request = temp_request
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual('111', result_json['transaction_id'])
+        self.assertEqual(500, result_json['code'])
+
+    @patch.object(regions.RegionService, 'get_regions_data',
+                  side_effect=regions.error_base.NotFoundError("no content !!!?"))
+    @patch.object(regions.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 404,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '222',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=404))
+    @patch.object(regions, 'authentication')
+    def test_get_region_not_found(self, mock_auth, get_err, result):
+        temp_request = regions.request
+        regions.request = MagicMock()
+
+        response = self.app.get('/v2/orm/regions', expect_errors=True)
+
+        regions.request = temp_request
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual('222', result_json['transaction_id'])
+        self.assertEqual(404, result_json['code'])
+
+    @patch.object(regions.RegionService, 'get_region_by_id_or_name',
+                  return_value=result_inst.regions[0])
+    @patch.object(regions, 'authentication')
+    def test_get_one_success(self, mock_authentication, result):
+        response = self.app.get('/v2/orm/regions/id')
+        self.assertEqual(dict(response.json), result_dict['regions'][0])
+
+    @patch.object(regions.RegionService, 'get_regions_data',
+                  side_effect=Exception("unknown error"))
+    @patch.object(regions.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 500,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '111',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=500))
+    @patch.object(regions, 'authentication')
+    def test_get_one_unknown_error(self, mock_auth, get_err, result):
+        temp_request = regions.request
+        regions.request = MagicMock()
+
+        response = self.app.get('/v2/orm/regions/id', expect_errors=True)
+
+        regions.request = temp_request
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual('111', result_json['transaction_id'])
+        self.assertEqual(500, result_json['code'])
diff --git a/orm/services/region_manager/rms/tests/controllers/v1/orm/resources/test_status.py b/orm/services/region_manager/rms/tests/controllers/v1/orm/resources/test_status.py
new file mode 100755
index 00000000..fb818711
--- /dev/null
+++ b/orm/services/region_manager/rms/tests/controllers/v1/orm/resources/test_status.py
@@ -0,0 +1,81 @@
+import json
+from mock import patch
+
+from rms.controllers.v2.orm.resources import status
+from rms.tests import FunctionalTest
+
+from wsme.exc import ClientSideError
+
+
+def get_region_status_data(status):
+    return {
+        "status": status,
+        "links": {
+            "self": "https://0.0.0.0:8080/v2/orm/regions/my_region/status",
+        }
+    }
+
+
+class TestRegionStatus(FunctionalTest):
+    @patch.object(status, 'request')
+    @patch.object(status.utils, 'audit_trail')
+    @patch.object(status.RegionService, 'update_region_status')
+    @patch.object(status.authentication, 'authorize', return_value=True)
+    def test_update_region_status_success(self,
+                                          auth,
+                                          mock_update_status_logic,
+                                          mock_audit_trail,
+                                          mock_request):
+        self.maxDiff = None
+        mock_update_status_logic.return_value = "functional"
+        response = self.app.put_json('/v2/orm/regions/my_region/status',
+                                     get_region_status_data("functional"))
+        self.assertEqual(response.status_code, 201)
+        self.assertEqual(response.json, get_region_status_data("functional"))
+
+    @patch.object(status, 'request')
+    @patch.object(status, 'err_utils')
+    @patch.object(status.RegionService, 'update_region_status')
+    @patch.object(status.authentication, 'authorize', return_value=True)
+    def test_update_region_status_invalid_status(self, auth,
+                                                 update_region_status,
+                                                 mock_err_util,
+                                                 request_mock):
+        mock_err_util.get_error = get_error
+        request_mock.transaction_id = "555"
+        response = self.app.put_json('/v2/orm/regions/my_region/status',
+                                     get_region_status_data("invalid_status"),
+                                     expect_errors=True)
+        self.assertEqual(response.status_code, 400)
+        self.assertEqual(json.loads(response.json['faultstring'])['message'],
+                         "Invalid status. Region status must be one "
+                         "of ['functional', 'maintenance', 'down']")
+
+    @patch.object(status, 'request')
+    @patch.object(status, 'err_utils')
+    @patch.object(status.RegionService, 'update_region_status')
+    @patch.object(status.authentication, 'authorize', return_value=True)
+    def test_update_region_status_unknown_error(self, auth,
+                                                update_region_status,
+                                                mock_err_util,
+                                                request_mock):
+        mock_err_util.get_error = get_error
+        request_mock.transaction_id = "555"
+        update_region_status.side_effect = Exception("unknown error")
+        response = self.app.put_json('/v2/orm/regions/my_region/status',
+                                     get_region_status_data("functional"),
+                                     expect_errors=True)
+        self.assertEqual(response.status_code, 500)
+        self.assertEqual(json.loads(response.json['faultstring'])['message'],
+                         "unknown error")
+
+
+def get_error(transaction_id, status_code, error_details=None, message=None):
+    return ClientSideError(json.dumps({
+        'code': status_code,
+        'type': 'test',
+        'created': '0.0',
+        'transaction_id': transaction_id,
+        'message': message if message else error_details,
+        'details': 'test'
+    }), status_code=status_code)
diff --git a/orm/services/region_manager/rms/tests/db_testing.py b/orm/services/region_manager/rms/tests/db_testing.py
new file mode 100644
index 00000000..7ff4ff7e
--- /dev/null
+++ b/orm/services/region_manager/rms/tests/db_testing.py
@@ -0,0 +1,90 @@
+import logging
+
+from rms.storage.base_data_manager import SQLDBError
+from rms.storage.my_sql.data_manager import DataManager
+
+logger = logging.getLogger(__name__)
+
+
+def run_db_tests(data_manager):
+    logger.info('In db testing')
+
+    try:
+        # add regions with meta_data and end_points
+
+        # end_point_list = [{"type": "ord", "url": "http://ord.com", "description": "ord url"},
+        #                   {"type": "identity", "url": "http://identity.com", "description": "keystone url"},
+        #                   {"type": "image", "url": "http://image.com", "description": "image api url"}]
+        #
+        # meta_data_list = [{"key": "key_1", "value": "value_1", "description": "meta data key 1"},
+        #                   {"key": "key_2", "value": "value_2", "description": "meta data key 2"},
+        #                   {"key": "key_3", "value": "value_3", "description": "meta data key 3"}]
+        #
+        # data_manager.add_region("region_1","region 1", "US", "Cal", "LA", "blv_1", "12345", 1,
+        #                         "functional", "ranger_agent 1.0", "kilo", "dt_1", "lt_1",
+        #                         "vlcp_1", "clli_1", "test test test", end_point_list, meta_data_list)
+        #
+        # data_manager.add_region("region_2","region 2", "IL", "IL", "TelAviv", "bazel 1", "12345", 0,
+        #                         "functional", "ranger_agent 1.0", "kilo", "dt_1", "lt_1",
+        #                         "vlcp_1", "clli_1", "test2 test2 test2", end_point_list, meta_data_list)
+        #
+        # # get all regions
+        # regions = data_manager.get_all_regions()
+        # logger.info(regions)
+
+        # region_dict = {"address_country":"Cal"}
+        # meta_data_dict = {"meta_data_key": "key_1", "meta_data_value": "value_1"}
+        # end_point_dict = None#{"end_point_type": "type_1"}
+        # x = data_manager.get_regions(region_dict,
+        #                           meta_data_dict,
+        #                           end_point_dict)
+
+        # delete exist region
+        # data_manager.delete_region("region_1")
+
+        # delete a region that does not exist
+        # data_manager.delete_region("region_25")
+
+        # remove valid meta_data entry from a region
+        # data_manager.remove_meta_data_from_region("region_2","key_1")
+
+        # remove invalid meta_data entry from a region
+        # data_manager.remove_meta_data_from_region("region_6", "key_999")
+
+        # add meta_data to valid region
+        # data_manager.add_meta_data_to_region("region_2","b_key", "b_value", "bla bla")
+
+        # add meta_data to invalid region
+        # data_manager.add_meta_data_to_region("region_7", "c_key", "c_value", "cla cla")
+
+        # add end_point to valid region
+        # data_manager.add_end_point_to_region("region_2","type_c", "url_c", "cla cla")
+        # data_manager.add_end_point_to_region("region_6", "type_c", "url_ccc", "cla cla")
+
+        # add end_point to invalid region
+        # data_manager.add_end_point_to_region("region_7", "type_7", "url_7", "cla7 cla7")
+
+        # x = data_manager.get_all_regions()
+        # logger.info(x)
+
+        # data_manager.add_group("group_0","group 0 description",["lcp_1", "lcp_2"])
+        # data_manager.delete_group("group_0")
+        # data_manager.remove_region_from_group("group_0","lcp_1")
+        # data_manager.add_region_to_group("group_0","lcp_0")
+        # data_manager.add_group("group_1","group 1","group 1 description",["SNA1","SNA2"])
+        # data_manager.get_all_groups()
+        x = data_manager.get_group("group_1")
+        logger.info(x)
+    except SQLDBError as e:
+        logger.error("SQL error raised {}".format(e.message))
+
+
+def main():
+    db_url = 'mysql://root:stack@127.0.0.1/orm_rms_db?charset=utf8'
+
+    data_manager = DataManager(db_url)
+
+    run_db_tests(data_manager)
+
+if __name__ == "__main__":
+    main()
diff --git a/orm/services/region_manager/rms/tests/model/__init__.py b/orm/services/region_manager/rms/tests/model/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/tests/model/test_url_parms.py b/orm/services/region_manager/rms/tests/model/test_url_parms.py
new file mode 100755
index 00000000..3c8ac6ca
--- /dev/null
+++ b/orm/services/region_manager/rms/tests/model/test_url_parms.py
@@ -0,0 +1,66 @@
+"""url parms unittests module."""
+import unittest
+
+from rms.model import url_parm
+
+parms = {'status': 'functional', 'city': 'Los Angeles', 'clli': 'clli_0',
+         'zip': '012345', 'country': 'US', 'metadata': ['key_1:value_1',
+                                                        'key_2:value_2'],
+         'valet': 'true', 'state': 'Cal', 'street': 'Blv st',
+         'rangerAgentVersion': 'ranger_agent 1.0', 'osversion': 'kilo',
+         'type': 'location_type_0', 'regionname': 'lcp 0'}
+
+parms_meta_none = {'status': 'functional', 'city': 'Los Angeles',
+                   'clli': 'clli_0',
+                   'zip': '012345', 'country': 'US',
+                   'metadata': None,
+                   'valet': 'true', 'state': 'Cal', 'street': 'Blv st',
+                   'rangerAgentVersion': 'ranger_agent 1.0', 'osversion': 'kilo',
+                   'type': 'location_type_0', 'regionname': 'lcp 0'}
+
+output_parms = {'address_city': 'Los Angeles', 'clli': 'clli_0',
+                'name': 'lcp 0', 'open_stack_version': 'kilo',
+                'address_street': 'Blv st', 'address_state': 'Cal',
+                'region_status': 'functional', 'valet': 'true',
+                'ranger_agent_version': 'ranger_agent 1.0', 'address_zip': '012345',
+                'address_country': 'US', 'location_type': 'location_type_0',
+                'metadata': ['key_1:value_1', 'key_2:value_2']}
+
+regiondict_output = {'address_city': 'Los Angeles', 'clli': 'clli_0',
+                     'name': 'lcp 0', 'valet': 'true',
+                     'open_stack_version': 'kilo', 'address_country': 'US',
+                     'ranger_agent_version': 'ranger_agent 1.0', 'region_status': 'functional',
+                     'address_state': 'Cal', 'address_street': 'Blv st',
+                     'location_type': 'location_type_0',
+                     'address_zip': '012345'}
+metadata_output = {'meta_data_keys': [],
+                   'meta_data_pairs': [{'metadata_key': 'key_1', 'metadata_value': 'value_1'},
+                                       {'metadata_key': 'key_2', 'metadata_value': 'value_2'}],
+                   'ref_keys': ['key_1', 'key_2']}
+
+
+class TestUrlParms(unittest.TestCase):
+    # parms init
+    def test_init_all(self):
+        obj = url_parm.UrlParms(**parms)
+        self.assertEqual(obj.__dict__, output_parms)
+
+    # test build query
+    def test_build_query(self):
+        obj = url_parm.UrlParms(**parms)
+        regiondict, metadatadict, none = obj._build_query()
+        self.assertEqual(regiondict_output, regiondict)
+        self.assertEqual(metadata_output, metadatadict)
+
+    # test build query metadat None
+    def test_build_query_meta_none(self):
+        obj = url_parm.UrlParms(**parms_meta_none)
+        regiondict, metadatadict, none = obj._build_query()
+        self.assertEqual(metadatadict, None)
+
+    # test build query metadat None
+    def test_build_query_all_none(self):
+        obj = url_parm.UrlParms()
+        regiondict, metadatadict, none = obj._build_query()
+        self.assertEqual(metadatadict, None)
+        self.assertEqual(regiondict, None)
diff --git a/orm/services/region_manager/rms/tests/services/__init__.py b/orm/services/region_manager/rms/tests/services/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/tests/services/test_services.py b/orm/services/region_manager/rms/tests/services/test_services.py
new file mode 100755
index 00000000..3f10f1d7
--- /dev/null
+++ b/orm/services/region_manager/rms/tests/services/test_services.py
@@ -0,0 +1,327 @@
+"""Services module unittests."""
+import mock
+from mock import patch
+from rms.services import services
+# from rms.model import url_parm as parms
+
+from rms.tests import FunctionalTest
+from rms.tests.controllers.v1.orm.resources.test_region import full_region
+from rms.controllers.v2.orm.resources import regions
+from pecan import conf
+from rms.model import model as PyModels
+
+
+class db(object):
+    def __init__(self, name=None, exp=None):
+        self.name = name
+        self.exp = exp
+
+    def get_group(self, name=None):
+        if name:
+            return {'regions': [u'lcp_1'],
+                    'name': u'ccplz',
+                    'description': u'b'}
+        else:
+            return None
+
+    def get_all_groups(self):
+        if self.exp:
+            raise Exception("any")
+        return [{'regions': [u'lcp_1'], 'name': u'ccplz',
+                'description': u'b'}, {'regions': [u'lcp_1'], 'name': u'ccplz',
+                                       'description': u'b'}]
+
+    def add_group(self, *items):
+        if items[3] and "bad_region" in items[3]:
+            raise services.error_base.InputValueError()
+
+    def get_regions(self, region_dict=None, metadata_dict=None,
+                    end_point=None):
+        if region_dict:
+            return {'regions': [u'lcp_1'],
+                    'name': u'ccplz',
+                    'description': u'b'}
+        else:
+            return None
+
+    def delete_group(self, id):
+        if self.exp:
+            raise Exception("any")
+        return None
+
+    def get_region_by_id_or_name(self, id_name):
+        return id_name
+
+    def add_region(self, **kw):
+        if self.exp:
+            raise Exception("any")
+        return True
+
+    def update_region(self, id=None, **kw):
+        if self.exp == "not found":
+            raise services.error_base.NotFoundError(message="id not found")
+        elif self.exp:
+            raise Exception("error")
+        return True
+
+    def delete_region(self, id=None, **kw):
+        if self.exp:
+            raise Exception("not deleted")
+        return True
+
+
+class URlParm(object):
+
+    def __init__(self, metadata=None, clli=None):
+        self.metadata = metadata
+        self.clli = clli
+
+    def _build_query(self):
+        if self.metadata:
+            return (self.metadata, self.clli, None)
+        return (None, None, None)
+
+
+class TestServices(FunctionalTest):
+    """Main test case for the Services module."""
+
+    def _to_wsme_from_input(self, input):
+        full_region = input
+        obj = regions.RegionsData()
+        obj.clli = full_region["CLLI"]
+        obj.name = full_region["name"]
+        obj.design_type = full_region["designType"]
+        obj.location_type = full_region["locationType"]
+        obj.vlcp_name = full_region["vlcpName"]
+        obj.id = full_region["id"]
+        obj.address.country = full_region["address"]["country"]
+        obj.address.city = full_region["address"]["city"]
+        obj.address.state = full_region["address"]["state"]
+        obj.address.street = full_region["address"]["street"]
+        obj.address.zip = full_region["address"]["zip"]
+        obj.ranger_agent_version = full_region["rangerAgentVersion"]
+        obj.open_stack_version = full_region["OSVersion"]
+        obj.metadata = full_region["metadata"]
+        obj.status = full_region["status"]
+        obj.endpoints = []
+        for endpoint in full_region["endpoints"]:
+            obj.endpoints.append(regions.EndPoint(type=endpoint["type"],
+                                                  publicurl=endpoint[
+                                                      "publicURL"]))
+        return obj
+
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db())
+    def test_get_groups_data(self, mock_db_get_group):
+        services.get_groups_data('ccplz')
+
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db(exp=True))
+    def test_get_all_groups_data_err(self, mock_db_get_group):
+        with self.assertRaises(Exception) as exp:
+            services.get_all_groups()
+
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db())
+    def test_get_all_groups_data(self, mock_db_get_group):
+        services.get_all_groups()
+
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db())
+    def test_delete_group(self, mock_db_get_group):
+        services.delete_group('id')
+
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db(exp=True))
+    def test_delete_group_err(self, mock_db_get_group):
+        with self.assertRaises(Exception) as exp:
+            services.delete_group('id')
+
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db())
+    def test_get_groups_empty_data(self, mock_db_get_group):
+        self.assertRaises(services.error_base.NotFoundError,
+                          services.get_groups_data, None)
+
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db())
+    def test_get_regions_empty_data(self, mock_db_get_group):
+        url_parm = URlParm()
+        self.assertRaises(services.error_base.NotFoundError,
+                          services.get_regions_data, url_parm)
+
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db())
+    def test_get_regions_data(self, mock_db_get_group):
+        url_parm = URlParm(metadata="key,value", clli="any")
+        services.get_regions_data(url_parm)
+
+    @patch.object(services.data_manager_factory, 'get_data_manager')
+    def test_create_group_in_db_success(self, mock_get_data_manager):
+        """Make sure that no exception is raised."""
+        services.create_group_in_db('d', 'a', 'b', ['c'])
+
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db())
+    def test_create_group_in_db_not_valid_regions(self, mock_get_data_manager):
+        """Make sure that no exception is raised."""
+        with self.assertRaises(services.error_base.NotFoundError) as exp:
+            services.create_group_in_db('d', 'a', 'b', ['bad_region'])
+
+    @patch.object(services.data_manager_factory, 'get_data_manager')
+    def test_create_group_in_db_duplicate_entry(self, mock_get_data_manager):
+        """Make sure that the expected exception is raised if group exists."""
+        my_manager = mock.MagicMock()
+        my_manager.add_group = mock.MagicMock(
+            side_effect=services.error_base.ConflictError(
+                'test'))
+        mock_get_data_manager.return_value = my_manager
+        self.assertRaises(services.error_base.ConflictError,
+                          services.create_group_in_db, 'd', 'a', 'b', ['c'])
+
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db())
+    def test_get_region_by_id_or_name(self, mock_data_manager_factory):
+        result = services.get_region_by_id_or_name({"test1": "test1"})
+        self.assertEqual(result, {"test1": "test1"})
+
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db())
+    def test_get_region_by_id_or_name_no_content(self,
+                                                 mock_data_manager_factory):
+        self.assertRaises(services.error_base.NotFoundError,
+                          services.get_region_by_id_or_name, None)
+
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=Exception("any"))
+    def test_get_region_by_id_or_name_500(self, mock_data_manager_factory):
+        self.assertRaises(Exception, services.get_region_by_id_or_name, "id")
+
+    @patch.object(services, 'get_region_by_id_or_name',
+                  return_value={"a": "b"})
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db())
+    def test_create_region_success(self, mock_db_get_group,
+                                   mock_get_region_id_name):
+        result = services.create_full_region(self._to_wsme_from_input(full_region))
+        self.assertEqual(result, {"a": "b"})
+
+    @patch.object(services, 'get_region_by_id_or_name',
+                  return_value={"a": "b"})
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db())
+    def test_create_region_duplicate(self, mock_db_create_region,
+                                     mock_get_region_id_name):
+        duplicate = mock.MagicMock()
+        duplicate.side_effect = services.base_data_manager.DuplicateEntryError()
+        mock_db_create_region.return_value.add_region = duplicate
+        with self.assertRaises(services.error_base.ConflictError) as exp:
+            result = services.create_full_region(
+                self._to_wsme_from_input(full_region))
+
+    @patch.object(services, 'get_region_by_id_or_name',
+                  return_value={"a": "b"})
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db())
+    def test_create_region_validate_status_error(self, mock_db_get_group,
+                                                 mock_get_region_id_name):
+        orig_status = full_region['status']
+        full_region['status'] = "123"
+        allowed_status = conf.region_options.allowed_status_values[:]
+        with self.assertRaises(services.error_base.InputValueError) as exp:
+            result = services.create_full_region(self._to_wsme_from_input(full_region))
+            test_ok = str(allowed_status) in exp.expected.message
+            self.assertEqual(test_ok, True)
+        full_region['status'] = orig_status
+
+    @patch.object(services, 'get_region_by_id_or_name',
+                  return_value={"a": "b"})
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db())
+    def test_create_region_validate_endpoints_error(self, mock_db_get_group,
+                                                    mock_get_region_id_name):
+        message = ""
+        endpoints_types_must_have = conf.region_options.endpoints_types_must_have[:]
+        orig_endpoint = full_region['endpoints']
+        full_region['endpoints'] = [
+            {
+                "type": "dashboards",
+                "publicURL": "http://horizon1.com"
+            }]
+        try:
+            result = services.create_full_region(
+                self._to_wsme_from_input(full_region))
+        except services.error_base.InputValueError as exp:
+            message = exp.message
+        full_region['endpoints'] = orig_endpoint
+        self.assertEqual(str(endpoints_types_must_have) in str(message), True)
+
+    @patch.object(services, 'get_region_by_id_or_name',
+                  return_value={"a": "b"})
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db(exp=True))
+    def test_create_region_validate_any_error(self, mock_db_get_group,
+                                              mock_get_region_id_name):
+        message = None
+        try:
+            result = services.create_full_region(
+                self._to_wsme_from_input(full_region))
+        except Exception as exp:
+            message = exp.message
+        self.assertEqual(message, "any")
+
+    @patch.object(services, 'get_region_by_id_or_name',
+                  return_value={"a": "b"})
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db())
+    def test_update_region_success(self, mock_db_get_group,
+                                   mock_get_region_id_name):
+        result = services.update_region('id',
+                                        self._to_wsme_from_input(full_region))
+        self.assertEqual(result, {"a": "b"})
+
+    @patch.object(services, 'get_region_by_id_or_name',
+                  return_value={"a": "b"})
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db(exp=True))
+    def test_update_region_error(self, mock_db_get_group,
+                                 mock_get_region_id_name):
+        try:
+            result = services.update_region('id',
+                                            self._to_wsme_from_input(full_region))
+        except Exception as exp:
+            message = exp.message
+        self.assertEqual(message, "error")
+
+    @patch.object(services, 'get_region_by_id_or_name',
+                  return_value={"a": "b"})
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db(exp="not found"))
+    def test_update_region_notfound_error(self, mock_db_get_group,
+                                          mock_get_region_id_name):
+        try:
+            result = services.update_region('id',
+                                            self._to_wsme_from_input(full_region))
+        except services.error_base.NotFoundError as exp:
+            message = exp.message
+        self.assertEqual(message, "id not found")
+
+    @patch.object(services, 'get_region_by_id_or_name',
+                  return_value={"a": "b"})
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db(exp=True))
+    def test_delete_region_error(self, mock_db_get_group,
+                                 mock_get_region_id_name):
+        try:
+            result = services.delete_region(self._to_wsme_from_input(full_region))
+        except Exception as exp:
+            message = exp.message
+        self.assertEqual(message, "not deleted")
+
+    @patch.object(services, 'get_region_by_id_or_name',
+                  return_value={"a": "b"})
+    @patch.object(services.data_manager_factory, 'get_data_manager',
+                  return_value=db())
+    def test_delete_region_success(self, mock_db_get_group,
+                                   mock_get_region_id_name):
+        result = services.delete_region(self._to_wsme_from_input(full_region))
diff --git a/orm/services/region_manager/rms/tests/storage/__init__.py b/orm/services/region_manager/rms/tests/storage/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/tests/storage/my_sql/__init__.py b/orm/services/region_manager/rms/tests/storage/my_sql/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/tests/storage/my_sql/test_data_manager.py b/orm/services/region_manager/rms/tests/storage/my_sql/test_data_manager.py
new file mode 100755
index 00000000..7f3603d9
--- /dev/null
+++ b/orm/services/region_manager/rms/tests/storage/my_sql/test_data_manager.py
@@ -0,0 +1,293 @@
+import unittest
+
+import mock
+
+from rms.services import error_base
+from rms.storage.my_sql import data_manager, data_models
+from rms.storage.base_data_manager import DuplicateEntryError
+
+end_point_list = [{"type": "ord",
+                   "url": "http://ord.com"}]
+
+meta_data_dict = {"key_1": ["value_1"]}
+
+
+return_region = data_models.Region(region_id='SNA1')
+
+
+class QueryObject():
+
+    def __init__(self, ret=None):
+        self.ret = ret
+
+    def filter(self, query=None):
+        ret = mock.MagicMock()
+        if self.ret:
+            ret.first.return_value = return_region
+            return ret
+        else:
+            ret.first.return_value = None
+            return ret
+
+    def filter_by(self, *args, **kwargs):
+        ret = mock.MagicMock()
+        if self.ret:
+            ret.first.return_value = return_region
+            return ret
+        else:
+            ret.first.return_value = None
+            return ret
+
+
+class MyFacade(object):
+    """Mock EngineFacade class."""
+
+    def __init__(self, filter_by=None, query=None, is_ref_err=False):
+        """Initialize the object."""
+        self._filter_by = filter_by
+        self._query = query
+        self._is_ref_err = is_ref_err
+
+    def get_session(self):
+        """Make add() Raise a duplicate entry exception."""
+        session = mock.MagicMock()
+        dup_ent = data_manager.oslo_db.exception.DBDuplicateEntry
+        session.add = mock.MagicMock(side_effect=dup_ent('test'))
+        if self._is_ref_err:
+            dup_ent = data_manager.oslo_db.exception.DBReferenceError
+            session.add = mock.MagicMock(side_effect=dup_ent('test', "", "", ""))
+        my_filter = mock.MagicMock()
+        my_filter.filter_by = mock.MagicMock(return_value=self._filter_by)
+        if self._query is not None:
+            ret = self._query
+        else:
+            ret = my_filter
+        session.query = mock.MagicMock(return_value=ret)
+
+        return session
+
+
+class TestDataManager(unittest.TestCase):
+
+    @mock.patch.object(data_manager, 'db_session')
+    def test_add_region_sanity(self, mock_db_session):
+        """Test that no exception is raised when calling add_status_record."""
+        my_data_manager = data_manager.DataManager("url", "", "")
+        my_data_manager.add_region("reg1", "region1", "a_state", "a_country",
+                                   "a_city", "a_street", "a_zip", "a_status", "ranger_agent_ver",
+                                   "os_ver", "design_type", "loc_type", "vlcp", "clli",
+                                   end_point_list, meta_data_dict, "a_desc")
+
+    @mock.patch.object(data_manager.db_session, 'EngineFacade', return_value=MyFacade())
+    def test_add_region_duplicate_error(self, mock_db_session):
+        """Test that duplicate exception is raised when calling add_status_record."""
+        my_data_manager = data_manager.DataManager("url", "", "")
+        with self.assertRaises(DuplicateEntryError):
+            my_data_manager.add_region("reg1", "region1", "a_state", "a_country",
+                                       "a_city", "a_street", "a_zip", "a_status", "ranger_agent_ver",
+                                       "os_ver", "design_type", "loc_type", "vlcp", "clli",
+                                       [], {}, "a_desc")
+
+    @mock.patch.object(data_manager, 'db_session')
+    def test_add_group_sanity(self, mock_db_session):
+        """Test that no exception is raised when calling add_group."""
+        my_data_manager = data_manager.DataManager("url", "", "")
+        my_data_manager.add_group("group1", "group 1", "bla bla", ["region1"])
+
+    @mock.patch.object(data_manager.db_session, 'EngineFacade', return_value=MyFacade())
+    def test_add_group_duplicate_error(self, mock_db_session):
+        """Test that ConflictError is raised when calling add_group."""
+        my_data_manager = data_manager.DataManager("url", "", "")
+        with self.assertRaises(error_base.ConflictError):
+            my_data_manager.add_group("group1", "group 1", "bla bla", ["region1"])
+
+    @mock.patch.object(data_manager.db_session, 'EngineFacade',
+                       return_value=MyFacade(is_ref_err=True))
+    def test_add_group_reference_error(self, mock_db_session):
+        """Test that reference exception is raised when calling add_group."""
+        my_data_manager = data_manager.DataManager("url", "", "")
+        with self.assertRaises(error_base.InputValueError):
+            my_data_manager.add_group("group1", "group 1", "bla bla", ["region1"])
+
+    @mock.patch.object(data_manager.db_session, 'EngineFacade',
+                       return_value=MyFacade(query=QueryObject(ret=return_region)))
+    def test_get_region_id_or_name_success(self, mock_db_session):
+        my_data_manager = data_manager.DataManager('url', "", "")
+        result = my_data_manager.get_region_by_id_or_name("id")
+        self.assertEqual(result.id, 'SNA1')
+
+    @mock.patch.object(data_manager.db_session, 'EngineFacade',
+                       return_value=MyFacade(
+                           query=QueryObject(ret=None)))
+    def test_get_region_id_or_name_None(self, mock_db_session):
+        my_data_manager = data_manager.DataManager("url", "", "")
+        result = my_data_manager.get_region_by_id_or_name("id")
+        self.assertEqual(result, None)
+
+    @mock.patch.object(data_manager.db_session, 'EngineFacade')
+    def test_get_region_id_or_name_error(self, mock_db_session):
+        mock_get_session = mock.MagicMock()
+        mock_get_session.get_session.side_effect = ValueError('test')
+        mock_db_session.return_value = mock_get_session
+
+        my_data_manager = data_manager.DataManager("url", "", "")
+        self.assertRaises(ValueError, my_data_manager.get_region_by_id_or_name,
+                          "id")
+
+    @mock.patch.object(data_manager.db_session, 'EngineFacade',
+                       return_value=MyFacade(
+                           filter_by=[return_region]))
+    def test_get_regions(self, mock_db_session):
+        my_data_manager = data_manager.DataManager("url", "", "")
+        result = my_data_manager.get_regions(
+            region_filters_dict={"meta_data_key": "1"},
+            meta_data_dict=None, end_point_dict=None)
+        self.assertEqual(result[0].id, return_region.region_id)
+
+        # Test that no exception is raised on the other successful flow
+        mock_db_session.return_value = mock.MagicMock()
+        my_data_manager.get_regions(
+            region_filters_dict=None,
+            meta_data_dict={"meta_data_keys": ["1"], "meta_data_pairs": []},
+            end_point_dict=end_point_list[0])
+
+    @mock.patch.object(data_manager.db_session, 'EngineFacade')
+    def test_get_all_regions(self, mock_db_session):
+        all_regions = [return_region]
+        mock_db_session.return_value = MyFacade(query=all_regions)
+        my_data_manager = data_manager.DataManager("url", "", "")
+
+        result = my_data_manager.get_all_regions()
+        self.assertEqual(len(result), len(all_regions))
+        self.assertEqual(result[0].id, all_regions[0].region_id)
+
+    @mock.patch.object(data_manager, 'db_session')
+    def test_update_region_sanity(self, mock_db_session):
+        """Test that no exception is raised when calling update_region."""
+        my_data_manager = data_manager.DataManager("url", "", "")
+        my_data_manager.update_region("reg1", "region1", "region_name",
+                                      "a_state", "a_country",
+                                      "a_city", "a_street", "a_zip", "a_status",
+                                      "ranger_agent_ver",
+                                      "os_ver", "design_type", "loc_type",
+                                      "vlcp", "clli",
+                                      end_point_list, meta_data_dict, "a_desc")
+
+    @mock.patch.object(data_manager.db_session, 'EngineFacade',
+                       return_value=MyFacade(
+                           query=QueryObject(ret=None)))
+    def test_update_region_region_not_found(self, mock_engine_facade):
+        """Test that NotFoundError is raised when calling update_region."""
+        my_data_manager = data_manager.DataManager("url", "", "")
+        self.assertRaises(data_manager.ServiceBase.NotFoundError,
+                          my_data_manager.update_region, "reg1", "region1",
+                          "region_name",
+                          "a_state", "a_country",
+                          "a_city", "a_street", "a_zip", "a_status",
+                          "ranger_agent_ver",
+                          "os_ver", "design_type", "loc_type",
+                          "vlcp", "clli",
+                          end_point_list, meta_data_dict, "a_desc")
+
+    @mock.patch.object(data_manager.db_session, 'EngineFacade')
+    def test_update_region_other_error(self, mock_engine_facade):
+        """Test that ValueError is raised when calling update_region."""
+        mock_session = mock.MagicMock()
+        mock_session.get_session.side_effect = ValueError('test')
+        mock_engine_facade.return_value = mock_session
+        my_data_manager = data_manager.DataManager("url", "", "")
+        self.assertRaises(ValueError,
+                          my_data_manager.update_region, "reg1", "region1",
+                          "region_name",
+                          "a_state", "a_country",
+                          "a_city", "a_street", "a_zip", "a_status",
+                          "ranger_agent_ver",
+                          "os_ver", "design_type", "loc_type",
+                          "vlcp", "clli",
+                          end_point_list, meta_data_dict, "a_desc")
+
+    @mock.patch.object(data_manager, 'db_session')
+    def test_delete_region_sanity(self, mock_db_session):
+        my_data_manager = data_manager.DataManager("url", "", "")
+        my_data_manager.delete_region("region")
+
+    @mock.patch.object(data_manager, 'db_session')
+    def test_add_meta_data_to_region_sanity(self, mock_db_session):
+        my_data_manager = data_manager.DataManager("url", "", "")
+        my_data_manager.add_meta_data_to_region('region', {'meta': 'data'})
+
+    @mock.patch.object(data_manager.db_session, 'EngineFacade',
+                       return_value=MyFacade(
+                           query=QueryObject(ret=None)))
+    def test_add_meta_data_to_region_region_not_found(self, mock_db_session):
+        my_data_manager = data_manager.DataManager("url", "", "")
+        result = my_data_manager.add_meta_data_to_region('region',
+                                                         {'meta': 'data'})
+        self.assertIsNone(result)
+
+    @mock.patch.object(data_manager.db_session, 'EngineFacade')
+    def test_add_meta_data_to_region_error(self, mock_db_session):
+        mock_begin = mock.MagicMock()
+        mock_begin.begin.side_effect = data_manager.oslo_db.exception.DBDuplicateEntry(
+            'test')
+        mock_get_session = mock.MagicMock()
+        mock_get_session.get_session.return_value = mock_begin
+        mock_db_session.return_value = mock_get_session
+
+        my_data_manager = data_manager.DataManager("url", "", "")
+
+        self.assertRaises(data_manager.error_base.ConflictError,
+                          my_data_manager.add_meta_data_to_region,
+                          'region', {'meta': 'data'})
+
+    @mock.patch.object(data_manager, 'db_session')
+    def test_update_region_meta_data_sanity(self, mock_db_session):
+        my_data_manager = data_manager.DataManager("url", "", "")
+        my_data_manager.update_region_meta_data('region', {'meta': 'data'})
+
+    @mock.patch.object(data_manager.db_session, 'EngineFacade',
+                       return_value=MyFacade(
+                           query=QueryObject(ret=None)))
+    def test_update_region_meta_data_region_not_found(self, mock_db_session):
+        my_data_manager = data_manager.DataManager("url", "", "")
+        self.assertRaises(data_manager.error_base.NotFoundError,
+                          my_data_manager.update_region_meta_data,
+                          'region', {'meta': 'data'})
+
+    @mock.patch.object(data_manager, 'db_session')
+    def test_delete_region_metadata_sanity(self, mock_db_session):
+        my_data_manager = data_manager.DataManager("url", "", "")
+        my_data_manager.delete_region_metadata('region', {'meta': 'data'})
+
+    @mock.patch.object(data_manager.db_session, 'EngineFacade',
+                       return_value=MyFacade(
+                           query=QueryObject(ret=None)))
+    def test_delete_region_metadata_region_not_found(self, mock_db_session):
+        my_data_manager = data_manager.DataManager("url", "", "")
+        self.assertRaises(data_manager.error_base.NotFoundError,
+                          my_data_manager.delete_region_metadata,
+                          'region', {'meta': 'data'})
+
+    @mock.patch.object(data_manager, 'db_session')
+    def test_update_region_status_sanity(self, mock_db_session):
+        my_data_manager = data_manager.DataManager("url", "", "")
+        my_data_manager.update_region_status('region', 'status')
+
+    @mock.patch.object(data_manager.db_session, 'EngineFacade',
+                       return_value=MyFacade(
+                           query=QueryObject(ret=None)))
+    def test_update_region_status_region_not_found(self, mock_db_session):
+        my_data_manager = data_manager.DataManager("url", "", "")
+        self.assertRaises(data_manager.error_base.NotFoundError,
+                          my_data_manager.update_region_status,
+                          'region', 'status')
+
+    @mock.patch.object(data_manager, 'db_session')
+    def test_group_functions_sanity(self, mock_db_session):
+        """Test that no exception is raised when calling group functions."""
+        my_data_manager = data_manager.DataManager("url", "", "")
+
+        my_data_manager.delete_group('group')
+        my_data_manager.get_group('group')
+        my_data_manager.update_group('id', 'name', 'description', ['region'])
+        my_data_manager.get_all_groups()
diff --git a/orm/services/region_manager/rms/tests/storage/test_base_data_manager.py b/orm/services/region_manager/rms/tests/storage/test_base_data_manager.py
new file mode 100644
index 00000000..c8726996
--- /dev/null
+++ b/orm/services/region_manager/rms/tests/storage/test_base_data_manager.py
@@ -0,0 +1,44 @@
+import unittest
+
+from rms.storage.base_data_manager import BaseDataManager
+
+
+class BaseDataManagerTests(unittest.TestCase):
+
+    def test_base_data_manager_add_region_not_implemented(self):
+        """ Check if creating an instance and calling add_region
+        method fail"""
+        with self.assertRaises(NotImplementedError):
+            BaseDataManager("", "", "").add_region('1', '2', '3', '4', '5', '6', '7',
+                                                   '8', '9', '10', '11', '12', '13',
+                                                   '14', '15', '16', '17')
+
+    def test_base_data_manager_get_regions_not_implemented(self):
+        """ Check if creating an instance and calling get_regions
+        method fail"""
+        with self.assertRaises(NotImplementedError):
+            BaseDataManager("", "", "").get_regions('1', '2', '3')
+
+    def test_base_data_manager_get_all_regions_not_implemented(self):
+        """ Check if creating an instance and calling get_all_regions
+        method fail"""
+        with self.assertRaises(NotImplementedError):
+            BaseDataManager("", "", "").get_all_regions()
+
+    def test_base_data_manager_add_group_not_implemented(self):
+        """ Check if creating an instance and calling add_group
+        method fail"""
+        with self.assertRaises(NotImplementedError):
+            BaseDataManager("", "", "").add_group("1", "2", "3", "4")
+
+    def test_base_data_manager_get_group_not_implemented(self):
+        """ Check if creating an instance and calling get_group
+        method fail"""
+        with self.assertRaises(NotImplementedError):
+            BaseDataManager("", "", "").get_group("1")
+
+    def test_base_data_manager_get_all_groups_not_implemented(self):
+        """ Check if creating an instance and calling get_all_groups
+        method fail"""
+        with self.assertRaises(NotImplementedError):
+            BaseDataManager("", "", "").get_all_groups()
diff --git a/orm/services/region_manager/rms/tests/storage/test_data_manager_factory.py b/orm/services/region_manager/rms/tests/storage/test_data_manager_factory.py
new file mode 100644
index 00000000..3b2f73ae
--- /dev/null
+++ b/orm/services/region_manager/rms/tests/storage/test_data_manager_factory.py
@@ -0,0 +1,17 @@
+from mock import patch
+import unittest
+
+from rms.storage import data_manager_factory
+from rms.storage.my_sql.data_manager import DataManager
+from rms.storage.my_sql import data_manager
+
+
+class StorageFactoryTests(unittest.TestCase):
+
+    @patch.object(data_manager_factory, 'conf')
+    @patch.object(data_manager, 'db_session')
+    def test_get_data_manager(self, conf_mock, db_session_mock):
+        """ Check the returned object from get_region_resource_id_status_connection
+            is instance of  DataManager"""
+        obj = data_manager_factory.get_data_manager()
+        self.assertIsInstance(obj, DataManager)
diff --git a/orm/services/region_manager/rms/tests/test_configuration.py b/orm/services/region_manager/rms/tests/test_configuration.py
new file mode 100755
index 00000000..e2f4c454
--- /dev/null
+++ b/orm/services/region_manager/rms/tests/test_configuration.py
@@ -0,0 +1,15 @@
+"""Get configuration module unittests."""
+from mock import patch
+from rms.controllers import configuration as root
+from rms.tests import FunctionalTest
+
+
+class TestGetConfiguration(FunctionalTest):
+    """Main get configuration test case."""
+
+    @patch.object(root.utils, 'report_config', return_value='12345')
+    @patch.object(root, 'authentication')
+    def test_get_configuration_success(self, mock_authentication, input):
+        """Test get_configuration returns the expected value on success."""
+        response = self.app.get('/configuration')
+        self.assertEqual(response.json, '12345')
diff --git a/orm/services/region_manager/rms/tests/test_logs.py b/orm/services/region_manager/rms/tests/test_logs.py
new file mode 100755
index 00000000..24f122e4
--- /dev/null
+++ b/orm/services/region_manager/rms/tests/test_logs.py
@@ -0,0 +1,47 @@
+import json
+import logging
+
+from mock import patch, MagicMock
+from wsme.exc import ClientSideError
+
+import rms.controllers.logs as logs
+from rms.controllers.logs import LogsController as logs_controller
+from rms.tests import FunctionalTest
+
+
+class TestGetConfiguration(FunctionalTest):
+
+    @patch.object(logging, 'getLogger')
+    def test_change_log_level_success(self, input):
+        logs_controller._change_log_level(50)
+
+    @patch.object(logs_controller, '_change_log_level')
+    @patch.object(logs, 'authentication')
+    def test_put_success(self, mock_authentication, err):
+        response = self.app.put('/logs/info', expect_errors=True)
+        self.assertEqual(response.status_int, 201)
+
+    @patch.object(logs_controller, '_change_log_level')
+    @patch.object(logs.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 500,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '333',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=500))
+    @patch.object(logs, 'authentication')
+    def test_put_failed_wrong_log_level(self, mock_auth, err, err2):
+        temp_request = logs.request
+        logs.request = MagicMock()
+
+        response = self.app.put('/logs/info000', expect_errors=True)
+
+        logs.request = temp_request
+
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual("333", result_json['transaction_id'])
+        self.assertEqual(500, result_json['code'])
diff --git a/orm/services/region_manager/rms/tests/tests_lcp_controller.py b/orm/services/region_manager/rms/tests/tests_lcp_controller.py
new file mode 100755
index 00000000..fff36de2
--- /dev/null
+++ b/orm/services/region_manager/rms/tests/tests_lcp_controller.py
@@ -0,0 +1,195 @@
+from mock import patch, MagicMock
+from wsme.exc import ClientSideError
+
+from rms.services import services
+from rms.controllers import lcp_controller
+
+from rms.model.model import RegionData, Regions, EndPoint
+from rms.services.error_base import NotFoundError
+
+import json
+
+from rms.controllers import lcp_controller as lcps
+
+from rms.tests import FunctionalTest
+
+
+TEST_REGIONS_DATA = [
+    {
+        "status": "1",
+        "vLCP_name": "n/a",
+        "ORD_EP": "http://ord1.com",
+        "horizon_EP": "http://horizon1.com",
+        "design_type": "n/a",
+        "AIC_version": "ranger_agent1.0",
+        "id": "SNA1",
+        "OS_version": "kilo",
+        "keystone_EP": "http://identity1.com",
+        "zone_name": "SNA1",
+        "location_type": "n/a"
+    },
+    {
+        "status": "0",
+        "vLCP_name": "n/a",
+        "ORD_EP": "http://ord2.com",
+        "horizon_EP": "http://horizon2.com",
+        "design_type": "n/a",
+        "AIC_version": "ranger_agent1.5",
+        "id": "SNA2",
+        "OS_version": "kilo",
+        "keystone_EP": "http://identity2.com",
+        "zone_name": "SNA2",
+        "location_type": "n/a"
+    },
+]
+
+end_point_ord_1 = EndPoint(publicurl="http://ord1.com",
+                           type="ord")
+end_point_identity_1 = EndPoint(publicurl="http://identity1.com",
+                                type="identity")
+end_point_horizon_1 = EndPoint(publicurl="http://horizon1.com",
+                               type="dashboard")
+
+end_point_ord_2 = EndPoint(publicurl="http://ord2.com",
+                           type="ord")
+end_point_identity_2 = EndPoint(publicurl="http://identity2.com",
+                                type="identity")
+end_point_horizon_2 = EndPoint(publicurl="http://horizon2.com",
+                               type="dashboard")
+end_points_1 = [end_point_ord_1, end_point_identity_1, end_point_horizon_1]
+end_points_2 = [end_point_ord_2, end_point_identity_2, end_point_horizon_2]
+
+region_data_sna1 = RegionData(status="functional", id="SNA1", name="SNA 1",
+                              clli="n/a", ranger_agent_version="ranger_agent1.0", design_type="n/a",
+                              location_type="n/a", vlcp_name="n/a", open_stack_version="kilo",
+                              endpoints=end_points_1)
+region_data_sna2 = RegionData(status="down", id="SNA2", name="SNA 2",
+                              clli="n/a", ranger_agent_version="ranger_agent1.5", design_type="n/a",
+                              location_type="n/a", vlcp_name="n/a", open_stack_version="kilo",
+                              endpoints=end_points_2)
+region_data_no_endpoints = RegionData(status="functional", id="SNA2", name="SNA 2",
+                                      clli="n/a", ranger_agent_version="ranger_agent1.5", design_type="n/a",
+                                      location_type="n/a", vlcp_name="n/a", open_stack_version="kilo")
+
+regions_mock = Regions([region_data_sna1, region_data_sna2])
+
+
+class TestLcpController(FunctionalTest):
+
+    @patch.object(services, 'get_regions_data', return_value=regions_mock)
+    def test_get_zones_success(self, regions_data):
+        zones = lcps.get_zones()
+        self.assertEqual(zones, TEST_REGIONS_DATA)
+
+    @patch.object(services, 'get_regions_data',
+                  side_effect=NotFoundError(message="No regions found!"))
+    def test_get_zones_get_regions_data_error(self, regions_data):
+        zones = lcps.get_zones()
+        self.assertEqual(zones, [])
+
+    # Test get_all in lcp_controller
+    @patch.object(lcp_controller, 'get_zones', return_value=TEST_REGIONS_DATA)
+    @patch.object(lcp_controller, 'authentication')
+    def test_get_all_success(self, mock_authentication, get_zones):
+
+        response = self.app.get('/lcp', expect_errors=True)
+        response_json = json.loads(response.body)
+
+        self.assertEqual(response_json, TEST_REGIONS_DATA)
+        self.assertEqual(response.status_int, 200)
+
+    @patch.object(lcp_controller, 'get_zones',
+                  side_effect=Exception("unknown error"))
+    @patch.object(lcp_controller.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 500,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '999',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=500))
+    @patch.object(lcp_controller, 'authentication')
+    def test_get_all_get_zones_error(self, mock_auth, err, get_zones):
+        temp_request = lcp_controller.request
+        lcp_controller.request = MagicMock()
+
+        response = self.app.get('/lcp', expect_errors=True)
+
+        lcp_controller.request = temp_request
+
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual("999", result_json['transaction_id'])
+        self.assertEqual(500, result_json['code'])
+
+    # Test get_one in lcp_controller
+    @patch.object(lcp_controller, 'get_zones', return_value=TEST_REGIONS_DATA)
+    @patch.object(lcp_controller, 'authentication')
+    def test_get_one_success(self, mock_authentication, get_zones):
+
+        response = self.app.get('/lcp/SNA1/', expect_errors=True)
+        response_json = json.loads(response.body)
+
+        self.assertEqual(response_json["zone_name"], "SNA1")
+        self.assertEqual(response_json["id"], "SNA1")
+        self.assertEqual(response.status_int, 200)
+
+    @patch.object(lcp_controller, 'get_zones',
+                  side_effect=Exception("unknown error"))
+    @patch.object(lcp_controller.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 500,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '555',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=500))
+    @patch.object(lcp_controller, 'authentication')
+    def test_get_one_get_zones_error(self, mock_auth, err, get_zones):
+        temp_request = lcp_controller.request
+        lcp_controller.request = MagicMock()
+
+        response = self.app.get('/lcp/1234', expect_errors=True)
+
+        lcp_controller.request = temp_request
+
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual("555", result_json['transaction_id'])
+        self.assertEqual(500, result_json['code'])
+
+    @patch.object(lcp_controller, 'get_zones', return_value=[])
+    @patch.object(lcp_controller.err_utils, 'get_error',
+                  return_value=ClientSideError(json.dumps({
+                      'code': 404,
+                      'type': 'test',
+                      'created': '0.0',
+                      'transaction_id': '444',
+                      'message': 'test',
+                      'details': 'test'
+                  }), status_code=404))
+    @patch.object(lcp_controller, 'authentication')
+    def test_get_one_not_found(self, mock_auth, err, get_zones):
+        temp_request = lcp_controller.request
+        lcp_controller.request = MagicMock()
+
+        response = self.app.get('/lcp/1234', expect_errors=True)
+
+        lcp_controller.request = temp_request
+
+        dict_body = json.loads(response.body)
+        result_json = json.loads(dict_body['faultstring'])
+
+        self.assertEqual("444", result_json['transaction_id'])
+        self.assertEqual(404, result_json['code'])
+
+    # Test get_one in lcp_controller
+    def test_build_zone_response_with_missing_endpoints(self,):
+        result = lcps.build_zone_response(region_data_no_endpoints)
+        self.assertEqual("", result['keystone_EP'])
+        self.assertEqual("", result['horizon_EP'])
+        self.assertEqual("", result['ORD_EP'])
diff --git a/orm/services/region_manager/rms/tests/utils/__init__.py b/orm/services/region_manager/rms/tests/utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/tests/utils/test_authentication.py b/orm/services/region_manager/rms/tests/utils/test_authentication.py
new file mode 100755
index 00000000..d0dc925c
--- /dev/null
+++ b/orm/services/region_manager/rms/tests/utils/test_authentication.py
@@ -0,0 +1,80 @@
+"""Authentication utilities module unittests."""
+import mock
+from rms.utils import authentication
+from rms.tests import FunctionalTest
+
+
+class TestGetConfiguration(FunctionalTest):
+    """Main authentication test case."""
+
+    @mock.patch.object(authentication.policy, 'authorize')
+    @mock.patch.object(authentication, '_get_keystone_ep')
+    @mock.patch.object(authentication, '_is_authorization_enabled')
+    def test_authorize_success(self, mock_iae, mock_gke, mock_authorize):
+        request = mock.MagicMock()
+        action = 'test:test'
+
+        # Success when authentication is disabled
+        mock_iae.return_value = False
+        authentication.authorize(request, action)
+
+        # Success when authentication is enabled
+        mock_iae.return_value = True
+        authentication.authorize(request, action)
+
+    def mock_authorize_no_keystone(self, *args, **kwargs):
+        self.assertIsNone(kwargs['keystone_ep'])
+
+    @mock.patch.object(authentication, 'policy')
+    @mock.patch.object(authentication, '_get_keystone_ep')
+    @mock.patch.object(authentication, '_is_authorization_enabled')
+    def test_authorize_gke_failed(self, mock_iae, mock_gke, mock_policy):
+        request = mock.MagicMock()
+        action = 'test:test'
+
+        # Success when authentication is disabled
+        mock_iae.return_value = False
+        authentication.authorize(request, action)
+
+        # Success when authentication is enabled
+        mock_iae.return_value = True
+        authentication.authorize(request, action)
+
+    @mock.patch.object(authentication, 'policy')
+    @mock.patch.object(authentication, '_get_keystone_ep',
+                       side_effect=ValueError('test'))
+    @mock.patch.object(authentication, '_is_authorization_enabled',
+                       return_value=True)
+    def test_authorize_gke_failed(self, mock_iae, mock_gke, mock_policy):
+        request = mock.MagicMock()
+        action = 'test:test'
+
+        mock_policy.authorize = self.mock_authorize_no_keystone
+        authentication.authorize(request, action)
+
+    def test_is_authorization_enabled(self):
+        app_conf = mock.MagicMock()
+
+        app_conf.authentication.enabled = True
+        self.assertTrue(authentication._is_authorization_enabled(app_conf))
+
+        app_conf.authentication.enabled = False
+        self.assertFalse(authentication._is_authorization_enabled(app_conf))
+
+    @mock.patch.object(authentication.RegionService,
+                       'get_region_by_id_or_name')
+    def test_get_keystone_ep_success(self, mock_grbion):
+        region = mock.MagicMock()
+        keystone_ep = mock.MagicMock()
+        keystone_ep.type = 'identity'
+        keystone_ep.publicurl = 'test'
+        region.endpoints = [keystone_ep]
+        mock_grbion.return_value = region
+
+        self.assertEqual(authentication._get_keystone_ep('region'),
+                         keystone_ep.publicurl)
+
+    @mock.patch.object(authentication.RegionService,
+                       'get_region_by_id_or_name')
+    def test_get_keystone_ep_no_keystone_ep(self, mock_grbion):
+        self.assertIsNone(authentication._get_keystone_ep('region'))
diff --git a/orm/services/region_manager/rms/utils/__init__.py b/orm/services/region_manager/rms/utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms/utils/authentication.py b/orm/services/region_manager/rms/utils/authentication.py
new file mode 100755
index 00000000..ae93d2ac
--- /dev/null
+++ b/orm/services/region_manager/rms/utils/authentication.py
@@ -0,0 +1,53 @@
+import logging
+
+from keystone_utils import tokens
+from orm_common.policy import policy
+from orm_common.utils import api_error_utils as err_utils
+
+from pecan import conf
+
+from rms.services import services as RegionService
+
+
+logger = logging.getLogger(__name__)
+
+
+def _get_keystone_ep(auth_region):
+    result = RegionService.get_region_by_id_or_name(auth_region)
+    for ep in result.endpoints:
+        if ep.type == 'identity':
+            return ep.publicurl
+
+    # Keystone EP not found
+    return None
+
+
+def authorize(request, action):
+    if not _is_authorization_enabled(conf):
+        return
+
+    auth_region = request.headers.get('X-Auth-Region')
+    try:
+        keystone_ep = _get_keystone_ep(auth_region)
+    except Exception:
+        # Failed to find Keystone EP - we'll set it to None instead of failing
+        # because the rule might be to let everyone pass
+        keystone_ep = None
+
+    policy.authorize(action, request, conf, keystone_ep=keystone_ep)
+
+
+def _is_authorization_enabled(app_conf):
+    return app_conf.authentication.enabled
+
+
+def get_token_conf(app_conf):
+    mech_id = app_conf.authentication.mech_id
+    mech_password = app_conf.authentication.mech_pass
+    # RMS URL is not necessary since this service is RMS
+    rms_url = ''
+    tenant_name = app_conf.authentication.tenant_name
+    keystone_version = app_conf.authentication.keystone_version
+    conf = tokens.TokenConf(mech_id, mech_password, rms_url, tenant_name,
+                            keystone_version)
+    return conf
diff --git a/orm/services/region_manager/rms_mock/MANIFEST.in b/orm/services/region_manager/rms_mock/MANIFEST.in
new file mode 100644
index 00000000..c922f11a
--- /dev/null
+++ b/orm/services/region_manager/rms_mock/MANIFEST.in
@@ -0,0 +1 @@
+recursive-include public *
diff --git a/orm/services/region_manager/rms_mock/__init__.py b/orm/services/region_manager/rms_mock/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms_mock/config.py b/orm/services/region_manager/rms_mock/config.py
new file mode 100644
index 00000000..eef79b91
--- /dev/null
+++ b/orm/services/region_manager/rms_mock/config.py
@@ -0,0 +1,56 @@
+# Server Specific Configurations
+server = {
+    'port': '8082',
+    'host': '0.0.0.0'
+}
+
+# Pecan Application Configurations
+app = {
+    'root': 'rms_mock.controllers.root.RootController',
+    'modules': ['rms_mock'],
+    'static_root': '%(confdir)s/public',
+    'template_path': '%(confdir)s/rms_mock/templates',
+    'debug': True,
+    'errors': {
+        404: '/error/404',
+        '__force_dict__': True
+    }
+}
+
+logging = {
+    'root': {'level': 'INFO', 'handlers': ['console']},
+    'loggers': {
+        'mock': {'level': 'DEBUG', 'handlers': ['console'],
+                 'propagate': False},
+        'pecan': {'level': 'DEBUG', 'handlers': ['console'],
+                  'propagate': False},
+        'py.warnings': {'handlers': ['console']},
+        '__force_dict__': True
+    },
+    'handlers': {
+        'console': {
+            'level': 'DEBUG',
+            'class': 'logging.StreamHandler',
+            'formatter': 'color'
+        }
+    },
+    'formatters': {
+        'simple': {
+            'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]'
+                       '[%(threadName)s] %(message)s')
+        },
+        'color': {
+            '()': 'pecan.log.ColorFormatter',
+            'format': ('%(asctime)s [%(padded_color_levelname)s] [%(name)s]'
+                       '[%(threadName)s] %(message)s'),
+            '__force_dict__': True
+        }
+    }
+}
+
+# Custom Configurations must be in Python dictionary format::
+#
+# foo = {'bar':'baz'}
+#
+# All configurations are accessible at::
+# pecan.conf
diff --git a/orm/services/region_manager/rms_mock/data/zones.json b/orm/services/region_manager/rms_mock/data/zones.json
new file mode 100644
index 00000000..fa83cdef
--- /dev/null
+++ b/orm/services/region_manager/rms_mock/data/zones.json
@@ -0,0 +1,4002 @@
+[
+  {
+    "site": {
+      "location_type": "Kaka",
+      "id": 0
+    },
+    "zonePurpose": {
+      "name": "56d560c0fdf7f8f3d54e0975",
+      "id": 1809
+    },
+    "powerType": {
+      "name": "56d560c0beb6b59b6971e4af",
+      "id": 5591
+    },
+    "designType": {
+      "name": "56d560c0e888eae4b4addf00",
+      "id": 7554
+    },
+    "zoneType": {
+      "name": "56d560c0b8cc195e24fc71f1",
+      "id": 5290
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 65,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-09-21"
+    },
+    "created": {
+      "date": "2015-07-17"
+    },
+    "name": "56d560c0077bed9896419fed",
+    "id": 0
+  },
+  {
+    "site": {
+      "location_type": "Gerber",
+      "id": 1
+    },
+    "zonePurpose": {
+      "name": "56d560c00be07167daaca128",
+      "id": 9905
+    },
+    "powerType": {
+      "name": "56d560c0df982f8d8b9a31bc",
+      "id": 1502
+    },
+    "designType": {
+      "name": "56d560c0444b508f593e5212",
+      "id": 5758
+    },
+    "zoneType": {
+      "name": "56d560c0b34cab98f98d7810",
+      "id": 3283
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 87,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-07-13"
+    },
+    "created": {
+      "date": "2014-12-31"
+    },
+    "name": "56d560c0fb8c3a1e604ea38a",
+    "id": 1
+  },
+  {
+    "site": {
+      "location_type": "Darlington",
+      "id": 2
+    },
+    "zonePurpose": {
+      "name": "56d560c07c31e09908d572a2",
+      "id": 4989
+    },
+    "powerType": {
+      "name": "56d560c0bacb2d27d3478ecb",
+      "id": 7287
+    },
+    "designType": {
+      "name": "56d560c0671119915dd2bfa3",
+      "id": 8755
+    },
+    "zoneType": {
+      "name": "56d560c08b54a95277893bec",
+      "id": 44
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 31,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-07-28"
+    },
+    "created": {
+      "date": "2015-01-02"
+    },
+    "name": "56d560c0ad15ee6584ea7f6a",
+    "id": 2
+  },
+  {
+    "site": {
+      "location_type": "Grapeview",
+      "id": 3
+    },
+    "zonePurpose": {
+      "name": "56d560c0e9ee854d68341aeb",
+      "id": 1559
+    },
+    "powerType": {
+      "name": "56d560c07241c8733f4930cf",
+      "id": 2162
+    },
+    "designType": {
+      "name": "56d560c0f8faf5af9e3ebe31",
+      "id": 3085
+    },
+    "zoneType": {
+      "name": "56d560c077c836936e75abb2",
+      "id": 1721
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 52,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-07-27"
+    },
+    "created": {
+      "date": "2015-06-01"
+    },
+    "name": "56d560c0287fb8c701fc9e38",
+    "id": 3
+  },
+  {
+    "site": {
+      "location_type": "Harborton",
+      "id": 4
+    },
+    "zonePurpose": {
+      "name": "56d560c0208f030996c82344",
+      "id": 1738
+    },
+    "powerType": {
+      "name": "56d560c08c42f6f945f944f1",
+      "id": 9090
+    },
+    "designType": {
+      "name": "56d560c06b7def38de502709",
+      "id": 8537
+    },
+    "zoneType": {
+      "name": "56d560c079b0fc1cef6d2222",
+      "id": 5724
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 40,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-07-22"
+    },
+    "created": {
+      "date": "2016-01-02"
+    },
+    "name": "56d560c0b77f19e071949de8",
+    "id": 4
+  },
+  {
+    "site": {
+      "location_type": "Loma",
+      "id": 5
+    },
+    "zonePurpose": {
+      "name": "56d560c0ec3e2ac7b2c0f152",
+      "id": 8000
+    },
+    "powerType": {
+      "name": "56d560c0d0ec627f037015bb",
+      "id": 9791
+    },
+    "designType": {
+      "name": "56d560c0bd04e377a0dd0f2c",
+      "id": 2792
+    },
+    "zoneType": {
+      "name": "56d560c0f6d83b30489af6f5",
+      "id": 3254
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 69,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-09-10"
+    },
+    "created": {
+      "date": "2015-06-28"
+    },
+    "name": "56d560c0f1fa91683d500f95",
+    "id": 5
+  },
+  {
+    "site": {
+      "location_type": "Conestoga",
+      "id": 6
+    },
+    "zonePurpose": {
+      "name": "56d560c053d0ef55f8ea6d97",
+      "id": 9496
+    },
+    "powerType": {
+      "name": "56d560c079ffaf8bce92e04d",
+      "id": 3434
+    },
+    "designType": {
+      "name": "56d560c02416964249a44183",
+      "id": 3247
+    },
+    "zoneType": {
+      "name": "56d560c0186ca3357e09d971",
+      "id": 2673
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 64,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-11-06"
+    },
+    "created": {
+      "date": "2015-04-07"
+    },
+    "name": "56d560c0661fa2553b08bf58",
+    "id": 6
+  },
+  {
+    "site": {
+      "location_type": "Robbins",
+      "id": 7
+    },
+    "zonePurpose": {
+      "name": "56d560c02705578ca9d2a544",
+      "id": 3572
+    },
+    "powerType": {
+      "name": "56d560c08afb35dcb4059ea2",
+      "id": 4462
+    },
+    "designType": {
+      "name": "56d560c0d56b34acf3db716e",
+      "id": 8982
+    },
+    "zoneType": {
+      "name": "56d560c033901a4be0ac0f75",
+      "id": 3828
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 48,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-05-13"
+    },
+    "created": {
+      "date": "2015-11-14"
+    },
+    "name": "56d560c097454dbe336965d4",
+    "id": 7
+  },
+  {
+    "site": {
+      "location_type": "Levant",
+      "id": 8
+    },
+    "zonePurpose": {
+      "name": "56d560c036b795db4f296524",
+      "id": 8868
+    },
+    "powerType": {
+      "name": "56d560c0960ffb1caa91bc60",
+      "id": 6739
+    },
+    "designType": {
+      "name": "56d560c0e7171703cc080421",
+      "id": 6038
+    },
+    "zoneType": {
+      "name": "56d560c0daa037ee05426ba2",
+      "id": 5118
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 75,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-01-25"
+    },
+    "created": {
+      "date": "2014-12-20"
+    },
+    "name": "56d560c008fa52b023b29fc5",
+    "id": 8
+  },
+  {
+    "site": {
+      "location_type": "Ruckersville",
+      "id": 9
+    },
+    "zonePurpose": {
+      "name": "56d560c0b4c0c5f87861b820",
+      "id": 2198
+    },
+    "powerType": {
+      "name": "56d560c0dd9c2d8249119d7d",
+      "id": 6208
+    },
+    "designType": {
+      "name": "56d560c00ae96c94d4e5130c",
+      "id": 6494
+    },
+    "zoneType": {
+      "name": "56d560c04e9cd43ba9b82a99",
+      "id": 8232
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 60,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-05-20"
+    },
+    "created": {
+      "date": "2014-09-12"
+    },
+    "name": "56d560c0ef468199f4ce9fbe",
+    "id": 9
+  },
+  {
+    "site": {
+      "location_type": "Darbydale",
+      "id": 10
+    },
+    "zonePurpose": {
+      "name": "56d560c0568a1bc602c2a516",
+      "id": 4225
+    },
+    "powerType": {
+      "name": "56d560c016040e62ccfb0d91",
+      "id": 3783
+    },
+    "designType": {
+      "name": "56d560c0f3ba7341a17d8185",
+      "id": 2087
+    },
+    "zoneType": {
+      "name": "56d560c0d5b6fd0898c2e906",
+      "id": 836
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 12,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-12-22"
+    },
+    "created": {
+      "date": "2014-10-21"
+    },
+    "name": "56d560c03585ccd60db30317",
+    "id": 10
+  },
+  {
+    "site": {
+      "location_type": "Russellville",
+      "id": 11
+    },
+    "zonePurpose": {
+      "name": "56d560c07db2ad46c813de9a",
+      "id": 6894
+    },
+    "powerType": {
+      "name": "56d560c0a0caca1bcd68427e",
+      "id": 9151
+    },
+    "designType": {
+      "name": "56d560c00203072ed32a04de",
+      "id": 6937
+    },
+    "zoneType": {
+      "name": "56d560c0e70b8710fa947299",
+      "id": 2205
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 67,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-01-22"
+    },
+    "created": {
+      "date": "2014-12-21"
+    },
+    "name": "56d560c0e4749a49c3aa5c1a",
+    "id": 11
+  },
+  {
+    "site": {
+      "location_type": "Torboy",
+      "id": 12
+    },
+    "zonePurpose": {
+      "name": "56d560c0d2dfe463240d2aec",
+      "id": 6800
+    },
+    "powerType": {
+      "name": "56d560c0e9dfc4d729a79d88",
+      "id": 5345
+    },
+    "designType": {
+      "name": "56d560c0269658c50beef835",
+      "id": 2533
+    },
+    "zoneType": {
+      "name": "56d560c0cc3b33209a39b847",
+      "id": 6875
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 2,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-10-05"
+    },
+    "created": {
+      "date": "2014-07-08"
+    },
+    "name": "56d560c053960ab24ca0805e",
+    "id": 12
+  },
+  {
+    "site": {
+      "location_type": "Sunbury",
+      "id": 13
+    },
+    "zonePurpose": {
+      "name": "56d560c080bee9492ac82b1d",
+      "id": 4413
+    },
+    "powerType": {
+      "name": "56d560c02dc6868b70818fa2",
+      "id": 8623
+    },
+    "designType": {
+      "name": "56d560c07f9ccb7b84fad7bb",
+      "id": 2265
+    },
+    "zoneType": {
+      "name": "56d560c0ca5601d3f78203aa",
+      "id": 7699
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 71,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-08-15"
+    },
+    "created": {
+      "date": "2014-10-25"
+    },
+    "name": "56d560c03d488b2cc84a1dda",
+    "id": 13
+  },
+  {
+    "site": {
+      "location_type": "Lynn",
+      "id": 14
+    },
+    "zonePurpose": {
+      "name": "56d560c09a23c4ecd0ed752c",
+      "id": 9861
+    },
+    "powerType": {
+      "name": "56d560c00f300e4c7e8b1cd0",
+      "id": 8714
+    },
+    "designType": {
+      "name": "56d560c08aa0f77bd0795e90",
+      "id": 2862
+    },
+    "zoneType": {
+      "name": "56d560c0aad9980362e9a1b6",
+      "id": 6874
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 18,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-10-18"
+    },
+    "created": {
+      "date": "2014-04-30"
+    },
+    "name": "56d560c051688c89f3de807c",
+    "id": 14
+  },
+  {
+    "site": {
+      "location_type": "Nash",
+      "id": 15
+    },
+    "zonePurpose": {
+      "name": "56d560c0b7308257f2b028c0",
+      "id": 4799
+    },
+    "powerType": {
+      "name": "56d560c0d03dd4e556b6f928",
+      "id": 2694
+    },
+    "designType": {
+      "name": "56d560c05c8de483d88ba5a8",
+      "id": 73
+    },
+    "zoneType": {
+      "name": "56d560c07a4a13778f1e48ac",
+      "id": 8245
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 23,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-09-01"
+    },
+    "created": {
+      "date": "2015-11-22"
+    },
+    "name": "56d560c0a29e37498b71e70d",
+    "id": 15
+  },
+  {
+    "site": {
+      "location_type": "Cascades",
+      "id": 16
+    },
+    "zonePurpose": {
+      "name": "56d560c045a7ed95d8ad744b",
+      "id": 6161
+    },
+    "powerType": {
+      "name": "56d560c051cf90347cbad974",
+      "id": 6327
+    },
+    "designType": {
+      "name": "56d560c01f480e20a6cc9ad0",
+      "id": 6763
+    },
+    "zoneType": {
+      "name": "56d560c0b111b46a36a74504",
+      "id": 6658
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 99,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-05-05"
+    },
+    "created": {
+      "date": "2016-02-09"
+    },
+    "name": "56d560c057f556e9c3c1c6b6",
+    "id": 16
+  },
+  {
+    "site": {
+      "location_type": "Alamo",
+      "id": 17
+    },
+    "zonePurpose": {
+      "name": "56d560c0fe44e205be539cf3",
+      "id": 6946
+    },
+    "powerType": {
+      "name": "56d560c09cc6b3e45ff59c07",
+      "id": 4407
+    },
+    "designType": {
+      "name": "56d560c0a980159b631c9e5b",
+      "id": 3171
+    },
+    "zoneType": {
+      "name": "56d560c09d49a4761a48ffe3",
+      "id": 4357
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 99,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2016-02-01"
+    },
+    "created": {
+      "date": "2014-07-31"
+    },
+    "name": "56d560c00cf5a2760cf08e41",
+    "id": 17
+  },
+  {
+    "site": {
+      "location_type": "Frystown",
+      "id": 18
+    },
+    "zonePurpose": {
+      "name": "56d560c05952a93c02b6b576",
+      "id": 7733
+    },
+    "powerType": {
+      "name": "56d560c056fdce251c91a768",
+      "id": 7114
+    },
+    "designType": {
+      "name": "56d560c0ef82a3e2338ea7d0",
+      "id": 5849
+    },
+    "zoneType": {
+      "name": "56d560c0a65759eb60f29950",
+      "id": 8347
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 10,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-10-04"
+    },
+    "created": {
+      "date": "2014-04-02"
+    },
+    "name": "56d560c0241cde7ce6c58188",
+    "id": 18
+  },
+  {
+    "site": {
+      "location_type": "Brantleyville",
+      "id": 19
+    },
+    "zonePurpose": {
+      "name": "56d560c06a25d6dc604f01e0",
+      "id": 1082
+    },
+    "powerType": {
+      "name": "56d560c03d5d6ad44a79d1a1",
+      "id": 7015
+    },
+    "designType": {
+      "name": "56d560c0151053ff69026777",
+      "id": 3352
+    },
+    "zoneType": {
+      "name": "56d560c0fd123e68b408ed90",
+      "id": 6766
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 12,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-06-30"
+    },
+    "created": {
+      "date": "2016-01-25"
+    },
+    "name": "56d560c03c73665ebdc6056b",
+    "id": 19
+  },
+  {
+    "site": {
+      "location_type": "Cannondale",
+      "id": 20
+    },
+    "zonePurpose": {
+      "name": "56d560c09478dd6f647504dd",
+      "id": 1005
+    },
+    "powerType": {
+      "name": "56d560c0bc4043e8c6deb18a",
+      "id": 9489
+    },
+    "designType": {
+      "name": "56d560c04be3e637fa5c092f",
+      "id": 9217
+    },
+    "zoneType": {
+      "name": "56d560c0edcd5d451ffc6426",
+      "id": 4048
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 60,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-07-08"
+    },
+    "created": {
+      "date": "2015-04-09"
+    },
+    "name": "56d560c016415f96723501d1",
+    "id": 20
+  },
+  {
+    "site": {
+      "location_type": "Leyner",
+      "id": 21
+    },
+    "zonePurpose": {
+      "name": "56d560c04d8e23fd99da120b",
+      "id": 5456
+    },
+    "powerType": {
+      "name": "56d560c0df29852762a05de6",
+      "id": 7454
+    },
+    "designType": {
+      "name": "56d560c0758cd1219562ffb6",
+      "id": 4913
+    },
+    "zoneType": {
+      "name": "56d560c056dfdc9fc398dbed",
+      "id": 4009
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 59,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-07-02"
+    },
+    "created": {
+      "date": "2014-10-01"
+    },
+    "name": "56d560c0ce9b895539518fe3",
+    "id": 21
+  },
+  {
+    "site": {
+      "location_type": "Gorham",
+      "id": 22
+    },
+    "zonePurpose": {
+      "name": "56d560c0adebb96d11f6f791",
+      "id": 3097
+    },
+    "powerType": {
+      "name": "56d560c013eb6c1f0105810c",
+      "id": 8159
+    },
+    "designType": {
+      "name": "56d560c0c4863be25cc9dfa4",
+      "id": 1517
+    },
+    "zoneType": {
+      "name": "56d560c06b0ca411cb84a07e",
+      "id": 6974
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 92,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-10-08"
+    },
+    "created": {
+      "date": "2015-07-08"
+    },
+    "name": "56d560c0e24d04e0e61880dc",
+    "id": 22
+  },
+  {
+    "site": {
+      "location_type": "Fillmore",
+      "id": 23
+    },
+    "zonePurpose": {
+      "name": "56d560c066c130964a8f58d6",
+      "id": 5072
+    },
+    "powerType": {
+      "name": "56d560c0acf54c89ed29b3b2",
+      "id": 8943
+    },
+    "designType": {
+      "name": "56d560c0fb24b2f45d1dc3d9",
+      "id": 7884
+    },
+    "zoneType": {
+      "name": "56d560c054d47b34cb47f35d",
+      "id": 4668
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 5,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-07-15"
+    },
+    "created": {
+      "date": "2014-10-26"
+    },
+    "name": "56d560c0126cddd5f1a987bd",
+    "id": 23
+  },
+  {
+    "site": {
+      "location_type": "Greer",
+      "id": 24
+    },
+    "zonePurpose": {
+      "name": "56d560c05349527b410d1e7e",
+      "id": 3018
+    },
+    "powerType": {
+      "name": "56d560c0da936cb67de27921",
+      "id": 9559
+    },
+    "designType": {
+      "name": "56d560c0724f86e6a6a6afb2",
+      "id": 119
+    },
+    "zoneType": {
+      "name": "56d560c001633e4d0d567b48",
+      "id": 6613
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 18,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-10-30"
+    },
+    "created": {
+      "date": "2014-04-26"
+    },
+    "name": "56d560c0fc34077ac5f8babc",
+    "id": 24
+  },
+  {
+    "site": {
+      "location_type": "Bison",
+      "id": 25
+    },
+    "zonePurpose": {
+      "name": "56d560c0247024acf62455c3",
+      "id": 2622
+    },
+    "powerType": {
+      "name": "56d560c0ddb7f3280470d846",
+      "id": 7570
+    },
+    "designType": {
+      "name": "56d560c0c9ae1912a40456ce",
+      "id": 1433
+    },
+    "zoneType": {
+      "name": "56d560c0bce9c1f9c3b920f5",
+      "id": 2768
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 60,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2016-01-23"
+    },
+    "created": {
+      "date": "2016-01-21"
+    },
+    "name": "56d560c0c79b04a794c6c887",
+    "id": 25
+  },
+  {
+    "site": {
+      "location_type": "Smeltertown",
+      "id": 26
+    },
+    "zonePurpose": {
+      "name": "56d560c069b4a5fddb8d7d4c",
+      "id": 4235
+    },
+    "powerType": {
+      "name": "56d560c05a31f12df87e86b8",
+      "id": 422
+    },
+    "designType": {
+      "name": "56d560c022ef9593330519b0",
+      "id": 9307
+    },
+    "zoneType": {
+      "name": "56d560c0a8f766c6482cd548",
+      "id": 3376
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 33,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-03-01"
+    },
+    "created": {
+      "date": "2015-12-03"
+    },
+    "name": "56d560c033ae93c228322b30",
+    "id": 26
+  },
+  {
+    "site": {
+      "location_type": "Lodoga",
+      "id": 27
+    },
+    "zonePurpose": {
+      "name": "56d560c085d1df36b4cfc240",
+      "id": 3966
+    },
+    "powerType": {
+      "name": "56d560c0ae10ed5eaf5d4f1b",
+      "id": 6883
+    },
+    "designType": {
+      "name": "56d560c099ed12e73d38d06f",
+      "id": 5884
+    },
+    "zoneType": {
+      "name": "56d560c06cbb0fb0ed806eb4",
+      "id": 6026
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 98,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-04-29"
+    },
+    "created": {
+      "date": "2015-04-16"
+    },
+    "name": "56d560c029fddda29ae94099",
+    "id": 27
+  },
+  {
+    "site": {
+      "location_type": "Castleton",
+      "id": 28
+    },
+    "zonePurpose": {
+      "name": "56d560c005d5523efa88f11b",
+      "id": 9223
+    },
+    "powerType": {
+      "name": "56d560c066631aa8ec5c366e",
+      "id": 1442
+    },
+    "designType": {
+      "name": "56d560c00fc0fdad15c53ca2",
+      "id": 2050
+    },
+    "zoneType": {
+      "name": "56d560c024dd7d85839c6fba",
+      "id": 3735
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 39,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-02-19"
+    },
+    "created": {
+      "date": "2015-11-16"
+    },
+    "name": "56d560c0ce0e3a71cf4fd6bb",
+    "id": 28
+  },
+  {
+    "site": {
+      "location_type": "Tilleda",
+      "id": 29
+    },
+    "zonePurpose": {
+      "name": "56d560c020be752d13e4f0cd",
+      "id": 7834
+    },
+    "powerType": {
+      "name": "56d560c03cecf2671bb9ee2c",
+      "id": 3227
+    },
+    "designType": {
+      "name": "56d560c08837945128d96159",
+      "id": 1698
+    },
+    "zoneType": {
+      "name": "56d560c04fdf224ad8d0a998",
+      "id": 6490
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 79,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-03-02"
+    },
+    "created": {
+      "date": "2015-04-14"
+    },
+    "name": "56d560c0a78a2aea1e5df5b5",
+    "id": 29
+  },
+  {
+    "site": {
+      "location_type": "Valmy",
+      "id": 30
+    },
+    "zonePurpose": {
+      "name": "56d560c0b788c77b8c16e01c",
+      "id": 6296
+    },
+    "powerType": {
+      "name": "56d560c08ef889d6a7e215dd",
+      "id": 8792
+    },
+    "designType": {
+      "name": "56d560c041bb436f46172e7b",
+      "id": 9819
+    },
+    "zoneType": {
+      "name": "56d560c061fac9825e323af2",
+      "id": 465
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 53,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-03-09"
+    },
+    "created": {
+      "date": "2014-09-16"
+    },
+    "name": "56d560c03191b8f63969fd4e",
+    "id": 30
+  },
+  {
+    "site": {
+      "location_type": "Blue",
+      "id": 31
+    },
+    "zonePurpose": {
+      "name": "56d560c0b51a91dbdac3fc36",
+      "id": 1343
+    },
+    "powerType": {
+      "name": "56d560c046c5c6fa155f9ecf",
+      "id": 7517
+    },
+    "designType": {
+      "name": "56d560c06ef3ee967b7f5ccb",
+      "id": 8951
+    },
+    "zoneType": {
+      "name": "56d560c0286719c68089524b",
+      "id": 2042
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 87,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-11-16"
+    },
+    "created": {
+      "date": "2014-02-26"
+    },
+    "name": "56d560c03bb51163ed1e028e",
+    "id": 31
+  },
+  {
+    "site": {
+      "location_type": "Herlong",
+      "id": 32
+    },
+    "zonePurpose": {
+      "name": "56d560c0a69f976fe08f03af",
+      "id": 7471
+    },
+    "powerType": {
+      "name": "56d560c0aac0198e0745d8ba",
+      "id": 6107
+    },
+    "designType": {
+      "name": "56d560c0eed43fd9c0a94abb",
+      "id": 3396
+    },
+    "zoneType": {
+      "name": "56d560c01e08dd515acd4d45",
+      "id": 8826
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 34,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-10-16"
+    },
+    "created": {
+      "date": "2014-05-11"
+    },
+    "name": "56d560c049ca7f5030e09cb6",
+    "id": 32
+  },
+  {
+    "site": {
+      "location_type": "Rodanthe",
+      "id": 33
+    },
+    "zonePurpose": {
+      "name": "56d560c0c968144ed07e180a",
+      "id": 7716
+    },
+    "powerType": {
+      "name": "56d560c0e9c14ccda611a97b",
+      "id": 2584
+    },
+    "designType": {
+      "name": "56d560c090b97312fabcceba",
+      "id": 5558
+    },
+    "zoneType": {
+      "name": "56d560c01157ab8f0bb3e7cb",
+      "id": 5173
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 38,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-11-23"
+    },
+    "created": {
+      "date": "2015-10-29"
+    },
+    "name": "56d560c0326a70418fa07b91",
+    "id": 33
+  },
+  {
+    "site": {
+      "location_type": "Sanders",
+      "id": 34
+    },
+    "zonePurpose": {
+      "name": "56d560c01cea86b9060ac9bb",
+      "id": 3675
+    },
+    "powerType": {
+      "name": "56d560c082b8301ac84dc675",
+      "id": 5335
+    },
+    "designType": {
+      "name": "56d560c0d5f62bcd51abea28",
+      "id": 5121
+    },
+    "zoneType": {
+      "name": "56d560c066c5e191a879b52f",
+      "id": 2578
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 91,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-01-08"
+    },
+    "created": {
+      "date": "2014-10-18"
+    },
+    "name": "56d560c00f6e15f9503ea384",
+    "id": 34
+  },
+  {
+    "site": {
+      "location_type": "Calverton",
+      "id": 35
+    },
+    "zonePurpose": {
+      "name": "56d560c030cfa637f749326e",
+      "id": 5236
+    },
+    "powerType": {
+      "name": "56d560c05e23eb35e0b7432e",
+      "id": 5964
+    },
+    "designType": {
+      "name": "56d560c0df297a2eb168afcb",
+      "id": 5343
+    },
+    "zoneType": {
+      "name": "56d560c04cb3698141129144",
+      "id": 5191
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 27,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-12-15"
+    },
+    "created": {
+      "date": "2014-01-09"
+    },
+    "name": "56d560c0a2642bbad9f0180b",
+    "id": 35
+  },
+  {
+    "site": {
+      "location_type": "Rote",
+      "id": 36
+    },
+    "zonePurpose": {
+      "name": "56d560c08a8518cf01863a4d",
+      "id": 1290
+    },
+    "powerType": {
+      "name": "56d560c0832ecb1823e069a8",
+      "id": 1429
+    },
+    "designType": {
+      "name": "56d560c009191b5429961c39",
+      "id": 4446
+    },
+    "zoneType": {
+      "name": "56d560c05b4413606834951e",
+      "id": 3055
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 93,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-03-02"
+    },
+    "created": {
+      "date": "2014-01-03"
+    },
+    "name": "56d560c07ee2080ff4bcd900",
+    "id": 36
+  },
+  {
+    "site": {
+      "location_type": "Gloucester",
+      "id": 37
+    },
+    "zonePurpose": {
+      "name": "56d560c0100e69fbd25caecf",
+      "id": 934
+    },
+    "powerType": {
+      "name": "56d560c0b83644ed71029eb5",
+      "id": 7837
+    },
+    "designType": {
+      "name": "56d560c0b27c1d8d3ac70e4b",
+      "id": 1098
+    },
+    "zoneType": {
+      "name": "56d560c0620d33989ab375e2",
+      "id": 8544
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 22,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-07-09"
+    },
+    "created": {
+      "date": "2015-12-17"
+    },
+    "name": "56d560c071b95693ff3def45",
+    "id": 37
+  },
+  {
+    "site": {
+      "location_type": "Libertytown",
+      "id": 38
+    },
+    "zonePurpose": {
+      "name": "56d560c07d322c6dda1f0d61",
+      "id": 8516
+    },
+    "powerType": {
+      "name": "56d560c049c685a3f3a2bc3f",
+      "id": 7844
+    },
+    "designType": {
+      "name": "56d560c0f5fc4a8172d02db2",
+      "id": 2358
+    },
+    "zoneType": {
+      "name": "56d560c0bb27ffeb81c307b4",
+      "id": 1292
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 3,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-11-17"
+    },
+    "created": {
+      "date": "2016-02-06"
+    },
+    "name": "56d560c0397247302b0703bc",
+    "id": 38
+  },
+  {
+    "site": {
+      "location_type": "Madrid",
+      "id": 39
+    },
+    "zonePurpose": {
+      "name": "56d560c081d6850fca450f46",
+      "id": 9765
+    },
+    "powerType": {
+      "name": "56d560c082e495ba33e3ace3",
+      "id": 9109
+    },
+    "designType": {
+      "name": "56d560c00f831dfdd97f4aea",
+      "id": 1050
+    },
+    "zoneType": {
+      "name": "56d560c058b8cf043e0ddefc",
+      "id": 7071
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 3,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-05-07"
+    },
+    "created": {
+      "date": "2016-01-16"
+    },
+    "name": "56d560c065e33d4a7a97d6dc",
+    "id": 39
+  },
+  {
+    "site": {
+      "location_type": "Magnolia",
+      "id": 40
+    },
+    "zonePurpose": {
+      "name": "56d560c045ac9fed80740a73",
+      "id": 2020
+    },
+    "powerType": {
+      "name": "56d560c03c71f014cb6f41dd",
+      "id": 538
+    },
+    "designType": {
+      "name": "56d560c0dda73cacfaf7f70a",
+      "id": 3698
+    },
+    "zoneType": {
+      "name": "56d560c028d3df2a8a5a7097",
+      "id": 5185
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 42,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-05-30"
+    },
+    "created": {
+      "date": "2014-10-07"
+    },
+    "name": "56d560c079539139c836d585",
+    "id": 40
+  },
+  {
+    "site": {
+      "location_type": "Gilmore",
+      "id": 41
+    },
+    "zonePurpose": {
+      "name": "56d560c086d55b3215b897c1",
+      "id": 2761
+    },
+    "powerType": {
+      "name": "56d560c0af644b576afd4591",
+      "id": 9758
+    },
+    "designType": {
+      "name": "56d560c02e4e7a560f5b1c9e",
+      "id": 3327
+    },
+    "zoneType": {
+      "name": "56d560c01afef659bbd2a63e",
+      "id": 8009
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 15,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-05-05"
+    },
+    "created": {
+      "date": "2015-06-09"
+    },
+    "name": "56d560c052f661383788f819",
+    "id": 41
+  },
+  {
+    "site": {
+      "location_type": "Wheaton",
+      "id": 42
+    },
+    "zonePurpose": {
+      "name": "56d560c091897930e4a321ac",
+      "id": 7099
+    },
+    "powerType": {
+      "name": "56d560c0144e5a67a1c23005",
+      "id": 1417
+    },
+    "designType": {
+      "name": "56d560c0ec1399e14c3831c7",
+      "id": 7711
+    },
+    "zoneType": {
+      "name": "56d560c038f7cb1be99a077c",
+      "id": 8038
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 35,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-08-07"
+    },
+    "created": {
+      "date": "2014-04-30"
+    },
+    "name": "56d560c0107734f625b3c7e0",
+    "id": 42
+  },
+  {
+    "site": {
+      "location_type": "Delwood",
+      "id": 43
+    },
+    "zonePurpose": {
+      "name": "56d560c041eec1fca5437a00",
+      "id": 2300
+    },
+    "powerType": {
+      "name": "56d560c06285c6b65af88f7a",
+      "id": 6106
+    },
+    "designType": {
+      "name": "56d560c01ccd49801ba9cfbd",
+      "id": 7534
+    },
+    "zoneType": {
+      "name": "56d560c0626dafd003dc0ba1",
+      "id": 6481
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 41,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-08-12"
+    },
+    "created": {
+      "date": "2015-12-28"
+    },
+    "name": "56d560c00fd3ffc699a9a9f5",
+    "id": 43
+  },
+  {
+    "site": {
+      "location_type": "Chumuckla",
+      "id": 44
+    },
+    "zonePurpose": {
+      "name": "56d560c04b034f9b2f39a1a2",
+      "id": 7511
+    },
+    "powerType": {
+      "name": "56d560c00d6710729c93866d",
+      "id": 4002
+    },
+    "designType": {
+      "name": "56d560c00251b1d8f74040db",
+      "id": 1474
+    },
+    "zoneType": {
+      "name": "56d560c0d20f69bdb0f8e8ac",
+      "id": 5392
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 43,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-01-01"
+    },
+    "created": {
+      "date": "2015-01-10"
+    },
+    "name": "56d560c0f4a03df16f4d6081",
+    "id": 44
+  },
+  {
+    "site": {
+      "location_type": "Blanford",
+      "id": 45
+    },
+    "zonePurpose": {
+      "name": "56d560c07ebae1008545f665",
+      "id": 5638
+    },
+    "powerType": {
+      "name": "56d560c0f77e9bbc9460232e",
+      "id": 76
+    },
+    "designType": {
+      "name": "56d560c0497eb03d1071195c",
+      "id": 6700
+    },
+    "zoneType": {
+      "name": "56d560c066046abba79d8dcb",
+      "id": 2329
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 25,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-09-04"
+    },
+    "created": {
+      "date": "2015-11-23"
+    },
+    "name": "56d560c09b6527b949303ffb",
+    "id": 45
+  },
+  {
+    "site": {
+      "location_type": "Bascom",
+      "id": 46
+    },
+    "zonePurpose": {
+      "name": "56d560c0ee8d4ea5a1dd0243",
+      "id": 2815
+    },
+    "powerType": {
+      "name": "56d560c01adc0eeaceed92fe",
+      "id": 224
+    },
+    "designType": {
+      "name": "56d560c008e6c030928e09e4",
+      "id": 338
+    },
+    "zoneType": {
+      "name": "56d560c0aabadfa119131e0a",
+      "id": 6656
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 59,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-10-29"
+    },
+    "created": {
+      "date": "2014-01-06"
+    },
+    "name": "56d560c0289c2a2965c76497",
+    "id": 46
+  },
+  {
+    "site": {
+      "location_type": "Harold",
+      "id": 47
+    },
+    "zonePurpose": {
+      "name": "56d560c0731d5299d3122f2b",
+      "id": 4243
+    },
+    "powerType": {
+      "name": "56d560c00e9f70ce6b329a26",
+      "id": 2150
+    },
+    "designType": {
+      "name": "56d560c0a8f6e4445bdd6169",
+      "id": 7391
+    },
+    "zoneType": {
+      "name": "56d560c0bf5adf58ffffb14d",
+      "id": 2719
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 41,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-08-29"
+    },
+    "created": {
+      "date": "2014-12-30"
+    },
+    "name": "56d560c01f75f39e09e3c9f3",
+    "id": 47
+  },
+  {
+    "site": {
+      "location_type": "Roosevelt",
+      "id": 48
+    },
+    "zonePurpose": {
+      "name": "56d560c0988d063eb71729a7",
+      "id": 6667
+    },
+    "powerType": {
+      "name": "56d560c0ad31768ea1ddca09",
+      "id": 6991
+    },
+    "designType": {
+      "name": "56d560c0c28c4c6758652c3c",
+      "id": 5256
+    },
+    "zoneType": {
+      "name": "56d560c01bebe9061aa47d00",
+      "id": 6970
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 57,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2016-01-29"
+    },
+    "created": {
+      "date": "2015-09-30"
+    },
+    "name": "56d560c0d1b8adfa554b6423",
+    "id": 48
+  },
+  {
+    "site": {
+      "location_type": "Leland",
+      "id": 49
+    },
+    "zonePurpose": {
+      "name": "56d560c00423da2f23b6dcb1",
+      "id": 8098
+    },
+    "powerType": {
+      "name": "56d560c01792c147706146cd",
+      "id": 8653
+    },
+    "designType": {
+      "name": "56d560c0c789b9e3a0770593",
+      "id": 2149
+    },
+    "zoneType": {
+      "name": "56d560c0b5f828802b16e82a",
+      "id": 7818
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 98,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-07-06"
+    },
+    "created": {
+      "date": "2014-12-30"
+    },
+    "name": "56d560c01eef9e6dff0eeb5d",
+    "id": 49
+  },
+  {
+    "site": {
+      "location_type": "Jardine",
+      "id": 50
+    },
+    "zonePurpose": {
+      "name": "56d560c0cb9345d9d38fede8",
+      "id": 2308
+    },
+    "powerType": {
+      "name": "56d560c0e9fd1b050d95ae66",
+      "id": 3012
+    },
+    "designType": {
+      "name": "56d560c02d1e2244a85d7baf",
+      "id": 9549
+    },
+    "zoneType": {
+      "name": "56d560c09f247522857fc0f6",
+      "id": 6134
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 48,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-10-10"
+    },
+    "created": {
+      "date": "2014-11-25"
+    },
+    "name": "56d560c09f8a40e4324a4280",
+    "id": 50
+  },
+  {
+    "site": {
+      "location_type": "Trona",
+      "id": 51
+    },
+    "zonePurpose": {
+      "name": "56d560c0d7077ede587d4592",
+      "id": 3824
+    },
+    "powerType": {
+      "name": "56d560c058dd0e17896b96a9",
+      "id": 5409
+    },
+    "designType": {
+      "name": "56d560c0f36bfb970b33ffe6",
+      "id": 7274
+    },
+    "zoneType": {
+      "name": "56d560c0a4860ed240407db0",
+      "id": 4302
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 15,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-05-30"
+    },
+    "created": {
+      "date": "2014-02-18"
+    },
+    "name": "56d560c06d460d876cb74409",
+    "id": 51
+  },
+  {
+    "site": {
+      "location_type": "Whitestone",
+      "id": 52
+    },
+    "zonePurpose": {
+      "name": "56d560c0006314920e70e82c",
+      "id": 7292
+    },
+    "powerType": {
+      "name": "56d560c0ebee34abaaa4204d",
+      "id": 3853
+    },
+    "designType": {
+      "name": "56d560c038c35079789da1de",
+      "id": 5965
+    },
+    "zoneType": {
+      "name": "56d560c0013d9ded4cfbc59f",
+      "id": 8513
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 99,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-10-05"
+    },
+    "created": {
+      "date": "2015-01-02"
+    },
+    "name": "56d560c0f5386dfbbfd4039b",
+    "id": 52
+  },
+  {
+    "site": {
+      "location_type": "Lupton",
+      "id": 53
+    },
+    "zonePurpose": {
+      "name": "56d560c0410f97fbd39bb188",
+      "id": 6797
+    },
+    "powerType": {
+      "name": "56d560c06eafb4db025f1106",
+      "id": 2265
+    },
+    "designType": {
+      "name": "56d560c0a16a7371f3b818d5",
+      "id": 8569
+    },
+    "zoneType": {
+      "name": "56d560c08f19993f2e6e26a0",
+      "id": 1021
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 14,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-06-19"
+    },
+    "created": {
+      "date": "2014-04-06"
+    },
+    "name": "56d560c080ca44dd12438645",
+    "id": 53
+  },
+  {
+    "site": {
+      "location_type": "Rivera",
+      "id": 54
+    },
+    "zonePurpose": {
+      "name": "56d560c0832400a19d27c71a",
+      "id": 2428
+    },
+    "powerType": {
+      "name": "56d560c01caf295194dab3db",
+      "id": 3595
+    },
+    "designType": {
+      "name": "56d560c0d81865e32cfd5015",
+      "id": 1995
+    },
+    "zoneType": {
+      "name": "56d560c034c0c62dec180146",
+      "id": 1222
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 91,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-04-04"
+    },
+    "created": {
+      "date": "2014-03-02"
+    },
+    "name": "56d560c008b9be11f9ea2af3",
+    "id": 54
+  },
+  {
+    "site": {
+      "location_type": "Bayview",
+      "id": 55
+    },
+    "zonePurpose": {
+      "name": "56d560c0b8c00af24a57e1dc",
+      "id": 9190
+    },
+    "powerType": {
+      "name": "56d560c02d84a656157756c1",
+      "id": 2364
+    },
+    "designType": {
+      "name": "56d560c039f53fe3347386e2",
+      "id": 7347
+    },
+    "zoneType": {
+      "name": "56d560c00238f9a29b650121",
+      "id": 6711
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 67,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-03-30"
+    },
+    "created": {
+      "date": "2016-02-02"
+    },
+    "name": "56d560c08ae02ad02c962e6d",
+    "id": 55
+  },
+  {
+    "site": {
+      "location_type": "Craig",
+      "id": 56
+    },
+    "zonePurpose": {
+      "name": "56d560c0cdbd720e7d620f14",
+      "id": 5433
+    },
+    "powerType": {
+      "name": "56d560c0013a4ee2d8618fce",
+      "id": 1942
+    },
+    "designType": {
+      "name": "56d560c09e1a56046e1f8ba9",
+      "id": 6283
+    },
+    "zoneType": {
+      "name": "56d560c0e92d4b5c624e36d9",
+      "id": 1646
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 0,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-10-11"
+    },
+    "created": {
+      "date": "2014-06-20"
+    },
+    "name": "56d560c0d6ca45a9f0125296",
+    "id": 56
+  },
+  {
+    "site": {
+      "location_type": "Titanic",
+      "id": 57
+    },
+    "zonePurpose": {
+      "name": "56d560c0fbb05edc14762095",
+      "id": 5966
+    },
+    "powerType": {
+      "name": "56d560c0f60aa44c28712cbc",
+      "id": 456
+    },
+    "designType": {
+      "name": "56d560c0e160905a6e575615",
+      "id": 8400
+    },
+    "zoneType": {
+      "name": "56d560c08023b61f49493343",
+      "id": 6948
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 14,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-11-23"
+    },
+    "created": {
+      "date": "2015-11-08"
+    },
+    "name": "56d560c0761fab2939b9ed3d",
+    "id": 57
+  },
+  {
+    "site": {
+      "location_type": "Rockingham",
+      "id": 58
+    },
+    "zonePurpose": {
+      "name": "56d560c0f5b34a73b9cf891f",
+      "id": 8830
+    },
+    "powerType": {
+      "name": "56d560c012bec7571a69a7fc",
+      "id": 4413
+    },
+    "designType": {
+      "name": "56d560c091c8a6795879c234",
+      "id": 112
+    },
+    "zoneType": {
+      "name": "56d560c00f1fcc2699896dfd",
+      "id": 5779
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 93,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-01-24"
+    },
+    "created": {
+      "date": "2015-03-25"
+    },
+    "name": "56d560c05cbfa15ec7bfb3e4",
+    "id": 58
+  },
+  {
+    "site": {
+      "location_type": "Tuttle",
+      "id": 59
+    },
+    "zonePurpose": {
+      "name": "56d560c04169d60c304d1284",
+      "id": 6779
+    },
+    "powerType": {
+      "name": "56d560c05b5e6657f4622c48",
+      "id": 5927
+    },
+    "designType": {
+      "name": "56d560c031f9a0a8860e410c",
+      "id": 3470
+    },
+    "zoneType": {
+      "name": "56d560c0286d2374c3247255",
+      "id": 596
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 39,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-01-09"
+    },
+    "created": {
+      "date": "2014-04-30"
+    },
+    "name": "56d560c07121f35302543176",
+    "id": 59
+  },
+  {
+    "site": {
+      "location_type": "Katonah",
+      "id": 60
+    },
+    "zonePurpose": {
+      "name": "56d560c0d542bd664b5d93c3",
+      "id": 8153
+    },
+    "powerType": {
+      "name": "56d560c06e0536e61c9a0e98",
+      "id": 203
+    },
+    "designType": {
+      "name": "56d560c01c26486c1398d7cc",
+      "id": 7477
+    },
+    "zoneType": {
+      "name": "56d560c016519009f54f8df1",
+      "id": 9112
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 29,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-11-04"
+    },
+    "created": {
+      "date": "2014-08-26"
+    },
+    "name": "56d560c08e6f1b72a957cdf2",
+    "id": 60
+  },
+  {
+    "site": {
+      "location_type": "Unionville",
+      "id": 61
+    },
+    "zonePurpose": {
+      "name": "56d560c06cde4ee178611ed4",
+      "id": 6050
+    },
+    "powerType": {
+      "name": "56d560c054fd0bd4b212be14",
+      "id": 8759
+    },
+    "designType": {
+      "name": "56d560c0095871981b7901a8",
+      "id": 226
+    },
+    "zoneType": {
+      "name": "56d560c05dd527ac1fd78c0a",
+      "id": 8845
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 97,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-02-10"
+    },
+    "created": {
+      "date": "2014-11-23"
+    },
+    "name": "56d560c0ed72fec6e592add2",
+    "id": 61
+  },
+  {
+    "site": {
+      "location_type": "Coalmont",
+      "id": 62
+    },
+    "zonePurpose": {
+      "name": "56d560c090418fd4da3d2aab",
+      "id": 3669
+    },
+    "powerType": {
+      "name": "56d560c059f6dc824d76c767",
+      "id": 3525
+    },
+    "designType": {
+      "name": "56d560c0ffce94eea11ba508",
+      "id": 3046
+    },
+    "zoneType": {
+      "name": "56d560c093df5084d7f0ad5f",
+      "id": 834
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 51,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-06-04"
+    },
+    "created": {
+      "date": "2015-06-21"
+    },
+    "name": "56d560c092d30a559b40ba2d",
+    "id": 62
+  },
+  {
+    "site": {
+      "location_type": "Irwin",
+      "id": 63
+    },
+    "zonePurpose": {
+      "name": "56d560c087b64651dbcb1361",
+      "id": 3262
+    },
+    "powerType": {
+      "name": "56d560c000579241be30407c",
+      "id": 1335
+    },
+    "designType": {
+      "name": "56d560c062da2f0bbde27b37",
+      "id": 5320
+    },
+    "zoneType": {
+      "name": "56d560c0822dee52cba698ba",
+      "id": 417
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 61,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-11-02"
+    },
+    "created": {
+      "date": "2014-02-02"
+    },
+    "name": "56d560c03acc16df6b47dcc6",
+    "id": 63
+  },
+  {
+    "site": {
+      "location_type": "Crenshaw",
+      "id": 64
+    },
+    "zonePurpose": {
+      "name": "56d560c0bf1e2852cd4925c1",
+      "id": 5006
+    },
+    "powerType": {
+      "name": "56d560c0a93b6643c073b480",
+      "id": 6467
+    },
+    "designType": {
+      "name": "56d560c04787261cb236edd2",
+      "id": 3597
+    },
+    "zoneType": {
+      "name": "56d560c0c4c83a2bbb12763b",
+      "id": 3791
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 93,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-05-05"
+    },
+    "created": {
+      "date": "2015-12-19"
+    },
+    "name": "56d560c0c5ecc5e808265326",
+    "id": 64
+  },
+  {
+    "site": {
+      "location_type": "Belva",
+      "id": 65
+    },
+    "zonePurpose": {
+      "name": "56d560c0e9196a00a007e857",
+      "id": 4471
+    },
+    "powerType": {
+      "name": "56d560c09c9727544cfe1ee1",
+      "id": 4969
+    },
+    "designType": {
+      "name": "56d560c0127968d2b6a5a977",
+      "id": 6874
+    },
+    "zoneType": {
+      "name": "56d560c027fe345cf5530f2d",
+      "id": 1997
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 21,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-06-06"
+    },
+    "created": {
+      "date": "2015-07-14"
+    },
+    "name": "56d560c05b9c5abca8adebd6",
+    "id": 65
+  },
+  {
+    "site": {
+      "location_type": "Rockbridge",
+      "id": 66
+    },
+    "zonePurpose": {
+      "name": "56d560c157dad375db38b27e",
+      "id": 9853
+    },
+    "powerType": {
+      "name": "56d560c1e3ffb1af13368243",
+      "id": 9357
+    },
+    "designType": {
+      "name": "56d560c19a814a81cf725bae",
+      "id": 5757
+    },
+    "zoneType": {
+      "name": "56d560c1b56f90ed745f3c22",
+      "id": 8718
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 59,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-12-18"
+    },
+    "created": {
+      "date": "2015-08-08"
+    },
+    "name": "56d560c1c982f7aa14aaa418",
+    "id": 66
+  },
+  {
+    "site": {
+      "location_type": "Oley",
+      "id": 67
+    },
+    "zonePurpose": {
+      "name": "56d560c135814cd334320d3b",
+      "id": 207
+    },
+    "powerType": {
+      "name": "56d560c1398ccee865c3baaa",
+      "id": 9699
+    },
+    "designType": {
+      "name": "56d560c1e88dba86fec92df9",
+      "id": 5170
+    },
+    "zoneType": {
+      "name": "56d560c1c356cadfad0425c2",
+      "id": 7402
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 43,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-05-07"
+    },
+    "created": {
+      "date": "2014-11-27"
+    },
+    "name": "56d560c1f1ac9edd50fae484",
+    "id": 67
+  },
+  {
+    "site": {
+      "location_type": "Leeper",
+      "id": 68
+    },
+    "zonePurpose": {
+      "name": "56d560c166cd1db8dbacf7f0",
+      "id": 2697
+    },
+    "powerType": {
+      "name": "56d560c1aa5754dede90ff32",
+      "id": 7930
+    },
+    "designType": {
+      "name": "56d560c171b5a8f8c67fef7c",
+      "id": 2335
+    },
+    "zoneType": {
+      "name": "56d560c184e8a7b907e7673f",
+      "id": 3897
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 100,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-07-24"
+    },
+    "created": {
+      "date": "2015-08-23"
+    },
+    "name": "56d560c18b9b3aa0288cb26f",
+    "id": 68
+  },
+  {
+    "site": {
+      "location_type": "Detroit",
+      "id": 69
+    },
+    "zonePurpose": {
+      "name": "56d560c1994ce1159c0625b3",
+      "id": 2652
+    },
+    "powerType": {
+      "name": "56d560c17edf282edb081071",
+      "id": 2448
+    },
+    "designType": {
+      "name": "56d560c1b44f04bb41dd6dd2",
+      "id": 5040
+    },
+    "zoneType": {
+      "name": "56d560c1c61abf60958d1db0",
+      "id": 3496
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 44,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-07-04"
+    },
+    "created": {
+      "date": "2015-10-19"
+    },
+    "name": "56d560c138231bc7f6844803",
+    "id": 69
+  },
+  {
+    "site": {
+      "location_type": "Leroy",
+      "id": 70
+    },
+    "zonePurpose": {
+      "name": "56d560c172ced1c936869d12",
+      "id": 7284
+    },
+    "powerType": {
+      "name": "56d560c1650048a5d48e8dd7",
+      "id": 1132
+    },
+    "designType": {
+      "name": "56d560c19699f4ef4c6a4cfb",
+      "id": 1519
+    },
+    "zoneType": {
+      "name": "56d560c1e8d5b714d5893558",
+      "id": 4905
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 83,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-05-08"
+    },
+    "created": {
+      "date": "2015-02-21"
+    },
+    "name": "56d560c17cbc1d569ecdd225",
+    "id": 70
+  },
+  {
+    "site": {
+      "location_type": "Dupuyer",
+      "id": 71
+    },
+    "zonePurpose": {
+      "name": "56d560c13eb8af5955ed91a8",
+      "id": 4368
+    },
+    "powerType": {
+      "name": "56d560c128e5d7459fa1367e",
+      "id": 7564
+    },
+    "designType": {
+      "name": "56d560c1e4ba9e890872dc62",
+      "id": 3930
+    },
+    "zoneType": {
+      "name": "56d560c133179db7652a5e34",
+      "id": 6196
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 91,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-07-30"
+    },
+    "created": {
+      "date": "2015-06-10"
+    },
+    "name": "56d560c165534d12641f1d15",
+    "id": 71
+  },
+  {
+    "site": {
+      "location_type": "Caspar",
+      "id": 72
+    },
+    "zonePurpose": {
+      "name": "56d560c17fdf00d790acb5af",
+      "id": 8494
+    },
+    "powerType": {
+      "name": "56d560c12be5b3910451809b",
+      "id": 5521
+    },
+    "designType": {
+      "name": "56d560c1563801541feae38a",
+      "id": 6
+    },
+    "zoneType": {
+      "name": "56d560c10d702c675c6b1fe9",
+      "id": 9217
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 66,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-12-10"
+    },
+    "created": {
+      "date": "2014-03-28"
+    },
+    "name": "56d560c1cc08dc1c0e26b4b6",
+    "id": 72
+  },
+  {
+    "site": {
+      "location_type": "Drytown",
+      "id": 73
+    },
+    "zonePurpose": {
+      "name": "56d560c1dae28a1b5ae267ec",
+      "id": 2477
+    },
+    "powerType": {
+      "name": "56d560c1dfc10bf928b9c9f3",
+      "id": 3228
+    },
+    "designType": {
+      "name": "56d560c1287c90f1ccd20fb0",
+      "id": 9864
+    },
+    "zoneType": {
+      "name": "56d560c1a6eae1d900584625",
+      "id": 1583
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 81,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-05-29"
+    },
+    "created": {
+      "date": "2015-04-09"
+    },
+    "name": "56d560c1492afbc7c1427d77",
+    "id": 73
+  },
+  {
+    "site": {
+      "location_type": "Durham",
+      "id": 74
+    },
+    "zonePurpose": {
+      "name": "56d560c1ef65302934f5e6dc",
+      "id": 3898
+    },
+    "powerType": {
+      "name": "56d560c12b636879fc9ac848",
+      "id": 3383
+    },
+    "designType": {
+      "name": "56d560c1db8604849fee5fd4",
+      "id": 8929
+    },
+    "zoneType": {
+      "name": "56d560c13cdc8e1a01de7d8d",
+      "id": 877
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 65,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-12-15"
+    },
+    "created": {
+      "date": "2015-07-10"
+    },
+    "name": "56d560c1fa90866d656a6004",
+    "id": 74
+  },
+  {
+    "site": {
+      "location_type": "Jenkinsville",
+      "id": 75
+    },
+    "zonePurpose": {
+      "name": "56d560c1603c6b2be9de5e4d",
+      "id": 4698
+    },
+    "powerType": {
+      "name": "56d560c1fa18a8c0d656a422",
+      "id": 9998
+    },
+    "designType": {
+      "name": "56d560c12d9f261309cddf96",
+      "id": 8088
+    },
+    "zoneType": {
+      "name": "56d560c137336e7289f9fd36",
+      "id": 6565
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 48,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-09-18"
+    },
+    "created": {
+      "date": "2015-12-12"
+    },
+    "name": "56d560c1c3a8051dea22d46d",
+    "id": 75
+  },
+  {
+    "site": {
+      "location_type": "Gasquet",
+      "id": 76
+    },
+    "zonePurpose": {
+      "name": "56d560c13c9816037480ffe4",
+      "id": 7599
+    },
+    "powerType": {
+      "name": "56d560c1a6cad875a215ad89",
+      "id": 5056
+    },
+    "designType": {
+      "name": "56d560c1d6abc9b84a8cb846",
+      "id": 319
+    },
+    "zoneType": {
+      "name": "56d560c1e6d4b25b58eab937",
+      "id": 3990
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 66,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-12-20"
+    },
+    "created": {
+      "date": "2015-08-01"
+    },
+    "name": "56d560c1e4d63f2f6af4200f",
+    "id": 76
+  },
+  {
+    "site": {
+      "location_type": "Dowling",
+      "id": 77
+    },
+    "zonePurpose": {
+      "name": "56d560c1d0a538762b59e02f",
+      "id": 1615
+    },
+    "powerType": {
+      "name": "56d560c16ea1f0b739a39d2c",
+      "id": 4555
+    },
+    "designType": {
+      "name": "56d560c1f794ff62afd4274b",
+      "id": 9755
+    },
+    "zoneType": {
+      "name": "56d560c19345cad1efcafa14",
+      "id": 4699
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 59,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-04-30"
+    },
+    "created": {
+      "date": "2014-07-23"
+    },
+    "name": "56d560c1f6a875453d430369",
+    "id": 77
+  },
+  {
+    "site": {
+      "location_type": "Balm",
+      "id": 78
+    },
+    "zonePurpose": {
+      "name": "56d560c10227da3e57ebce4a",
+      "id": 6345
+    },
+    "powerType": {
+      "name": "56d560c10a3341aaf5466396",
+      "id": 6294
+    },
+    "designType": {
+      "name": "56d560c1e4e14c514a6abe2b",
+      "id": 212
+    },
+    "zoneType": {
+      "name": "56d560c15249489062d07d7a",
+      "id": 2414
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 19,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-06-05"
+    },
+    "created": {
+      "date": "2015-11-30"
+    },
+    "name": "56d560c1a58b9572c1ce12f1",
+    "id": 78
+  },
+  {
+    "site": {
+      "location_type": "Macdona",
+      "id": 79
+    },
+    "zonePurpose": {
+      "name": "56d560c17e4def1d50cc9d9e",
+      "id": 1376
+    },
+    "powerType": {
+      "name": "56d560c14a89ad37ec57d535",
+      "id": 8573
+    },
+    "designType": {
+      "name": "56d560c1d55c3d19bb9166db",
+      "id": 3172
+    },
+    "zoneType": {
+      "name": "56d560c16739ffe0dfee5149",
+      "id": 408
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 46,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-11-28"
+    },
+    "created": {
+      "date": "2014-12-05"
+    },
+    "name": "56d560c19de149e3bd30c972",
+    "id": 79
+  },
+  {
+    "site": {
+      "location_type": "Wattsville",
+      "id": 80
+    },
+    "zonePurpose": {
+      "name": "56d560c119fc710821e3f495",
+      "id": 2092
+    },
+    "powerType": {
+      "name": "56d560c189b822790b799165",
+      "id": 7339
+    },
+    "designType": {
+      "name": "56d560c164b56c4099dbff29",
+      "id": 4075
+    },
+    "zoneType": {
+      "name": "56d560c13bde6d70c6da0d1d",
+      "id": 1304
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 19,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-10-26"
+    },
+    "created": {
+      "date": "2014-12-03"
+    },
+    "name": "56d560c1b86d7ce12797f618",
+    "id": 80
+  },
+  {
+    "site": {
+      "location_type": "Buxton",
+      "id": 81
+    },
+    "zonePurpose": {
+      "name": "56d560c1f69903bc85c090e8",
+      "id": 7934
+    },
+    "powerType": {
+      "name": "56d560c1cae0dd4d94754853",
+      "id": 2180
+    },
+    "designType": {
+      "name": "56d560c11ba0e8fa84f55d1a",
+      "id": 8607
+    },
+    "zoneType": {
+      "name": "56d560c14ae48add0172593b",
+      "id": 1304
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 94,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-09-07"
+    },
+    "created": {
+      "date": "2015-11-21"
+    },
+    "name": "56d560c18e1c0dd8719b9401",
+    "id": 81
+  },
+  {
+    "site": {
+      "location_type": "Conway",
+      "id": 82
+    },
+    "zonePurpose": {
+      "name": "56d560c1d840cf24e9296df0",
+      "id": 6151
+    },
+    "powerType": {
+      "name": "56d560c188074d3dec302d02",
+      "id": 482
+    },
+    "designType": {
+      "name": "56d560c17b60a2e9c54b8608",
+      "id": 5809
+    },
+    "zoneType": {
+      "name": "56d560c12365e48fcf1694d6",
+      "id": 4354
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 98,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-11-05"
+    },
+    "created": {
+      "date": "2014-12-07"
+    },
+    "name": "56d560c1dd5675ae340efb8b",
+    "id": 82
+  },
+  {
+    "site": {
+      "location_type": "Jackpot",
+      "id": 83
+    },
+    "zonePurpose": {
+      "name": "56d560c11f00e6c29f78b357",
+      "id": 1744
+    },
+    "powerType": {
+      "name": "56d560c18df238018caa26ca",
+      "id": 5287
+    },
+    "designType": {
+      "name": "56d560c1b35bc61d3201bb7c",
+      "id": 8121
+    },
+    "zoneType": {
+      "name": "56d560c1edf03c238d559997",
+      "id": 1720
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 59,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-06-29"
+    },
+    "created": {
+      "date": "2015-05-19"
+    },
+    "name": "56d560c1d4b55352966eed84",
+    "id": 83
+  },
+  {
+    "site": {
+      "location_type": "Flintville",
+      "id": 84
+    },
+    "zonePurpose": {
+      "name": "56d560c1d428f161c6454acd",
+      "id": 2440
+    },
+    "powerType": {
+      "name": "56d560c1cd181d518199ce04",
+      "id": 8665
+    },
+    "designType": {
+      "name": "56d560c12bfc2ac757eb098b",
+      "id": 9819
+    },
+    "zoneType": {
+      "name": "56d560c12bcb1d075747ddc0",
+      "id": 2338
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 41,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-07-27"
+    },
+    "created": {
+      "date": "2015-01-08"
+    },
+    "name": "56d560c12fe463b676b7e647",
+    "id": 84
+  },
+  {
+    "site": {
+      "location_type": "Deercroft",
+      "id": 85
+    },
+    "zonePurpose": {
+      "name": "56d560c1fa9c119a979058ff",
+      "id": 8
+    },
+    "powerType": {
+      "name": "56d560c1ba9d11096c5769e6",
+      "id": 1345
+    },
+    "designType": {
+      "name": "56d560c1ab418371a415b8ba",
+      "id": 4950
+    },
+    "zoneType": {
+      "name": "56d560c1d5bed9c9f15e9efe",
+      "id": 9636
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 23,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-11-15"
+    },
+    "created": {
+      "date": "2014-04-08"
+    },
+    "name": "56d560c127f1c4d3708558f9",
+    "id": 85
+  },
+  {
+    "site": {
+      "location_type": "Cawood",
+      "id": 86
+    },
+    "zonePurpose": {
+      "name": "56d560c159b143aab9ef1e99",
+      "id": 4495
+    },
+    "powerType": {
+      "name": "56d560c1e7537e1bbf7d5648",
+      "id": 2554
+    },
+    "designType": {
+      "name": "56d560c1197293b7d414d3bb",
+      "id": 939
+    },
+    "zoneType": {
+      "name": "56d560c194d5d0d6e8dcf3ee",
+      "id": 974
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 52,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-09-15"
+    },
+    "created": {
+      "date": "2015-08-11"
+    },
+    "name": "56d560c12fb4759369c8f96d",
+    "id": 86
+  },
+  {
+    "site": {
+      "location_type": "Inkerman",
+      "id": 87
+    },
+    "zonePurpose": {
+      "name": "56d560c112d9498c1d3fcaa8",
+      "id": 1548
+    },
+    "powerType": {
+      "name": "56d560c1e0104f5e9d4f8d8a",
+      "id": 3361
+    },
+    "designType": {
+      "name": "56d560c133df234e47d6dca1",
+      "id": 8099
+    },
+    "zoneType": {
+      "name": "56d560c11c718ac4304c0502",
+      "id": 7261
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 92,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-09-05"
+    },
+    "created": {
+      "date": "2015-03-18"
+    },
+    "name": "56d560c1f71f5112ae54405d",
+    "id": 87
+  },
+  {
+    "site": {
+      "location_type": "Blodgett",
+      "id": 88
+    },
+    "zonePurpose": {
+      "name": "56d560c1150f38e8dc7a4334",
+      "id": 3995
+    },
+    "powerType": {
+      "name": "56d560c1d491b5fdda008ea3",
+      "id": 4677
+    },
+    "designType": {
+      "name": "56d560c179a359491ca8dd08",
+      "id": 9489
+    },
+    "zoneType": {
+      "name": "56d560c17c50b926dec1b1f5",
+      "id": 7173
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 4,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-04-25"
+    },
+    "created": {
+      "date": "2014-06-07"
+    },
+    "name": "56d560c1f39bec5d9efdbe06",
+    "id": 88
+  },
+  {
+    "site": {
+      "location_type": "Fidelis",
+      "id": 89
+    },
+    "zonePurpose": {
+      "name": "56d560c17535831df443ec51",
+      "id": 5998
+    },
+    "powerType": {
+      "name": "56d560c16f0040a27ea2506c",
+      "id": 2008
+    },
+    "designType": {
+      "name": "56d560c1ed6495cbebbe7930",
+      "id": 3526
+    },
+    "zoneType": {
+      "name": "56d560c1ead71c6d1e5b2174",
+      "id": 9417
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 15,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-01-31"
+    },
+    "created": {
+      "date": "2016-01-14"
+    },
+    "name": "56d560c1b9e56f19abd6d0bd",
+    "id": 89
+  },
+  {
+    "site": {
+      "location_type": "Hobucken",
+      "id": 90
+    },
+    "zonePurpose": {
+      "name": "56d560c15f5447d4be24a4a2",
+      "id": 1225
+    },
+    "powerType": {
+      "name": "56d560c16fd746187141fa5a",
+      "id": 7639
+    },
+    "designType": {
+      "name": "56d560c16162bc7f1465c827",
+      "id": 8999
+    },
+    "zoneType": {
+      "name": "56d560c1a75b14bd612a54c0",
+      "id": 446
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 30,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-03-13"
+    },
+    "created": {
+      "date": "2015-09-15"
+    },
+    "name": "56d560c111d62a18cd25e389",
+    "id": 90
+  },
+  {
+    "site": {
+      "location_type": "Coinjock",
+      "id": 91
+    },
+    "zonePurpose": {
+      "name": "56d560c137d70331834fa47c",
+      "id": 3158
+    },
+    "powerType": {
+      "name": "56d560c1eb63a51e75f1ef33",
+      "id": 8092
+    },
+    "designType": {
+      "name": "56d560c18f68172f95bb0412",
+      "id": 7822
+    },
+    "zoneType": {
+      "name": "56d560c1ec7e2d44ff7c8e48",
+      "id": 8128
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 57,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-09-03"
+    },
+    "created": {
+      "date": "2014-01-01"
+    },
+    "name": "56d560c13685873e32faf2fe",
+    "id": 91
+  },
+  {
+    "site": {
+      "location_type": "Ballico",
+      "id": 92
+    },
+    "zonePurpose": {
+      "name": "56d560c14d131b8fd1afd72c",
+      "id": 157
+    },
+    "powerType": {
+      "name": "56d560c1d8d3a94f20d11c97",
+      "id": 533
+    },
+    "designType": {
+      "name": "56d560c194c02371bb234868",
+      "id": 8345
+    },
+    "zoneType": {
+      "name": "56d560c1dc9ebbde0c28355a",
+      "id": 1564
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 23,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-06-30"
+    },
+    "created": {
+      "date": "2014-09-07"
+    },
+    "name": "56d560c107c932a3e08e44d9",
+    "id": 92
+  },
+  {
+    "site": {
+      "location_type": "Columbus",
+      "id": 93
+    },
+    "zonePurpose": {
+      "name": "56d560c11871178266078ed7",
+      "id": 8963
+    },
+    "powerType": {
+      "name": "56d560c11d43eb1b8d44e390",
+      "id": 1006
+    },
+    "designType": {
+      "name": "56d560c144ef61f5dc7c709f",
+      "id": 4945
+    },
+    "zoneType": {
+      "name": "56d560c1d2f6ce761b4328c5",
+      "id": 9895
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 99,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2015-03-05"
+    },
+    "created": {
+      "date": "2015-07-19"
+    },
+    "name": "56d560c1c37f519b199b12eb",
+    "id": 93
+  },
+  {
+    "site": {
+      "location_type": "Kirk",
+      "id": 94
+    },
+    "zonePurpose": {
+      "name": "56d560c1c71242e1f36e3b59",
+      "id": 6990
+    },
+    "powerType": {
+      "name": "56d560c14c3c992705e5fe68",
+      "id": 3348
+    },
+    "designType": {
+      "name": "56d560c175fcda9b3798923d",
+      "id": 3914
+    },
+    "zoneType": {
+      "name": "56d560c1c7be25f9c7150eed",
+      "id": 7459
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 79,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-08-15"
+    },
+    "created": {
+      "date": "2015-09-26"
+    },
+    "name": "56d560c13978259efa633fa5",
+    "id": 94
+  },
+  {
+    "site": {
+      "location_type": "Logan",
+      "id": 95
+    },
+    "zonePurpose": {
+      "name": "56d560c1254dae383a8dd86e",
+      "id": 3477
+    },
+    "powerType": {
+      "name": "56d560c12604efdfa865d9b1",
+      "id": 560
+    },
+    "designType": {
+      "name": "56d560c14c3615bcc6554586",
+      "id": 2663
+    },
+    "zoneType": {
+      "name": "56d560c11154f37c39cca7d4",
+      "id": 472
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 98,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-06-22"
+    },
+    "created": {
+      "date": "2014-07-05"
+    },
+    "name": "56d560c123c59b5e54271039",
+    "id": 95
+  },
+  {
+    "site": {
+      "location_type": "Vaughn",
+      "id": 96
+    },
+    "zonePurpose": {
+      "name": "56d560c16e6e5741fed83023",
+      "id": 1079
+    },
+    "powerType": {
+      "name": "56d560c1553a5d9fc6f9a1c3",
+      "id": 6041
+    },
+    "designType": {
+      "name": "56d560c1ade2d650edac5b3a",
+      "id": 9487
+    },
+    "zoneType": {
+      "name": "56d560c18607f77902613a1e",
+      "id": 9476
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 15,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-08-01"
+    },
+    "created": {
+      "date": "2014-08-03"
+    },
+    "name": "56d560c128bc0e550ee7cd9d",
+    "id": 96
+  },
+  {
+    "site": {
+      "location_type": "Hasty",
+      "id": 97
+    },
+    "zonePurpose": {
+      "name": "56d560c17ca2c51bca21b5ed",
+      "id": 7746
+    },
+    "powerType": {
+      "name": "56d560c1de7e5f37d960863f",
+      "id": 7781
+    },
+    "designType": {
+      "name": "56d560c1b35c5951047223bc",
+      "id": 2835
+    },
+    "zoneType": {
+      "name": "56d560c1110f2de2aec1cdc7",
+      "id": 1459
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 85,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-09-27"
+    },
+    "created": {
+      "date": "2014-06-16"
+    },
+    "name": "56d560c1428d7cc61a8ad82b",
+    "id": 97
+  },
+  {
+    "site": {
+      "location_type": "Worton",
+      "id": 98
+    },
+    "zonePurpose": {
+      "name": "56d560c15aa7e8436d56c023",
+      "id": 7942
+    },
+    "powerType": {
+      "name": "56d560c113f9f7cef8466bdb",
+      "id": 2035
+    },
+    "designType": {
+      "name": "56d560c19f900b07adaf74a5",
+      "id": 6988
+    },
+    "zoneType": {
+      "name": "56d560c1d3ba5cff37e5f0ff",
+      "id": 2242
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 65,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-09-29"
+    },
+    "created": {
+      "date": "2014-02-10"
+    },
+    "name": "56d560c113ca121ec83c9c94",
+    "id": 98
+  },
+  {
+    "site": {
+      "location_type": "Adelino",
+      "id": 99
+    },
+    "zonePurpose": {
+      "name": "56d560c1fd3213b0e9f937c4",
+      "id": 7382
+    },
+    "powerType": {
+      "name": "56d560c1496181a2fb68ee85",
+      "id": 6767
+    },
+    "designType": {
+      "name": "56d560c138bf22f6e8a98efa",
+      "id": 87
+    },
+    "zoneType": {
+      "name": "56d560c16ceffaa72387ccaa",
+      "id": 6987
+    },
+    "zoneState": "string",
+    "useableRackUnits": 0,
+    "openStackVersion": "string",
+    "numberOfComputeRack": 0,
+    "distributedControlPlane": "string",
+    "avialableKwPerRack": 23,
+    "secondaryDcp": "string",
+    "primaryDcp": "string",
+    "lastUpdateBy": "string",
+    "locked_by": "string",
+    "last_updated": {
+      "date": "2014-11-22"
+    },
+    "created": {
+      "date": "2016-01-22"
+    },
+    "name": "56d560c1edd271f6d12b707c",
+    "id": 99
+  }
+]
\ No newline at end of file
diff --git a/orm/services/region_manager/rms_mock/public/css/style.css b/orm/services/region_manager/rms_mock/public/css/style.css
new file mode 100644
index 00000000..55c9db54
--- /dev/null
+++ b/orm/services/region_manager/rms_mock/public/css/style.css
@@ -0,0 +1,43 @@
+body {
+  background: #311F00;
+  color: white;
+  font-family: 'Helvetica Neue', 'Helvetica', 'Verdana', sans-serif;
+  padding: 1em 2em;
+}
+
+a {
+  color: #FAFF78;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+div#content  {
+  width: 800px;
+  margin: 0 auto;
+}
+
+form {
+  margin: 0;
+  padding: 0;
+  border: 0;
+}
+
+fieldset {
+  border: 0;
+}
+
+input.error {
+  background: #FAFF78;
+}
+
+header {
+  text-align: center;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  font-family: 'Futura-CondensedExtraBold', 'Futura', 'Helvetica', sans-serif;
+  text-transform: uppercase;
+}
diff --git a/orm/services/region_manager/rms_mock/public/images/logo.png b/orm/services/region_manager/rms_mock/public/images/logo.png
new file mode 100644
index 00000000..a8f403e4
Binary files /dev/null and b/orm/services/region_manager/rms_mock/public/images/logo.png differ
diff --git a/orm/services/region_manager/rms_mock/rms_mock/__init__.py b/orm/services/region_manager/rms_mock/rms_mock/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms_mock/rms_mock/app.py b/orm/services/region_manager/rms_mock/rms_mock/app.py
new file mode 100644
index 00000000..f53f79bb
--- /dev/null
+++ b/orm/services/region_manager/rms_mock/rms_mock/app.py
@@ -0,0 +1,26 @@
+from pecan import make_app
+from rms_mock import model
+from pecan import make_app, conf
+from pecan.commands import CommandRunner
+
+from rms import model
+
+
+def setup_app(config):
+
+    model.init_model()
+    app_conf = dict(config.app)
+
+    return make_app(
+        app_conf.pop('root'),
+        logging=getattr(config, 'logging', {}),
+        **app_conf
+    )
+
+
+def main():
+    runner = CommandRunner()
+    runner.run(['serve', '../config.py'])
+
+if __name__ == "__main__":
+    main()
diff --git a/orm/services/region_manager/rms_mock/rms_mock/controllers/__init__.py b/orm/services/region_manager/rms_mock/rms_mock/controllers/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/region_manager/rms_mock/rms_mock/controllers/lcp_controller.py b/orm/services/region_manager/rms_mock/rms_mock/controllers/lcp_controller.py
new file mode 100644
index 00000000..96e4cdb9
--- /dev/null
+++ b/orm/services/region_manager/rms_mock/rms_mock/controllers/lcp_controller.py
@@ -0,0 +1,26 @@
+import pecan
+import logging
+
+from pecan import rest
+
+LOG = logging.getLogger(__name__)
+
+
+class LcpController(rest.RestController):
+    """
+       this class is for getting the lcp list from AIC Formation.
+    """
+
+    @pecan.expose()
+    def get(self):
+        """
+        when a get call is received in RestAPI this function return a
+        list of lcp
+        """
+        LOG.info('int get function')
+
+        file = open('data/zones.json', 'r')
+        zones = file.read()
+
+        # return the lcp's as dictionary so they can be converted to Json
+        return zones
diff --git a/orm/services/region_manager/rms_mock/rms_mock/controllers/root.py b/orm/services/region_manager/rms_mock/rms_mock/controllers/root.py
new file mode 100644
index 00000000..3366e46a
--- /dev/null
+++ b/orm/services/region_manager/rms_mock/rms_mock/controllers/root.py
@@ -0,0 +1,19 @@
+from pecan import expose, redirect
+from webob.exc import status_map
+from lcp_controller import LcpController
+
+
+class RootController(object):
+    """
+        in charge of RestAPI in the root directory
+    """
+    lcp = LcpController()
+
+    @expose('error.html')
+    def error(self, status):
+        try:
+            status = int(status)
+        except ValueError:  # pragma: no cover
+            status = 500
+        message = getattr(status_map.get(status), 'explanation', '')
+        return dict(status=status, message=message)
diff --git a/orm/services/region_manager/rms_mock/rms_mock/model/__init__.py b/orm/services/region_manager/rms_mock/rms_mock/model/__init__.py
new file mode 100644
index 00000000..d983f7bc
--- /dev/null
+++ b/orm/services/region_manager/rms_mock/rms_mock/model/__init__.py
@@ -0,0 +1,15 @@
+from pecan import conf  # noqa
+
+
+def init_model():
+    """
+    This is a stub method which is called at application startup time.
+
+    If you need to bind to a parsed database configuration, set up tables or
+    ORM classes, or perform any database initialization, this is the
+    recommended place to do it.
+
+    For more information working with databases, and some common recipes,
+    see http://pecan.readthedocs.org/en/latest/databases.html
+    """
+    pass
diff --git a/orm/services/region_manager/rms_mock/rms_mock/templates/error.html b/orm/services/region_manager/rms_mock/rms_mock/templates/error.html
new file mode 100644
index 00000000..323bc562
--- /dev/null
+++ b/orm/services/region_manager/rms_mock/rms_mock/templates/error.html
@@ -0,0 +1,12 @@
+<%inherit file="../../../lcp_core/templates/layout.html" />
+
+## provide definitions for blocks we want to redefine
+<%def name="title()">
+    Server Error ${status}
+</%def>
+
+## now define the body of the template
+    <header>
+        <h1>Server Error ${status}</h1>
+    </header>
+    <p>${message}</p>
diff --git a/orm/services/region_manager/rms_mock/rms_mock/templates/index.html b/orm/services/region_manager/rms_mock/rms_mock/templates/index.html
new file mode 100644
index 00000000..c5624a2e
--- /dev/null
+++ b/orm/services/region_manager/rms_mock/rms_mock/templates/index.html
@@ -0,0 +1,34 @@
+<%inherit file="../../../mock/templates/layout.html" />
+
+## provide definitions for blocks we want to redefine
+<%def name="title()">
+    Welcome to Pecan!
+</%def>
+
+## now define the body of the template
+    <header>
+        <h1><img src="/images/logo.png" /></h1>
+    </header>
+
+    <div id="content">
+
+        <p>This is a sample Pecan project.</p>
+
+        <p>
+            Instructions for getting started can be found online at <a
+            href="http://pecanpy.org" target="window">pecanpy.org</a>
+        </p>
+
+        <p>
+            ...or you can search the documentation here:
+        </p>
+
+        <form method="POST" action="/">
+            <fieldset>
+                <input name="q" />
+                <input type="submit" value="Search" />
+            </fieldset>
+            <small>Enter search terms or a module, class or function name.</small>
+        </form>
+
+    </div>
diff --git a/orm/services/region_manager/rms_mock/rms_mock/templates/layout.html b/orm/services/region_manager/rms_mock/rms_mock/templates/layout.html
new file mode 100644
index 00000000..40908591
--- /dev/null
+++ b/orm/services/region_manager/rms_mock/rms_mock/templates/layout.html
@@ -0,0 +1,22 @@
+<html>
+    <head>
+        <title>${self.title()}</title>
+        ${self.style()}
+        ${self.javascript()}
+    </head>
+    <body>
+        ${self.body()}
+    </body>
+</html>
+
+<%def name="title()">
+    Default Title
+</%def>
+
+<%def name="style()">
+    <link rel="stylesheet" type="text/css" media="screen" href="/css/style.css" />
+</%def>
+
+<%def name="javascript()">
+    <script language="text/javascript" src="/javascript/shared.js"></script>
+</%def>
diff --git a/orm/services/region_manager/rms_mock/setup.cfg b/orm/services/region_manager/rms_mock/setup.cfg
new file mode 100644
index 00000000..00ca2206
--- /dev/null
+++ b/orm/services/region_manager/rms_mock/setup.cfg
@@ -0,0 +1,6 @@
+[nosetests]
+match=^test
+where=test
+nocapture=1
+cover-package=test
+cover-erase=1
diff --git a/orm/services/region_manager/rms_mock/setup.py b/orm/services/region_manager/rms_mock/setup.py
new file mode 100644
index 00000000..0d17d5b6
--- /dev/null
+++ b/orm/services/region_manager/rms_mock/setup.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+try:
+    from setuptools import setup, find_packages
+except ImportError:
+    from ez_setup import use_setuptools
+    use_setuptools()
+    from setuptools import setup, find_packages
+
+setup(
+    name='mock',
+    version='0.1',
+    description='',
+    author='',
+    author_email='',
+    install_requires=[
+        "pecan",
+    ],
+    test_suite='mock',
+    zip_safe=False,
+    include_package_data=True,
+    packages=find_packages(exclude=['ez_setup'])
+)
diff --git a/orm/services/region_manager/scripts/db_scripts/create_db.sql b/orm/services/region_manager/scripts/db_scripts/create_db.sql
new file mode 100644
index 00000000..b37c821a
--- /dev/null
+++ b/orm/services/region_manager/scripts/db_scripts/create_db.sql
@@ -0,0 +1,63 @@
+create database if not exists orm_rms_db DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+use orm_rms_db;
+
+create table if not exists rms_groups
+   (
+	id integer auto_increment not null,
+	group_id varchar(64) not null,
+	name varchar(64) not null,
+	description varchar(255) not null,
+	primary key (id),
+	unique group_idx (group_id));
+
+
+create table if not exists region
+   (
+	id integer auto_increment not null,
+	region_id varchar(64) not null,
+	name varchar(64) not null,
+	address_state varchar(64) not null,
+	address_country varchar(64) not null,
+	address_city varchar(64) not null,
+	address_street varchar(64) not null,
+	address_zip varchar(64) not null,
+	region_status enum('building', 'functional', 'maintenance', 'down') not null,
+	ranger_agent_version varchar(64) not null,
+	open_stack_version varchar(64) not null,
+	design_type Varchar(64) not null,
+    location_type varchar(64) not null,
+	vlcp_name varchar(64) not null,
+	clli varchar(64) not null,
+	description varchar(255) not null,
+	primary key (id),
+	unique region_idx (region_id));
+
+
+create table if not exists group_region
+   (
+	group_id varchar(64) not null,
+	region_id varchar(64) not null,
+	primary key (group_id, region_id),
+	foreign key (group_id) REFERENCES `rms_groups` (`group_id`) ON DELETE CASCADE,
+	foreign key (region_id) REFERENCES `region` (`region_id`)  ON DELETE CASCADE);
+
+
+create table if not exists region_end_point
+   (
+	region_id varchar(64) not null,
+	end_point_type varchar(64) not null,
+	public_url varchar(255) not null,
+	primary key (region_id, end_point_type),
+	foreign key (region_id) REFERENCES `region` (`region_id`) ON DELETE CASCADE,
+	unique region_end_point_type(region_id, end_point_type));
+
+
+create table if not exists region_meta_data
+   (
+    id integer auto_increment not null,
+	region_id varchar(64) not null,
+	meta_data_key varchar(64) not null,
+	meta_data_value varchar(255) not null,
+	primary key (id),
+	foreign key (region_id) REFERENCES `region` (`region_id`) ON DELETE CASCADE,
+    unique region_meta_data_key_value(region_id, meta_data_key, meta_data_value));
diff --git a/orm/services/region_manager/scripts/db_scripts/insert_test_values.sql b/orm/services/region_manager/scripts/db_scripts/insert_test_values.sql
new file mode 100644
index 00000000..aa364ade
--- /dev/null
+++ b/orm/services/region_manager/scripts/db_scripts/insert_test_values.sql
@@ -0,0 +1,59 @@
+use orm_rms_db;
+
+insert into region (region_id,
+                    name,
+	                address_state,
+	                address_country,
+	                address_city,
+	                address_street,
+	                address_zip,
+	                region_status,
+	                ranger_agent_version,
+	                open_stack_version,
+	                design_type,
+                    location_type,
+	                vlcp_name,
+	                clli ,
+	                description)
+        values
+        ("lcp_0","lcp 0", "Cal", "US", "Los Angeles", "Blv st", "012345", "functional", "ranger_agent 1.0", "kilo", "design_type_0", "location_type_0", "vlcp_0", "clli_0", "lcp_0 in LA"),
+        ("lcp_1","lcp 1", "NY", "US", "New York", "5th avn", "112345", "functional", "ranger_agent 1.9", "kilo", "design_type_1", "location_type_1", "vlcp_1", "clli_1", "lcp_1 in NY"),
+        ("lcp_2","lcp 2", "", "IL", "Tel Aviv", "Bazel 4", "212345", "functional", "ranger_agent 1.0", "kilo", "design_type_2", "location_type_2", "vlcp_2", "clli_2", "lcp_2 in Tel Aviv");
+
+insert into rms_groups (group_id,
+	                 name,
+	                 description)
+	    values
+	    ("group_0", "group 0", "test group 0"),
+        ("group_1", "group 1", "test group 1");
+
+insert into group_region (group_id,
+                          region_id)
+        values
+        ("group_0","lcp_0"),
+        ("group_0","lcp_1"),
+        ("group_1","lcp_2");
+
+insert into region_meta_data (region_id,
+	                          meta_data_key,
+	                          meta_data_value)
+        values
+        ("lcp_0", "key_0", "value_0"),
+        ("lcp_0", "key_1", "value_1"),
+        ("lcp_1", "key_0", "value_0"),
+        ("lcp_1", "key_1", "value_1"),
+        ("lcp_2", "key_0", "value_0");
+
+insert into region_end_point (region_id,
+	                          end_point_type,
+	                          public_url)
+        values
+        ("lcp_0", "ord", "http://ord_0.com"),
+        ("lcp_0", "identity", "http://identity_0.com"),
+        ("lcp_0", "dashboard", "http://image_0.com"),
+        ("lcp_1", "ord", "http://ord_1.com"),
+        ("lcp_1", "identity", "http://identity_1.com"),
+        ("lcp_1", "dashboard", "http://image_1.com"),
+        ("lcp_2", "ord", "http://ord_2.com"),
+        ("lcp_2", "identity", "http://identity_2.com"),
+        ("lcp_2", "dashboard", "http://image_2.com");
diff --git a/orm/services/region_manager/scripts/db_scripts/update_db.sql b/orm/services/region_manager/scripts/db_scripts/update_db.sql
new file mode 100644
index 00000000..73f8c851
--- /dev/null
+++ b/orm/services/region_manager/scripts/db_scripts/update_db.sql
@@ -0,0 +1,80 @@
+use orm_rms_db;
+
+# This SQL script is used for upgrading ORM_RMS_DB.
+
+# PROCEDURE Update_Region_Status()
+# The following defines and then calls a stored procedure that updates and replaces
+# region_status from 'commissioning' to 'building'.
+
+DROP PROCEDURE IF EXISTS Rename_group_table;
+
+DELIMITER $$
+
+CREATE PROCEDURE Rename_group_table()
+BEGIN
+    DECLARE _table_exist INT;
+-- Check if table 'group' exists even if no rows in table
+    SET _table_exist = (  SELECT COUNT(*)
+                          FROM information_schema.tables
+                          WHERE table_schema = 'orm_rms_db'
+                          AND table_name like 'group');
+    IF _table_exist > 0 THEN
+        RENAME TABLE `group` TO rms_groups;
+    END IF;
+END $$
+DELIMITER ;
+
+CALL Rename_group_table;
+
+DROP PROCEDURE IF EXISTS Update_Region_Status;
+
+DELIMITER $$
+
+CREATE PROCEDURE Update_Region_Status()
+BEGIN
+--  Add a new enum value 'building' to the end of the enum list
+    ALTER TABLE region CHANGE region_status
+        region_status ENUM('commissioning','functional','maintenance','down','building');
+
+-- Update the table to change the old to the new value
+    UPDATE region set region_status = 'building' where region_status = 'commissioning';
+
+-- after changing to the new values, safe to remove the old "commissioning" value from the ENUM list
+    ALTER TABLE region CHANGE region_status
+        region_status ENUM('building','functional','maintenance','down');
+
+END $$
+DELIMITER ;
+
+CALL Update_Region_Status;
+
+# PROCEDURE Upgrade_Region_Meta_Data;
+# The following defines and then calls a stored procedure that does the following for the region_meta_data table:
+#     1. Check if a column named 'id' not exist, if exist the db already up to date.
+#     2. Remove old fk, pk and unique constraint.
+#     3. Add a new column to the region_meta_data table named 'id' set it as auto increment and primary key.
+#     4. Add a new constraint to define unique values.
+
+DROP PROCEDURE IF EXISTS Upgrade_Region_Meta_Data;
+
+DELIMITER $$
+CREATE PROCEDURE Upgrade_Region_Meta_Data()
+BEGIN
+    DECLARE _count INT;
+    SET _count = (  SELECT COUNT(*)
+                    FROM INFORMATION_SCHEMA.COLUMNS
+                    WHERE   TABLE_NAME = 'region_meta_data' AND
+                            COLUMN_NAME = 'id');
+    IF _count = 0 THEN
+        ALTER TABLE region_meta_data DROP FOREIGN KEY region_meta_data_ibfk_1;
+        ALTER TABLE region_meta_data DROP PRIMARY KEY;
+        ALTER TABLE region_meta_data DROP index region_meta_data_key;
+
+        ALTER TABLE region_meta_data ADD COLUMN id int NOT NULL AUTO_INCREMENT primary key FIRST;
+        ALTER TABLE region_meta_data ADD CONSTRAINT region_meta_data_key_value UNIQUE (region_id, meta_data_key, meta_data_value);
+    END IF;
+END $$
+DELIMITER ;
+
+CALL Upgrade_Region_Meta_Data;
+
diff --git a/orm/services/region_manager/scripts/shell_scripts/create_db.sh b/orm/services/region_manager/scripts/shell_scripts/create_db.sh
new file mode 100644
index 00000000..5dee4fcb
--- /dev/null
+++ b/orm/services/region_manager/scripts/shell_scripts/create_db.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+echo Creating database: orm_rms_db
+echo Creating tables: rms_groups, region, group_region, region_end_point, region_meta_data
+
+mysql -uroot -pstack < ../db_scripts/create_db.sql
+
+echo Done !
+
+
+
+
+
+
+
diff --git a/orm/services/region_manager/scripts/shell_scripts/csv_2_db_loader.sh b/orm/services/region_manager/scripts/shell_scripts/csv_2_db_loader.sh
new file mode 100644
index 00000000..b79094ce
--- /dev/null
+++ b/orm/services/region_manager/scripts/shell_scripts/csv_2_db_loader.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+echo Loading region data from csv to rms db
+
+cd ../..
+python csv2db.py
+
+echo Done !
+
+
+
+
+
+
+
diff --git a/orm/services/region_manager/scripts/shell_scripts/update_db.sh b/orm/services/region_manager/scripts/shell_scripts/update_db.sh
new file mode 100644
index 00000000..024a1287
--- /dev/null
+++ b/orm/services/region_manager/scripts/shell_scripts/update_db.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+mysql -uroot -pstack < ../db_scripts/update_db.sql
+
+echo Done !
diff --git a/orm/services/region_manager/swagger/swagger.yaml b/orm/services/region_manager/swagger/swagger.yaml
new file mode 100644
index 00000000..03180aaa
--- /dev/null
+++ b/orm/services/region_manager/swagger/swagger.yaml
@@ -0,0 +1,713 @@
+swagger: '2.0'
+info:
+  version: 3.5.0
+  title: RMS API
+
+# the domain of the service
+host: 135.76.2.229
+# array of all schemes that your API supports
+schemes:
+  - https
+
+# will be prefixed to all paths
+basePath: /v2/orm
+produces:
+  - application/json
+
+paths:
+  /regions:
+    parameters:
+
+      - $ref: "#/parameters/Client"
+    post:
+      summary: Create a new region
+      parameters:
+        - $ref: "#/parameters/Token"
+        - $ref: "#/parameters/Region"
+        - name: full region
+          in: body
+          description: input body to create full region
+          schema:
+            $ref: '#/definitions/RegionsData'
+          required: true
+
+      tags:
+        - Region
+
+      responses:
+        201:
+          description: Region created successfully
+          schema:
+              $ref: '#/definitions/RegionsData'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        409:
+          description: Duplicate Error
+          schema:
+            $ref: '#/definitions/409'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    get:
+      summary: get a list of regions by criteria (or all regions, if no criterion is specified)
+      parameters:
+        - name: type
+          in: query
+          type: "string"
+          required: false
+        - name: status
+          in: query
+          type: "string"
+          required: false
+        - name: metadata
+          in: query
+          type: "array"
+          items:
+            type: "string"
+          required: false
+        - name: rangerAgentVersion
+          in: query
+          type: "string"
+          required: false
+        - name: clli
+          in: query
+          type: "string"
+          required: false
+        - name: regionname
+          in: query
+          type: "string"
+          required: false
+        - name: osversion
+          in: query
+          type: "string"
+          required: false
+        - name: valet
+          in: query
+          type: "string"
+          required: false
+        - name: country
+          in: query
+          type: "string"
+          required: false
+        - name: state
+          in: query
+          type: "string"
+          required: false
+        - name: city
+          in: query
+          type: "string"
+          required: false
+        - name: street
+          in: query
+          type: "string"
+          required: false
+        - name: zip
+          in: query
+          type: "string"
+          required: false
+      tags:
+        - Region
+      responses:
+        200:
+          description: list of regions by criteria
+          schema:
+              $ref: '#/definitions/RegionsWrapper'
+        404:
+          description: No regions found for the specified criteria
+          schema:
+            $ref: '#/definitions/404'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /regions/{region_id}:
+    parameters:
+      - $ref: "#/parameters/Client"
+    get:
+      summary: Get a region by id or name
+      parameters:
+        - name: region_id
+          in: path
+          type: string
+          description: ID or name of the requested region
+          required: true
+      tags:
+        - Region
+      responses:
+        200:
+          description: The requested region
+          schema:
+            $ref: '#/definitions/RegionsData'
+        404:
+          description: Region not found
+          schema:
+            $ref: '#/definitions/404'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    delete:
+      summary: Delete a region by ID
+      parameters:
+        - $ref: "#/parameters/Token"
+        - $ref: "#/parameters/Region"
+        - name: region_id
+          in: path
+          type: string
+          description: ID of the region to delete
+          required: true
+      tags:
+        - Region
+      responses:
+        204:
+          description: No content
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    put:
+      summary: Update a region by ID
+      parameters:
+        - $ref: "#/parameters/Token"
+        - $ref: "#/parameters/Region"
+        - name: region_id
+          in: path
+          type: string
+          description: ID or name of the requested region
+          required: true
+        - name: full region
+          in: body
+          description: input body to create full region
+          schema:
+            $ref: '#/definitions/RegionsData'
+          required: true
+      tags:
+        - Region
+      responses:
+        200:
+          description: The updated region
+          schema:
+            $ref: '#/definitions/RegionsData'
+        404:
+          description: Region not found
+          schema:
+            $ref: '#/definitions/404'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /groups:
+    parameters:
+      - $ref: "#/parameters/Client"
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+    post:
+      summary: Create a new group
+      parameters:
+        - name: full group
+          in: body
+          description: input body to create full group
+          schema:
+            $ref: '#/definitions/Groups'
+          required: true
+
+      tags:
+        - Group
+
+      responses:
+        201:
+          description: Group created successfully
+          schema:
+              $ref: '#/definitions/Result'
+        400:
+          description: Bad Request Error
+          schema:
+            $ref: '#/definitions/400'
+        409:
+          description: Duplicate Error
+          schema:
+            $ref: '#/definitions/409'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    get:
+      summary: Get all groups
+      tags:
+        - Group
+      responses:
+        200:
+          description: list of groups
+          schema:
+              $ref: '#/definitions/GroupsWrapper'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /groups/{group_id}:
+    parameters:
+      - $ref: "#/parameters/Client"
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+    get:
+      summary: Get a single group by ID
+      parameters:
+        - name: group_id
+          in: path
+          type: string
+          description: ID of the requested group
+          required: true
+      tags:
+        - Group
+      responses:
+        200:
+          description: The requested group
+          schema:
+            $ref: '#/definitions/Groups'
+        404:
+          description: Group not found
+          schema:
+            $ref: '#/definitions/404'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    delete:
+      summary: Delete a group by ID
+      parameters:
+        - name: group_id
+          in: path
+          type: string
+          description: ID of the group to delete
+          required: true
+      tags:
+        - Group
+      responses:
+        204:
+          description: No content'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    put:
+      summary: Update a group by ID
+      parameters:
+        - name: group_id
+          in: path
+          type: string
+          description: ID of the requested group
+          required: true
+        - name: full group
+          in: body
+          description: input body to update full group
+          schema:
+            $ref: '#/definitions/Groups'
+          required: true
+      tags:
+        - Group
+      responses:
+        200:
+          description: The updated group
+          schema:
+            $ref: '#/definitions/Result'
+        404:
+          description: Group not found
+          schema:
+            $ref: '#/definitions/404'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /regions/{region_id}/status:
+    parameters:
+      - $ref: "#/parameters/Client"
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+    put:
+      summary: Update a region status
+      parameters:
+        - name: region_id
+          in: path
+          type: string
+          description: ID of the requested region
+          required: true
+        - name: status
+          in: body
+          description: status JSON
+          schema:
+            $ref: '#/definitions/RegionStatus'
+          required: true
+      tags:
+        - Status
+      responses:
+        200:
+          description: The updated status
+          schema:
+            $ref: '#/definitions/RegionStatus'
+        400:
+          description: Invalid status
+          schema:
+            $ref: '#/definitions/400'
+        404:
+          description: Region not found
+          schema:
+            $ref: '#/definitions/404'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /regions/{region_id}/metadata:
+    parameters:
+      - $ref: "#/parameters/Client"
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+    post:
+      summary: Add metadata to a region
+      parameters:
+        - name: region_id
+          in: path
+          type: string
+          description: ID of the requested region
+          required: true
+        - name: metadata
+          in: body
+          description: metadata JSON
+          schema:
+            $ref: '#/definitions/MetadataWrapper'
+          required: true
+      tags:
+        - Metadata
+      responses:
+        201:
+          description: Metadata successfully added
+          schema:
+            $ref: '#/definitions/MetadataWrapper'
+        400:
+          description: Invalid JSON body
+          schema:
+            $ref: '#/definitions/400'
+        404:
+          description: Region not found
+          schema:
+            $ref: '#/definitions/404'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    put:
+      summary: Replace region metadata
+      parameters:
+        - name: region_id
+          in: path
+          type: string
+          description: ID of the requested region
+          required: true
+        - name: metadata
+          in: body
+          description: metadata JSON
+          schema:
+            $ref: '#/definitions/MetadataWrapper'
+          required: true
+      tags:
+        - Metadata
+      responses:
+        200:
+          description: Metadata successfully replaced
+          schema:
+            $ref: '#/definitions/MetadataWrapper'
+        400:
+          description: Invalid JSON body
+          schema:
+            $ref: '#/definitions/400'
+        404:
+          description: Region not found
+          schema:
+            $ref: '#/definitions/404'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+    get:
+      summary: Get region metadata
+      parameters:
+        - name: region_id
+          in: path
+          type: string
+          description: ID of the requested region
+          required: true
+      tags:
+        - Metadata
+      responses:
+        200:
+          description: Region metadata
+          schema:
+            $ref: '#/definitions/MetadataWrapper'
+        404:
+          description: Region not found
+          schema:
+            $ref: '#/definitions/404'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+  /regions/{region_id}/metadata/{metadata_key}:
+    parameters:
+      - $ref: "#/parameters/Client"
+      - $ref: "#/parameters/Token"
+      - $ref: "#/parameters/Region"
+    delete:
+      summary: Delete metadata from a region
+      parameters:
+        - name: region_id
+          in: path
+          type: string
+          description: ID of the requested region
+          required: true
+        - name: metadata_key
+          in: path
+          type: string
+          description: Metadata key to delete
+          required: true
+      tags:
+        - Metadata
+      responses:
+        204:
+          description: No content
+        404:
+          description: Region not found
+          schema:
+            $ref: '#/definitions/404'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+
+
+definitions:
+  Address:
+    type: object
+    properties:
+      country:
+        type: string
+      state:
+        type: string
+      city:
+        type: string
+      street:
+        type: string
+      zip:
+        type: string
+
+  EndPoint:
+    type: object
+    properties:
+      publicURL:
+        type: string
+      type:
+        type: string
+
+  RegionsData:
+    type: object
+    properties:
+      status:
+        type: string
+        enum: [
+            "building",
+            "functional",
+            "maintenance",
+            "down"
+        ]
+      id:
+        type: string
+        description: Region ID
+      name:
+        type: string
+        description: deprecated, this field is ignored
+      ranger_agent_version:
+        type: string
+        example: "AIC3.5"
+      open_stack_version:
+        type: string
+      clli:
+        type: string
+      metadata:
+        $ref: '#/definitions/ListDictionary'
+      endpoints:
+        type: array
+        description: Region endpoints. Must include "identity", "ord" and "dashboard"
+        items:
+          $ref: '#/definitions/EndPoint'
+      address:
+        $ref: '#/definitions/Address'
+      design_type:
+        type: string
+        example: "medium"
+      location_type:
+        type: string
+      vlcp_name:
+        type: string
+
+  Groups:
+    type: object
+    properties:
+      id:
+        type: string
+      name:
+        type: string
+      description:
+        type: string
+      regions:
+        type: array
+        items:
+          type: string
+
+  GroupsWrapper:
+    type: object
+    properties:
+      groups:
+        type: array
+        items:
+          $ref: '#/definitions/Groups'
+
+  Result:
+    type: object
+    properties:
+      group:
+        $ref: '#/definitions/Groups'
+
+  RegionStatus:
+    type: object
+    properties:
+      status:
+        type: string
+        enum: [
+            "functional",
+            "maintenance",
+            "building",
+            "down"
+        ]
+      links:
+        type: object
+        description: Status link, for output only
+        example: {"property1": "value1"}
+
+  MetadataWrapper:
+    type: object
+    properties:
+      metadata:
+        $ref: '#/definitions/ListDictionary'
+
+  RegionsWrapper:
+    type: object
+    properties:
+      regions:
+        type: array
+        items:
+          $ref: '#/definitions/RegionsData'
+
+  Error:
+    type: object
+    properties:
+      code:
+        type: integer
+        format: int32
+      type:
+        type: string
+      transaction_id:
+        type: string
+      message:
+        type: string
+      details:
+        type: string
+
+  409:
+    type: object
+    properties:
+      code:
+        type: integer
+        format: int32
+      type:
+        type: string
+      transaction_id:
+        type: string
+      message:
+        type: string
+      details:
+        type: string
+
+  400:
+    type: object
+    properties:
+      code:
+        type: integer
+        format: int32
+      type:
+        type: string
+      transaction_id:
+        type: string
+      message:
+        type: string
+      details:
+        type: string
+
+  404:
+    type: object
+    properties:
+      code:
+        type: integer
+        format: int32
+      type:
+        type: string
+      transaction_id:
+        type: string
+      message:
+        type: string
+      details:
+        type: string
+
+  ListDictionary:
+    type: object
+    additionalProperties:
+      type: "string"
+    example: {"property1": ["value1", "value2"]}
+
+
+parameters:
+  Token:
+    name: X-Auth-Token
+    in: header
+    description: Token from keystone
+    required: true
+    type: string
+
+  Region:
+    name: X-Auth-Region
+    in: header
+    description: Region
+    required: true
+    type: string
+
+  Client:
+    name: X-RANGER-Client
+    in: header
+    description: Client name
+    required: false
+    type: string
+
diff --git a/orm/services/region_manager/tox.ini b/orm/services/region_manager/tox.ini
new file mode 100755
index 00000000..d1ea4254
--- /dev/null
+++ b/orm/services/region_manager/tox.ini
@@ -0,0 +1,27 @@
+[tox]
+envlist = py27
+
+[testenv]
+setenv = PYTHONPATH = {toxinidir}:{toxinidir}/rms/external_mock/
+deps = -r{toxinidir}/requirements.txt
+       -r{toxinidir}/test-requirements.txt
+
+commands =
+    python setup.py testr --coverage --slowest --omit=rms/storage/my_sql/data_models.py,rms/tests/*,.tox/*,external_mock/*,setup.py,rms/logger/*,rms/app.py
+    coverage report --omit=rms/storage/my_sql/data_models.py,rms/tests/*,.tox/*,external_mock/*,setup.py,rms/logger/*,rms/app.py
+    coverage html  --omit=rms/storage/my_sql/data_models.py,rms/tests/*,.tox/*,external_mock/*,setup.py,rms/logger/*,rms/app.py
+
+[testenv:cover]
+setenv = PYTHONPATH = {toxinidir}:{toxinidir}/rms/external_mock/
+deps = -r{toxinidir}/requirements.txt
+       -r{toxinidir}/test-requirements.txt
+
+commands =
+     python setup.py testr --coverage --omit=rms/storage/my_sql/data_models.py,rms/tests/*,.tox/*,external_mock/*,setup.py,rms/logger/*,rms/app.py
+     coverage report --omit=rms/storage/my_sql/data_models.py,rms/tests/*,.tox/*,external_mock/*,setup.py,rms/logger/*,rms/app.py
+     coverage html  --omit=rms/storage/my_sql/data_models.py,rms/tests/*,.tox/*,external_mock/*,setup.py,rms/logger/*,rms/app.py
+
+[testenv:pep8]
+commands =
+
+    py.test --pep8 -m pep8
diff --git a/orm/services/resource_distributor/_-init__.py b/orm/services/resource_distributor/_-init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/config.py b/orm/services/resource_distributor/config.py
new file mode 100755
index 00000000..1b43ada6
--- /dev/null
+++ b/orm/services/resource_distributor/config.py
@@ -0,0 +1,176 @@
+# Pecan Application configurations
+app = {
+    'root': 'rds.controllers.root.RootController',
+    'modules': ['rds'],
+    'service_name': 'RDS'
+}
+
+server = {
+    'port': '8777',
+    'host': '0.0.0.0'
+}
+
+# DB configurations
+database = {
+    'url': 'mysql://root:stack@127.0.0.1/orm_rds?charset=utf8'
+}
+
+sot = {
+    'type': 'git',
+}
+
+git = {
+    # possible values : 'native', 'gittle'
+    'type': 'native',
+    'local_repository_path': '/opt/app/orm/ORM',
+    'file_name_format': 's_{}.yml',
+    'relative_path_format': '/{}/hot/{}/{}',
+    'commit_message_format': 'File was added to repository: {}',
+    'commit_user': 'orm_rds',
+    'commit_email': 'orm_rds@att.com',
+    'git_server_url': 'orm_rds@172.20.90.218:~/SoT/ORM.git',
+    'git_cmd_timeout': 45
+}
+
+audit = {
+    'audit_server_url': 'http://127.0.0.1:8776/v1/audit/transaction',
+    'num_of_send_retries': 3,
+    'time_wait_between_retries': 1
+}
+
+ims = {
+    'base_url': 'http://127.0.0.1:8084/',
+    'metadata_path': 'v1/orm/images/{0}/regions/{1}/metadata'
+}
+
+rms = {
+    'base_url': 'http://127.0.0.1:8080/',
+    'all_regions_path': 'v2/orm/regions'
+}
+
+ordupdate = {
+    'discovery_url': 'http://127.0.0.1',
+    'discovery_port': 8080,
+    'template_type': 'hot',
+    # This flag should be false only in case the ord does not support https.
+    'https_enabled': True,
+    # ORD supports HTTPS and you don't need a certificate? set 'cert_path': ''
+    'cert_path': '../resources/ord.crt'
+}
+
+verify = False
+
+UUID_URL = 'http://172.20.90.232:8090/v1/uuids'
+
+# yaml configurations
+yaml_configs = {
+    'customer_yaml': {
+        'yaml_version': '2014-10-16',
+        'yaml_options': {
+            'quotas': True,
+            'type': 'ldap'
+        },
+        'yaml_keys': {
+            'quotas_keys': {
+                'keypairs': 'key_pairs',
+                'network': 'networks',
+                'port': 'ports',
+                'router': 'routers',
+                'subnet': 'subnets',
+                'floatingip': 'floating_ips'
+            }
+        }
+    },
+    'flavor_yaml':{
+        'yaml_version': '2013-05-23',
+        'yaml_args': {
+            'rxtx_factor': 1
+        }
+    },
+    'image_yaml': {
+        'yaml_version': '2014-10-16'
+    }
+}
+
+# value of status to be blocked before creating any resource
+block_by_status = "Submitted"
+
+# this tells which values to allow resource submit the region
+allow_region_statuses = ['functional']
+
+# region_resource_id_status configurations
+region_resource_id_status = {
+    # interval_time_validation in minutes
+    'max_interval_time': {
+        'images': 60,
+        'tenants': 60,
+        'flavors': 60,
+        'users': 60,
+        'default': 60
+    },
+    'allowed_status_values': {
+        'Success',
+        'Error',
+        'Submitted'
+    },
+    'allowed_operation_type':
+    {
+        'create',
+        'modify',
+        'delete'
+    },
+    'allowed_resource_type':
+    {
+        'customer',
+        'image',
+        'flavor'
+    }
+}
+
+logging = {
+    'root': {'level': 'INFO', 'handlers': ['console']},
+    'loggers': {
+        'rds': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'], 'propagate': False},
+        'orm_common': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'], 'propagate': False},
+        'audit_client': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'], 'propagate': False},
+        'pecan': {'level': 'DEBUG', 'handlers': ['console'], 'propagate': False},
+        'py.warnings': {'handlers': ['console']},
+        '__force_dict__': True
+    },
+    'handlers': {
+        'console': {
+            'level': 'DEBUG',
+            'class': 'logging.StreamHandler',
+            'formatter': 'color'
+        },
+        'Logfile': {
+            'level': 'DEBUG',
+            'class': 'logging.handlers.RotatingFileHandler',
+            'maxBytes': 50000000,
+            'backupCount': 10,
+            'filename': '/tmp/rds.log',
+            'formatter': 'simple'
+        }
+    },
+    'formatters': {
+        'simple': {
+            'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]'
+                       '[%(threadName)s] %(message)s')
+        },
+        'color': {
+            '()': 'pecan.log.ColorFormatter',
+            'format':'%(asctime)s [%(padded_color_levelname)s] [%(name)s] [%(threadName)s] %(message)s',
+            '__force_dict__': True
+        }
+    }
+}
+
+
+authentication = {
+    "enabled": True,
+    "mech_id": "admin",
+    "mech_pass": "stack",
+    "tenant_name": "admin",
+    # The Keystone version currently in use. Can be either "2.0" or "3"
+    "keystone_version": "2.0"
+}
diff --git a/orm/services/resource_distributor/doc/RDS_Status_Service_Design.docx b/orm/services/resource_distributor/doc/RDS_Status_Service_Design.docx
new file mode 100644
index 00000000..e4bd69a3
Binary files /dev/null and b/orm/services/resource_distributor/doc/RDS_Status_Service_Design.docx differ
diff --git a/orm/services/resource_distributor/doc/source/conf.py b/orm/services/resource_distributor/doc/source/conf.py
new file mode 100644
index 00000000..5db310ee
--- /dev/null
+++ b/orm/services/resource_distributor/doc/source/conf.py
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('../..'))
+# -- General configuration ----------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = [
+    'sphinx.ext.autodoc',
+    #'sphinx.ext.intersphinx',
+    'oslosphinx'
+]
+
+# autodoc generation is a bit aggressive and a nuisance when doing heavy
+# text edit cycles.
+# execute "export SPHINX_DEBUG=1" in your terminal to disable
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'orm_rds'
+copyright = u'2013, OpenStack Foundation'
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+add_module_names = True
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# -- Options for HTML output --------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  Major themes that come with
+# Sphinx are currently 'default' and 'sphinxdoc'.
+# html_theme_path = ["."]
+# html_theme = '_theme'
+# html_static_path = ['static']
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = '%sdoc' % project
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass
+# [howto/manual]).
+latex_documents = [
+    ('index',
+     '%s.tex' % project,
+     u'%s Documentation' % project,
+     u'OpenStack Foundation', 'manual'),
+]
+
+# Example configuration for intersphinx: refer to the Python standard library.
+#intersphinx_mapping = {'http://docs.python.org/': None}
diff --git a/orm/services/resource_distributor/doc/source/contributing.rst b/orm/services/resource_distributor/doc/source/contributing.rst
new file mode 100644
index 00000000..30c78c8f
--- /dev/null
+++ b/orm/services/resource_distributor/doc/source/contributing.rst
@@ -0,0 +1,4 @@
+============
+Contributing
+============
+.. include:: ../../CONTRIBUTING.rst
diff --git a/orm/services/resource_distributor/doc/source/index.rst b/orm/services/resource_distributor/doc/source/index.rst
new file mode 100644
index 00000000..8cbbcddf
--- /dev/null
+++ b/orm/services/resource_distributor/doc/source/index.rst
@@ -0,0 +1,25 @@
+.. rds documentation master file, created by
+   sphinx-quickstart on Tue Jul  9 22:26:36 2013.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Welcome to rds's documentation!
+========================================================
+
+Contents:
+
+.. toctree::
+   :maxdepth: 2
+
+   readme
+   installation
+   usage
+   contributing
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
diff --git a/orm/services/resource_distributor/doc/source/installation.rst b/orm/services/resource_distributor/doc/source/installation.rst
new file mode 100644
index 00000000..8a6f5e5b
--- /dev/null
+++ b/orm/services/resource_distributor/doc/source/installation.rst
@@ -0,0 +1,12 @@
+============
+Installation
+============
+
+At the command line::
+
+    $ pip install rds
+
+Or, if you have virtualenvwrapper installed::
+
+    $ mkvirtualenv rds
+    $ pip install rds
diff --git a/orm/services/resource_distributor/doc/source/readme.rst b/orm/services/resource_distributor/doc/source/readme.rst
new file mode 100644
index 00000000..0517a6bb
--- /dev/null
+++ b/orm/services/resource_distributor/doc/source/readme.rst
@@ -0,0 +1 @@
+.. include:: ../../README.rst
diff --git a/orm/services/resource_distributor/doc/source/usage.rst b/orm/services/resource_distributor/doc/source/usage.rst
new file mode 100644
index 00000000..d1854c14
--- /dev/null
+++ b/orm/services/resource_distributor/doc/source/usage.rst
@@ -0,0 +1,7 @@
+========
+Usage
+========
+
+To use rds in a project::
+
+    import rds
diff --git a/orm/services/resource_distributor/ordmockserver/MANIFEST.in b/orm/services/resource_distributor/ordmockserver/MANIFEST.in
new file mode 100644
index 00000000..c922f11a
--- /dev/null
+++ b/orm/services/resource_distributor/ordmockserver/MANIFEST.in
@@ -0,0 +1 @@
+recursive-include public *
diff --git a/orm/services/resource_distributor/ordmockserver/config.py b/orm/services/resource_distributor/ordmockserver/config.py
new file mode 100755
index 00000000..7909c0e0
--- /dev/null
+++ b/orm/services/resource_distributor/ordmockserver/config.py
@@ -0,0 +1,114 @@
+# Server Specific Configurations
+server = {
+    'port': '1337',
+    'host': '0.0.0.0'
+}
+
+UUID_URL = 'http://127.0.0.1:8090/v1/uuids'
+RDS_STATUS_URL = 'http://127.0.0.1:8777/v1/rds/status'
+SECONDS_BEFORE_STATUS_UPDATE = 5
+
+status_data = {
+    'ord_notifier_id': '1',
+    'region': 'mtn6',
+    'status': 'Success',
+    'error_code': '',
+    'error_msg': ''
+}
+
+image_extra_metadata = {
+    'checksum': 'd4ea426817a742328da91438e3a3208b',
+    # Size should be int and virtual_size should be real None once our
+    # database supports these values
+    'size': '1337',
+    'virtual_size': 'None'
+}
+
+# Pecan Application Configurations
+app = {
+    'root': 'ordmockserver.controllers.root.RootController',
+    'modules': ['ordmockserver'],
+    'static_root': '%(confdir)s/public',
+    'template_path': '%(confdir)s/restapi/templates',
+    'debug': True,
+    'errors': {
+        404: '/error/404',
+        '__force_dict__': True
+    }
+}
+
+verify = False
+
+logging = {
+    'root': {'level': 'INFO', 'handlers': ['console']},
+    'loggers': {
+        'restapi': {'level': 'DEBUG', 'handlers': ['console','logfile'], 'propagate': False},
+        'pecan': {'level': 'DEBUG', 'handlers': ['console'], 'propagate': False},
+        'py.warnings': {'handlers': ['console']},
+        '__force_dict__': True
+    },
+    'handlers': {
+        'console': {
+            'level': 'DEBUG',
+            'class': 'logging.StreamHandler',
+            'formatter': 'color'
+        },
+        'logfile' : {
+            'class': 'logging.FileHandler',
+            'filename' : '/home/pecanlogs.log',
+            'level' : 'DEBUG',
+            'formatter' : 'simple'
+        }
+    },
+    'formatters': {
+        'simple': {
+            'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]'
+                       '[%(threadName)s] %(message)s')
+        },
+        'color': {
+            '()': 'pecan.log.ColorFormatter',
+            'format': ('%(asctime)s [%(padded_color_levelname)s] [%(name)s]'
+                       '[%(threadName)s] %(message)s'),
+        '__force_dict__': True
+        }
+    }
+}
+
+
+"""
+# orign logging
+logging = {
+    'root': {'level': 'INFO', 'handlers': ['console']},
+    'loggers': {
+        'restapi': {'level': 'DEBUG', 'handlers': ['console'], 'propagate': False},
+        'pecan': {'level': 'DEBUG', 'handlers': ['console'], 'propagate': False},
+        'py.warnings': {'handlers': ['console']},
+        '__force_dict__': True
+    },
+    'handlers': {
+        'console': {
+            'level': 'DEBUG',
+            'class': 'logging.StreamHandler',
+            'formatter': 'color'
+        }
+    },
+    'formatters': {
+        'simple': {
+            'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]'
+                       '[%(threadName)s] %(message)s')
+        },
+        'color': {
+            '()': 'pecan.log.ColorFormatter',
+            'format': ('%(asctime)s [%(padded_color_levelname)s] [%(name)s]'
+                       '[%(threadName)s] %(message)s'),
+        '__force_dict__': True
+        }
+    }
+}
+"""
+# Custom Configurations must be in Python dictionary format::
+#
+# foo = {'bar':'baz'}
+#
+# All configurations are accessible at::
+# pecan.conf
diff --git a/orm/services/resource_distributor/ordmockserver/ordmockserver/__init__.py b/orm/services/resource_distributor/ordmockserver/ordmockserver/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/ordmockserver/ordmockserver/app.py b/orm/services/resource_distributor/ordmockserver/ordmockserver/app.py
new file mode 100644
index 00000000..6e5140dd
--- /dev/null
+++ b/orm/services/resource_distributor/ordmockserver/ordmockserver/app.py
@@ -0,0 +1,14 @@
+from pecan import make_app
+from ordmockserver import model
+
+
+def setup_app(config):
+
+    model.init_model()
+    app_conf = dict(config.app)
+
+    return make_app(
+        app_conf.pop('root'),
+        logging=getattr(config, 'logging', {}),
+        **app_conf
+    )
diff --git a/orm/services/resource_distributor/ordmockserver/ordmockserver/controllers/OrdNotifier/__init__.py b/orm/services/resource_distributor/ordmockserver/ordmockserver/controllers/OrdNotifier/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/ordmockserver/ordmockserver/controllers/OrdNotifier/models/__init__.py b/orm/services/resource_distributor/ordmockserver/ordmockserver/controllers/OrdNotifier/models/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/ordmockserver/ordmockserver/controllers/OrdNotifier/root.py b/orm/services/resource_distributor/ordmockserver/ordmockserver/controllers/OrdNotifier/root.py
new file mode 100755
index 00000000..a14c7df8
--- /dev/null
+++ b/orm/services/resource_distributor/ordmockserver/ordmockserver/controllers/OrdNotifier/root.py
@@ -0,0 +1,90 @@
+import json
+import logging.handlers
+from pecan import conf
+from pecan import request
+import pecan.rest
+import requests
+import threading
+import time
+import wsme
+from wsme import types as wtypes
+from wsmeext.pecan import wsexpose
+
+my_logger = logging.getLogger(__name__)
+
+
+class Result(wtypes.DynamicBase):
+    haha = wsme.wsattr(wtypes.text, mandatory=True)
+
+    def __init__(self, haha):
+        self.haha = haha
+
+
+class OrdNotifierWrapper(wtypes.DynamicBase):
+    ord_notifier = wsme.wsattr(
+        {str: str, str: str, str: str, str: str, str: str}, mandatory=False,
+        name='ord-notifier')
+
+    def __init__(self, ord_notifier=None):
+        self.ord_notifier = ord_notifier
+
+
+def send_status_update(ord_notifier_wrapper):
+    # Wait before sending the status update, to make sure RDS updates the
+    # status to Submitted
+    time.sleep(conf.SECONDS_BEFORE_STATUS_UPDATE)
+
+    json_to_send = {"rds-listener": {}}
+    for key in ('ord-notifier-id', 'region', 'status', 'error-code',
+                'error-msg',):
+        # Take the keys from the configuration
+        json_to_send['rds-listener'][key] = conf.status_data[
+            key.replace('-', '_')]
+
+    for key in ('request-id', 'resource-id', 'resource-type',
+                'resource-template-version', 'resource-template-type',
+                'region',):
+        # Take the keys from the input json
+        json_to_send['rds-listener'][key] = ord_notifier_wrapper.ord_notifier[
+            key]
+
+    json_to_send['rds-listener']['resource-operation'] = \
+        ord_notifier_wrapper.ord_notifier['operation']
+
+    if ord_notifier_wrapper.ord_notifier['resource-type'] == 'image':
+        json_to_send['rds-listener'][
+            'resource_extra_metadata'] = dict(conf.image_extra_metadata)
+
+    result = requests.post(conf.RDS_STATUS_URL,
+                           headers={'Content-Type': 'application/json'},
+                           data=json.dumps(json_to_send),
+                           verify=conf.verify)
+    my_logger.debug(
+        'Status update status code: {}, content: {}'.format(result.status_code,
+                                                            result.content))
+    return result
+
+
+class OrdNotifier(pecan.rest.RestController):
+    def _send_status_update(self, ord_notifier_wrapper):
+        thread = threading.Thread(target=send_status_update,
+                                  args=(ord_notifier_wrapper,))
+        thread.start()
+
+    @wsexpose(Result, body=OrdNotifierWrapper, status_code=200,
+              rest_content_types='json')
+    def post(self, ord_notifier_wrapper):
+        try:
+            my_logger.debug('Entered post, ord_notifier: {}'.format(
+                ord_notifier_wrapper.ord_notifier))
+            mandatory_keys = ['resource-type']
+            if not all(
+                    [key in ord_notifier_wrapper.ord_notifier for key in
+                     mandatory_keys]):
+                raise ValueError('A mandatory key is missing')
+
+            self._send_status_update(ord_notifier_wrapper)
+        except Exception as exc:
+            my_logger.error(str(exc))
+
+        return Result('Success')
diff --git a/orm/services/resource_distributor/ordmockserver/ordmockserver/controllers/__init__.py b/orm/services/resource_distributor/ordmockserver/ordmockserver/controllers/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/ordmockserver/ordmockserver/controllers/root.py b/orm/services/resource_distributor/ordmockserver/ordmockserver/controllers/root.py
new file mode 100755
index 00000000..5dfe7670
--- /dev/null
+++ b/orm/services/resource_distributor/ordmockserver/ordmockserver/controllers/root.py
@@ -0,0 +1,48 @@
+from pecan import expose, redirect, response
+from pecan import *
+from webob.exc import status_map
+from OrdNotifier import root
+
+
+class CatalogController(object):
+    @expose()
+    def index(self):
+        return "Welcome to the catalog."
+
+
+class ORD(object):
+    @expose()
+    def index(self):
+        return dict()
+    ord_notifier=root.OrdNotifier()
+
+
+class RootOne(object):
+    @expose()
+    def index(self):
+        return dict()
+    ord=ORD()
+
+
+class RootController(object):
+
+    @expose(generic=True, template='index.html')
+    def index(self):
+        return dict()
+
+    @index.when(method='GET')
+    def index_get(self):
+        return 'hi'
+
+
+    def error(self, status):
+        try:
+            status = int(status)
+        except ValueError:  # pragma: no cover
+            status = 500
+        message = getattr(status_map.get(status), 'explanation', '')
+        return dict(status=status, message=message)
+
+    cat=CatalogController()
+    #customer=root.CreateNewCustomer()
+    v1=RootOne()
diff --git a/orm/services/resource_distributor/ordmockserver/ordmockserver/model/__init__.py b/orm/services/resource_distributor/ordmockserver/ordmockserver/model/__init__.py
new file mode 100644
index 00000000..d983f7bc
--- /dev/null
+++ b/orm/services/resource_distributor/ordmockserver/ordmockserver/model/__init__.py
@@ -0,0 +1,15 @@
+from pecan import conf  # noqa
+
+
+def init_model():
+    """
+    This is a stub method which is called at application startup time.
+
+    If you need to bind to a parsed database configuration, set up tables or
+    ORM classes, or perform any database initialization, this is the
+    recommended place to do it.
+
+    For more information working with databases, and some common recipes,
+    see http://pecan.readthedocs.org/en/latest/databases.html
+    """
+    pass
diff --git a/orm/services/resource_distributor/ordmockserver/ordmockserver/templates/error.html b/orm/services/resource_distributor/ordmockserver/ordmockserver/templates/error.html
new file mode 100644
index 00000000..f2d97961
--- /dev/null
+++ b/orm/services/resource_distributor/ordmockserver/ordmockserver/templates/error.html
@@ -0,0 +1,12 @@
+<%inherit file="layout.html" />
+
+## provide definitions for blocks we want to redefine
+<%def name="title()">
+    Server Error ${status}
+</%def>
+
+## now define the body of the template
+    <header>
+        <h1>Server Error ${status}</h1>
+    </header>
+    <p>${message}</p>
diff --git a/orm/services/resource_distributor/ordmockserver/ordmockserver/templates/index.html b/orm/services/resource_distributor/ordmockserver/ordmockserver/templates/index.html
new file mode 100644
index 00000000..f17c3862
--- /dev/null
+++ b/orm/services/resource_distributor/ordmockserver/ordmockserver/templates/index.html
@@ -0,0 +1,34 @@
+<%inherit file="layout.html" />
+
+## provide definitions for blocks we want to redefine
+<%def name="title()">
+    Welcome to Pecan!
+</%def>
+
+## now define the body of the template
+    <header>
+        <h1><img src="/images/logo.png" /></h1>
+    </header>
+
+    <div id="content">
+
+        <p>This is a sample Pecan project.</p>
+
+        <p>
+            Instructions for getting started can be found online at <a
+            href="http://pecanpy.org" target="window">pecanpy.org</a>
+        </p>
+
+        <p>
+            ...or you can search the documentation here:
+        </p>
+
+        <form method="POST" action="/">
+            <fieldset>
+                <input name="q" />
+                <input type="submit" value="Search" />
+            </fieldset>
+            <small>Enter search terms or a module, class or function name.</small>
+        </form>
+
+    </div>
diff --git a/orm/services/resource_distributor/ordmockserver/ordmockserver/templates/layout.html b/orm/services/resource_distributor/ordmockserver/ordmockserver/templates/layout.html
new file mode 100644
index 00000000..40908591
--- /dev/null
+++ b/orm/services/resource_distributor/ordmockserver/ordmockserver/templates/layout.html
@@ -0,0 +1,22 @@
+<html>
+    <head>
+        <title>${self.title()}</title>
+        ${self.style()}
+        ${self.javascript()}
+    </head>
+    <body>
+        ${self.body()}
+    </body>
+</html>
+
+<%def name="title()">
+    Default Title
+</%def>
+
+<%def name="style()">
+    <link rel="stylesheet" type="text/css" media="screen" href="/css/style.css" />
+</%def>
+
+<%def name="javascript()">
+    <script language="text/javascript" src="/javascript/shared.js"></script>
+</%def>
diff --git a/orm/services/resource_distributor/ordmockserver/public/css/style.css b/orm/services/resource_distributor/ordmockserver/public/css/style.css
new file mode 100644
index 00000000..55c9db54
--- /dev/null
+++ b/orm/services/resource_distributor/ordmockserver/public/css/style.css
@@ -0,0 +1,43 @@
+body {
+  background: #311F00;
+  color: white;
+  font-family: 'Helvetica Neue', 'Helvetica', 'Verdana', sans-serif;
+  padding: 1em 2em;
+}
+
+a {
+  color: #FAFF78;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+div#content  {
+  width: 800px;
+  margin: 0 auto;
+}
+
+form {
+  margin: 0;
+  padding: 0;
+  border: 0;
+}
+
+fieldset {
+  border: 0;
+}
+
+input.error {
+  background: #FAFF78;
+}
+
+header {
+  text-align: center;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  font-family: 'Futura-CondensedExtraBold', 'Futura', 'Helvetica', sans-serif;
+  text-transform: uppercase;
+}
diff --git a/orm/services/resource_distributor/ordmockserver/public/images/logo.png b/orm/services/resource_distributor/ordmockserver/public/images/logo.png
new file mode 100644
index 00000000..a8f403e4
Binary files /dev/null and b/orm/services/resource_distributor/ordmockserver/public/images/logo.png differ
diff --git a/orm/services/resource_distributor/ordmockserver/setup.cfg b/orm/services/resource_distributor/ordmockserver/setup.cfg
new file mode 100644
index 00000000..4c9b8495
--- /dev/null
+++ b/orm/services/resource_distributor/ordmockserver/setup.cfg
@@ -0,0 +1,6 @@
+[nosetests]
+match=^test
+where=ordmockserver
+nocapture=1
+cover-package=ordmockserver
+cover-erase=1
diff --git a/orm/services/resource_distributor/ordmockserver/setup.py b/orm/services/resource_distributor/ordmockserver/setup.py
new file mode 100644
index 00000000..c4d11ee5
--- /dev/null
+++ b/orm/services/resource_distributor/ordmockserver/setup.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+try:
+    from setuptools import setup, find_packages
+except ImportError:
+    from ez_setup import use_setuptools
+    use_setuptools()
+    from setuptools import setup, find_packages
+
+setup(
+    name='ordmockserver',
+    version='0.1',
+    description='',
+    author='',
+    author_email='',
+    install_requires=[
+        "pecan",
+    ],
+    test_suite='ordmockserver',
+    zip_safe=False,
+    include_package_data=True,
+    packages=find_packages(exclude=['ez_setup'])
+)
diff --git a/orm/services/resource_distributor/rds.conf b/orm/services/resource_distributor/rds.conf
new file mode 100644
index 00000000..a7bba7d1
--- /dev/null
+++ b/orm/services/resource_distributor/rds.conf
@@ -0,0 +1,26 @@
+Listen 8777
+ 
+<VirtualHost *:8777>
+ 
+    WSGIDaemonProcess rds user=orm group=orm threads=5
+    WSGIScriptAlias / /opt/app/orm/rds/rds.wsgi
+	
+	<Location /v1/rds/logs>
+		Order deny,allow
+		Deny from all
+		Allow from localhost
+	</Location>
+
+	<Location /v1/rds/configuration>
+		Order deny,allow
+		Deny from all
+		Allow from localhost
+	</Location>
+ 
+    <Directory /opt/app/orm/rds/>
+        WSGIProcessGroup rds
+        WSGIApplicationGroup %{GLOBAL}
+                Require all granted
+        Allow from all
+    </Directory>
+</VirtualHost>
diff --git a/orm/services/resource_distributor/rds.wsgi b/orm/services/resource_distributor/rds.wsgi
new file mode 100644
index 00000000..f5259e20
--- /dev/null
+++ b/orm/services/resource_distributor/rds.wsgi
@@ -0,0 +1,2 @@
+from pecan.deploy import deploy
+application = deploy('/opt/app/orm/rds/config.py')
diff --git a/orm/services/resource_distributor/rds/__init__.py b/orm/services/resource_distributor/rds/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/app.py b/orm/services/resource_distributor/rds/app.py
new file mode 100755
index 00000000..8f9a1e9c
--- /dev/null
+++ b/orm/services/resource_distributor/rds/app.py
@@ -0,0 +1,75 @@
+import logging
+import os
+
+from pecan import make_app, conf
+from pecan.commands import CommandRunner
+
+from services import region_resource_id_status
+from storage import factory
+from sot import sot_factory
+
+from audit_client.api import audit
+
+
+logger = logging.getLogger(__name__)
+
+
+def setup_app(pecan_config):
+    """This method is the starting point of the application.
+    The application can be started either by running pecan
+    and pass it the config.py,
+    or by running this file with python,
+    then the main method is called and starting pecan.
+
+    The method initializes components and return a WSGI application"""
+
+    init_sot()
+    init_audit()
+
+    factory.database = conf.database
+    region_resource_id_status.config = conf.region_resource_id_status
+
+    app = make_app(conf.app.root, logging=conf.logging)
+    logger.info('Starting RDS...')
+
+    validate_sot()
+
+    return app
+
+
+def init_sot():
+    """Initialize SoT module
+    """
+    sot_factory.sot_type = conf.sot.type
+    sot_factory.local_repository_path = conf.git.local_repository_path
+    sot_factory.relative_path_format = conf.git.relative_path_format
+    sot_factory.file_name_format = conf.git.file_name_format
+    sot_factory.commit_message_format = conf.git.commit_message_format
+    sot_factory.commit_user = conf.git.commit_user
+    sot_factory.commit_email = conf.git.commit_email
+    sot_factory.git_server_url = conf.git.git_server_url
+    sot_factory.git_type = conf.git.type
+
+
+def init_audit():
+    """Initialize audit client module
+    """
+    audit.init(conf.audit.audit_server_url,
+               conf.audit.num_of_send_retries,
+               conf.audit.time_wait_between_retries,
+               conf.app.service_name)
+
+
+def validate_sot():
+    sot_factory.get_sot().validate_sot_state()
+
+
+def main():
+    dir_name = os.path.dirname(__file__)
+    drive, path_and_file = os.path.splitdrive(dir_name)
+    path, filename = os.path.split(path_and_file)
+    runner = CommandRunner()
+    runner.run(['serve', path+'/config.py'])
+
+if __name__ == "__main__":
+    main()
\ No newline at end of file
diff --git a/orm/services/resource_distributor/rds/controllers/__init__.py b/orm/services/resource_distributor/rds/controllers/__init__.py
new file mode 100644
index 00000000..e1a527df
--- /dev/null
+++ b/orm/services/resource_distributor/rds/controllers/__init__.py
@@ -0,0 +1 @@
+"""v1 package."""
diff --git a/orm/services/resource_distributor/rds/controllers/root.py b/orm/services/resource_distributor/rds/controllers/root.py
new file mode 100644
index 00000000..5f687358
--- /dev/null
+++ b/orm/services/resource_distributor/rds/controllers/root.py
@@ -0,0 +1,8 @@
+"""controller moudle."""
+from rds.controllers.v1 import root as v1
+
+
+class RootController(object):
+    """api controller."""
+
+    v1 = v1.V1Controller()
diff --git a/orm/services/resource_distributor/rds/controllers/v1/__init__.py b/orm/services/resource_distributor/rds/controllers/v1/__init__.py
new file mode 100644
index 00000000..b933650e
--- /dev/null
+++ b/orm/services/resource_distributor/rds/controllers/v1/__init__.py
@@ -0,0 +1 @@
+"""v1 package."""
diff --git a/orm/services/resource_distributor/rds/controllers/v1/base.py b/orm/services/resource_distributor/rds/controllers/v1/base.py
new file mode 100644
index 00000000..15cb5ad2
--- /dev/null
+++ b/orm/services/resource_distributor/rds/controllers/v1/base.py
@@ -0,0 +1,100 @@
+"""Exceptions."""
+import wsme
+from wsme import types as wtypes
+
+
+class ClientSideError(wsme.exc.ClientSideError):
+    """return 400 with error message."""
+
+    def __init__(self, error, status_code=400):
+        """init function..
+
+        :param error: error message
+        :param status_code: returned code
+        """
+        super(ClientSideError, self).__init__(error, status_code)
+
+
+class InputValueError(ClientSideError):
+    """return 400 for invalid input."""
+
+    def __init__(self, name, value, status_code=400):
+        """init function.
+
+        :param name: inavlid input field name
+        :param value: invalid value
+        :param status_code: returned code
+        """
+        super(InputValueError, self).__init__("Invalid "
+                                              "value for input {} : "
+                                              "{}".format(name, value),
+                                              status_code)
+
+
+class EntityNotFoundError(ClientSideError):
+    """return 404 entity not found."""
+
+    def __init__(self, id):
+        """init func.
+
+        :param id: Entity id
+        """
+        super(EntityNotFoundError, self).__init__("Entity not found "
+                                                  "for {}".format(id),
+                                                  status_code=404)
+
+
+class LockedEntity(ClientSideError):
+    """return 409 locked."""
+
+    def __init__(self, name):
+        """init func.
+
+        :param name: locked message
+        """
+        super(LockedEntity, self).__init__("Entity {} is "
+                                           "locked".format(name),
+                                           status_code=409)
+
+
+class NotAllowedError(ClientSideError):
+    """return 405 not allowed operation."""
+
+    def __init__(self, name):
+        """init func.
+
+        :param name: name of method
+        """
+        super(NotAllowedError, self).__init__("not allowed : "
+                                              "{}".format(name),
+                                              status_code=405)
+
+
+class Base(wtypes.DynamicBase):
+    """not implemented."""
+
+    pass
+
+    '''
+    @classmethod
+    def from_model(cls, m):
+        return cls(**(m.as_dict()))
+
+    def as_dict(self, model):
+        valid_keys = inspect.getargspec(model.__init__)[0]
+        if 'self' in valid_keys:
+            valid_keys.remove('self')
+        return self.as_dict_from_keys(valid_keys)
+
+
+    def as_dict_from_keys(self, keys):
+        return dict((k, getattr(self, k))
+                    for k in keys
+                    if hasattr(self, k) and
+                    getattr(self, k) != wsme.Unset)
+
+    @classmethod
+    def from_db_and_links(cls, m, links):
+        return cls(links=links, **(m.as_dict()))
+
+    '''
diff --git a/orm/services/resource_distributor/rds/controllers/v1/configuration/__init__.py b/orm/services/resource_distributor/rds/controllers/v1/configuration/__init__.py
new file mode 100644
index 00000000..e1a527df
--- /dev/null
+++ b/orm/services/resource_distributor/rds/controllers/v1/configuration/__init__.py
@@ -0,0 +1 @@
+"""v1 package."""
diff --git a/orm/services/resource_distributor/rds/controllers/v1/configuration/root.py b/orm/services/resource_distributor/rds/controllers/v1/configuration/root.py
new file mode 100644
index 00000000..f8be0ffa
--- /dev/null
+++ b/orm/services/resource_distributor/rds/controllers/v1/configuration/root.py
@@ -0,0 +1,28 @@
+"""Configuration rest API input module."""
+
+import logging
+from orm_common.utils import utils
+from pecan import conf
+from pecan import rest
+from wsmeext.pecan import wsexpose
+
+logger = logging.getLogger(__name__)
+
+
+class Configuration(rest.RestController):
+    """Configuration controller."""
+
+    @wsexpose(str, str, status_code=200)
+    def get(self, dump_to_log='false'):
+        """get method.
+
+        :param dump_to_log: A boolean string that says whether the
+        configuration should be written to log
+        :return: A pretty string that contains the service's configuration
+        """
+        logger.info("Get configuration...")
+
+        dump = dump_to_log.lower() == 'true'
+        utils.set_utils_conf(conf)
+        result = utils.report_config(conf, dump, logger)
+        return result
diff --git a/orm/services/resource_distributor/rds/controllers/v1/logs.py b/orm/services/resource_distributor/rds/controllers/v1/logs.py
new file mode 100644
index 00000000..e8d7b1bb
--- /dev/null
+++ b/orm/services/resource_distributor/rds/controllers/v1/logs.py
@@ -0,0 +1,65 @@
+import logging
+
+from pecan import rest
+import wsme
+from wsmeext.pecan import wsexpose
+
+logger = logging.getLogger(__name__)
+
+
+class LogChangeResultWSME(wsme.types.DynamicBase):
+    """log change result wsme type."""
+
+    result = wsme.wsattr(str, mandatory=True, default=None)
+
+    def __init__(self, **kwargs):
+        """"init method."""
+        super(LogChangeResult, self).__init__(**kwargs)
+
+
+class LogChangeResult(object):
+    """log change result type."""
+
+    def __init__(self, result):
+        """"init method."""
+        self.result = result
+
+
+class LogsController(rest.RestController):
+    """Logs Audit controller."""
+
+    @wsexpose(LogChangeResultWSME, str, status_code=201,
+              rest_content_types='json')
+    def put(self, level):
+        """update log level.
+
+        :param level: the log level text name
+        :return:
+        """
+
+        logger.info("Changing log level to [{}]".format(level))
+        try:
+            log_level = logging._levelNames.get(level.upper())
+            if log_level is not None:
+                self._change_log_level(log_level)
+                result = "Log level changed to {}.".format(level)
+                logger.info(result)
+            else:
+                raise Exception(
+                    "The given log level [{}] doesn't exist.".format(level))
+        except Exception as e:
+            result = "Fail to change log_level. Reason: {}".format(
+                e.message)
+            logger.error(result)
+        return LogChangeResult(result)
+
+    @staticmethod
+    def _change_log_level(log_level):
+        path = __name__.split('.')
+        if len(path) > 0:
+            root = path[0]
+            root_logger = logging.getLogger(root)
+            root_logger.setLevel(log_level)
+        else:
+            logger.info("Fail to change log_level to [{}]. "
+                        "the given log level doesn't exist.".format(log_level))
diff --git a/orm/services/resource_distributor/rds/controllers/v1/resources/__init__.py b/orm/services/resource_distributor/rds/controllers/v1/resources/__init__.py
new file mode 100644
index 00000000..a3c7f303
--- /dev/null
+++ b/orm/services/resource_distributor/rds/controllers/v1/resources/__init__.py
@@ -0,0 +1 @@
+"""resource package."""
diff --git a/orm/services/resource_distributor/rds/controllers/v1/resources/root.py b/orm/services/resource_distributor/rds/controllers/v1/resources/root.py
new file mode 100755
index 00000000..ab202b0b
--- /dev/null
+++ b/orm/services/resource_distributor/rds/controllers/v1/resources/root.py
@@ -0,0 +1,283 @@
+"""handle rest api input module."""
+
+import ast
+import logging.handlers
+import time
+
+import pecan
+import wsme
+from pecan import rest
+from wsme import types as wtypes
+from wsmeext.pecan import wsexpose
+
+from rds.controllers.v1.base import ClientSideError
+from rds.controllers.v1.base import LockedEntity
+from rds.controllers.v1.base import NotAllowedError
+from rds.services import resource as ResourceService
+from rds.services.base import ConflictValue
+
+my_logger = logging.getLogger(__name__)
+
+resources_operation_list = {
+    "flavor": ['delete', 'create', 'modify'],
+    "image": ['delete', 'create', 'modify']
+}
+
+
+class Links(wtypes.DynamicBase):
+    """class method."""
+
+    self = wsme.wsattr(wtypes.text, mandatory=True)
+
+    def __init__(own, self=""):
+        """init function.
+
+        :param self: self link
+        """
+        own.self = self
+
+
+class CreatedResource(wtypes.DynamicBase):
+    """class method for returned json."""
+
+    id = wsme.wsattr(wtypes.text, mandatory=True)
+    created = wsme.wsattr(wtypes.text, mandatory=False)
+    links = wsme.wsattr(Links, mandatory=True)
+    updated = wsme.wsattr(wtypes.text, mandatory=False)
+    err = wsme.wsattr(wtypes.text, mandatory=False)
+    message = wsme.wsattr(wtypes.text, mandatory=False)
+
+    def __init__(self, id="", err=None, message=None,
+                 created=None, updated=None, links=Links()):
+        """init function.
+
+        :param id: resource id
+        :param err: error if any
+        :param message: error message
+        :param created: timestamp
+        :param updated: timestamp when put request
+        :param links:
+        """
+        self.id = id
+        self.links = links
+        if created is not None:
+            self.created = created
+        if updated is not None:
+            self.updated = updated
+        if err is not None:
+            self.err = err            # pragma: no cover
+        if message is not None:
+            self.message = message    # pragma: no cover
+
+
+class Result(wtypes.DynamicBase):
+    """class method, json header."""
+
+    customer = wsme.wsattr(CreatedResource, mandatory=False)
+    flavor = wsme.wsattr(CreatedResource, mandatory=False)
+    image = wsme.wsattr(CreatedResource, mandatory=False)
+
+    def __init__(self, customer=None,
+                 flavor=None, image=None):
+        """init function.
+
+        :param customer: json header
+        :param flavor: json header
+        """
+        if customer is not None:
+            self.customer = customer
+        if flavor is not None:
+            self.flavor = flavor
+        if image is not None:
+            self.image = image
+
+
+class TrackingData(wtypes.DynamicBase):
+    """class method to handle json input."""
+
+    external_id = wsme.wsattr(wtypes.text, mandatory=True)
+    tracking_id = wsme.wsattr(wtypes.text, mandatory=True)
+
+    def __init__(self, external_id="", tracking_id=""):
+        """init function.
+
+        :param external_id: full flow traking id
+        :param tracking_id: enternal traking id
+        """
+        self.external_id = external_id
+        self.tracking_id = tracking_id
+
+
+class ResourceTypeData(wtypes.DynamicBase):
+    """class method, handle json input."""
+
+    resource_type = wsme.wsattr(wtypes.text, mandatory=True)
+    resource_id = wsme.wsattr(wtypes.text, mandatory=False)
+
+    def __init__(self, resource_type="", resource_id=None):
+        """init function.
+
+        :param resource_type: type of the resource eg.customer, flavor..
+        :param resource_id: id of the resource
+        """
+        self.resource_type = resource_type
+        if resource_id is not None:
+            self.resource_id = resource_id    # pragma: no cover
+
+
+class ResourceData(wtypes.DynamicBase):
+    """class method to handle resource data json."""
+
+    resource = wsme.wsattr(ResourceTypeData, mandatory=True)
+    model = wsme.wsattr(wtypes.text, mandatory=True)
+    # model = wsme.wsattr(FullJson, mandatory=True)
+    tracking = wsme.wsattr(TrackingData, mandatory=True)
+
+    def __init__(self, model="", resource=ResourceTypeData(),
+                 tracking=TrackingData(),):
+        """init function.
+
+        :param model: input json (resource data)
+        :param resource: resource type, resource id
+        :param tracking: transaction id
+        """
+        self.resource = resource
+        self.tracking = tracking
+        self.model = model
+
+
+class Resource(wtypes.DynamicBase):
+    """main class  first key json."""
+
+    service_template = wsme.wsattr(ResourceData, mandatory=True)
+
+    def __init__(self, service_template=ResourceData()):
+        """init function.
+
+        :param service_template:
+        """
+        self.service_template = service_template
+
+
+class CreateNewResource(rest.RestController):
+    """creatin new resource controller."""
+
+    @wsexpose(Result, body=Resource, status_code=201,
+              rest_content_types='json')
+    def post(self, resource):
+        """Handle HTTP POST request.
+
+        :param Customer (json in request body):
+        :return: result (json format ... {'Cusetomer':{'id':'',
+        'links':{'own':'how host url'},'created':'1234567890'}}
+        the response will be 201 created if success
+        :return 409 for conflict
+        :return 400 bad request
+        handle json input
+        """
+        my_logger.info("create resource")
+        jsondata = resource.service_template.model
+        my_logger.debug("parse json & get yaml file!!! {}".format(jsondata))
+        uuid = resource.service_template.tracking.tracking_id
+        resource_type = resource.service_template.resource.resource_type
+        base_url = pecan.request.application_url
+        jsondata = ast.literal_eval(jsondata)
+
+        try:
+            resource_id = ResourceService.main(jsondata,
+                                               uuid,
+                                               resource_type,
+                                               'create')
+            site_link = "%s/v1/rds/%s/%s" % (base_url,
+                                             resource_type,
+                                             resource_id)
+            res = Result(**{resource_type: CreatedResource(id=resource_id,
+                                                           created='%d' % (time.time()*1000),
+                                                           links=Links(site_link))})
+            return res
+        except ConflictValue as e:
+            my_logger.error("the request blocked need to wait "
+                            "for previous operation to be done ")
+            raise LockedEntity(e.message)
+        except Exception as e:
+            my_logger.error("error :- %s " % str(e.message))
+            raise ClientSideError(e.message)
+
+    @wsexpose(Result, body=Resource, status_code=201,
+              rest_content_types='json')
+    def put(self, resource):
+        """Handle HTTP POST request.
+
+        :param Customer (json in request body):
+        :return: result (json format ... {'Cusetomer':{'id':'',
+        'links':{'own':'how host url'},'created':'1234567890'}}
+        the response will be 201 created if success
+        :return 409 for conflict
+        :return 400 bad request
+        handle json input
+        """
+        my_logger.info("modify resource")
+        jsondata = resource.service_template.model
+        my_logger.debug("parse json & get yaml file!!! {}".format(jsondata))
+        uuid = resource.service_template.tracking.tracking_id
+        resource_type = resource.service_template.resource.resource_type
+        base_url = pecan.request.application_url
+        jsondata = ast.literal_eval(jsondata)
+
+        try:
+            resource_id = ResourceService.main(jsondata,
+                                               uuid,
+                                               resource_type,
+                                               'modify')
+            my_logger.debug("data sent!.")
+            site_link = "%s/v1/rds/%s/%s" % (base_url,
+                                             resource_type,
+                                             resource_id)
+            res = Result(**{resource_type: CreatedResource(id=resource_id,
+                                                           updated='%d' % (
+                                                           time.time() * 1000),
+                                                           links=Links(
+                                                               site_link))})
+            return res
+        except ConflictValue as e:
+            my_logger.error("the request blocked need to wait "
+                            "for previous operation to be done ")
+            raise LockedEntity(e.message)
+        except Exception as e:
+            my_logger.error("error :- %s " % str(e.message))
+            raise ClientSideError(e.message)
+
+    @wsexpose(str, body=Resource, status_code=200,
+              rest_content_types='json')
+    def delete(self, resource):
+        """handle json input.
+
+        :param resource: input json
+        :return: 200 if valid json
+        :return: 405 not allowed for not valid resource to delete
+        :return: 400 for bad request
+        """
+        operation = 'delete'
+        my_logger.info("delete resource ")
+        jsondata = resource.service_template.model
+        my_logger.debug("parse json & get yaml file!!! {}".format(jsondata))
+        jsondata = ast.literal_eval(jsondata)
+        resource_uuid = resource.service_template.tracking.tracking_id
+        resource_type = resource.service_template.resource.resource_type
+        if resource_type not in resources_operation_list or operation not in \
+                resources_operation_list[resource_type]:
+            raise NotAllowedError("delete Not allowed for this"
+                                  " resource %s" % resource_type)
+        try:
+            resource_id = ResourceService.main(jsondata,
+                                               resource_uuid,
+                                               resource_type,
+                                               operation)
+            return resource_id
+        except ConflictValue as e:
+            my_logger.error("the request blocked need to wait"
+                            " for previous operation to be done ")
+            raise LockedEntity(e.message)
+        except Exception as e:
+            my_logger.error("error :- %s " % str(e.message))
+            raise ClientSideError(e.message)
diff --git a/orm/services/resource_distributor/rds/controllers/v1/root.py b/orm/services/resource_distributor/rds/controllers/v1/root.py
new file mode 100755
index 00000000..3f395838
--- /dev/null
+++ b/orm/services/resource_distributor/rds/controllers/v1/root.py
@@ -0,0 +1,21 @@
+"""v1 controller."""
+from rds.controllers.v1 import logs
+from rds.controllers.v1.configuration import root as config_root
+from rds.controllers.v1.resources import root as Rds
+
+from rds.controllers.v1.status import resource_status
+
+
+class RDS(object):
+    """RDS controller."""
+
+    resources = Rds.CreateNewResource()
+    status = resource_status.Status()
+    configuration = config_root.Configuration()
+    logs = logs.LogsController()
+
+
+class V1Controller(object):
+    """v1 controller."""
+
+    rds = RDS
diff --git a/orm/services/resource_distributor/rds/controllers/v1/status/__init__.py b/orm/services/resource_distributor/rds/controllers/v1/status/__init__.py
new file mode 100644
index 00000000..1c127ddb
--- /dev/null
+++ b/orm/services/resource_distributor/rds/controllers/v1/status/__init__.py
@@ -0,0 +1 @@
+"""status module."""
diff --git a/orm/services/resource_distributor/rds/controllers/v1/status/get_resource.py b/orm/services/resource_distributor/rds/controllers/v1/status/get_resource.py
new file mode 100755
index 00000000..592c8a16
--- /dev/null
+++ b/orm/services/resource_distributor/rds/controllers/v1/status/get_resource.py
@@ -0,0 +1,111 @@
+"""handle get resource module."""
+import logging
+
+import wsme
+from pecan import rest
+from wsme import types as wtypes
+from wsmeext.pecan import wsexpose
+
+from rds.controllers.v1.base import EntityNotFoundError
+from rds.services import region_resource_id_status as regionResourceIdStatus
+
+logger = logging.getLogger(__name__)
+
+
+class ResourceMetaData(wtypes.DynamicBase):
+    """class method."""
+
+    checksum = wsme.wsattr(wtypes.text, mandatory=True)
+    virtual_size = wsme.wsattr(wtypes.text, mandatory=True)
+    size = wsme.wsattr(wtypes.text, mandatory=True)
+
+    def __init__(self, size='', virtual_size='', checksum=''):
+        """
+
+        :param size:
+        :param virtual_size:
+        :param checksum:
+        """
+        self.checksum = checksum
+        self.virtual_size = virtual_size
+        self.size = size
+
+
+class OutputResource(wtypes.DynamicBase):
+    """class method returned json body."""
+
+    region = wsme.wsattr(wtypes.text, mandatory=True)
+    timestamp = wsme.wsattr(wtypes.text, mandatory=True)
+    ord_transaction_id = wsme.wsattr(wtypes.text, mandatory=True)
+    resource_id = wsme.wsattr(wtypes.text, mandatory=True)
+    ord_notifier_id = wsme.wsattr(wtypes.text, mandatory=True)
+    status = wsme.wsattr(wtypes.text, mandatory=True)
+    error_code = wsme.wsattr(wtypes.text, mandatory=True)
+    error_msg = wsme.wsattr(wtypes.text, mandatory=True)
+    resource_extra_metadata = wsme.wsattr(ResourceMetaData, mandatory=False)
+    operation = wsme.wsattr(wtypes.text, mandatory=True)
+
+    def __init__(self, region="", timestamp="", ord_transaction_id="",
+                 resource_id="", ord_notifier_id="", status="",
+                 error_code="", error_msg="", operation="",
+                 resource_meta_data=ResourceMetaData()):
+        """init function.
+
+        :param region: targets : list of lcp's
+        :param timestamp:
+        :param ord_transaction_id:
+        :param resource_id:
+        :param ord_notifier_id:
+        :param status: success, error, submitted
+        :param error_code:
+        :param error_msg: error message
+        """
+        self.region = region
+        self.timestamp = timestamp
+        self.ord_notifier_id = ord_notifier_id
+        self.ord_transaction_id = ord_transaction_id
+        self.resource_id = resource_id
+        self.status = status
+        self.error_code = error_code
+        self.error_msg = error_msg
+        self.operation = operation
+        if resource_meta_data:
+            self.resource_extra_metadata = resource_meta_data
+
+
+class Result(wtypes.DynamicBase):
+    """class method json headers."""
+
+    regions = wsme.wsattr([OutputResource], mandatory=True)
+    status = wsme.wsattr(wtypes.text, mandatory=True)
+
+    def __init__(self, status=[OutputResource()]):
+        """init dunction.
+
+        :param status: mian status: success, error, submitted
+        """
+        self.status = status    # pragma: no cover
+
+
+class GetResource(rest.RestController):
+    """controller get resource."""
+
+    @wsexpose(Result, str, status_code=200, rest_content_types='json')
+    def get(self, id):
+        """get method.
+
+        :param id: resource id
+        :return: json output by resource id
+        if no data for this resource id 404 will be returned
+        :description: the function will get resource id check the DB for
+        all resource status and return list of json data
+        """
+        logger.info("get status")
+        logger.debug("get status data by resource id : %s" % id)
+        result = regionResourceIdStatus.get_status_by_resource_id(id)
+
+        if result is None or not result.regions:
+            logger.error("no content for id %s " % id)
+            raise EntityNotFoundError("resourceid %s" % id)
+        logger.debug("items number : %s" % len(result.status))
+        return result
diff --git a/orm/services/resource_distributor/rds/controllers/v1/status/resource_status.py b/orm/services/resource_distributor/rds/controllers/v1/status/resource_status.py
new file mode 100755
index 00000000..b4b71b11
--- /dev/null
+++ b/orm/services/resource_distributor/rds/controllers/v1/status/resource_status.py
@@ -0,0 +1,155 @@
+"""handle post request module."""
+import logging
+import time
+
+import wsme
+from pecan import rest
+from rds.controllers.v1.base import InputValueError, ClientSideError
+from wsme import types as wtypes
+from wsmeext.pecan import wsexpose
+
+from rds.controllers.v1.status import get_resource
+from rds.services import region_resource_id_status as regionResourceIdStatus
+from rds.services.base import InputError, ErrorMesage
+from rds.utils import utils
+
+logger = logging.getLogger(__name__)
+
+
+class MetaData(wtypes.DynamicBase):
+    """class method metadata input."""
+    checksum = wsme.wsattr(wtypes.text, mandatory=True)
+    virtual_size = wsme.wsattr(wtypes.text, mandatory=True)
+    size = wsme.wsattr(wtypes.text, mandatory=True)
+
+    def __init__(self, checksum=None, virtual_size=None, size=None):
+        """
+
+        :param checksum:
+        :param virtual_size:
+        :param size:
+        """
+        self.size = size
+        self.checksum = checksum
+        self.virtual_size = virtual_size
+
+    def to_dict(self):
+        return dict(size=self.size,
+                    checksum=self.checksum,
+                    virtual_size=self.virtual_size)
+
+
+class ResourceData(wtypes.DynamicBase):
+    """class method, handle json input."""
+
+    resource_id = wsme.wsattr(wtypes.text, mandatory=True, name='resource-id')
+    request_id = wsme.wsattr(wtypes.text, mandatory=True, name='request-id')
+    resource_type = wsme.wsattr(wtypes.text, mandatory=True,
+                                name='resource-type')
+    resource_template_version = wsme.wsattr(wtypes.text, mandatory=True,
+                                            name='resource-template-version')
+    resource_template_type = wsme.wsattr(wtypes.text, mandatory=True,
+                                         name='resource-template-type')
+    resource_operation = wsme.wsattr(wtypes.text, mandatory=True,
+                                     name='resource-operation')
+    ord_notifier_id = wsme.wsattr(wtypes.text, mandatory=True,
+                                  name='ord-notifier-id')
+    region = wsme.wsattr(wtypes.text, mandatory=True)
+    status = wsme.wsattr(wtypes.text, mandatory=True)
+    error_code = wsme.wsattr(wtypes.text, mandatory=True, name='error-code')
+    error_msg = wsme.wsattr(wtypes.text, mandatory=True, name='error-msg')
+    resource_extra_metadata = wsme.wsattr(MetaData, mandatory=False)
+
+    def __init__(self, resource_id="", request_id="", resource_type="",
+                 resource_template_version="", resource_template_type="",
+                 resource_operation="", ord_notifier_id="", region="",
+                 status="", error_code="", error_msg="",
+                 resource_extra_metadata=None):
+        """init function.
+
+        :param resource_id: uuid
+        :param request_id:
+        :param resource_type: customer, flavor, image...
+        :param resource_template_version: version of heat
+        :param resource_template_type:
+        :param resource_operation: create, delete..
+        :param ord_notifier_id:
+        :param region: lcp's
+        :param status: success, error, submitted
+        :param error_code:
+        :param error_msg: error message
+        """
+        self.resource_id = resource_id
+        self.request_id = request_id
+        self.resource_type = resource_type
+        self.resource_template_version = resource_template_version
+        self.resource_template_type = resource_template_type
+        self.resource_operation = resource_operation
+        self.ord_notifier_id = ord_notifier_id
+        self.region = region
+        self.status = status
+        self.error_code = error_code
+        self.error_msg = error_msg
+        if resource_extra_metadata:
+            self.resource_extra_metadata = resource_extra_metadata
+
+
+class StatusInput(wtypes.DynamicBase):
+    """class method, input json header."""
+
+    rds_listener = wsme.wsattr(ResourceData, mandatory=True,
+                               name='rds-listener')
+
+    def __init__(self, rds_listener=ResourceData()):
+        """init function.
+
+        :param rds_listener: json header
+        """
+        self.rds_listener = rds_listener
+
+
+class Status(rest.RestController):
+    """post status controller."""
+
+    resource = get_resource.GetResource()
+
+    @wsexpose(None, body=StatusInput, status_code=201,
+              rest_content_types='json')
+    def post(self, status_input):
+        """handle post request.
+
+        :param status_input: json data
+        :return: 201 created
+        :description: get input json create dict and save dict to the DB
+        if any validation fields fail will return input value error 400
+        """
+        logger.info("post status")
+        logger.debug("parse json!")
+        data_to_save = dict(
+            timestamp=int(time.time())*1000,
+            region=status_input.rds_listener.region,
+            resource_id=status_input.rds_listener.resource_id,
+            status=status_input.rds_listener.status,
+            transaction_id=status_input.rds_listener.request_id,
+            error_code=status_input.rds_listener.error_code,
+            error_msg=status_input.rds_listener.error_msg,
+            resource_operation=status_input.rds_listener.resource_operation,
+            resource_type=status_input.rds_listener.resource_type,
+            ord_notifier_id=status_input.rds_listener.ord_notifier_id)
+
+        if status_input.rds_listener.resource_type == 'image' and status_input.rds_listener.resource_extra_metadata != wsme.Unset:
+            data_to_save['resource_extra_metadata'] =\
+                status_input.rds_listener.resource_extra_metadata.to_dict()
+
+        logger.debug("save data to database.. data :- %s" % data_to_save)
+        try:
+            regionResourceIdStatus.add_status(data_to_save)
+            # send data to ims
+            utils.post_data_to_image(data_to_save)
+        except ErrorMesage as exp:
+            logger.error(exp.message)
+            # raise ClientSideError(status_code=400, error=exp.message)
+        except InputError as e:
+            logger.error("Invalid value for input {}: {}".format(str(e.name),
+                                                                 str(e.value)))
+            raise InputValueError(e.name, e.value)
diff --git a/orm/services/resource_distributor/rds/ordupdate/__init__.py b/orm/services/resource_distributor/rds/ordupdate/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/ordupdate/ord_notifier.py b/orm/services/resource_distributor/rds/ordupdate/ord_notifier.py
new file mode 100755
index 00000000..3e5bd92d
--- /dev/null
+++ b/orm/services/resource_distributor/rds/ordupdate/ord_notifier.py
@@ -0,0 +1,287 @@
+"""ORD trigger main module."""
+
+import json
+import time
+
+import logging
+import requests
+
+from pecan import conf
+
+from audit_client.api import audit
+
+from rds.services import region_resource_id_status as regionResourceIdStatus
+
+# REST API constants
+OK_CODE = 200
+ACK_CODE = 200
+
+logger = logging.getLogger(__name__)
+
+
+class OrdNotFoundError(Exception):
+    """Indicates that the correct ORD to notify was not found."""
+
+    pass
+
+
+class NotifyNotAcknowledgedError(Exception):
+    """Indicates that the ORD did not respond correctly to our notification."""
+
+    pass
+
+
+class ConfigFileError(Exception):
+    """Indicates that the configuration file could not be found."""
+
+    pass
+
+
+def _find_correct_ord(url, lcp_name):
+    """Use the Discover API to get the ORD URL.
+
+    :param url: Discovery server URL
+    :param lcp_name: The name of the LCP whose ORD is to be found
+    :return: The ORD URL, or None if it wasn't found
+    """
+    logger.info('Getting the ORD URL of LCP %s...' % (lcp_name,))
+    # Get the LCP record from RMS
+    response = requests.get('%s/v2/orm/regions?regionname=%s' % (url,
+                                                                 lcp_name,),
+                            verify=conf.verify)
+    if response.status_code != OK_CODE:
+        return None
+
+    lcp = response.json()
+    try:
+        for endpoint in lcp['regions'][0]['endpoints']:
+            if endpoint['type'] == 'ord':
+                return endpoint['publicURL']
+    except KeyError:
+        return None
+
+    # Invalid LCP record (does not contain an ORD)
+    return None
+
+
+def _notify(ord_url,
+            transaction_id,
+            resource_id,
+            resource_type,
+            resource_template_version,
+            resource_template_name,
+            operation,
+            region_id):
+    """Send the notification message to the ORD.
+
+    :param ord_url:
+    :param transaction_id:
+    :param resource_id:
+    :param resource_type:
+    :param resource_template_version:
+    :param resource_template_name:
+    :param operation:
+    :param region_id:
+    :raise: requests.exceptions.ConnectionError when the POST request
+    cannot be sent,
+    NotifyNotAcknowledgedError when the ORD did not respond to the notification
+    as expected
+    InvalidJsonError if the payload is missing one of the expected values
+    :return:
+    """
+    # Prepare the request body
+    data_to_send = {'ord-notifier': {
+        'request-id': transaction_id,
+        'resource-id': resource_id,
+        'resource-type': resource_type,
+        'resource-template-version': resource_template_version,
+        'resource-template-name': resource_template_name,
+        'resource-template-type': conf.ordupdate.template_type,
+        'operation': operation,
+        'region': region_id
+        }
+    }
+
+    is_ord_url_https = ord_url.startswith('https')
+    https_enabled = conf.ordupdate.https_enabled
+    logger.debug('notify: ord_url: %s, https_enabled: %s, JSON: %s' % (
+        ord_url, str(https_enabled), data_to_send,))
+
+    logger.info('Notifying ORD...')
+    if https_enabled:
+        if conf.ordupdate.cert_path == '':
+            extra_message = '(not using certificate)'
+        else:
+            extra_message = ''
+
+        logger.debug('Certificate path: \'%s\' %s' % (
+            conf.ordupdate.cert_path, extra_message, ))
+
+        if not is_ord_url_https:
+            ord_url = 'https%s' % ord_url[4:]
+            logger.debug('switch to https, notifying ord_url: %s' % (
+                ord_url))
+        try:
+            # Added the header to support the older version of requests
+            headers = {'Content-Type': 'application/json'}
+            response = requests.post('%s/v1/ord/ord_notifier' % (ord_url,),
+                                     data=json.dumps(data_to_send),
+                                     headers=headers,
+                                     cert=conf.ordupdate.cert_path)
+        except requests.exceptions.SSLError:
+            logger.debug('Received an SSL error (is the certificate valid?)')
+            raise
+    else:
+        if is_ord_url_https:
+            ord_url = 'http%s' % ord_url[5:]
+            logger.debug('https not supported, notifying ord_url: %s' % (
+                ord_url))
+        headers = {'Content-Type': 'application/json'}
+        response = requests.post('%s/v1/ord/ord_notifier' % (ord_url,),
+                                 headers=headers,
+                                 data=json.dumps(data_to_send))
+
+    # Make sure the ORD sent an ACK
+    if response.status_code != ACK_CODE:
+        message = 'Did not receive an ACK from ORD %s, status code: %d' % (
+                ord_url, response.status_code, )
+        encoded_message = message.replace('\n', '_').replace('\r', '_')
+	if encoded_message != message:
+            encoded_message = encoded_message + "(encoded)"
+        logger.error(encoded_message)
+        raise NotifyNotAcknowledgedError(message)
+
+
+def _update_audit(lcp_name, application_id, tracking_id, transaction_id,
+                  transaction_type, resource_id, user_id=None,
+                  external_id=None, event_details=None, status=None):
+    """Update the Audit repository with the action status."""
+    timestamp = int(time.time() * 1000)
+    audit.audit(timestamp, application_id, tracking_id, transaction_id,
+                transaction_type, resource_id, conf.app.service_name,
+                user_id, external_id, event_details)
+    logger.info('LCP %s: %s (%s)' % (lcp_name, event_details, status, ))
+
+
+def _update_resource_status(region, resource_id, status, transaction_id,
+                            error_code, error_msg, resource_operation,
+                            resource_type):
+    """Update the resource status db with the status."""
+    if status == 'Success':
+        status = 'Submitted'
+    else:
+        status = 'Error'
+
+    data_to_save = dict(
+        timestamp=int(time.time() * 1000),
+        region=region,
+        resource_id=resource_id,
+        status=status,
+        transaction_id=transaction_id,
+        error_code=error_code,
+        error_msg=error_msg,
+        resource_operation=resource_operation,
+        resource_type=resource_type,
+        ord_notifier_id="")
+
+    regionResourceIdStatus.add_status(data_to_save)
+
+
+def notify_ord(transaction_id,
+               tracking_id,
+               resource_type,
+               resource_template_version,
+               resource_name,
+               resource_id,
+               operation,
+               region_id,
+               application_id,
+               user_id,
+               external_id=None,
+               error=False):
+    """Notify ORD of the changes.
+
+    This function should be called after a resource has changed in SoT
+    (created, modified or deleted).
+
+    :param transaction_id: The transaction id under which the resource was
+    updated
+    :param tracking_id: The tracking ID of the whole operation
+    :param resource_type: The resource type ("customer" | "image" | "flavor")
+    :param resource_template_version: The version id of the change in git
+    :param resource_name: The updated resource name
+    :param resource_id: The updated resource ID
+    :param operation: Operation made on resource ("create" | "modify" |
+    "delete")
+    :param region_id: This is the LCP name (not ID!).
+    :param application_id: The running application ID (RDS, CMS, etc.)
+    :param user_id: The calling user ID
+    :param external_id: An external tracking ID (optional)
+    :param error: A boolean that says whether an error has occurred during the
+    upload operation
+    :return:
+    :raise: ConfigFileError - when the configuration file was not found,
+    OrdNotFoundError - when the ORD was not found,
+    requests.exceptions.ConnectionError when the POST request
+    cannot be sent,
+    NotifyNotAcknowledgedError - when the ORD did not respond to the
+    notification as expected
+    """
+    logger.debug('Entered notify_ord with transaction_id: %s, '
+                 'tracking_id: %s, resource_type: %s, '
+                 'resource_template_version: %s, resource_name: %s, '
+                 'resource_id: %s, operation: %s, region_id: %s, '
+                 'application_id: %s, user_id: %s, external_id: %s, '
+                 'error: %s' % (transaction_id, tracking_id, resource_type,
+                                resource_template_version, resource_name,
+                                resource_id, operation, region_id,
+                                application_id, user_id, external_id, error,))
+
+    error_msg = ''
+    transaction_type = '%s %s' % (operation, resource_type, )
+    try:
+        if error:
+            event_details = 'upload failed'
+            status = 'SoT_Error'
+            error_msg = 'Upload to SoT Git repository failed'
+        else:
+            # Discover the correct ORD
+            discover_url = '%s:%d' % (conf.ordupdate.discovery_url,
+                                      conf.ordupdate.discovery_port,)
+            ord_to_update = _find_correct_ord(discover_url, region_id)
+
+            if ord_to_update is None:
+                message = 'ORD of LCP %s not found' % (region_id, )
+                logger.error(message)
+                raise OrdNotFoundError(message)
+
+            _notify(ord_to_update,
+                    transaction_id,
+                    resource_id,
+                    resource_type,
+                    resource_template_version,
+                    resource_name,
+                    operation,
+                    region_id)
+
+            # All OK
+            event_details = '%s notified' % (region_id, )
+            status = 'Success'
+    except Exception:
+        event_details = '%s notification failed' % (region_id, )
+        status = 'ORD_Error'
+        error_msg = 'Notification to ORD failed'
+        raise
+    finally:
+        # Update resource_status db with status
+        _update_resource_status(region_id, resource_id, status, transaction_id,
+                                0, error_msg, operation, resource_type)
+
+        # Write a record to Audit repository. Note that I assigned the
+        # appropriate values to event_details and status in every flow, so
+        # these variables won't be referenced before assignment
+        _update_audit(region_id, application_id, tracking_id, transaction_id,
+                      transaction_type, resource_id, user_id, external_id,
+                      event_details, status)
+        logger.debug("Create Resource Requested to ORD: region=%s resource_id=%s status=%s"
+            % (region_id, resource_id, status))
diff --git a/orm/services/resource_distributor/rds/proxies/__init__.py b/orm/services/resource_distributor/rds/proxies/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/proxies/ims_proxy.py b/orm/services/resource_distributor/rds/proxies/ims_proxy.py
new file mode 100755
index 00000000..a62dddb2
--- /dev/null
+++ b/orm/services/resource_distributor/rds/proxies/ims_proxy.py
@@ -0,0 +1,61 @@
+import requests
+import json
+import logging
+
+from pecan import conf
+
+from rds.utils import authentication as AuthService
+from rds.services.base import ErrorMesage
+
+
+logger = logging.getLogger(__name__)
+
+
+headers = {'content-type': 'application/json'}
+
+
+def _set_headers():
+    try:
+        region, token_id = AuthService.get_token()
+        if token_id:
+            headers['X-Auth-Token'] = token_id
+            headers['X-Auth-Region'] = region
+    except:
+        logger.error("no token")
+
+
+def send_image_metadata(meta_data, region, resource_id, action='post'):
+    logger.debug(
+        "IMS PROXY - send metadata to ims {} for region {}".format(meta_data,
+                                                                   region))
+    data_to_send = {
+        "metadata": {
+            "checksum": meta_data['checksum'],
+            "virtual_size": meta_data['virtual_size'],
+            "size": meta_data['size']
+        }
+    }
+
+    _set_headers()
+    data_to_send_as_json = json.dumps(data_to_send)
+    logger.debug("sending the data to ims server post method ")
+    logger.debug("ims server {0} path = {1}".format(conf.ims.base_url,
+                                                    conf.ims.metadata_path).format(
+        resource_id, region))
+
+    if action == 'post':
+        try:
+            response = requests.post(
+                conf.ims.base_url + (conf.ims.metadata_path).format(resource_id, region),
+                data=data_to_send_as_json, headers=headers, verify=conf.verify)
+            logger.debug("got response from ims {}".format(response))
+        except requests.ConnectionError as exp:
+            logger.error(exp)
+            logger.exception(exp)
+            raise ErrorMesage("fail to connect to server {}".format(exp.message))
+
+    if response.status_code != 200:
+        raise ErrorMesage(
+            "Got error from rds server, code: {0} message: {1}".format(
+                response.status_code, response.content))
+    return
diff --git a/orm/services/resource_distributor/rds/proxies/rms_proxy.py b/orm/services/resource_distributor/rds/proxies/rms_proxy.py
new file mode 100755
index 00000000..e237ab60
--- /dev/null
+++ b/orm/services/resource_distributor/rds/proxies/rms_proxy.py
@@ -0,0 +1,31 @@
+"""python module."""
+
+import json
+import logging
+import requests
+
+from pecan import conf
+from rds.services.base import ErrorMesage
+
+
+logger = logging.getLogger(__name__)
+
+
+headers = {'content-type': 'application/json'}
+
+
+def get_regions():
+    logger.debug("get list of regions from rms")
+    logger.debug("rms server {0} path = {1}".format(conf.rms.base_url,
+                                                    conf.rms.all_regions_path))
+
+    response = requests.get(conf.rms.base_url + conf.rms.all_regions_path,
+                            headers=headers, verify=conf.verify)
+
+    if response.status_code != 200:
+        log_message = "not able to get regions {}".format(response)
+        log_message = log_message.replace('\n', '_').replace('\r', '_')
+        logger.error(log_message)
+        return
+
+    return response.json()
diff --git a/orm/services/resource_distributor/rds/resources/ord.crt b/orm/services/resource_distributor/rds/resources/ord.crt
new file mode 100644
index 00000000..3efb7eb2
--- /dev/null
+++ b/orm/services/resource_distributor/rds/resources/ord.crt
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgIJAM1SFBUUEOLCMA0GCSqGSIb3DQEBCwUAMGcxCzAJBgNV
+BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
+aWRnaXRzIFB0eSBMdGQxIDAeBgNVBAMMF29yZC5sb2NhbC5hdHQuaW5mcmEubmV0
+MB4XDTE2MDUwMjE2MDQyMVoXDTE3MDUwMjE2MDQyMVowZzELMAkGA1UEBhMCQVUx
+EzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMg
+UHR5IEx0ZDEgMB4GA1UEAwwXb3JkLmxvY2FsLmF0dC5pbmZyYS5uZXQwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAGKa75pvFsWqbdnFif7a+85krdjgF
+RZZ2lnRVCdjiwyAI5KEk8awr79vr+3/xOMmEiuMYBkS3EbjnEILlGme+MHepIysB
+OHMcLmqVqOZwd/9kiNBViIBX4Ma05zYlCyMjwipgawuwUc1riJPMPTAXuXsjuDVH
+0AZQHX22S56vx/y4PtoAW61qcbSaKxCiNPrYb9wom/YMacI4kkL5yA0w0J4UBbWw
+95dY8x0bUWjqo+pDUGwaHzSNsy4gRdrV/uHRmNEdnw3rVsRhjSxKoL0QDlnmTfFS
+g0qnEafVMZewcL/H9+5hbnsW1xC8mSj0aNGOwYi3WQPF6lfrpRAH73nhAgMBAAGj
+UDBOMB0GA1UdDgQWBBR0F2IlR9nD9ahVa+bxhzoJbhAvxTAfBgNVHSMEGDAWgBR0
+F2IlR9nD9ahVa+bxhzoJbhAvxTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUA
+A4IBAQChB/YXQLcSI91ClDgn66OKIBrUvOdCi1s7oxphT8URY6Wj1nEUa0I7g3Rj
+kUzyBTrUgHn36+R7exo1Zw0LhVyEAphsI0bMSJPJTLwi6qXwHN025/ZAEpeCvMsi
+aMB6GiOO+oKWlU3aUGme5+y/u4TIbWdxI3TQPZs+2sRGKZ1mKEPOzdF/25Ao2xXg
+eEmg71CST9QhyS+eAfKaM3Tujd/2uyfzZdGlmYYrOjs7cWOx+AF9RcUaeXnheEWz
+YTB5xL05CcQlUf/Ahj2bvfBcy/Lu8sASNz9ESJQOnupzcv3tYS/pn7g788Z5TL2P
+anwmSyLi6hyiYKP6RE2Rj6kD/jOX
+-----END CERTIFICATE-----
diff --git a/orm/services/resource_distributor/rds/services/__init__.py b/orm/services/resource_distributor/rds/services/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/services/base.py b/orm/services/resource_distributor/rds/services/base.py
new file mode 100644
index 00000000..199f60dc
--- /dev/null
+++ b/orm/services/resource_distributor/rds/services/base.py
@@ -0,0 +1,22 @@
+
+class Error(Exception):
+    pass
+
+
+class InputError(Error):
+    def __init__(self, name, value):
+        self.name = name
+        self.value = value
+
+
+class ErrorMesage(Error):
+    def __init__(self, message=None):
+        self.message = message
+
+
+class ConflictValue(Error):
+    """
+    block values if operation still in progress
+    """
+    pass
+
diff --git a/orm/services/resource_distributor/rds/services/etc/audit.conf b/orm/services/resource_distributor/rds/services/etc/audit.conf
new file mode 100644
index 00000000..a5168dd7
--- /dev/null
+++ b/orm/services/resource_distributor/rds/services/etc/audit.conf
@@ -0,0 +1,4 @@
+[DEFAULT]
+audit_server_url=http://127.0.0.1:8776/v1/audit/transaction
+num_of_send_retries = 3
+time_wait_between_retries = 1
diff --git a/orm/services/resource_distributor/rds/services/model/__init__.py b/orm/services/resource_distributor/rds/services/model/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/services/model/region_resource_id_status.py b/orm/services/resource_distributor/rds/services/model/region_resource_id_status.py
new file mode 100755
index 00000000..d312db1a
--- /dev/null
+++ b/orm/services/resource_distributor/rds/services/model/region_resource_id_status.py
@@ -0,0 +1,69 @@
+
+
+class ResourceMetaData(object):
+    def __init__(self, checksum, virtual_size, size):
+        self.size = size
+        self.virtual_size = virtual_size
+        self.checksum = checksum
+
+    def as_dict(self):
+        return self.__dict__
+
+
+class Model(object):
+    def __init__(self,
+                 timestamp,
+                 region,
+                 status,
+                 transaction_id,
+                 resource_id,
+                 ord_notifier,
+                 err_msg,
+                 err_code,
+                 operation,
+                 resource_extra_metadata=None):
+        self.timestamp = timestamp
+        self.region = region
+        self.status = status
+        self.ord_transaction_id = transaction_id
+        self.resource_id = resource_id
+        self.ord_notifier_id = ord_notifier
+        self.error_msg = err_msg
+        self.error_code = err_code
+        self.operation = operation
+
+        if resource_extra_metadata:
+            self.resource_extra_metadata = ResourceMetaData(
+                checksum=resource_extra_metadata[0].checksum,
+                virtual_size=resource_extra_metadata[0].virtual_size,
+                size=resource_extra_metadata[0].size
+            )
+        else:
+            self.resource_extra_metadata = None
+
+    def as_dict(self):
+        return self.__dict__
+
+
+class StatusModel(object):
+    def __init__(self, status):
+        self.regions = status
+        self.status = self._get_aggregated_status()
+
+    def _get_aggregated_status(self):
+        is_pending = False
+        for region in self.regions:
+            if region.status == 'Error' and region.operation.strip() != 'delete':
+                # If a region had an error, the aggregated status is 'Error'
+                return 'Error'
+            elif region.status == 'Submitted':
+                # Just set the flag but don't return, because there might be
+                # an error in any of the next iterations
+                is_pending = True
+
+        if is_pending:
+            return 'Pending'
+        else:
+            # If self.regions is empty, the result will still be 'Success' but the
+            # server returns 404 Not Found
+            return 'Success'
diff --git a/orm/services/resource_distributor/rds/services/model/resource_input.py b/orm/services/resource_distributor/rds/services/model/resource_input.py
new file mode 100644
index 00000000..a4d62929
--- /dev/null
+++ b/orm/services/resource_distributor/rds/services/model/resource_input.py
@@ -0,0 +1,13 @@
+
+class ResourceData(object):
+    def __init__(self, resource_id, resource_type,
+                 targets, operation="create",
+                 transaction_id="", model="",
+                 external_transaction_id=""):
+        self.resource_id = resource_id
+        self.targets = targets
+        self.resource_type = resource_type
+        self.operation = operation
+        self.transaction_id = transaction_id
+        self.model = model
+        self.external_transaction_id = external_transaction_id
\ No newline at end of file
diff --git a/orm/services/resource_distributor/rds/services/region_resource_id_status.py b/orm/services/resource_distributor/rds/services/region_resource_id_status.py
new file mode 100755
index 00000000..d9238572
--- /dev/null
+++ b/orm/services/resource_distributor/rds/services/region_resource_id_status.py
@@ -0,0 +1,96 @@
+import logging
+import sys
+import time
+
+from rds.services.base import Error, InputError
+from rds.storage import factory
+
+logger = logging.getLogger(__name__)
+config = {
+    'max_interval_time': {
+    },
+    'allowed_status_values': {
+    }
+}
+
+num_of_seconds_in_minute = 60
+num_of_miliseconds_in_seconds = 1000
+
+
+def add_status(data):
+    logger.debug("add resource status timestamp [{}], region [{}], status [{}] "
+                 ", transaction_id [{}] and resource_id [{}], ord_notifier_id [{}], "
+                 "error message [{}], error code [{}] and "
+                 "resource_extra_metadata [{}]".format(data['timestamp'],
+                                                     data['region'],
+                                                     data['status'],
+                                                     data['transaction_id'],
+                                                     data['resource_id'],
+                                                     data['ord_notifier_id'],
+                                                     data['error_msg'],
+                                                     data['error_code'],
+                                                     data.get('resource_extra_metadata', None)))
+
+    try:
+        validate_status_value(data['status'])
+        validate_operation_type(data['resource_operation'])
+        validate_resource_type(data['resource_type'])
+
+        conn = factory.get_region_resource_id_status_connection()
+        conn.add_update_status_record(data['timestamp'], data['region'], data['status'],
+                                      data['transaction_id'], data['resource_id'],
+                                      data['ord_notifier_id'], data['error_msg'],
+                                      data['error_code'],
+                                      data['resource_operation'],
+                                      data.get('resource_extra_metadata'))
+        # post_data_to_image(data)
+    except Error as e:
+        logger.exception("invalid inputs error")
+        raise
+    except:
+        logger.exception("Unexpected error: {}".format(sys.exc_info()[0]))
+        raise
+
+
+def get_status_by_resource_id(resource_id):
+    logger.debug("get status by resource id %s " % resource_id)
+    conn = factory.get_region_resource_id_status_connection()
+    result = conn.get_records_by_resource_id(resource_id)
+    return result
+
+
+def get_regions_by_status_resource_id(status, resource_id):
+    logger.debug("get regions by status %s for resource %s" % (status, resource_id))
+    conn = factory.get_region_resource_id_status_connection()
+    result = conn.get_records_by_resource_id_and_status(resource_id,
+                                                        status)
+    return result
+
+
+def validate_resource_type(resource_type):
+    allowed_resource_type = config['allowed_resource_type']
+    if resource_type not in allowed_resource_type:
+        logger.exception("status value is not valid: {}".format(resource_type))
+        raise InputError("operation_type", resource_type)
+
+
+def validate_operation_type(operation_type):
+    allowed_operation_type = config['allowed_operation_type']
+    if operation_type not in allowed_operation_type:
+        logger.exception("status value is not valid: {}".format(operation_type))
+        raise InputError("operation_type", operation_type)
+
+
+def validate_status_value(status):
+    allowed_status_values = config['allowed_status_values']
+    if status not in allowed_status_values:
+        logger.exception("status value is not valid: {}".format(status))
+        raise InputError("status", status)
+
+
+# def post_data_to_image(data):
+#     if data['resource_type'] == "image":
+#         logger.debug("send metadata {} to ims :- {} for region {}".format(
+#             data['resource_extra_metadata'], data['resource_id'], data['region']))
+#         # ims_proxy.send_image_metadata(data['resource_extra_metadata'], data['resource_id'], data['region'])
+#     return
\ No newline at end of file
diff --git a/orm/services/resource_distributor/rds/services/resource.py b/orm/services/resource_distributor/rds/services/resource.py
new file mode 100755
index 00000000..a7442447
--- /dev/null
+++ b/orm/services/resource_distributor/rds/services/resource.py
@@ -0,0 +1,183 @@
+"""create resource moudle."""
+import logging
+import time
+
+from pecan import conf
+from pecan import request
+from rds.services import region_resource_id_status as regionResourceIdStatus
+from rds.services import yaml_customer_builder
+from rds.services import yaml_flavor_bulder
+from rds.services import yaml_image_builder
+from rds.services.base import ConflictValue
+from rds.services.base import ErrorMesage
+from rds.services.model.resource_input import ResourceData as InputData
+from rds.sot import sot_factory
+from rds.utils import uuid_utils
+from rds.utils import utils
+
+
+my_logger = logging.getLogger(__name__)
+
+
+def _get_inputs_from_resource_type(jsondata,
+                                   resource_type,
+                                   external_transaction_id,
+                                   operation="create"):
+    if resource_type == "customer":
+        input_data = InputData(resource_id=jsondata['uuid'],
+                               resource_type=resource_type,
+                               operation=operation,
+                               targets=jsondata['regions'],
+                               model=jsondata,
+                               external_transaction_id=external_transaction_id)
+    elif resource_type == "flavor" or resource_type == "image":
+        input_data = InputData(resource_id=jsondata['id'],
+                               resource_type=resource_type,
+                               operation=operation,
+                               targets=jsondata['regions'],
+                               model=jsondata,
+                               external_transaction_id=external_transaction_id)
+    else:
+        raise ErrorMesage("no support for resource %s" % resource_type)
+    return input_data
+
+
+def _region_valid(region):
+    if 'rms_status' in region and region[
+        'rms_status'] not in conf.allow_region_statuses:
+        return False
+    return True
+
+
+def _create_or_update_resource_status(input_data, target, error_msg='',
+                                      status="Submitted"):
+    # check rms region status
+    if not _region_valid(target):
+        status = 'Error'
+        error_msg = "Not sent to ord as status equal to " + target['rms_status']
+
+    my_logger.debug("save status as %s" % status)
+    data_to_save = dict(
+        timestamp=int(time.time() * 1000),
+        region=target['name'],
+        resource_id=input_data.resource_id,
+        status=status,
+        transaction_id=input_data.transaction_id,
+        error_code='',
+        error_msg=error_msg,
+        resource_operation=target['action'],
+        resource_type=input_data.resource_type,
+        ord_notifier_id='')
+    regionResourceIdStatus.add_status(data_to_save)
+    my_logger.debug("status %s saved" % status)
+
+
+def _set_all_statuses_to_error(input_data, message=None):
+    targets = input_data.targets
+    for target in targets:
+        _create_or_update_resource_status(input_data=input_data, target=target,
+                                          error_msg=message or 'system error',
+                                          status="Error")
+
+
+def _create_data_to_sot(input_data):
+    """create data.
+
+    : build yaml string
+    :param jsondata: full json in request body
+    :param resource_type: eg... Customer
+    :return: return list of dictionaries with yaml string
+    """
+    jsondata = input_data.model
+    targetslist = []
+    targets = input_data.targets
+    for target in targets:
+        # save start status to submitted for each region
+        _create_or_update_resource_status(input_data, target)
+        if not _region_valid(target):
+            continue
+        if target['action'] == "delete":
+            yamldata = "delete"
+        elif input_data.resource_type == "customer":
+            yamldata = yaml_customer_builder.yamlbuilder(jsondata, target)
+        elif input_data.resource_type == "flavor":
+            yamldata = yaml_flavor_bulder.yamlbuilder(jsondata, target)
+        elif input_data.resource_type == "image":
+            yamldata = yaml_image_builder.yamlbuilder(jsondata, target)
+        targetslist.append({"region_id": target['name'],
+                            "resource_type": input_data.resource_type,
+                            "resource_name": input_data.resource_id,
+                            "template_data": yamldata,
+                            "operation": target['action']})
+    return targetslist
+
+
+def _upload_to_sot(uuid, tranid, targetslist):
+    application_id = request.headers[
+        'X-RANGER-Client'] if 'X-RANGER-Client' in request.headers else \
+        'NA'
+    user_id = request.headers[
+        'X-RANGER-Requester'] if 'X-RANGER-Requester' in request.headers else \
+        ''
+    sot = sot_factory.get_sot()
+    sot.save_resource_to_sot(uuid,
+                             tranid,
+                             targetslist,
+                             application_id,
+                             user_id)
+
+
+def _check_resource_status(input_data):
+    resource_id = input_data.resource_id
+    status = conf.block_by_status
+    # check if any of the region creation in pending
+    regions_by_resource = \
+        regionResourceIdStatus.get_regions_by_status_resource_id(status,
+                                                                 resource_id)
+    # if any not ready return 409
+    if regions_by_resource is not None and regions_by_resource.regions:
+        raise ConflictValue([region.region for region in regions_by_resource.regions])
+
+
+def update_sot(input_data):
+    """create resource."""
+    my_logger.debug("build yaml file for %s id: %s" % (input_data.resource_type,
+                     input_data.resource_id))
+    targetslist = _create_data_to_sot(input_data)
+    my_logger.debug("upload yaml to SoT")
+    _upload_to_sot(input_data.resource_id,
+                   input_data.transaction_id,
+                   targetslist)
+
+
+def main(jsondata, external_transaction_id, resource_type, operation):
+    """main function handle resource operation."""
+    my_logger.info("got %s for %s resource" % (operation, resource_type))
+    try:
+        input_data = _get_inputs_from_resource_type(
+            jsondata=jsondata,
+            resource_type=resource_type,
+            operation=operation,
+            external_transaction_id=external_transaction_id
+        )
+        my_logger.debug("iterate through the regions see if none in submitted")
+        _check_resource_status(input_data)
+        my_logger.debug("get uuid from uuid generator")
+        input_data.transaction_id = uuid_utils.get_random_uuid()
+        my_logger.debug("uuid ={}".format(input_data.transaction_id))
+        # add regions status from rms (to check if it down)
+        input_data.targets = utils.add_rms_status_to_regions(
+            input_data.targets, input_data.resource_type)
+        update_sot(input_data)
+    except ConflictValue:
+        raise
+    except ErrorMesage as exp:
+        my_logger.error(exp.message)
+        my_logger.exception(exp)
+        raise
+    except Exception as e:
+        my_logger.exception(e)
+        _set_all_statuses_to_error(input_data)
+        my_logger.error("deleting fails ,Error : {}".format(str(e.message)))
+        raise ErrorMesage(str(e.message))
+    return input_data.resource_id
diff --git a/orm/services/resource_distributor/rds/services/yaml_customer_builder.py b/orm/services/resource_distributor/rds/services/yaml_customer_builder.py
new file mode 100755
index 00000000..c4273cfb
--- /dev/null
+++ b/orm/services/resource_distributor/rds/services/yaml_customer_builder.py
@@ -0,0 +1,171 @@
+"""yaml build build yaml from json input."""
+import logging
+import re
+import yaml
+
+from pecan import conf
+
+logger = logging.getLogger(__name__)
+
+def get_users_quotas(data, region):
+    """get default or own region.
+
+    get users and quotas from default or actual region
+    :param data:
+    :param region:
+    :return:
+    """
+    users = region['users']
+    quotas = region['quotas']
+    if not users:
+        users = data['default_region']['users']
+    if not quotas:
+        quotas = data['default_region']['quotas']
+    return users, quotas
+
+
+def creat_final_yaml(title, description, resources, outputs):
+    """put all yaml strings together.
+
+    :param title: ther version of yaml
+    :param description: file description
+    :param resources: body of the yaml file
+    :param outputs: the output of the yaml
+    :return: the full string of yaml file
+    """
+    title_yaml = re.sub("'", "", yaml.dump(title, default_flow_style=False))
+    description_yaml = yaml.dump(description, default_flow_style=False)
+    resourcesyaml = re.sub("''", '', yaml.dump(resources,
+                                               default_flow_style=False))
+    resources_yaml = re.sub("'", '', resourcesyaml)
+    yamldata = title_yaml
+    yamldata = yamldata + "\n"+description_yaml
+    yamldata = yamldata + "\n"+resources_yaml
+    yamldata = yamldata + "\n"+yaml.dump(outputs)
+    return yamldata
+
+
+def _create_metadata_yaml(alldata):
+    metadata ={}
+    metadata_items={}
+    for item in alldata['metadata']:
+        metadata_items.update(item)
+    metadata['tenant_metadata'] = {'type': 'OS::Keystone::Metadata\n',
+                                   'properties': {
+                                       'TENANT_ID': "{'get_resource': '%s'}" %
+                                                    alldata['uuid'],
+                                       'METADATA': {
+                                           'metadata': metadata_items}}}
+    return metadata
+
+
+def yamlbuilder(alldata, region):
+    logger.info("building customer yaml")
+    logger.debug("start building flavor yaml for region %s" % region['name'])
+    """build cstomer yaml.
+
+    build yaml file from json
+    :param alldata: full json data
+    :param region: data per region
+    :return: the full string of yaml file
+    """
+    outputs = {}
+    resources = {}
+    yaml_version = conf.yaml_configs.customer_yaml.yaml_version
+    yaml_type = conf.yaml_configs.customer_yaml.yaml_options.type
+    title = {'heat_template_version': yaml_version}
+    description = {'description': 'yaml file for region - %s' % region['name']}
+    jsondata = alldata
+    project_name = jsondata['name']
+    project_description = jsondata['description']
+    # TODO(amar): remove these lines when using objects instead of string json
+    status = {"0": False, "1": True}[str(jsondata['enabled'])]
+    outputs['outputs'] = {}
+    resources['resources'] = {}
+    resources['resources']["%s" % alldata['uuid']] =\
+        {'type': 'OS::Keystone::Project2\n',
+         'properties': {'name': "%s" % project_name,
+                        'project_id': alldata['uuid'],
+                        'description': project_description,
+                        'enabled': status}}
+    # create the output
+    outputs['outputs']["%s_id" % alldata['uuid']] =\
+        {"value": {"get_resource": "%s" % alldata['uuid']}}
+
+    users, quotas = get_users_quotas(alldata, region)
+    for user in users:
+        user_roles = []
+        any_role = []
+        for role in user['roles']:
+            role_format = "%s"
+            user_roles.append(
+                {"role": role_format % role,
+                 'project': "{'get_resource': '%s'}" % alldata['uuid']}
+            )
+            # create the output for roles
+          #  outputs['outputs']["%s_id" % role] =\
+         #       {"value": {"get_resource": "%s" % role}}
+
+        # no support for group when type is ldap
+        if yaml_type != 'ldap':
+            # create one group for user
+            # not real group its only from heat to be able to delete the user
+            any_role = [
+                {'project': "{'get_resource': '%s'}" % alldata['uuid'],
+                 'role': "{'get_resource': '%s'}" % role}
+            ]
+            group_name = "%s_%s_group" % (alldata['uuid'], user['id'])
+            resources['resources'][group_name] = \
+                {'type': 'OS::Keystone::Group\n',
+                 'properties': {'name': "%s" % group_name,
+                                'domain': 'default',
+                                'description': 'dummy',
+                                'roles': any_role}}
+
+            # remove groupe section when type is ldap
+            # create users :: added the hard coded groupe
+            user_group = ["{'get_resource': '%s'}" % group_name]
+            resources['resources'][user['id']] = \
+                {'type': 'OS::Keystone::User\n',
+                 'properties': {'name': user['id'],
+                                'groups': user_group,
+                                'roles': user_roles}}
+        else:
+            resources['resources'][user['id']] = \
+                {'type': 'OS::Keystone::UserRoleAssignment\n',
+                 'properties': {'user': user['id'],
+                                'roles': user_roles}}
+
+        # create the output for users
+        outputs['outputs']["%s_id" % user['id']] = \
+            {"value": {"get_resource": user['id']}}
+
+    options = {"compute": ["nova_quota", "OS::Nova::Quota\n"],
+               "network": ["neutron_quota", "OS::Neutron::Quota\n"],
+               "storage": ["cinder_quota", "OS::Cinder::Quota\n"]}
+
+    # create quotas if quotas
+    if conf.yaml_configs.customer_yaml.yaml_options.quotas:
+        quotas_keys = dict(conf.yaml_configs.customer_yaml.yaml_keys.quotas_keys)
+        for items in quotas:
+            for item in items:
+
+                # these lines added to check if got excpected keys if not they will be replaced
+                for ite in items[item].keys()[:]:
+                    if ite in quotas_keys:
+                        items[item][quotas_keys[ite]] = items[item][ite]
+                        del items[item][ite]
+                #------------------------------------
+
+                # adding tenant to each quota
+                items[item]['tenant'] = \
+                    "{'get_resource': %s}" % alldata['uuid']
+                resources['resources'][options[item][0]] = \
+                    {"type": options[item][1], "properties": items[item]}
+    metadata = _create_metadata_yaml(alldata)
+    resources['resources'].update(metadata)
+    # putting all parts together for full yaml
+    yamldata = creat_final_yaml(title, description, resources, outputs)
+    logger.debug(
+        "done building customer yaml for region %s " % region['name'])
+    return yamldata
diff --git a/orm/services/resource_distributor/rds/services/yaml_flavor_bulder.py b/orm/services/resource_distributor/rds/services/yaml_flavor_bulder.py
new file mode 100755
index 00000000..847eca52
--- /dev/null
+++ b/orm/services/resource_distributor/rds/services/yaml_flavor_bulder.py
@@ -0,0 +1,78 @@
+"""flavor builder module."""
+import logging
+import re
+
+import yaml
+from pecan import conf
+
+my_logger = logging.getLogger(__name__)
+
+
+def create_final_yaml(title, resources, description, outputs):
+    """connect yaml strings together."""
+    title_yaml = re.sub("'", "", yaml.dump(title, default_flow_style=False))
+    description_yaml = yaml.dump(description, default_flow_style=False)
+    resources_yaml = yaml.dump(resources)
+    outputs_yaml = yaml.dump(outputs)
+    yamldata = title_yaml + "\n" + description_yaml
+    yamldata = yamldata + "\n" + resources_yaml + "\n" + outputs_yaml
+    return yamldata
+
+
+def yamlbuilder(alldata, region):
+    """build yaml."""
+    my_logger.info("building flavor yaml")
+    my_logger.debug("start building flavor yaml for region %s" % region['name'])
+    resources = {}
+    extra_specs = {}
+    outputs = {}
+    tags = {}
+    options = {}
+    tenants = []
+    flavor_type = 'nova_flavor'
+    rxtx_factor = conf.yaml_configs.flavor_yaml.yaml_args.rxtx_factor
+    if 'rxtx_factor' in alldata:
+        rxtx_factor = int(alldata['rxtx_factor'])
+    yaml_version = conf.yaml_configs.flavor_yaml.yaml_version
+    public = {'public': True, 'private': False}[alldata['visibility']]
+    title = {'heat_template_version': yaml_version}
+    description = {'description': 'yaml file for region - %s' % region['name']}
+    ram = int(alldata['ram'])
+    swap = int(alldata['swap'])
+    for key, value in alldata['extra_specs'].items():
+        extra_specs[key] = value
+    # Handle tags
+    if 'tag' in alldata:
+        for key, value in alldata['tag'].items():
+            extra_specs[key] = value
+    # Handle options
+    if 'options' in alldata:
+        for key, value in alldata['options'].items():
+            extra_specs[key] = value
+    # Handle tenants
+    for tenant in alldata['tenants']:
+        tenants.append(tenant['tenant_id'])
+
+    # Generate the output
+    resources['resources'] = {}
+    resources['resources'][flavor_type] = \
+        {'type': 'OS::Nova::Flavor',
+         'properties': {'disk': alldata['disk'],
+                        'ephemeral': alldata['ephemeral'],
+                        'extra_specs': extra_specs,
+                        'flavorid': alldata['id'],
+                        'is_public': public,
+                        'name': alldata['name'],
+                        'ram': ram,
+                        'rxtx_factor': rxtx_factor,
+                        'swap': swap,
+                        'tenants': tenants,
+                        'vcpus': alldata['vcpus']}}
+    # gen the output
+    outputs['outputs'] = {}
+    outputs['outputs']['%s_id' % flavor_type] =\
+        {'value': {"get_resource": flavor_type}}
+    flavor_yaml = create_final_yaml(title, resources, description, outputs)
+    my_logger.debug(
+        "done!!! building flavor yaml for region %s " % region['name'])
+    return flavor_yaml
diff --git a/orm/services/resource_distributor/rds/services/yaml_image_builder.py b/orm/services/resource_distributor/rds/services/yaml_image_builder.py
new file mode 100755
index 00000000..37fcdaa8
--- /dev/null
+++ b/orm/services/resource_distributor/rds/services/yaml_image_builder.py
@@ -0,0 +1,56 @@
+import logging
+import re
+
+import yaml
+from pecan import conf
+
+my_logger = logging.getLogger(__name__)
+
+
+def create_full_yaml(title, resources, description, outputs):
+    title_yaml = re.sub("'", "", yaml.dump(title, default_flow_style=False))
+    description_yaml = yaml.dump(description, default_flow_style=False)
+    resources_yaml = re.sub("'", '', re.sub("''", '', yaml.dump(resources, default_flow_style=False)))
+    outputs_yaml = re.sub("'", '', re.sub("''", '', yaml.dump(outputs)))
+    full_yaml = title_yaml + "\n" + description_yaml
+    full_yaml = full_yaml + "\n" + resources_yaml + "\n" + outputs_yaml
+    return full_yaml
+
+
+def _properties(alldata, region):
+    public = True if alldata['visibility'] == "public" else False
+    protected = {0: False, 1: True}[alldata['protected']]
+    tenants = [tenant['customer_id'] for tenant in alldata['customers']]
+    return dict(
+        name = alldata['name'],
+        container_format = alldata["container_format"],
+        min_ram = alldata['min_ram'],
+        disk_format = alldata['disk_format'],
+        min_disk = alldata['min_disk'],
+        protected = protected,
+        copy_from = alldata["url"],
+        owner = alldata["owner"],
+        is_public = public,
+        tenants = str(tenants)
+    )
+
+
+def _glanceimage(alldata, region):
+    return dict(
+        type = "OS::Glance::Image2",
+        properties = _properties(alldata, region)
+    )
+
+
+def yamlbuilder(alldata, region):
+    resources = {}
+    outputs = {}
+    image_type = "glance_image"
+    yaml_version = conf.yaml_configs.image_yaml.yaml_version
+    title = {'heat_template_version': yaml_version}
+    description = {'description': 'yaml file for region - %s' % region['name']}
+    resources['resources'] = {"glance_image": _glanceimage(alldata, region)}
+    outputs['outputs'] = {
+        '%s_id' % image_type: {"value": {"get_resource": "%s" % image_type}}}
+    full_yaml = create_full_yaml(title, resources, description, outputs)
+    return full_yaml
diff --git a/orm/services/resource_distributor/rds/sot/__init__.py b/orm/services/resource_distributor/rds/sot/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/sot/base_sot.py b/orm/services/resource_distributor/rds/sot/base_sot.py
new file mode 100644
index 00000000..6a440cee
--- /dev/null
+++ b/orm/services/resource_distributor/rds/sot/base_sot.py
@@ -0,0 +1,18 @@
+""" SoT interface definition
+"""
+
+
+class BaseSoT(object):
+
+    def save_resource_to_sot(self,
+                             tracking_id,
+                             transaction_id,
+                             resource_list):
+        raise NotImplementedError("Please Implement this method")
+
+    def validate_sot_state(self):
+        raise NotImplementedError("Please Implement this method")
+
+
+class SoTError(Exception):
+    pass
diff --git a/orm/services/resource_distributor/rds/sot/git_sot/__init__.py b/orm/services/resource_distributor/rds/sot/git_sot/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/sot/git_sot/git_base.py b/orm/services/resource_distributor/rds/sot/git_sot/git_base.py
new file mode 100644
index 00000000..17fd8ad7
--- /dev/null
+++ b/orm/services/resource_distributor/rds/sot/git_sot/git_base.py
@@ -0,0 +1,35 @@
+import subprocess
+
+from pecan import conf
+
+
+class BaseGit(object):
+
+    def git_init(self):
+        raise NotImplementedError("Please Implement this method")
+
+    def git_upload_changes(self):
+        raise NotImplementedError("Please Implement this method")
+
+    def git_reset_changes(self):
+        raise NotImplementedError("Please Implement this method")
+
+    def validate_git(self):
+        raise NotImplementedError("Please Implement this method")
+
+
+class GitInitError(Exception):
+    pass
+
+
+class GitUploadError(Exception):
+    pass
+
+
+class GitResetError(Exception):
+    pass
+
+
+class GitValidateError(Exception):
+    pass
+
diff --git a/orm/services/resource_distributor/rds/sot/git_sot/git_factory.py b/orm/services/resource_distributor/rds/sot/git_sot/git_factory.py
new file mode 100644
index 00000000..542c66e8
--- /dev/null
+++ b/orm/services/resource_distributor/rds/sot/git_sot/git_factory.py
@@ -0,0 +1,15 @@
+from git_gittle import GitGittle
+from git_native import GitNative
+
+
+def get_git_impl(git_type):
+    """Return the correct Git implementation according to git_type"""
+    git_impl = None
+    if git_type == 'gittle':
+        git_impl = GitGittle()
+    elif git_type == 'native':
+        git_impl = GitNative()
+    else:
+        raise RuntimeError("Invalid Git implementation!!")
+
+    return git_impl
diff --git a/orm/services/resource_distributor/rds/sot/git_sot/git_gittle.py b/orm/services/resource_distributor/rds/sot/git_sot/git_gittle.py
new file mode 100755
index 00000000..c7c0a93f
--- /dev/null
+++ b/orm/services/resource_distributor/rds/sot/git_sot/git_gittle.py
@@ -0,0 +1,63 @@
+import logging
+
+from pecan import conf
+from gittle import Gittle
+
+from git_base import BaseGit, GitInitError, GitUploadError
+
+logger = logging.getLogger(__name__)
+
+
+class GitGittle(BaseGit):
+
+    def __init__(self):
+        self.repo = None
+
+    def git_init(self):
+        try:
+            # Init repository
+            logger.debug("Local repository path:{}, Git server url: {}".format(conf.git.local_repository_path,
+                                                                               conf.git.git_server_url))
+            self.repo = Gittle(conf.git.local_repository_path, origin_uri=conf.git.git_server_url)
+
+            logger.info("Pulling from git..")
+            # Update local working copy
+            self.repo.pull()
+
+            logger.info("GitGittle - Git is up to date !")
+
+        except Exception as exc:
+            logger.error("GitGittle - Failed to initialize Git. Reason: {}".format(exc.message))
+            raise GitInitError(exc.message)
+
+    def git_upload_changes(self):
+        commit_id = ""
+        try:
+
+            logger.info("Commit changes in progress ..")
+            # Stage modified files
+            self.repo.stage(self.repo.pending_files)
+
+            commit_message = conf.git.commit_message_format.format(self.repo.added_files)
+            # Commit the change
+            commit_id = self.repo.commit(conf.git.commit_user,
+                                         conf.git.commit_email,
+                                         commit_message)
+
+            logger.info("Commit details: commit_user:{}, commit_email:{}, "
+                        "commit_message:{}, commit_id:{}".format(conf.git.commit_user,
+                                                                 conf.git.commit_email,
+                                                                 commit_message,
+                                                                 commit_id))
+
+            # Push to repository
+            self.repo.push()
+
+        except Exception as exc:
+            logger.error("GitGittle - Filed to upload file to git.")
+            raise GitUploadError("Failed to upload file to Git")
+
+        return commit_id
+
+    def validate_git(self):
+        pass
diff --git a/orm/services/resource_distributor/rds/sot/git_sot/git_native.py b/orm/services/resource_distributor/rds/sot/git_sot/git_native.py
new file mode 100644
index 00000000..587b869b
--- /dev/null
+++ b/orm/services/resource_distributor/rds/sot/git_sot/git_native.py
@@ -0,0 +1,271 @@
+"""Native (bash commands) Git module."""
+import logging
+import subprocess, shlex
+from threading import Timer
+
+import time
+from pecan import conf
+
+from git_base import BaseGit
+from git_base import GitUploadError, GitInitError, GitResetError
+from git_base import GitValidateError
+
+logger = logging.getLogger(__name__)
+
+
+class GitNative(BaseGit):
+    """The native Git implementation."""
+
+    def git_init(self):
+        """Initialize Git."""
+        try:
+            logger.info("Local repository path:{}, "
+                        "Git server url: {}, "
+                        "Git command timeout: "
+                        "{} seconds".format(conf.git.local_repository_path,
+                                    conf.git.git_server_url,
+                                    conf.git.git_cmd_timeout))
+
+            out, error = self._git_pull(conf.git.local_repository_path)
+            if self._is_conflict(out) or self._is_error(error):
+                logger.error("Git pull result:\nerror:"
+                             " {}\nout: {}".format(error, out))
+                self.git_reset_changes("Reset all changes due "
+                                       "to git pull conflict or error.")
+
+        except GitResetError as exc:
+            msg = "Failed to initialize git repository. " \
+                  "Reason: {}".format(exc.message)
+            logger.error(msg)
+            raise GitInitError(msg)
+
+    def git_upload_changes(self):
+        """Upload (commit and push) the changes to Git."""
+        commit_id = ""
+        try:
+            logger.info("Upload changes in progress ..")
+
+            self._git_add(conf.git.local_repository_path)
+
+            commit_message = conf.git.commit_message_format.format("")
+
+            logger.info("Committing with the following parameters: "
+                        "user: {}, email: {}, message: {}".
+                        format(conf.git.commit_user,
+                               conf.git.commit_email,
+                               commit_message))
+            self._git_commit(conf.git.commit_user,
+                             conf.git.commit_email,
+                             commit_message,
+                             conf.git.local_repository_path)
+
+            commit_id, error = self._git_get_commit_id(
+                conf.git.local_repository_path)
+            logger.info("Commit id : {}".format(commit_id))
+
+            out, error = self._git_pull(conf.git.local_repository_path)
+            # This check is needed only for Pull before Push.
+            if self._is_error(error):
+                raise GitNativeError("Git pull error! [{}]".format(error))
+
+            # Push to repository
+            self._git_push(conf.git.local_repository_path)
+
+        except GitNativeError as exc:
+            msg = "Failed to upload file to git. " \
+                  "Reason: {}".format(exc.message)
+            logger.error(msg)
+            raise GitUploadError(msg)
+
+        return commit_id
+
+    def validate_git(self):
+        logger.info("Git repository validation started...\n"
+                    "Git commands timeout: {} "
+                    "seconds".format(conf.git.git_cmd_timeout))
+        try:
+            self._git_config(conf.git.local_repository_path)
+
+            out, error = self._git_pull(conf.git.local_repository_path)
+            if self._is_conflict(out) or self._is_error(error):
+                logger.info("Git pull error, reset ...")
+                self._git_commit(conf.git.commit_user,
+                                 conf.git.commit_email,
+                                 "Git pull error found !!!",
+                                 conf.git.local_repository_path)
+
+                self._git_reset(conf.git.local_repository_path)
+                logger.info("Git was reset to server's state.")
+            else:
+                self._git_add(conf.git.local_repository_path)
+
+                self._git_commit(conf.git.commit_user,
+                                 conf.git.commit_email,
+                                 "Git validation commit",
+                                 conf.git.local_repository_path)
+
+                out, error = self._git_pull(conf.git.local_repository_path)
+                # This check is needed only for pull before push.
+                if self._is_error(error):
+                    raise GitNativeError("Git pull error! [{}]".format(error))
+
+                self._git_push(conf.git.local_repository_path)
+
+            logger.info("Git repository state validation check done !")
+
+        except GitNativeError as exc:
+            logger.error("Git state invalid. Reason: [{}]".format(
+                exc.message))
+            raise GitValidateError("Git state invalid !")
+
+    def git_reset_changes(self, msg):
+        logger.info("Reset local repository to Git server started.")
+        try:
+            self._git_commit(conf.git.commit_user,
+                             conf.git.commit_email,
+                             msg,
+                             conf.git.local_repository_path)
+
+            self._git_reset(conf.git.local_repository_path)
+            logger.info("Local repository is now up to date "
+                        "with Git server.")
+
+        except GitNativeError as exc:
+            msg = "Git reset changes failed. " \
+                  "Reason: {}".format(exc.message)
+            logger.error(msg)
+            raise GitResetError(msg)
+
+    def _git_config(self, repo_dir):
+        logger.info("Set git configuration params started.")
+        cmds = ['git config --global user.name {}'.format(conf.git.commit_user),
+                'git config --global user.email {}'.format(conf.git.commit_email)]
+
+        for cmd in cmds:
+            self._execute_git_cmd(cmd, repo_dir)
+        logger.info("Set git configuration params done.")
+
+    def _git_add(self, repo_dir):
+        logger.info("Git add started.")
+        cmd = 'git add --all'
+        out, error = self._execute_git_cmd(cmd, repo_dir)
+        logger.info("Git add done.")
+        return out, error
+
+    def _git_commit(self, user, email, commit_message, repo_dir):
+        logger.info("Git commit started.")
+        cmd = 'git commit --author="%s <%s>" -am "%s"' % (user,
+                                                          email,
+                                                          commit_message)
+        out, error = self._execute_git_cmd(cmd, repo_dir)
+        logger.info("Git commit done.")
+        return out, error
+
+    def _git_get_commit_id(self, repo_dir):
+        logger.info("Git get commit id started.")
+        cmd = 'git rev-parse HEAD'
+        out, error = self._execute_git_cmd(cmd, repo_dir)
+        # we need to clean \n and whitespaces before returning the commit id
+        out = out.strip().split('\n')[0]
+        logger.info("Git get commit id done. commit id: {}".format(out))
+        return out, error
+
+    def _git_reset(self, repo_dir):
+        logger.info("Git reset started.")
+        cmd = 'git reset --hard origin/master '
+        out, error = self._execute_git_cmd(cmd, repo_dir)
+        logger.info("Git reset done.")
+        return out, error
+
+    def _git_push(self, repo_dir):
+        logger.info("Git push started.")
+        cmd = 'git push '
+        start_time = time.time()
+        out, error = self._execute_git_cmd(cmd, repo_dir)
+        logger.info("Git push done "
+                    "(%.3f seconds)" % (time.time() - start_time))
+        return out, error
+
+    def _execute_git_cmd(self, cmd, repo_dir):
+        error = ""
+        proc = subprocess.Popen(shlex.split(cmd), cwd=repo_dir,
+                                stdout=subprocess.PIPE,
+                                stderr=subprocess.PIPE)
+        timeout = conf.git.git_cmd_timeout
+        timer = Timer(timeout, on_subprocess_timeout, [cmd, proc])
+        try:
+            timer.start()
+            (out, error) = proc.communicate()
+            logger.debug("Cmd proc id: {}".format(proc.pid))
+            proc.wait()
+        finally:
+            if not timer.is_alive():
+                msg = "Git command '{}' timed out !!".format(cmd)
+                logger.error(msg)
+                # the word error must be in message
+                error = "error:" + msg
+            timer.cancel()
+
+        if self._is_error(error):
+            raise GitNativeError("Git error! [{}]".format(error))
+        return out, error
+
+    def _git_pull(self, repo_dir):
+        logger.info("Git pull started.")
+        cmd = 'git pull '
+        error = ""
+        start_time = time.time()
+        proc = subprocess.Popen(shlex.split(cmd), cwd=repo_dir,
+                                stdout=subprocess.PIPE,
+                                stderr=subprocess.PIPE)
+        timeout = conf.git.git_cmd_timeout
+        timer = Timer(timeout, on_subprocess_timeout, [cmd, proc])
+        try:
+            timer.start()
+            (out, error) = proc.communicate()
+            logger.debug("Cmd proc id: {}".format(proc.pid))
+            proc.wait()
+        finally:
+            if not timer.is_alive():
+                msg = "Git command '{}' timed out !!".format(cmd)
+                logger.error(msg)
+                # the word error must be in message
+                error = "error:" + msg
+            timer.cancel()
+
+        # Special case for pull caller method will check the output
+        if not self._is_error(error):
+            logger.info("Git pull done "
+                        "(%.3f seconds)" % (time.time() - start_time))
+
+        return out, error
+
+    def _is_error(self, error):
+        if error:
+            l_error = error.lower()
+            if 'error' in l_error or 'fatal' in l_error:
+                logger.error("Git operation returned with "
+                             "error:\n{}".format(error))
+                return True
+        return False
+
+    def _is_conflict(self, out):
+        if out:
+            l_out = out.lower()
+            if 'conflict' in l_out:
+                logger.info("Git operation returned with "
+                            "conflict:\n{}".format(out))
+                return True
+        return False
+
+
+def on_subprocess_timeout(cmd, proc):
+    logger.error("Subprocess for command : {}, timed out!".format(cmd))
+    logger.info("Terminating subprocess id: {}".format(proc.pid))
+    proc.kill()
+
+
+class GitNativeError(Exception):
+    """Describes a generic error in a Git operation."""
+
+    pass
diff --git a/orm/services/resource_distributor/rds/sot/git_sot/git_sot.py b/orm/services/resource_distributor/rds/sot/git_sot/git_sot.py
new file mode 100755
index 00000000..ad5b9882
--- /dev/null
+++ b/orm/services/resource_distributor/rds/sot/git_sot/git_sot.py
@@ -0,0 +1,233 @@
+import logging
+import os
+import threading
+
+from rds.ordupdate.ord_notifier import notify_ord
+from rds.sot import base_sot
+from rds.sot.base_sot import SoTError
+
+import git_factory
+from git_base import GitUploadError, GitInitError, GitResetError
+from git_base import GitValidateError
+
+logger = logging.getLogger(__name__)
+lock = threading.Lock()
+
+
+class GitSoT(base_sot.BaseSoT):
+
+    local_repository_path = ""
+    relative_path_format = ""
+    file_name_format = ""
+    commit_message_format = ""
+    commit_user = ""
+    commit_email = ""
+    git_server_url = ""
+    git_type = ""
+
+    def __init__(self):
+        logger.debug("In Git based SoT")
+        self.git_impl = git_factory.get_git_impl(GitSoT.git_type)
+
+    def save_resource_to_sot(self, tracking_id, transaction_id,
+                             resource_list, application_id, user_id):
+        thread = threading.Thread(target=update_sot,
+                                  args=(self.git_impl,
+                                        lock,
+                                        tracking_id,
+                                        transaction_id,
+                                        resource_list,
+                                        application_id,
+                                        user_id))
+        thread.start()
+
+    def validate_sot_state(self):
+        thread = threading.Thread(target=validate_git,
+                                  args=(self.git_impl, lock))
+
+        thread.start()
+
+
+def update_sot(git_impl, my_lock, tracking_id, transaction_id, resource_list,
+               application_id, user_id):
+    logger.info("Save resource to SoT. start ...")
+    commit_id = ""
+    result = False
+    logger.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
+    logger.info("Acquire Git lock...")
+    # Lock the entire git operations, so that no other threads change local
+    # files.
+    my_lock.acquire()
+    logger.info("Git lock acquired !!!!")
+    try:
+        init_git(git_impl)
+
+        handle_file_operations(resource_list)
+
+        commit_id = update_git(git_impl)
+
+        logger.info("All files were successfully updated in Git server :-)\n")
+
+        result = True
+
+    except SoTError as exc:
+        logger.error("Save resource to SoT Git repository failed. "
+                     "Reason: {}.".
+                     format(exc.message))
+    except GitInitError as init_exc:
+        logger.error("Initializing Git repository Failed. Reason: {}.".
+                     format(init_exc.message))
+    except GitUploadError as upload_exc:
+        logger.error("Uploading to Git repository Failed. Reason: {}.".
+                     format(upload_exc.message))
+        cleanup(git_impl)
+    finally:
+        logger.info("Release Git lock...")
+        my_lock.release()
+        logger.info("Git lock released !!!!")
+        logger.info("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<")
+
+    # This method is called also in case exception raised.
+    # Notification to ords will not be sent but status db and audit
+    # will be updated.
+    for resource in resource_list:
+        try:
+            notify_ord(transaction_id,
+                       tracking_id,
+                       resource["resource_type"],
+                       commit_id,   # This is the resource-template-version
+                       GitSoT.file_name_format.format(
+                           resource["resource_name"]),
+                       resource["resource_name"],  # This is the resource_id
+                       resource["operation"],
+                       resource["region_id"],
+                       application_id,  # application_id is not available
+                       user_id,  # user_id is not available
+                       "NA",  # external_id is not available
+                       not result)
+        except Exception as e:
+            logger.error("Error in updating ORD! Error: {}".format(
+                e.message
+            ))
+
+
+def handle_file_operations(resource_list):
+    for resource in resource_list:
+        file_path = get_resource_file_path(resource)
+        operation = resource["operation"]
+        logger.debug("Operation: {}".format(operation))
+        if operation == "delete":
+            logger.info("Deleting file: {}".format(file_path))
+            if os.path.exists(file_path):
+                try:
+                    os.remove(file_path)
+                    logger.info("File successfully deleted!")
+                except OSError as ex:
+                    msg = "Could not delete file. " \
+                          "Reason: {}".format(ex.message)
+                    logger.error(msg)
+                    raise SoTError(msg)
+            else:
+                logger.info("File does not exist, nothing to delete..")
+
+        else:  # for all other operations "modify", "create"
+            logger.info("Adding file: {}".format(file_path))
+            create_file_in_path(file_path, resource["template_data"])
+            logger.info("File was successfully added!")
+
+
+def get_resource_file_path(resource):
+    file_name = GitSoT.file_name_format.format(resource["resource_name"])
+    relative_path = GitSoT.relative_path_format. \
+        format(resource["region_id"],
+               resource["resource_type"],
+               file_name)
+    file_path = GitSoT.local_repository_path + relative_path
+    return file_path
+
+
+def create_file_in_path(file_path, file_data):
+    logger.info("Creating file : {}".format(file_path))
+
+    create_dir(file_path)
+    logger.debug("Directory path created..")
+
+    write_data_to_file(file_path, file_data)
+    logger.info("Data written to file.")
+
+
+def create_dir(file_path):
+    # Create actual directory path if not exist
+    f_path = os.path.dirname(file_path)
+    if not os.path.exists(f_path):
+        try:
+            os.makedirs(f_path)
+        except OSError as ex:
+            msg = "Failed to create directory path. " \
+                  "Reason: {}".format(ex.message)
+            logger.error(msg)
+            raise SoTError(msg)
+
+
+def write_data_to_file(file_path, file_data):
+    # Create and write data to file (If file exists it is overwritten)
+    try:
+        with open(file_path, 'w') as fo:
+            fo.write(file_data)
+    except IOError as ex:
+        msg = "Could not write data to file. " \
+              "Reason: {}".format(ex.message)
+        logger.error(msg)
+        raise SoTError(msg)
+    else:
+        fo.close()
+
+
+def init_git(git_impl):
+    try:
+        git_impl.git_init()
+    except GitInitError as exc:
+        logger.error("Failed to initialize Git. "
+                     "Reason: {}".format(exc.message))
+        raise
+
+
+def update_git(git_impl):
+    commit_id = ""
+    try:
+        commit_id = git_impl.git_upload_changes()
+    except GitUploadError as exc:
+        logger.error(exc.message)
+        raise
+    return commit_id
+
+
+def validate_git(git_impl, my_lock):
+    logger.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
+    logger.info("Acquire Git lock...")
+    my_lock.acquire()
+    logger.info("Git lock acquired !!!!")
+    try:
+        git_impl.validate_git()
+    except GitValidateError as exc:
+        logger.error("Git validation error. Reason: {}.".
+                     format(exc.message))
+    finally:
+        logger.info("Release Git lock...")
+        my_lock.release()
+        logger.info("Git lock released !!!!")
+        logger.info("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<")
+
+
+def cleanup(git_impl):
+    logger.info("Cleanup started...")
+    try:
+        git_impl.git_reset_changes("Clean up changes due to upload error.")
+    except GitResetError as exc:
+        logger.error(exc.message)
+        raise SoTError(exc.message)
+
+
+
+
+
diff --git a/orm/services/resource_distributor/rds/sot/sot_factory.py b/orm/services/resource_distributor/rds/sot/sot_factory.py
new file mode 100644
index 00000000..1c2fea4c
--- /dev/null
+++ b/orm/services/resource_distributor/rds/sot/sot_factory.py
@@ -0,0 +1,29 @@
+from rds.sot.git_sot import git_sot
+
+sot_type = ""
+local_repository_path = ""
+relative_path_format = ""
+file_name_format = ""
+commit_message_format = ""
+commit_user = ""
+commit_email = ""
+git_server_url = ""
+git_type = ""
+
+
+def get_sot():
+    """Return the correct SoT implementation according to sot_type"""
+
+    if sot_type == 'git':
+        git_sot.GitSoT.local_repository_path = local_repository_path
+        git_sot.GitSoT.relative_path_format = relative_path_format
+        git_sot.GitSoT.file_name_format = file_name_format
+        git_sot.GitSoT.commit_message_format = commit_message_format
+        git_sot.GitSoT.commit_user = commit_user
+        git_sot.GitSoT.commit_email = commit_email
+        git_sot.GitSoT.git_server_url = git_server_url
+        git_sot.GitSoT.git_type = git_type
+        sot = git_sot.GitSoT()
+        return sot
+    else:
+        raise RuntimeError("Invalid SoT implementation!!")
diff --git a/orm/services/resource_distributor/rds/sot/sot_utils.py b/orm/services/resource_distributor/rds/sot/sot_utils.py
new file mode 100644
index 00000000..758e3bc7
--- /dev/null
+++ b/orm/services/resource_distributor/rds/sot/sot_utils.py
@@ -0,0 +1,43 @@
+import yaml
+
+
+def merge_yamls(document, section):
+    document_dict = yaml.load(document)
+    section_dict = yaml.load(section)
+    merge_dict(section_dict, document_dict)
+    new_document = yaml.dump(document_dict)
+    return new_document
+
+
+# source is being merged into destiantion
+def merge_dict(source, destination):
+    for key, value in source.items():
+        if isinstance(value, dict):
+            # get node or create one
+            node = destination.setdefault(key, {})
+            merge_dict(value, node)
+        else:
+            destination[key] = value
+
+    return destination
+
+document = """
+    a: 1
+    b:
+        c: 3
+        d: 4
+        f:
+            h: h1
+"""
+
+section = """
+    b:
+        d: 6
+        e: 5
+        f:
+            g: g1
+            h:
+                h1: h2
+"""
+
+print(merge_yamls(document, section))
diff --git a/orm/services/resource_distributor/rds/storage/__init__.py b/orm/services/resource_distributor/rds/storage/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/storage/factory.py b/orm/services/resource_distributor/rds/storage/factory.py
new file mode 100644
index 00000000..a959c7fb
--- /dev/null
+++ b/orm/services/resource_distributor/rds/storage/factory.py
@@ -0,0 +1,10 @@
+from rds.storage.mysql.region_resource_id_status import Connection as RegionResourceIdStatusConnection
+
+database = {
+    'url' : 'na'
+}
+
+
+def get_region_resource_id_status_connection():
+    return RegionResourceIdStatusConnection(database['url'])
+
diff --git a/orm/services/resource_distributor/rds/storage/mysql/__init__.py b/orm/services/resource_distributor/rds/storage/mysql/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/storage/mysql/region_resource_id_status.py b/orm/services/resource_distributor/rds/storage/mysql/region_resource_id_status.py
new file mode 100755
index 00000000..6fb07c06
--- /dev/null
+++ b/orm/services/resource_distributor/rds/storage/mysql/region_resource_id_status.py
@@ -0,0 +1,210 @@
+import time
+
+from oslo_db.sqlalchemy import session as db_session
+from sqlalchemy import Column, Integer, Text, BigInteger, ForeignKey
+from sqlalchemy.orm import relationship
+from sqlalchemy.ext.declarative.api import declarative_base
+
+from rds.services.model.region_resource_id_status import Model, StatusModel
+from rds.storage import region_resource_id_status
+import logging
+import oslo_db
+
+from pecan import conf
+
+Base = declarative_base()
+logger = logging.getLogger(__name__)
+
+
+class ResourceStatusRecord(Base):
+    __tablename__ = 'resource_status'
+
+    id = Column(Integer, autoincrement=True, primary_key=True)
+    timestamp = Column(BigInteger, primary_key=False)
+    region = Column(Text, primary_key=False)
+    status = Column(Text, primary_key=False)
+    transaction_id = Column(Text, primary_key=False)
+    resource_id = Column(Text, primary_key=False)
+    ord_notifier = Column(Text, primary_key=False)
+    err_code = Column(Text, primary_key=False)
+    err_msg = Column(Text, primary_key=False)
+    operation = Column(Text, primary_key=False)
+    resource_extra_metadata = relationship("ImageMetadData",
+                                           cascade="all, delete, delete-orphan")
+
+class ImageMetadData(Base):
+    __tablename__ = 'image_metadata'
+
+    image_meta_data_id = Column(ForeignKey(u'resource_status.id'),
+                                 primary_key=True)
+    checksum = Column(Text, primary_key=False)
+    virtual_size = Column(Text, primary_key=False)
+    size = Column(Text, primary_key=False)
+
+
+class Connection(region_resource_id_status.Base):
+    """ Implements mysql DB """
+
+    def __init__(self, url):
+        self._engine_facade = db_session.EngineFacade(url)
+
+    def add_update_status_record(self,
+                                 timestamp,
+                                 region,
+                                 status,
+                                 transaction_id,
+                                 resource_id,
+                                 ord_notifier,
+                                 err_msg,
+                                 err_code,
+                                 operation,
+                                 resource_extra_metadata=None):
+        logger.debug("Add/Update status record:\ntimestamp [{}]\nregion [{}]"
+                     "\nstatus [{}]\ntransaction_id [{}]\nresource_id [{}]\n"
+                     "ord_notifier [{}]\nerr_code [{}]\n"
+                     "err_msg [{}] operation [{}] resource_extra_metadata"
+                     " [{}]".format(timestamp,
+                                    region,
+                                    status,
+                                    transaction_id,
+                                    resource_id,
+                                    ord_notifier,
+                                    err_code,
+                                    err_msg,
+                                    operation,
+                                    resource_extra_metadata))
+        try:
+            session = self._engine_facade.get_session()
+            with session.begin():
+                image_metadata = None
+                record = session.query(ResourceStatusRecord).\
+                    filter_by(resource_id=resource_id, region=region).first()
+                if resource_extra_metadata:
+                    image_metadata = ImageMetadData(
+                        checksum=resource_extra_metadata['checksum'],
+                        virtual_size=resource_extra_metadata['virtual_size'],
+                        size=resource_extra_metadata['size'])
+
+                if record is not None:
+                    logger.debug("Update record")
+                    record.timestamp = timestamp
+                    record.region = region
+                    record.status = status
+                    record.transaction_id = transaction_id
+                    record.resource_id = resource_id
+                    record.ord_notifier = ord_notifier
+                    record.err_msg = err_msg
+                    record.err_code = err_code
+                    record.operation = operation
+                    if record.resource_extra_metadata and image_metadata:
+                        record.resource_extra_metadata[0] = image_metadata
+                    elif image_metadata:
+                        record.resource_extra_metadata.append(image_metadata)
+                    else:
+                        # remove child if not given
+                        session.query(ImageMetadData).filter_by(
+                            image_meta_data_id=record.id).delete()
+                else:
+                    logger.debug("Add record")
+                    resource_status = ResourceStatusRecord(timestamp=timestamp,
+                                                           region=region,
+                                                           status=status,
+                                                           transaction_id=transaction_id,
+                                                           resource_id=resource_id,
+                                                           ord_notifier=ord_notifier,
+                                                           err_msg=err_msg,
+                                                           err_code=err_code,
+                                                           operation=operation)
+                    if resource_extra_metadata:
+                        resource_status.resource_extra_metadata.append(image_metadata)
+
+                    session.add(resource_status)
+
+        except oslo_db.exception.DBDuplicateEntry as e:
+            logger.warning("Duplicate entry: {}".format(str(e)))
+
+    def get_records_by_resource_id(self, resource_id):
+        return self.get_records_by_filter_args(resource_id=resource_id)
+
+    def get_records_by_filter_args(self, **filter_args):
+        logger.debug("Get records filtered by [{}]".format(filter_args))
+        (timestamp, ref_timestamp) = self.get_timstamp_pair()
+        logger.debug("timestamp=%s, ref_timestamp=%s" % (timestamp, ref_timestamp))
+        records_model = []
+        session = self._engine_facade.get_session()
+        with session.begin():
+            records = session.query(ResourceStatusRecord).filter_by(**filter_args)
+            # if found records return these records
+            if records is not None:
+                for record in records:
+                    if record.status == "Submitted" and record.timestamp < ref_timestamp:
+                        record.timestamp = timestamp
+                        record.status = "Error"
+                        record.err_msg = "Status updated to 'Error'. Too long 'Submitted' status"
+
+                    status = Model(record.timestamp,
+                                   record.region,
+                                   record.status,
+                                   record.transaction_id,
+                                   record.resource_id,
+                                   record.ord_notifier,
+                                   record.err_msg,
+                                   record.err_code,
+                                   record.operation,
+                                   record.resource_extra_metadata)
+                    records_model.append(status)
+                return StatusModel(records_model)
+            else:
+                logger.debug("No records found")
+                return None
+
+    def get_records_by_resource_id_and_status(self,
+                                              resource_id,
+                                              status):
+        """ This method filters all the records where resource_id is the given
+        resource_id and status is the given status.
+        for the matching records check if a time period elapsed and if so,
+        change the status to 'Error' and the timestamp to the given timestamp."""
+        logger.debug("Get records filtered by resource_id={} "
+                     "and status={}".format(resource_id,
+                                            status))
+        (timestamp, ref_timestamp) = self.get_timstamp_pair()
+        logger.debug("timestamp=%s, ref_timestamp=%s" % (timestamp, ref_timestamp))
+        session = self._engine_facade.get_session()
+        records_model = []
+        with session.begin():
+            records = session.query(ResourceStatusRecord).\
+                filter_by(resource_id=resource_id,
+                          status=status)
+            if records is not None:
+                for record in records:
+                    if record.status == "Submitted" and record.timestamp < ref_timestamp:
+                        record.timestamp = timestamp
+                        record.status = "Error"
+                        record.err_msg = "Status updated to 'Error'. Too long 'Submitted' status"
+                    else:
+                        status = Model(record.timestamp,
+                                       record.region,
+                                       record.status,
+                                       record.transaction_id,
+                                       record.resource_id,
+                                       record.ord_notifier,
+                                       record.err_msg,
+                                       record.err_code,
+                                       record.operation,
+                                       record.resource_extra_metadata)
+                        records_model.append(status)
+                if len(records_model):
+                    return StatusModel(records_model)
+            else:
+                logger.debug("No records found")
+            return None
+
+    def get_timstamp_pair(self):
+        timestamp = int(time.time())*1000
+        # assume same time period for all resource types
+        max_interval_time_in_seconds = conf.region_resource_id_status.max_interval_time.default * 60
+        ref_timestamp = (int(time.time()) - max_interval_time_in_seconds) * 1000
+        return timestamp, ref_timestamp
+
+
diff --git a/orm/services/resource_distributor/rds/storage/region_resource_id_status.py b/orm/services/resource_distributor/rds/storage/region_resource_id_status.py
new file mode 100644
index 00000000..43856d0d
--- /dev/null
+++ b/orm/services/resource_distributor/rds/storage/region_resource_id_status.py
@@ -0,0 +1,24 @@
+""" Storage base backend
+"""
+
+
+class Base(object):
+    def __init__(self, url):
+        pass
+
+    def add_update_status_record(self,
+                                 timestamp,
+                                 region,
+                                 status,
+                                 transaction_id,
+                                 resource_id,
+                                 ord_notifier,
+                                 err_msg,
+                                 err_code):
+        raise NotImplementedError("Please Implement this method")
+
+    def get_records_by_resource_id(self, resource_id):
+        raise NotImplementedError("Please Implement this method")
+
+    def get_records_by_filter_args(self, **filter_args):
+        raise NotImplementedError("Please Implement this method")
\ No newline at end of file
diff --git a/orm/services/resource_distributor/rds/tests/__init__.py b/orm/services/resource_distributor/rds/tests/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/tests/base.py b/orm/services/resource_distributor/rds/tests/base.py
new file mode 100644
index 00000000..23bd24c6
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/base.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+
+# Copyright 2010-2011 OpenStack Foundation
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from oslotest import base
+
+
+class TestCase(base.BaseTestCase):
+
+    """Test case base class for all unit tests."""
diff --git a/orm/services/resource_distributor/rds/tests/config.py b/orm/services/resource_distributor/rds/tests/config.py
new file mode 100755
index 00000000..b7314bfd
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/config.py
@@ -0,0 +1,170 @@
+# Pecan Application configurations
+app = {
+    'root': 'rds.controllers.root.RootController',
+    'modules': ['rds'],
+    'service_name': 'RDS'
+}
+
+server = {
+    'port': '8777',
+    'host': '0.0.0.0'
+}
+
+# DB configurations
+database = {
+    'url': 'mysql://root:stack@127.0.0.1/orm_rds?charset=utf8'
+}
+
+sot = {
+    'type': 'git',
+}
+
+git = {
+    # possible values : 'native', 'gittle'
+    'type': 'gittle',
+    'local_repository_path': '/home/orm/SoT/ORM',
+    'file_name_format': 's_{}.yml',
+    'relative_path_format': '/Document_Store/LCP/{}/{}/{}',
+    'commit_message_format': 'File was added to repository: {}',
+    'commit_user': 'orm_rds',
+    'commit_email': 'orm_rds@att.com',
+    'git_server_url': 'orm_rds@172.20.90.218:~/SoT/ORM.git'
+
+}
+
+audit = {
+    'audit_server_url': 'http://127.0.0.1:8776/v1/audit/transaction',
+    'num_of_send_retries': 3,
+    'time_wait_between_retries': 1
+}
+
+authentication = {
+    'enabled': False,
+    'mech_id': 'admin',
+    'mech_pass': 'stack',
+    'rms_url': 'http://172.20.90.174:8080',
+    'tenant_name': 'admin'
+}
+
+ordupdate = {
+    'discovery_url': '127.0.0.1',
+    'discovery_port': '8080',
+    'template_type': 'hot'
+}
+
+verify = False
+
+UUID_URL = 'http://172.20.90.232:8090/v1/uuids'
+
+yaml_configs = {
+    'customer_yaml': {
+        'yaml_version': '2014-10-16',
+        'yaml_options': {
+            'quotas': True,
+            'type': 'ldap'
+        },
+        'yaml_keys': {
+            'quotas_keys': {
+                'keypairs': 'key_pairs',
+                'network': 'networks',
+                'port': 'ports',
+                'router': 'routers',
+                'subnet': 'subnets',
+                'floatingip': 'floating_ips'
+            }
+        }
+    },
+    'flavor_yaml':{
+        'yaml_version': '2013-05-23',
+        'yaml_args': {
+            'rxtx_factor': 1
+        }
+    },
+    'image_yaml': {
+        'yaml_version': '2014-10-16'
+    }
+}
+
+# yaml configuration for create flavor
+yaml_flavor_version='2014-10-16'
+
+# value of status to be blocked before creating any resource
+block_by_status = "Submitted"
+
+# this tells which values to allow resource submit the region
+allow_region_statuses = ['functional']
+
+keystone_role_list = {
+    'member': '68cddd1a64eb4eae9c5d82581bc55426',
+    'reselleradmin': '2f358be4320a401cb7517c5938d93003',
+    'wwiftoperator': '852113b8aeba420eb6176f896e85d1fb',
+    '_member_': '6b29638c65de4df09b4d3ee0bee3ca39',
+    'admin': '084103f31503413a93d4e3b3383ca954'
+}
+
+# region_resource_id_status configurations
+region_resource_id_status = {
+    # interval_time_validation in minutes
+    'max_interval_time': {
+        'images': 60,
+        'tenants': 60,
+        'flavors': 60,
+        'users': 60,
+        'default': 60
+    },
+    'allowed_status_values': {
+        'Success',
+        'Error',
+        'Submitted'
+    },
+    'allowed_operation_type':
+    {
+        'create',
+        'modify',
+        'delete'
+    },
+    'allowed_resource_type':
+    {
+        'customer',
+        'image',
+        'flavor'
+    }
+}
+
+logging = {
+    'root': {'level': 'INFO', 'handlers': ['console']},
+    'loggers': {
+        'rds': {'level': 'DEBUG', 'handlers': ['console', 'Logfile'], 'propagate': False},
+        'pecan': {'level': 'DEBUG', 'handlers': ['console'], 'propagate': False},
+        'py.warnings': {'handlers': ['console']},
+        '__force_dict__': True
+    },
+    'handlers': {
+        'console': {
+            'level': 'CRITICAL',
+            'class': 'logging.StreamHandler',
+            'formatter': 'color'
+        },
+        'Logfile': {
+            'level': 'DEBUG',
+            'class': 'logging.handlers.RotatingFileHandler',
+            'maxBytes': 50000000,
+            'backupCount': 10,
+            'filename': '/tmp/rds.log',
+            'formatter': 'simple'
+        }
+    },
+    'formatters': {
+        'simple': {
+            'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]'
+                       '[%(threadName)s] %(message)s')
+        },
+        'color': {
+            '()': 'pecan.log.ColorFormatter',
+            'format':'%(asctime)s [%(padded_color_levelname)s] [%(name)s] [%(threadName)s] %(message)s',
+            '__force_dict__': True
+        }
+    }
+}
+
+
diff --git a/orm/services/resource_distributor/rds/tests/controllers/__init__.py b/orm/services/resource_distributor/rds/tests/controllers/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/tests/controllers/v1/__init__.py b/orm/services/resource_distributor/rds/tests/controllers/v1/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/tests/controllers/v1/configuration/__init__.py b/orm/services/resource_distributor/rds/tests/controllers/v1/configuration/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/tests/controllers/v1/configuration/test_get_configuration.py b/orm/services/resource_distributor/rds/tests/controllers/v1/configuration/test_get_configuration.py
new file mode 100755
index 00000000..53a12452
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/controllers/v1/configuration/test_get_configuration.py
@@ -0,0 +1,21 @@
+"""Get configuration module unittests."""
+from rds.tests.controllers.v1.functional_test import FunctionalTest
+from rds.controllers.v1.configuration import root
+from mock import patch
+
+
+class TestGetConfiguration(FunctionalTest):
+    """Main get configuration test case."""
+    @patch.object(root, 'utils')
+    def test_get_configuration_success(self, mock_utils):
+        """test get config success."""
+        mock_utils.set_utils_conf.return_value = True
+        mock_utils.report_config.return_value = "1234"
+        response = self.app.get('/v1/rds/configuration')
+        self.assertEqual(response.json, '1234')
+
+    # @patch.object(root.utils, 'report_config', return_value='12345')
+    # def test_get_configuration_success(self, input):
+    #     """Test get_configuration returns the expected value on success."""
+    #     response = self.app.get('/v1/rds/configuration')
+    #     self.assertEqual(response.json, '12345')
diff --git a/orm/services/resource_distributor/rds/tests/controllers/v1/functional_test.py b/orm/services/resource_distributor/rds/tests/controllers/v1/functional_test.py
new file mode 100644
index 00000000..5b2b64dc
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/controllers/v1/functional_test.py
@@ -0,0 +1,5 @@
+from rds.tests.functional_test import FunctionalTest
+
+
+class FunctionalTest(FunctionalTest):
+    PATH_PREFIX = '/v1'
diff --git a/orm/services/resource_distributor/rds/tests/controllers/v1/resources/__init__.py b/orm/services/resource_distributor/rds/tests/controllers/v1/resources/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/tests/controllers/v1/resources/test_create_resource.py b/orm/services/resource_distributor/rds/tests/controllers/v1/resources/test_create_resource.py
new file mode 100755
index 00000000..bb1a173b
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/controllers/v1/resources/test_create_resource.py
@@ -0,0 +1,242 @@
+"""unittest get resource."""
+from mock import patch
+
+import rds.controllers.v1.resources.root as root
+from rds.tests.controllers.v1.functional_test import FunctionalTest
+
+
+class TestCreateResource(FunctionalTest):
+    """tests for only for api handler."""
+
+    @patch.object(root.ResourceService, 'main', return_value="12345")
+    def test_create_resource_success(self, input):
+        """test create resource as it succeed."""
+        response = self.app.post_json('/v1/rds/resources', good_data)
+        assert response.json['customer']['id'] == '12345'
+        assert response.status_int == 201
+
+    @patch.object(root.ResourceService, 'main', return_value="12345")
+    def test_create_resource_success_flavor(self, input):
+        """test create flavor as it succeed."""
+        response = self.app.post_json('/v1/rds/resources', flavor_data)
+        assert response.json['flavor']['id'] == '12345'
+        assert response.status_int == 201
+
+    @patch.object(root.ResourceService, 'main', return_value="12345")
+    def test_create_resource_success_image(self, input):
+        """test create flavor as it succeed."""
+        response = self.app.post_json('/v1/rds/resources', image_data)
+        assert response.json['image']['id'] == '12345'
+        assert response.status_int == 201
+
+    @patch.object(root.ResourceService, 'main',
+                  side_effect=Exception("general exception"))
+    def test_create_resource_gen_except(self, input):
+        """test creatte resource to catch general exception."""
+        response = self.app.post_json('/v1/rds/resources',
+                                      good_data, expect_errors=True)
+        assert response.status_int == 400
+
+    @patch.object(root.ResourceService, 'main',
+                  side_effect=root.ConflictValue("region"))
+    def test_create_resource_conflict_except(self, input):
+        """test creatte resource to catch ConflictValue exception."""
+        response = self.app.post_json('/v1/rds/resources',
+                                      good_data, expect_errors=True)
+        assert response.status_int == 409
+
+    @patch.object(root.ResourceService, 'main', return_value="12345")
+    def test_delete_resource_flavor(self, input):
+        """test delete flavor."""
+        response = self.app.delete_json('/v1/rds/resources', flavor_data)
+        assert response.status_int == 200
+
+    @patch.object(root.ResourceService, 'main', return_value="12345")
+    def test_delete_resource_any(self, input):
+        """test delete resource not flavor."""
+        flavor_data["service_template"]["resource"]['resource_type'] = \
+            "customer"
+        response = self.app.delete_json('/v1/rds/resources', flavor_data,
+                                        expect_errors=True)
+        assert response.status_int == 405
+        flavor_data["service_template"]["resource"]['resource_type'] = "flavor"
+
+    @patch.object(root.ResourceService, 'main',
+                  side_effect=root.ConflictValue("region"))
+    def test_delete_resource_flavor_con(self, input):
+        """test delete flavor while previous proccess still in progress."""
+        try:
+            response = self.app.delete_json('/v1/rds/resources', flavor_data)
+        except Exception as e:
+            if '409 Conflict' not in str(e.message):
+                self.fail('error')
+
+    @patch.object(root.ResourceService, 'main',
+                  side_effect=Exception("unknown error"))
+    def test_delete_resource_flavor_exce(self, input):
+        """test delete flavor with general; exception."""
+        try:
+            response = self.app.delete_json('/v1/rds/resources', flavor_data)
+        except Exception as e:
+            if 'unknown error' not in str(e.message):
+                self.fail('error')
+
+    @patch.object(root.ResourceService, 'main', return_value="12345")
+    def test_update_resource_success(self, input):
+        updated =False
+        """test update resource as it succeed."""
+        response = self.app.put_json('/v1/rds/resources', good_data)
+        if 'updated' in response.json['customer']:
+            updated = True
+        assert response.json['customer']['id'] == '12345'
+        assert response.status_int == 201
+        assert updated == True
+
+    @patch.object(root.ResourceService, 'main',
+                  side_effect=Exception("unknown error"))
+    def test_put_resource_gen_exce(self, input):
+        """test customer put with general; exception."""
+        try:
+            response = self.app.put_json('/v1/rds/resources', good_data)
+        except Exception as e:
+            if 'unknown error' not in str(e.message):
+                self.fail('error')
+
+    @patch.object(root.ResourceService, 'main',
+                  side_effect=root.ConflictValue("region"))
+    def test_modify_resource_conflict_except(self, input):
+        """test modify resource to catch ConflictValue exception."""
+        response = self.app.put_json('/v1/rds/resources',
+                                      good_data, expect_errors=True)
+        assert response.status_int == 409
+
+good_data = {
+    "service_template": {
+        "resource": {
+            "resource_type": "customer"
+            },
+        "model": "{\n  \"uuid\": \"1e24981a-fa51-11e5-86aa-5e5517507c6"
+                 "6\",\n  \"description\": \"this is a description\",\n  \"nam"
+                 "e\": \"testname\",\n  \"enabled\": 1,\n  \"default_regio"
+                 "n\": {\n      \"name\": \"regionnamezzzz\",\n      \"quota"
+                 "s\":[\n          {\n            \"compute\": \n             "
+                 " {\n                \"instances\": \"10\",\n                "
+                 "\"injected_files\": \"10\",\n                \"keypair"
+                 "s\": \"10\",\n                \"ram\": \"10\"\n           "
+                 "   },\n            \"storage\":\n              {\n        "
+                 "        \"gigabytes\": \"10\",\n                \"snapsho"
+                 "ts\": \"10\",\n                \"volumes\": \"10\"\n      "
+                 "        },\n            \"network\": \n              {\n  "
+                 "              \"floatingip\": \"10\",\n                \"ne"
+                 "twork\": \"10\",\n                \"port\": \"10\",\n      "
+                 "          \"router\": \"10\",\n                \"subnet\":"
+                 " \"10\"\n              }\n            }\n        ],\n      "
+                 "\"users\": [\n        {\n          \"id\": \"userId1zzz"
+                 "z\",\n          \"roles\": [\n              \"admi"
+                 "nzzzz\",\n\t\t\t  \"otherzzzzz\"\n          ]\n        "
+                 "},\n\t\t{\n          \"id\": \"userId2zzz\",\n          \"ro"
+                 "les\": [\n\t\t\t  \"storagezzzzz\"\n          ]\n        "
+                 "}\n      ]\n    },\n  \"regions\": [\n    {\n      \"nam"
+                 "e\": \"regionname\",\n      \"quotas\":[\n          {\n     "
+                 "       \"compute\": \n              {\n                \"ins"
+                 "tances\": \"10\",\n                \"injected_file"
+                 "s\": \"10\",\n                \"keypairs\": \"10\",\n       "
+                 "         \"ram\": \"10\"\n              },\n            \"st"
+                 "orage\":\n              {\n                \"gigabyte"
+                 "s\": \"10\",\n                \"snapshots\": \"10\",\n     "
+                 "           \"volumes\": \"10\"\n              },\n         "
+                 "   \"network\": \n              {\n                \"floati"
+                 "ngip\": \"10\",\n                \"network\": \"10\",\n    "
+                 "            \"port\": \"10\",\n                \"route"
+                 "r\": \"10\",\n                \"subnet\": \"10\"\n         "
+                 "     }\n            }\n        ],\n      \"users\": [\n    "
+                 "    {\n          \"id\": \"userId1\",\n          \"role"
+                 "s\": [\n              \"admin\",\n\t\t\t  \"other\"\n      "
+                 "    ]\n        },\n\t\t{\n          \"id\": \"userId2\",\n "
+                 "         \"roles\": [\n\t\t\t  \"storage\"\n          ]\n  "
+                 "      }\n      ]\n    },\n\t{\n      \"name\": \"regionname"
+                 "test\",\n      \"quotas\":[\n          {\n            \"com"
+                 "pute\": \n              {\n                \"instanc"
+                 "es\": \"10\",\n                \"injected_files\": \"10\",\n"
+                 "                \"keypairs\": \"10\",\n                \"ra"
+                 "m\": \"10\"\n              },\n            \"storage\":\n  "
+                 "            {\n                \"gigabytes\": \"10\",\n    "
+                 "            \"snapshots\": \"10\",\n                \"volum"
+                 "es\": \"10\"\n              },\n            \"network\": \n"
+                 "              {\n                \"floatingip\": \"10\",\n "
+                 "               \"network\": \"10\",\n                \"por"
+                 "t\": \"10\",\n                \"router\": \"10\",\n        "
+                 "        \"subnet\": \"10\"\n              }\n            "
+                 "}\n        ],\n      \"users\": [\n        {\n          \"i"
+                 "d\": \"userId1test\",\n          \"roles\": [\n           "
+                 "   \"admintest\",\n\t\t\t  \"othertest\"\n          ]\n   "
+                 "     },\n\t\t{\n          \"id\": \"userId2test\",\n      "
+                 "    \"roles\": [\n\t\t\t  \"storagetest\"\n          ]\n  "
+                 "      }\n      ]\n    }\n  ]\n}",
+        "tracking": {
+            "external_id": "SSP-session1234",
+            "tracking_id": "uuid-12345"
+            }
+        }
+    }
+
+flavor_data = {
+    "service_template": {
+        "resource": {
+            "resource_type": "flavor"
+            },
+        "model": "{\n            \"status\": \"complete\",\n            \"pr"
+                 "ofile\": \"P2\",\n            \"regions\": [\n            "
+                 "    {\n                    \"name\": \"0\"\n              "
+                 "  },\n                {\n                    \"nam"
+                 "e\": \"1\"\n                }\n            ],\n            "
+                 "\"description\": \"First flavor for AMAR\",\n            \"r"
+                 "am\": 64,\n            \"visibility\": \"public\",\n       "
+                 "     \"extra_specs\": {\n                \"key1\": \"value"
+                 "1\",\n                \"key2\": \"value2\",\n              "
+                 "  \"keyx\": \"valuex\"\n            },\n            \"vcpu"
+                 "s\": 2,\n            \"swap\": 51231,\n            \"tenan"
+                 "ts\": [\n                {\n                    \"tenant_"
+                 "id\": \"abcd-efgh-ijkl-4567\"\n                },\n       "
+                 "         {\n                    \"tenant_id\": \"abcd-efgh-"
+                 "ijkl-4567\"\n                }\n            ],\n            "
+                 "\"disk\": 512,\n            \"empheral\": 1,\n            "
+                 "\"id\": \"uuid-uuid-uuid-uuid\",\n            \"name\": \"N"
+                 "ice Flavor\"\n        }",
+        "tracking": {
+            "external_id": "SSP-session1234",
+            "tracking_id": "uuid-12345"
+            }
+        }
+    }
+
+image_data = {
+    "service_template": {
+        "resource": {
+            "resource_type": "image"
+        },
+        "model": "{  \r\n   \"internal_id\":1,\r\n   \"id\":\"uuu1id12-uuid-uuid-uuid\",\r\n  "
+                 " \"name\":\"Ubuntu\",\r\n   \"enabled\": 1,\r\n   \"protected\": 1,\r\n  "
+                 " \"url\": \"https:\/\/mirrors.it.att.com\/images\/image-name\",\r\n "
+                 "  \"visibility\": \"public\",\r\n   \"disk_format\": \"raw\",\r\n  "
+                 " \"container_format\": \"bare\",\r\n   \"min_disk\":2,\r\n   \"min_ram\":0,\r\n "
+                 "  \"regions\":[  \r\n      {  \r\n         \"name\":\"North\",\r\n        "
+                 " \"type\":\"single\",\r\n         \"action\": \"delete\",\r\n         "
+                 "\"image_internal_id\":1\r\n      },\r\n      {  \r\n         \"name\":\"North\",\r\n        "
+                 " \"action\": \"create\",\r\n         \"type\":\"single\",\r\n        "
+                 " \"image_internal_id\":1\r\n      }\r\n   ],\r\n   \"image_properties\":[  \r\n      {  \r\n        "
+                 " \"key_name\":\"Key1\",\r\n         \"key_value\":\"Key1.value\",\r\n         "
+                 "\"image_internal_id\":1\r\n      },\r\n      {  \r\n         \"key_name\":\"Key2\",\r\n  "
+                 "       \"key_value\":\"Key2.value\",\r\n         \"image_internal_id\":1\r\n    "
+                 "  }\r\n   ],\r\n   \"image_tenant\":[  \r\n      {  \r\n         \"tenant_id\":\"abcd-efgh-ijkl-4567\",\r\n  "
+                 "       \"image_internal_id\":1\r\n      },\r\n      {  \r\n       "
+                 "  \"tenant_id\":\"abcd-efgh-ijkl-4567\",\r\n         \"image_internal_id\":1\r\n      }\r\n   ],\r\n "
+                 "  \"image_tags\":[  \r\n      {  \r\n         \"tag\":\"abcd-efgh-ijkl-4567\",\r\n     "
+                 "    \"image_internal_id\":1\r\n      },\r\n      {  \r\n         \"tag\":\"abcd-efgh-ijkl-4567\",\r\n   "
+                 "      \"image_internal_id\":1\r\n      }\r\n   ],\r\n   \"status\":\"complete\",\r\n}",
+        "tracking": {
+            "external_id": "SSP-session1234",
+            "tracking_id": "uuid-12345"
+        }
+    }
+}
diff --git a/orm/services/resource_distributor/rds/tests/controllers/v1/status/__init__.py b/orm/services/resource_distributor/rds/tests/controllers/v1/status/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/tests/controllers/v1/status/test_base.py b/orm/services/resource_distributor/rds/tests/controllers/v1/status/test_base.py
new file mode 100644
index 00000000..93e1d313
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/controllers/v1/status/test_base.py
@@ -0,0 +1,13 @@
+import unittest
+
+from rds.controllers.v1.base import ClientSideError
+
+
+class Test(unittest.TestCase):
+
+    #Test the creation of ClientSideError
+    def test_ClientSideError(self):
+        error_str = "This is an error message"
+        clientSideError = ClientSideError(error=error_str)
+        self.assertEqual(clientSideError.msg, error_str)
+        self.assertEqual(clientSideError.code, 400)
\ No newline at end of file
diff --git a/orm/services/resource_distributor/rds/tests/controllers/v1/status/test_get_resource_status.py b/orm/services/resource_distributor/rds/tests/controllers/v1/status/test_get_resource_status.py
new file mode 100755
index 00000000..6aa30d4b
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/controllers/v1/status/test_get_resource_status.py
@@ -0,0 +1,45 @@
+"""unittest get resource status."""
+from mock import MagicMock
+
+import rds.controllers.v1.status.get_resource as resource
+from rds.services.model.region_resource_id_status import Model
+from rds.services.model.region_resource_id_status import StatusModel
+from rds.tests.controllers.v1.functional_test import FunctionalTest
+
+
+class EmptyModel(object):
+    """mock class."""
+
+    status = None
+
+    def __init__(self, regions=None):
+        """init function.
+
+        :param regions:
+        """
+        self.regions = regions
+
+
+class GetResourceStatus(FunctionalTest):
+    """tests for get status api."""
+
+    def test_get_not_found_resource(self):
+        """get not found."""
+        resource.regionResourceIdStatus.get_status_by_resource_id = \
+            MagicMock(return_value=EmptyModel())
+        response = self.app.get('/v1/rds/status/resource/1',
+                                expect_errors=True)
+        assert response.status_int == 404
+
+    def test_get_valid_resource(self):
+        """get valid resource."""
+        result = Model(
+            status="200", timestamp="123456789", region="name",
+            transaction_id=5, resource_id="1",
+            ord_notifier="", err_msg="123", err_code="12", operation="create"
+        )
+        status_model = StatusModel(status=[result])
+        resource.regionResourceIdStatus.get_status_by_resource_id = \
+            MagicMock(return_value=status_model)
+        response = self.app.get('/v1/rds/status/resource/1')
+        assert response.status_int == 200
diff --git a/orm/services/resource_distributor/rds/tests/controllers/v1/status/test_resource_status.py b/orm/services/resource_distributor/rds/tests/controllers/v1/status/test_resource_status.py
new file mode 100644
index 00000000..e6edcc89
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/controllers/v1/status/test_resource_status.py
@@ -0,0 +1,64 @@
+"""unittest for post resource."""
+from mock import patch
+
+import rds.controllers.v1.status.resource_status as resource
+from rds.tests.controllers.v1.functional_test import FunctionalTest
+
+
+class PostResourceStatus(FunctionalTest):
+    """tests for only for api handler."""
+
+    @patch.object(resource.regionResourceIdStatus, 'add_status',
+                  return_value=None)
+    def test_valid_Post_status(self, input):
+        """Post json valid json."""
+        response = self.app.post_json('/v1/rds/status/', data)
+        assert response.status_int == 201
+
+    @patch.object(resource.regionResourceIdStatus, 'add_status',
+                  side_effect=resource.InputError("no input", 'request_id'))
+    def test_valid_Post_status_database_error(self, input):
+        """Post valid json return database error."""
+        response = self.app.post_json('/v1/rds/status/', data,
+                                      expect_errors=True)
+        assert response.status_int == 400
+
+    @patch.object(resource.regionResourceIdStatus, 'add_status',
+                  return_value=None)
+    def test_not_valid_json_Post(self, input):
+        """Post valid json return database error."""
+        response = self.app.post_json('/v1/rds/status/', data_not_valid,
+                                      expect_errors=True)
+        assert response.status_int == 400
+
+
+data = {
+    "rds-listener": {
+        "request-id": "0649c5be323f4792",
+        "resource-id": "12fde398643",
+        "resource-type": "customer",
+        "resource-template-version": "1",
+        "resource-template-type": "HOT",
+        "resource-operation": "create",
+        "ord-notifier-id": "1",
+        "region": "dla1",
+        "status": "Success",
+        "error-code": "200",
+        "error-msg": "OK"
+        }
+    }
+
+data_not_valid = {
+    "rds_listener": {
+        "resource_id": "12fde398643",
+        "resource_type": "customer",
+        "resource_template_version": "1",
+        "resource_template_type": "HOT",
+        "resource_operation": "create",
+        "ord_notifier_id": "1",
+        "region": "dla1",
+        "status": "Success",
+        "error_code": "200",
+        "error_msg": "OK"
+        }
+    }
diff --git a/orm/services/resource_distributor/rds/tests/controllers/v1/test_logs.py b/orm/services/resource_distributor/rds/tests/controllers/v1/test_logs.py
new file mode 100755
index 00000000..61cde64f
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/controllers/v1/test_logs.py
@@ -0,0 +1,26 @@
+"""Logs module unittests."""
+import logging
+from rds.tests.controllers.v1.functional_test import FunctionalTest
+from rds.controllers.v1.configuration import root
+from mock import patch
+
+
+class TestLogs(FunctionalTest):
+    """logs tests."""
+
+    def test_change_log_level_fail(self):
+        response = self.app.put('/v1/rds/logs/1')
+        expected_result = {"result": "Fail to change log_level. Reason: The given log level [1] doesn't exist."}
+        self.assertEqual(expected_result, response.json)
+
+    def test_change_log_level_none(self):
+        response = self.app.put('/v1/rds/logs/', expect_errors=True)
+        expexted_result = 'Missing argument: "level"'
+        self.assertEqual(response.json["faultstring"], expexted_result)
+        self.assertEqual(response.status_code, 400)
+
+    def test_change_log_level_success(self):
+        response = self.app.put('/v1/rds/logs/debug')
+        expexted_result = {'result': 'Log level changed to debug.'}
+        self.assertEqual(response.json, expexted_result)
+        self.assertEqual(response.status_code, 201)
diff --git a/orm/services/resource_distributor/rds/tests/functional_test.py b/orm/services/resource_distributor/rds/tests/functional_test.py
new file mode 100644
index 00000000..9684b586
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/functional_test.py
@@ -0,0 +1,140 @@
+"""Base classes for API tests.
+"""
+
+import pecan
+import pecan.testing
+import unittest
+from pecan.testing import load_test_app
+import os
+
+
+class FunctionalTest(unittest.TestCase):
+    """Used for functional tests of Pecan controllers.
+
+    Used in case when you need to test your literal application and its
+    integration with the framework.
+    """
+
+    PATH_PREFIX = ''
+
+    def setUp(self):
+        self.app = load_test_app(os.path.join(
+            os.path.dirname(__file__),
+            'config.py'
+        ))
+
+    def tearDown(self):
+        super(FunctionalTest, self).tearDown()
+        pecan.set_config({}, overwrite=True)
+
+    def put_json(self, path, params, expect_errors=False, headers=None,
+                 extra_environ=None, status=None):
+        """Sends simulated HTTP PUT request to Pecan test app.
+
+        :param path: url path of target service
+        :param params: content for wsgi.input of request
+        :param expect_errors: boolean value whether an error is expected based
+                              on request
+        :param headers: A dictionary of headers to send along with the request
+        :param extra_environ: A dictionary of environ variables to send along
+                              with the request
+        :param status: Expected status code of response
+        """
+        return self.post_json(path=path, params=params,
+                              expect_errors=expect_errors,
+                              headers=headers, extra_environ=extra_environ,
+                              status=status, method="put")
+
+    def post_json(self, path, params, expect_errors=False, headers=None,
+                  method="post", extra_environ=None, status=None):
+        """Sends simulated HTTP POST request to Pecan test app.
+
+        :param path: url path of target service
+        :param params: content for wsgi.input of request
+        :param expect_errors: boolean value whether an error is expected based
+                              on request
+        :param headers: A dictionary of headers to send along with the request
+        :param method: Request method type. Appropriate method function call
+                       should be used rather than passing attribute in.
+        :param extra_environ: A dictionary of environ variables to send along
+                              with the request
+        :param status: Expected status code of response
+        """
+        full_path = self.PATH_PREFIX + path
+        response = getattr(self.app, "%s_json" % method)(
+            str(full_path),
+            params=params,
+            headers=headers,
+            status=status,
+            extra_environ=extra_environ,
+            expect_errors=expect_errors
+        )
+        return response
+
+    def delete(self, path, expect_errors=False, headers=None,
+               extra_environ=None, status=None):
+        """Sends simulated HTTP DELETE request to Pecan test app.
+
+        :param path: url path of target service
+        :param expect_errors: boolean value whether an error is expected based
+                              on request
+        :param headers: A dictionary of headers to send along with the request
+        :param extra_environ: A dictionary of environ variables to send along
+                              with the request
+        :param status: Expected status code of response
+        """
+        full_path = self.PATH_PREFIX + path
+        response = self.app.delete(str(full_path),
+                                   headers=headers,
+                                   status=status,
+                                   extra_environ=extra_environ,
+                                   expect_errors=expect_errors)
+        return response
+
+    def get_json(self, path, expect_errors=False, headers=None,
+                 extra_environ=None, q=None, groupby=None, status=None,
+                 override_params=None, **params):
+        """Sends simulated HTTP GET request to Pecan test app.
+
+        :param path: url path of target service
+        :param expect_errors: boolean value whether an error is expected based
+                              on request
+        :param headers: A dictionary of headers to send along with the request
+        :param extra_environ: A dictionary of environ variables to send along
+                              with the request
+        :param q: list of queries consisting of: field, value, op, and type
+                  keys
+        :param groupby: list of fields to group by
+        :param status: Expected status code of response
+        :param override_params: literally encoded query param string
+        :param params: content for wsgi.input of request
+        """
+        q = q or []
+        groupby = groupby or []
+        full_path = self.PATH_PREFIX + path
+        if override_params:
+            all_params = override_params
+        else:
+            query_params = {'q.field': [],
+                            'q.value': [],
+                            'q.op': [],
+                            'q.type': [],
+                            }
+            for query in q:
+                for name in ['field', 'op', 'value', 'type']:
+                    query_params['q.%s' % name].append(query.get(name, ''))
+            all_params = {}
+            all_params.update(params)
+            if q:
+                all_params.update(query_params)
+            if groupby:
+                all_params.update({'groupby': groupby})
+        response = self.app.get(full_path,
+                                params=all_params,
+                                headers=headers,
+                                extra_environ=extra_environ,
+                                expect_errors=expect_errors,
+                                status=status)
+        if not expect_errors:
+            response = response.json
+        return response
diff --git a/orm/services/resource_distributor/rds/tests/ordupdate/__init__.py b/orm/services/resource_distributor/rds/tests/ordupdate/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/tests/ordupdate/test_ord_notifier.py b/orm/services/resource_distributor/rds/tests/ordupdate/test_ord_notifier.py
new file mode 100755
index 00000000..384ff833
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/ordupdate/test_ord_notifier.py
@@ -0,0 +1,234 @@
+import mock
+from mock import patch
+
+from rds.ordupdate import ord_notifier
+import unittest
+
+
+class MyResponse(object):
+    def __init__(self, status_code, json_result):
+        self.status_code = status_code
+        self.json_result = json_result
+
+    def json(self):
+        return self.json_result
+
+
+def validate_http_post(addr, **kwargs):
+    if addr.startswith('https'):
+        raise ValueError('Received an HTTPS address!')
+    else:
+        return MyResponse(ord_notifier.ACK_CODE, 'OK')
+
+
+def validate_https_post(addr, **kwargs):
+    if not addr.startswith('https'):
+        raise ValueError('Received an HTTPS address!')
+    else:
+        return MyResponse(ord_notifier.ACK_CODE, 'OK')
+
+
+class MyOrdupdate(object):
+    def __init__(self):
+        self.discovery_url = '3'
+        self.discovery_port = 3
+        self.template_type = '3'
+
+
+class MyDefault(object):
+    def __init__(self):
+        self.application_name = 'RDS'
+
+
+class MyConf(object):
+    def __init__(self):
+        self.ordupdate = MyOrdupdate()
+        self.DEFAULT = MyDefault()
+
+    def __call__(self, *args, **kwargs):
+        pass
+
+    def register_group(self, param):
+        pass
+
+    def register_opts(self, param1, param2):
+        pass
+
+
+class MainTest(unittest.TestCase):
+    def setUp(self):
+        super(MainTest, self).setUp()
+        self.addCleanup(mock.patch.stopall)
+        ord_notifier.CONF = MyConf()
+
+    @mock.patch.object(ord_notifier, 'conf')
+    def test_find_correct_ord_get_failure(self, mock_conf):
+        ord_notifier.requests.get = mock.MagicMock(
+            return_value=MyResponse(404, 'test'))
+        result = ord_notifier._find_correct_ord(None, None)
+        self.assertIsNone(result)
+
+    @mock.patch.object(ord_notifier, 'conf')
+    def test_find_correct_ord_bad_response(self, mock_conf):
+        ord_notifier.requests.get = mock.MagicMock(
+            return_value=MyResponse(ord_notifier.OK_CODE,
+                                    {'regions': [{'endpoints': [
+                                        {'publicurl': 'test',
+                                         'type': 'test'}]}]}))
+        result = ord_notifier._find_correct_ord(None, None)
+        self.assertIsNone(result)
+        ord_notifier.requests.get = mock.MagicMock(
+            return_value=MyResponse(ord_notifier.OK_CODE,
+                                    {'regions': [{'endqoints': [
+                                        {'publicurl': 'test',
+                                         'type': 'test'}]}]}))
+        result = ord_notifier._find_correct_ord(None, None)
+        self.assertIsNone(result)
+
+    @mock.patch.object(ord_notifier, 'conf')
+    def test_find_correct_ord_sanity(self, mock_conf):
+        ord_notifier.requests.get = mock.MagicMock(
+            return_value=MyResponse(ord_notifier.OK_CODE,
+                                    {'regions': [{'endpoints': [
+                                        {'publicURL': 'test',
+                                         'type': 'ord'}]}]}))
+        result = ord_notifier._find_correct_ord(None, 'gigi')
+        self.assertEqual('test', result)
+
+    @mock.patch.object(ord_notifier, 'conf')
+    @mock.patch.object(ord_notifier.json, 'dumps')
+    def test_notify_sanity(self, mock_dumps, mock_conf):
+        ord_notifier.requests.post = mock.MagicMock(
+            return_value=MyResponse(ord_notifier.ACK_CODE, None))
+        ord_notifier._notify(*("1",) * 8)
+
+    @mock.patch.object(ord_notifier, 'conf')
+    @mock.patch.object(ord_notifier.json, 'dumps')
+    def test_notify_not_acknowledged(self, mock_dumps, mock_conf):
+        ord_notifier.requests.post = mock.MagicMock(
+            return_value=MyResponse(404, None))
+
+        try:
+            ord_notifier._notify(*("1",) * 8)
+            self.fail('notify() passed successfully'
+                      '(expected NotifyNotAcknowledgedError)')
+        except ord_notifier.NotifyNotAcknowledgedError:
+            pass
+    #    @mock.patch.object(ord_notifier, 'conf')
+ #   def test_notify_sanity(self, mock_conf):
+  #      ord_notifier.requests.post = mock.MagicMock(
+   #         return_value=MyResponse(ord_notifier.ACK_CODE, None))
+    #    ord_notifier._notify(*("1", )*8)
+
+#    @mock.patch.object(ord_notifier, 'conf')
+ #   def test_notify_not_acknowledged(self, mock_conf):
+  #      ord_notifier.requests.post = mock.MagicMock(
+   #         return_value=MyResponse(404, None))
+#
+ #       try:
+  #          ord_notifier._notify(*("1", )*8)
+   #         self.fail('notify() passed successfully'
+    #                  '(expected NotifyNotAcknowledgedError)')
+     #   except ord_notifier.NotifyNotAcknowledgedError:
+      #      pass
+
+    @mock.patch.object(ord_notifier, 'conf')
+    def test_notify_https_disabled_but_received(self, mock_conf):
+        ord_notifier.requests.post = validate_http_post
+        mock_conf.ordupdate.https_enabled = False
+        mock_conf.ordupdate.template_type = 'a'
+        ord_notifier._notify('https://127.0.0.1:1337', *("1", )*7)
+
+    @mock.patch.object(ord_notifier, 'conf')
+    @mock.patch.object(ord_notifier.json, 'dumps')
+    def test_notify_https_enabled_and_no_certificate(self, mock_dumps,
+                                                     mock_conf):
+        ord_notifier.requests.post = validate_https_post
+        mock_conf.ordupdate.https_enabled = True
+        mock_conf.ordupdate.cert_path = ''
+        ord_notifier._notify('https://127.0.0.1:1337', *("1",) * 7)
+
+    @mock.patch.object(ord_notifier, 'conf')
+    @mock.patch.object(ord_notifier.json, 'dumps')
+    def test_notify_https_enabled_and_ssl_error(self, mock_dumps, mock_conf):
+        ord_notifier.requests.post = mock.MagicMock(
+            side_effect=ord_notifier.requests.exceptions.SSLError('test'))
+        mock_conf.ordupdate.https_enabled = True
+        mock_conf.ordupdate.cert_path = ''
+        self.assertRaises(ord_notifier.requests.exceptions.SSLError,
+                          ord_notifier._notify, 'https://127.0.0.1:1337',
+                          *("1",) * 7)
+#    @mock.patch.object(ord_notifier, 'conf')
+ #   def test_notify_https_enabled_and_no_certificate(self, mock_conf):
+  #      ord_notifier.requests.post = validate_https_post
+   #     mock_conf.ordupdate.https_enabled = True
+    #    mock_conf.ordupdate.cert_path = ''
+     #   ord_notifier._notify('https://127.0.0.1:1337', *("1", )*7)
+
+#    @mock.patch.object(ord_notifier, 'conf')
+ #   def test_notify_https_enabled_and_ssl_error(self, mock_conf):
+  #      ord_notifier.requests.post = mock.MagicMock(
+   #         side_effect=ord_notifier.requests.exceptions.SSLError('test'))
+    #    mock_conf.ordupdate.https_enabled = True
+     #   mock_conf.ordupdate.cert_path = ''
+      #  self.assertRaises(ord_notifier.requests.exceptions.SSLError,
+       #                   ord_notifier._notify, 'https://127.0.0.1:1337',
+        #                  *("1", )*7)
+
+    @patch.object(ord_notifier.audit, 'audit')
+    @patch.object(ord_notifier, 'regionResourceIdStatus')
+    @mock.patch.object(ord_notifier, 'conf')
+    def test_main_ord_not_found(self, mock_audit, mock_region, mock_conf):
+        ord_notifier.requests.get = mock.MagicMock(
+            return_value=MyResponse(404, 'test'))
+        try:
+            ord_notifier.notify_ord('test', '1', '2', '3', '4', '5', '6',
+                                    'gigi', '7', '')
+            self.fail('notify_ord() passed successfully (expected OrdNotFoundError)')
+        except ord_notifier.OrdNotFoundError as e:
+            self.assertEquals(e.message, 'ORD of LCP %s not found' % (
+                'gigi', ))
+
+    #@patch.object(ord_notifier.audit, 'audit')
+    #@patch.object(ord_notifier, 'regionResourceIdStatus')
+  #  @mock.patch.object(ord_notifier, 'conf')
+   # @mock.patch.object(ord_notifier.json, 'dumps')
+    #def test_main_sanity(self, mock_dumps, mock_conf, mock_region, mock_audit):
+     #   ord_notifier.requests.get = mock.MagicMock(
+      #      return_value=MyResponse(ord_notifier.OK_CODE,
+       #                             {ord_notifier.LCP_ID: 'gigi',
+        #                             ord_notifier.ORD_URL: 'test'}))
+   #     ord_notifier.requests.post = mock.MagicMock(
+    #        return_value=MyResponse(ord_notifier.ACK_CODE, None))
+
+     #   ord_notifier.notify_ord('test', '1', '2', '3', '4', '5', '6', '7',
+      #                          '8', '')
+  #  @patch.object(ord_notifier.audit, 'audit')
+ #   @patch.object(ord_notifier, 'regionResourceIdStatus')
+#    @mock.patch.object(ord_notifier, 'conf')
+#    def test_main_sanity(self, mock_audit, mock_region, mock_conf):
+ #       ord_notifier.requests.get = mock.MagicMock(
+  #          return_value=MyResponse(ord_notifier.OK_CODE,
+   #                                 {'regions': [{'endpoints': [
+    #                                    {'publicurl': 'test',
+     #                                    'type': 'ord'}]}]}))
+      #  ord_notifier.requests.post = mock.MagicMock(
+       #     return_value=MyResponse(ord_notifier.ACK_CODE, None))
+
+        #ord_notifier.notify_ord('test', '1', '2', '3', '4', '5', '6', '7',
+         #                       '8', '')
+
+    @patch.object(ord_notifier.audit, 'audit')
+    @patch.object(ord_notifier, 'regionResourceIdStatus')
+    @mock.patch.object(ord_notifier, 'conf')
+    def test_main_error(self, mock_audit, mock_region, mock_conf):
+        ord_notifier.requests.get = mock.MagicMock(
+            return_value=MyResponse(ord_notifier.OK_CODE,
+                                    {'regions': [{'endpoints': [
+                                        {'publicurl': 'test',
+                                         'type': 'ord'}]}]}))
+        ord_notifier.requests.post = mock.MagicMock(
+            return_value=MyResponse(ord_notifier.ACK_CODE, None))
+
+        ord_notifier.notify_ord('test', '1', '2', '3', '4', '5', '6', '7',
+                                '8', '9', '10', True)
diff --git a/orm/services/resource_distributor/rds/tests/services/__init__.py b/orm/services/resource_distributor/rds/tests/services/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/tests/services/model/__init__.py b/orm/services/resource_distributor/rds/tests/services/model/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/tests/services/model/test_region_resource_id_status.py b/orm/services/resource_distributor/rds/tests/services/model/test_region_resource_id_status.py
new file mode 100755
index 00000000..ae3be098
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/services/model/test_region_resource_id_status.py
@@ -0,0 +1,44 @@
+import unittest
+
+from rds.services.model import region_resource_id_status
+
+
+class TestModel(unittest.TestCase):
+    def test_model_as_dict(self):
+        model = region_resource_id_status.Model(1, 2, 3, 4, 5, 6, 7, 8,
+                                                'create')
+        expected_dict = {
+            'timestamp': 1,
+            'region': 2,
+            'status': 3,
+            'ord_transaction_id': 4,
+            'resource_id': 5,
+            'ord_notifier_id': 6,
+            'error_msg': 7,
+            'error_code': 8,
+            'operation': 'create',
+            'resource_extra_metadata': None
+        }
+
+        test_dict = model.as_dict()
+        self.assertEqual(test_dict, expected_dict)
+
+
+class TestStatusModel(unittest.TestCase):
+    def test_get_aggregated_status_error(self):
+        model = region_resource_id_status.Model(1, 2, 'Error', 4, 5, 6, 7, 8,
+                                                'create')
+        status_model = region_resource_id_status.StatusModel([model])
+        self.assertEqual(status_model.status, 'Error')
+
+    def test_get_aggregated_status_pending(self):
+        model = region_resource_id_status.Model(1, 2, 'Submitted', 4, 5, 6, 7,
+                                                8, 'create')
+        status_model = region_resource_id_status.StatusModel([model])
+        self.assertEqual(status_model.status, 'Pending')
+
+    def test_get_aggregated_status_success(self):
+        model = region_resource_id_status.Model(1, 2, 'Success', 4, 5, 6, 7, 8,
+                                                'create')
+        status_model = region_resource_id_status.StatusModel([model])
+        self.assertEqual(status_model.status, 'Success')
diff --git a/orm/services/resource_distributor/rds/tests/services/test_create_resource.py b/orm/services/resource_distributor/rds/tests/services/test_create_resource.py
new file mode 100755
index 00000000..9a02c5fd
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/services/test_create_resource.py
@@ -0,0 +1,671 @@
+"""create resource unittest module."""
+import unittest
+
+from mock import patch
+
+from rds.services import resource as ResourceService
+from rds.services.model.region_resource_id_status import Model, ResourceMetaData
+from rds.services.model.region_resource_id_status import StatusModel
+
+result = Model(
+    status="success", timestamp="123456789", region="name",
+    transaction_id=5, resource_id="1",
+    ord_notifier="", err_msg="123", err_code="12", operation="create",
+    resource_extra_metadata=[ResourceMetaData(checksum=1,virtual_size=2,size=3)]
+)
+
+uuid = "uuid-12345"
+
+
+class InputData(object):
+    """mock class."""
+
+    def __init__(self, resource_id, resource_type,
+                 targets, operation="create",
+                 transaction_id="", model="",
+                 external_transaction_id=""):
+        """init function.
+
+        :param resource_id:
+        :param resource_type:
+        :param targets:
+        :param operation:
+        :param transaction_id:
+        :param model:
+        :param external_transaction_id:
+        """
+        self.resource_id = resource_id
+        self.targets = targets
+        self.resource_type = resource_type
+        self.operation = operation
+        self.transaction_id = transaction_id
+        self.model = model
+        self.external_transaction_id = external_transaction_id
+
+
+class SoT(object):
+    """mock class."""
+
+    def save_resource_to_sot(*args):
+        """mock function."""
+        return None
+
+    def delete_resource_from_sot(*args):
+        """mock function."""
+        return None
+
+
+class CreateResource(unittest.TestCase):
+    """create resource test."""
+
+    # @patch.object(ResourceService.regionResourceIdStatus,
+    #               'get_regions_by_status_resource_id',
+    #               return_value=StatusModel(status=[result]))
+    # def test_create_customer_conflict_rise(self, result):
+    #     """check raise conflict."""
+    #     with self.assertRaises(ResourceService.ConflictValue):
+    #         ResourceService.main(jsondata, uuid, 'customer', 'create')
+
+    # @patch.object(ResourceService, '_upload_to_sot', return_value=[1, 2])
+    # @patch.object(ResourceService, '_create_data_to_sot', return_value=[1, 2])
+    # @patch.object(ResourceService.regionResourceIdStatus,
+    #               'get_regions_by_status_resource_id', return_value=None)
+    # @patch.object(ResourceService.uuid_utils,
+    #               'get_random_uuid', return_value='uuid-gen-123456')
+    # def test_create_customer_valid_uuid_gen(self, tranid, result,
+    #                                         sotdata, sotupload):
+    #     """check flow with uuid gen."""
+    #     status_model = StatusModel(status=[result])
+    #     status_model.regions = None
+    #     result.return_value = status_model
+    #     resource_id = ResourceService.main(jsondata, uuid,
+    #                                        'customer', 'create')
+    #     self.assertEqual(resource_id, jsondata['uuid'])
+
+    @patch.object(ResourceService.regionResourceIdStatus, 'add_status',
+                  return_value=None)
+    @patch.object(ResourceService, '_upload_to_sot', return_value=[1, 2])
+    @patch.object(ResourceService, '_create_data_to_sot', return_value=[1, 2])
+    @patch.object(ResourceService.regionResourceIdStatus,
+                  'get_regions_by_status_resource_id', return_value=None)
+    @patch.object(ResourceService.uuid_utils, 'get_random_uuid',
+                  side_effect=Exception("uuid general exception"))
+    def test_create_customer_not_valid_uuid_gen(self, tranid, result, sotdata,
+                                                sotupload, database):
+        """uuid gen raise an error."""
+        status_model = StatusModel(status=[result])
+        status_model.regions = None
+        result.return_value = status_model
+        with self.assertRaises(ResourceService.ErrorMesage):
+            resource_id = ResourceService.main(jsondata, uuid,
+                                               'customer', 'create')
+
+    # @patch.object(ResourceService.regionResourceIdStatus, 'add_status',
+    #               return_value=None)
+    # @patch.object(ResourceService.yaml_customer_builder, 'yamlbuilder',
+    #               return_value=["anystring"])
+    # @patch.object(ResourceService, '_upload_to_sot', return_value=[1, 2])
+    # @patch.object(ResourceService.regionResourceIdStatus,
+    #               'get_regions_by_status_resource_id', return_value=None)
+    # @patch.object(ResourceService.uuid_utils, 'get_random_uuid',
+    #               return_value='uuid-gen-123456')
+    # def test_create_customer_sot_data(self, tranid, result, sotupload,
+    #                                   yamlbuilder, database):
+    #     """check sot data build for customer."""
+    #     status_model = StatusModel(status=[result])
+    #     status_model.regions = None
+    #     result.return_value = status_model
+    #     resource_id = ResourceService.main(jsondata, uuid,
+    #                                        'customer', 'create')
+
+    # @patch.object(ResourceService.regionResourceIdStatus, 'add_status',
+    #               return_value=None)
+    # @patch.object(ResourceService.yaml_customer_builder, 'yamlbuilder',
+    #               return_value=["anystring"])
+    # @patch.object(ResourceService.sot_factory, 'get_sot',
+    #               return_value=SoT())
+    # @patch.object(ResourceService.regionResourceIdStatus,
+    #               'get_regions_by_status_resource_id', return_value=None)
+    # @patch.object(ResourceService.uuid_utils, 'get_random_uuid',
+    #               return_value='uuid-gen-123456')
+    # def test_create_resource_upload_sot(self, tranid, result, sotupload,
+    #                                     yamlbuilder, database):
+    #     """check upload to sot."""
+    #     status_model = StatusModel(status=[result])
+    #     status_model.regions = None
+    #     result.return_value = status_model
+    #     resource_id = ResourceService.main(jsondata, uuid,
+    #                                        'customer', 'create')
+
+    # @patch.object(ResourceService.regionResourceIdStatus, 'add_status',
+    #               return_value=None)
+    # @patch.object(ResourceService.yaml_flavor_bulder, 'yamlbuilder',
+    #               return_value=["anystring"])
+    # @patch.object(ResourceService.sot_factory, 'get_sot', return_value=SoT())
+    # @patch.object(ResourceService.regionResourceIdStatus,
+    #               'get_regions_by_status_resource_id', return_value=None)
+    # @patch.object(ResourceService.uuid_utils,
+    #               'get_random_uuid', return_value='uuid-gen-123456')
+    # def test_create_flavor_sot_data(self, tranid, result, sotupload,
+    #                                 yamlbuilder, database):
+    #     """check flavor data create."""
+    #     status_model = StatusModel(status=[result])
+    #     status_model.regions = None
+    #     result.return_value = status_model
+    #     resource_id = ResourceService.main(flavorjsondata, uuid,
+    #                                        'flavor', 'create')
+
+    @patch.object(ResourceService.regionResourceIdStatus,
+                  'add_status', return_value=None)
+    @patch.object(ResourceService.yaml_customer_builder,
+                  'yamlbuilder', return_value=["anystring"])
+    @patch.object(ResourceService.sot_factory, 'get_sot', return_value=SoT())
+    @patch.object(ResourceService.regionResourceIdStatus,
+                  'get_regions_by_status_resource_id', return_value=None)
+    @patch.object(ResourceService.uuid_utils, 'get_random_uuid',
+                  return_value='uuid-gen-123456')
+    def test_create_flavor_sot_data_check(self, tranid, result, sotupload,
+                                          yamlbuilder, database):
+        """check list creating."""
+        input_data = InputData(
+            transaction_id='497ab942-1ac0-11e6-82f3-005056a5129b',
+            resource_type='customer',
+            resource_id='1e24981a-fa51-11e5-86aa-5e5517507c66',
+            operation='create',
+            targets=targets
+        )
+        status_model = StatusModel(status=[result])
+        status_model.regions = None
+        result.return_value = status_model
+        result = ResourceService._create_data_to_sot(input_data)
+        self.assertEqual(result, target_list)
+
+    # @patch.object(ResourceService.regionResourceIdStatus,
+    #               'get_regions_by_status_resource_id',
+    #               return_value=StatusModel(status=[result]))
+    # def test_delete_flavor_conflict(self, databasemock):
+    #     """check delete flavor with conflict."""
+    #     with self.assertRaises(ResourceService.ConflictValue):
+    #         ResourceService.main(flavorjsondata, uuid, 'flavor', 'delete')
+
+    @patch.object(ResourceService.regionResourceIdStatus,
+                  'add_status', return_value=None)
+    @patch.object(ResourceService, '_upload_to_sot', return_value=[1, 2])
+    @patch.object(ResourceService, '_create_data_to_sot', return_value=[1, 2])
+    @patch.object(ResourceService.regionResourceIdStatus,
+                  'get_regions_by_status_resource_id', return_value=None)
+    @patch.object(ResourceService.uuid_utils, 'get_random_uuid',
+                  side_effect=Exception("uuid general exception"))
+    def test_delete_flavor_not_valid_uuid_gen(self, tranid, result, sotdata,
+                                              sotupload, database):
+        """delete flavor uuid gen raise an error."""
+        status_model = StatusModel(status=[result])
+        status_model.regions = None
+        result.return_value = status_model
+        with self.assertRaises(ResourceService.ErrorMesage):
+            resource_id = ResourceService.main(flavorjsondata, uuid,
+                                               'flavor', 'delete')
+
+    # @patch.object(ResourceService.yaml_flavor_bulder,
+    #               'yamlbuilder', return_value=["anystring"])
+    # @patch.object(ResourceService.regionResourceIdStatus,
+    #               'add_status', return_value=None)
+    # # @patch.object(ResourceService, '_delete_from_sot', return_value = None)
+    # @patch.object(ResourceService.sot_factory, 'get_sot', return_value=SoT())
+    # @patch.object(ResourceService.regionResourceIdStatus,
+    #               'get_regions_by_status_resource_id', return_value=None)
+    # @patch.object(ResourceService.uuid_utils, 'get_random_uuid',
+    #               return_value='uuid-gen-123456')
+    # def test_delete_flavor_not_valid_all(self, tranid, result,
+    #                                      sotdata, sotupload, yaml_mock):
+    #     """delete flavor uuid gen raise an error."""
+    #     status_model = StatusModel(status=[result])
+    #     status_model.regions = None
+    #     result.return_value = status_model
+    #     resource_id = ResourceService.main(flavorjsondata, uuid,
+    #                                        'flavor', 'delete')
+    #     self.assertEqual('uuid-uuid-uuid-uuid', resource_id)
+
+
+    # @patch.object(ResourceService.regionResourceIdStatus, 'add_status',
+    #               return_value=None)
+    # @patch.object(ResourceService.yaml_customer_builder, 'yamlbuilder',
+    #               return_value=["anystring"])
+    # @patch.object(ResourceService.sot_factory, 'get_sot',
+    #               return_value=SoT())
+    # @patch.object(ResourceService.regionResourceIdStatus,
+    #               'get_regions_by_status_resource_id', return_value=None)
+    # @patch.object(ResourceService.uuid_utils, 'get_random_uuid',
+    #               return_value='uuid-gen-123456')
+    # def test_create_resource_up2load_sot_put(self, moc_get_random_uuid,
+    #                                          moc_get_regions_by_status_resource_id,
+    #                                          moc_get_sot,
+    #                                          moc_yamlbuilder, moc_add_status):
+    #     """check upload to sot."""
+    #     status_model = StatusModel(status=[result])
+    #     status_model.regions = None
+    #     moc_get_regions_by_status_resource_id.return_value = status_model
+    #     resource_id = ResourceService.main(jsondata, uuid,
+    #                                        'customer', 'modify')
+
+
+    # @patch.object(ResourceService.regionResourceIdStatus, 'add_status',
+    #               return_value=None)
+    # @patch.object(ResourceService.yaml_image_builder, 'yamlbuilder',
+    #               return_value=["anystring"])
+    # @patch.object(ResourceService.sot_factory, 'get_sot',
+    #               return_value=SoT())
+    # @patch.object(ResourceService.regionResourceIdStatus,
+    #               'get_regions_by_status_resource_id', return_value=None)
+    # @patch.object(ResourceService.uuid_utils, 'get_random_uuid',
+    #               return_value='uuid-gen-123456')
+    # def test_create_resource_up2load_sot_put_image(self, moc_get_random_uuid,
+    #                                          moc_get_regions_by_status_resource_id,
+    #                                          moc_get_sot,
+    #                                          moc_yamlbuilder, moc_add_status):
+    #     """check upload to sot."""
+    #     status_model = StatusModel(status=[result])
+    #     status_model.regions = None
+    #     moc_get_regions_by_status_resource_id.return_value = status_model
+    #     resource_id = ResourceService.main(json_data_image, uuid,
+    #                                        'image', 'modify')
+
+
+    def test_get_inputs_from_resource_type(self):
+        input_data = ResourceService._get_inputs_from_resource_type(jsondata,
+                                                                    'customer',
+                                                                    'uuid-12345')
+        assert ( input_data.__dict__ == input_data_resource )
+
+
+    def test_get_inputs_from_resource_type_image(self):
+        input_data = ResourceService._get_inputs_from_resource_type(json_data_image,
+                                                                      'image',
+                                                                      'uuid-12345')
+        assert (input_data.__dict__ == expected_image_input_data)
+
+
+    def test_unknown_resource_type(self):
+        with self.assertRaises(ResourceService.ErrorMesage):
+            input_data = ResourceService._get_inputs_from_resource_type(jsondata,
+                                                                        'unknown',
+                                                                        'uuid-12345')
+
+
+
+jsondata = {
+    "uuid": "1e24981a-fa51-11e5-86aa-5e5517507c66", "default_region":
+        {
+            "quotas":
+                [
+                    {
+                        "compute": {
+                            "instances": "10",
+                            "ram": "10",
+                            "keypairs": "10",
+                            "injected_files": "10"
+                     },
+                        "storage": {"gigabytes": "10",
+                                    "snapshots": "10",
+                                    "volumes": "10"
+                                    },
+                        "network":
+                             {
+                                 "router": "10",
+                                 "floatingip": "10",
+                                 "port": "10",
+                                 "network": "10",
+                                 "subnet": "10"
+                             }}],
+            "users":
+                [
+                    {
+                        "id": "userId1zzzz",
+                        "roles":
+                            [
+                                "adminzzzz",
+                                "otherzzzzz"
+                            ]
+                    },
+                    {"id": "userId2zzz",
+                     "roles":
+                         [
+                             "storagezzzzz"
+                         ]
+                     }
+                ],
+            "name": "regionnamezzzz",
+            "action": "delete",
+        },
+    "description": "this is a description",
+    "enabled": 1,
+    "regions":
+        [
+            {
+                "quotas":
+                    [],
+                "users":
+                    [
+                        {
+                            "id": "userId1",
+                            "roles":
+                                [
+                                    "admin",
+                                    "other"
+                                ]
+                        },
+                        {"id": "userId2",
+                         "roles":
+                             [
+                                 "storage"
+                             ]
+                         }
+                    ],
+                "name": "regionname",
+                "action": "create"
+            },
+            {
+                "quotas":
+                    [
+                        {
+                            "compute":
+                                {
+                                    "instances": "10",
+                                    "ram": "10",
+                                    "keypairs": "10",
+                                    "injected_files": "10"
+                                },
+                            "storage":
+                                {
+                                    "gigabytes": "10",
+                                    "snapshots": "10",
+                                    "volumes": "10"
+                                },
+                            "network":
+                                {
+                                    "router": "10",
+                                    "floatingip": "10",
+                                    "port": "10",
+                                    "network": "10",
+                                    "subnet": "10"
+                                }
+                        }
+                    ],
+                "users":
+                    [],
+                "name": "regionnametest",
+                "action": "delete"
+            }
+        ],
+    "name": "welcome_man"
+}
+
+flavorjsondata = {"status": "complete", "profile": "P2", "regions":
+    [{"name": "North1","action": "create"}, {"name": "North2","action": "delete"
+                }], "description": "First flavor for AMAR",
+                  "ram": 64, "visibility": "public", "extra_specs": {
+                "key1": "value1", "key2": "value2", "keyx": "valuex"},
+                  "vcpus": 2,
+            "swap": 0, "tenants": [{"tenant_id": "abcd-efgh-ijkl-4567"},
+                                  {"tenant_id": "abcd-efgh-ijkl-4567"
+                }],
+                  "disk": 512, "empheral": 1, "id": "uuid-uuid-uuid-uuid",
+                  "name": "Nice Flavor"}
+
+json_data = {'uuid': '1e24981a-fa51-11e5-86aa-5e5517507c66',
+              'default_region': {'users': [{'id': 'userId1zzzz',
+                                            'roles': ['adminzzzz',
+                                                      'otherzzzzz'
+                                                      ]
+                                            },
+                                           {'id': 'userId2zzz',
+                                            'roles': ['storagezzzzz'
+                                                      ]
+                                            }
+                                           ],
+                                 'name': 'regionnamezzzz',
+                                 "action": "create",
+                                 'quotas': [{'storage': {
+                                     'gigabytes': '111',
+                                     'volumes': '111',
+                                     'snapshots': '111'},
+                                     'compute': {'instances': '111',
+                                                 'ram': '111',
+                                                 'keypairs': '111',
+                                                 'injected_files': '111'
+                                                 },
+                                     'network': {'port': '111',
+                                                 'router': '111',
+                                                 'subnet': '111',
+                                                 'network': '111',
+                                                 'floatingip': '111'}}]},
+              'description': 'this is a description', 'enabled': 1,
+              'regions': [{'users': [{'id': 'userId1',
+                                      'roles': ['admin', 'other']},
+                                     {'id': 'userId2',
+                                      'roles': ['storage']}],
+                           'name': 'regionname', "action": "delete",
+                           'quotas': []},
+                          {'users': [], 'name': 'regionnametest',
+                           "action": "modify",
+                           'quotas': [{'storage': {'gigabytes': '10',
+                                                   'volumes': '10',
+                                                   'snapshots': '10'},
+                                       'compute': {'instances': '10',
+                                                   'ram': '10',
+                                                   'keypairs': '10',
+                                                   'injected_files': '10'},
+                                       'network': {'port': '10',
+                                                   'router': '10',
+                                                   'subnet': '10',
+                                                   'network': '10',
+                                                   'floatingip': '10'}}]}],
+              'name': 'welcome_man'}
+
+
+target_list = [{'template_data': ['anystring'],
+                'operation': 'create',
+                'resource_name': '1e24981a-fa51-11e5-86aa-5e5517507c66',
+                'region_id': 'regionname', 'resource_type': u'customer'},
+               {'template_data': 'delete', 'operation': 'delete',
+                'resource_name': '1e24981a-fa51-11e5-86aa-5e5517507c66',
+                'region_id': 'regionnametest', 'resource_type': u'customer'}]
+
+targets = [{'users': [{'id': 'userId1', 'roles': ['admin', 'other']},
+                      {'id': 'userId2', 'roles': ['storage']}],
+            'name': 'regionname', "action": "create", 'quotas': []},
+           {'users': [],
+            'name': 'regionnametest',
+            "action": "delete",
+            'quotas': [{'storage': {'gigabytes': '10', 'volumes': '10',
+                                    'snapshots': '10'},
+                        'compute': {'instances': '10', 'ram': '10',
+                                    'keypairs': '10', 'injected_files': '10'},
+                        'network': {'port': '10',
+                                    'router': '10',
+                                    'subnet': '10',
+                                    'network': '10',
+                                    'floatingip': '10'}}]}]
+
+json_data_image = {
+   "internal_id":1,
+   "id":"uuu1id12-uuid-uuid-uuid",
+   "name":"Ubuntu",
+   "enabled": 1,
+   "protected": 1,
+   "url": "https://mirrors.it.att.com/images/image-name",
+   "visibility": "public",
+   "disk_format": "raw",
+   "container_format": "bare",
+   "min_disk":2,
+   "min_ram":0,
+   "regions":[
+      {
+         "name":"North",
+         "type":"single",
+         "action": "delete",
+         "image_internal_id":1
+      },
+      {
+         "name":"North",
+         "action": "create",
+         "type":"single",
+         "image_internal_id":1
+      }
+   ],
+   "image_properties":[
+      {
+         "key_name":"Key1",
+         "key_value":"Key1.value",
+         "image_internal_id":1
+      },
+      {
+         "key_name":"Key2",
+         "key_value":"Key2.value",
+         "image_internal_id":1
+      }
+   ],
+   "image_tenant":[
+      {
+         "tenant_id":"abcd-efgh-ijkl-4567",
+         "image_internal_id":1
+      },
+      {
+         "tenant_id":"abcd-efgh-ijkl-4567",
+         "image_internal_id":1
+      }
+   ],
+   "image_tags":[
+      {
+         "tag":"abcd-efgh-ijkl-4567",
+         "image_internal_id":1
+      },
+      {
+         "tag":"abcd-efgh-ijkl-4567",
+         "image_internal_id":1
+      }
+   ],
+   "status":"complete",
+}
+
+input_data_resource = {'resource_id': '1e24981a-fa51-11e5-86aa-5e5517507c66',
+                       'targets': [
+                           {'action': 'create', 'quotas': [],
+                            'name': 'regionname',
+                            'users': [
+                                {'id': 'userId1', 'roles': ['admin', 'other']},
+                                {'id': 'userId2', 'roles': ['storage']}]},
+                           {'action': 'delete',
+                            'quotas': [{
+                                'storage': {
+                                    'gigabytes': '10',
+                                    'volumes': '10',
+                                    'snapshots': '10'},
+                                'compute': {
+                                    'instances': '10',
+                                    'ram': '10',
+                                    'keypairs': '10',
+                                    'injected_files': '10'},
+                                'network': {
+                                    'subnet': '10',
+                                    'router': '10',
+                                    'port': '10',
+                                    'network': '10',
+                                    'floatingip': '10'}}],
+                            'name': 'regionnametest',
+                            'users': []}],
+                       'resource_type': 'customer',
+                       'model': {
+                           'uuid': '1e24981a-fa51-11e5-86aa-5e5517507c66',
+                           'default_region': {'action': 'delete',
+                                              'quotas': [{'storage': {
+                                                  'gigabytes': '10',
+                                                  'volumes': '10',
+                                                  'snapshots': '10'},
+                                                  'compute': {
+                                                      'instances': '10',
+                                                      'ram': '10',
+                                                      'keypairs': '10',
+                                                      'injected_files': '10'},
+                                                  'network': {
+                                                      'subnet': '10',
+                                                      'router': '10',
+                                                      'port': '10',
+                                                      'network': '10',
+                                                      'floatingip': '10'}}],
+                                              'name': 'regionnamezzzz',
+                                              'users': [
+                                                  {'id': 'userId1zzzz',
+                                                   'roles': ['adminzzzz',
+                                                             'otherzzzzz']},
+                                                  {'id': 'userId2zzz',
+                                                   'roles': [
+                                                       'storagezzzzz']}]},
+                           'description': 'this is a description',
+                           'enabled': 1, 'regions': [
+                               {'action': 'create', 'quotas': [],
+                                'name': 'regionname',
+                                'users': [{'id': 'userId1',
+                                           'roles': ['admin', 'other']},
+                                          {'id': 'userId2',
+                                           'roles': ['storage']}]},
+                               {'action': 'delete',
+                                'quotas': [{'storage': {'gigabytes': '10',
+                                                        'volumes': '10',
+                                                        'snapshots': '10'},
+                                            'compute': {'instances': '10',
+                                                        'ram': '10',
+                                                        'keypairs': '10',
+                                                        'injected_files': '10'},
+                                            'network': {'subnet': '10',
+                                                        'router': '10',
+                                                        'port': '10',
+                                                        'network': '10',
+                                                        'floatingip': '10'}}],
+                                'name': 'regionnametest', 'users': []}],
+                           'name': 'welcome_man'},
+                       'external_transaction_id': 'uuid-12345',
+                       'operation': 'create',
+                       'transaction_id': ''}
+
+expected_image_input_data = {'resource_id': 'uuu1id12-uuid-uuid-uuid',
+                             'targets': [
+                                 {'action': 'delete', 'image_internal_id': 1,
+                                  'type': 'single', 'name': 'North'},
+                                 {'action': 'create', 'image_internal_id': 1,
+                                  'type': 'single', 'name': 'North'}],
+                             'resource_type': 'image',
+                             'model': {'status': 'complete', 'name': 'Ubuntu',
+                                       'internal_id': 1,
+                                       'url': 'https://mirrors.it.att.com/images/image-name',
+                                       'disk_format': 'raw', 'min_ram': 0,
+                                       'enabled': 1, 'visibility': 'public',
+                                       'image_tags': [{'image_internal_id': 1,
+                                                       'tag': 'abcd-efgh-ijkl-4567'},
+                                                      {'image_internal_id': 1,
+                                                       'tag': 'abcd-efgh-ijkl-4567'}],
+                                       'regions': [{'action': 'delete',
+                                                    'image_internal_id': 1,
+                                                    'type': 'single',
+                                                    'name': 'North'},
+                                                   {'action': 'create',
+                                                    'image_internal_id': 1,
+                                                    'type': 'single',
+                                                    'name': 'North'}],
+                                       'image_properties': [
+                                           {'key_name': 'Key1',
+                                            'key_value': 'Key1.value',
+                                            'image_internal_id': 1},
+                                           {'key_name': 'Key2',
+                                            'key_value': 'Key2.value',
+                                            'image_internal_id': 1}],
+                                       'protected': 1, 'image_tenant': [
+                                     {'tenant_id': 'abcd-efgh-ijkl-4567',
+                                      'image_internal_id': 1},
+                                     {'tenant_id': 'abcd-efgh-ijkl-4567',
+                                      'image_internal_id': 1}],
+                                       'container_format': 'bare',
+                                       'min_disk': 2,
+                                       'id': 'uuu1id12-uuid-uuid-uuid'},
+                             'external_transaction_id': 'uuid-12345',
+                             'operation': 'create', 'transaction_id': ''}
diff --git a/orm/services/resource_distributor/rds/tests/services/test_customer_yaml.py b/orm/services/resource_distributor/rds/tests/services/test_customer_yaml.py
new file mode 100755
index 00000000..3ca34827
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/services/test_customer_yaml.py
@@ -0,0 +1,293 @@
+"""unittests create customer yaml module."""
+import unittest
+
+import yaml
+from mock import patch
+
+from rds.services import yaml_customer_builder as CustomerBuild
+
+alldata = {
+    'uuid': '1e24981a-fa51-11e5-86aa-5e5517507c66',
+    'metadata': [{'my_server_name': 'Apache1'},{'ocx_cust': '123456889'}],
+    'default_region': {'users': [{'id': 'userId1zzzz',
+                                  'roles': ['adminzzzz', 'otherzzzzz']},
+                                 {'id': 'userId2zzz',
+                                  'roles': ['storagezzzzz']}],
+                       'name': 'regionnamezzzz',
+                       'quotas': [{'storage': {'gigabytes': '111',
+                                               'volumes': '111',
+                                               'snapshots': '111'},
+                                   'compute': {'instances': '111',
+                                               'ram': '111',
+                                               'keypairs': '111',
+                                               'injected_files': '111'},
+                                   'network': {'port': '111',
+                                               'router': '111',
+                                               'subnet': '111',
+                                               'network': '111',
+                                               'floatingip': '111'}}]},
+    'description': 'this is a description', 'enabled': 1,
+    'regions': [{'users': [{'id': 'userId1', 'roles': ['admin', 'other']},
+                           {'id': 'userId2', 'roles': ['storage']}],
+                 'name': 'regionname', 'quotas': []},
+                {'users': [], 'name': 'regionnametest',
+                 'quotas': [{'storage': {'gigabytes': '10',
+                                         'volumes': '10',
+                                         'snapshots': '10'},
+                             'compute': {'instances': '10', 'ram': '10',
+                                         'keypairs': '10',
+                                         'injected_files': '10'},
+                             'network': {'port': '10', 'router': '10',
+                                         'subnet': '10', 'network': '10',
+                                         'floatingip': '10'}}]}],
+    'name': 'welcome_man'}
+
+region_quotas = {'users':
+                 [],
+                 'name': 'regionnametest',
+                 'quotas': [{'storage': {'gigabytes': '10',
+                                         'volumes': '10', 'snapshots': '10'},
+                             'compute': {'instances': '10', 'ram': '10',
+                                         'keypairs': '10',
+                                         'injected_files': '10'},
+                             'network': {'port': '10',
+                                         'router': '10',
+                                         'subnet': '10',
+                                         'network': '10',
+                                         'floatingip': '10'}}]}
+
+region_users = {'users': [{'id': 'userId1', 'roles': ['admin', 'other']},
+                          {'id': 'userId2', 'roles': ['storage']}],
+                'name': 'regionname', 'quotas': []}
+
+full_region = {'users': [{'id': 'userId1', 'roles': ['admin', 'other']},
+                         {'id': 'userId2', 'roles': ['storage']}],
+               'name': 'regionnametest',
+               'quotas': [{'storage': {'gigabytes': '10',
+                                       'volumes': '10', 'snapshots': '10'},
+                           'compute': {'instances': '10', 'ram': '10',
+                                       'keypairs': '10',
+                                       'injected_files': '10'},
+                           'network': {'port': '10', 'router': '10',
+                                       'subnet': '10',
+                                       'network': '10', 'floatingip': '10'}}]}
+
+
+fullyaml_with_users_quotasoff = \
+    'heat_template_version: 2015-1-2\n\ndescription: yaml file for region - ' \
+    'regionname\n\nresources:\n  tenant_metadata:\n' \
+    '    properties:\n      METADATA:\n        metadata:\n          my_server_name: Apache1\n      ' \
+    '    ocx_cust: 123456889\n      TENANT_ID: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n' \
+    '    type: OS::Keystone::Metadata\n\n      \n  userId1:\n    ' \
+    'properties:\n      groups:\n      - {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66_userId1_group}\n      ' \
+    'name: userId1\n      roles:\n      - project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n' \
+    '        role: admin\n      - project: {get_resource: ' \
+    '1e24981a-fa51-11e5-86aa-5e5517507c66}\n        role: other\n    type: OS::Keystone::User\n\n' \
+    '      \n  userId2:\n    properties:\n      groups:\n      - ' \
+    '{get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66_userId2_group}\n      name: userId2\n      roles:\n      ' \
+    '- project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n        role: storage\n' \
+    '    type: OS::Keystone::User\n\n      \n  1e24981a-fa51-11e5-86aa-5e5517507c66:\n    properties:\n      ' \
+    'description: this is a description\n      enabled: true\n      ' \
+    'name: welcome_man\n      project_id: 1e24981a-fa51-11e5-86aa-5e5517507c66\n    type: OS::Keystone::Project2\n\n      ' \
+    '\n  1e24981a-fa51-11e5-86aa-5e5517507c66_userId1_group:\n    properties:\n      description: dummy\n      ' \
+    'domain: default\n      name: 1e24981a-fa51-11e5-86aa-5e5517507c66_userId1_group\n      roles:\n      - ' \
+    'project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n        role: {get_resource: other}\n    ' \
+    'type: OS::Keystone::Group\n\n      \n  1e24981a-fa51-11e5-86aa-5e5517507c66_userId2_group:\n    properties:\n     ' \
+    ' description: dummy\n      domain: default\n      name: 1e24981a-fa51-11e5-86aa-5e5517507c66_userId2_group\n      ' \
+    'roles:\n      - project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n        ' \
+    'role: {get_resource: storage}\n    type: OS::Keystone::Group\n\n      ' \
+    '\n\noutputs:\n  userId1_id:\n    value: {get_resource: userId1}\n' \
+    '  userId2_id:\n    value: {get_resource: userId2}\n  ' \
+    '1e24981a-fa51-11e5-86aa-5e5517507c66_id:\n    value: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n'
+
+
+fullyaml_no_users_quotasoff = \
+    'heat_template_version: 2015-1-1\n\ndescription: yaml file for region ' \
+    '- regionnametest\n\nresources:\n  tenant_metadata:\n    properties:\n' \
+    '      METADATA:\n        metadata:\n          my_server_name: Apache1\n          ocx_cust: 123456889\n' \
+    '      TENANT_ID: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n    ' \
+    'type: OS::Keystone::Metadata\n\n      \n  userId1zzzz:\n    properties:\n      ' \
+    'groups:\n      - {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66_userId1zzzz_group}\n      ' \
+    'name: userId1zzzz\n      roles:\n      - project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n' \
+    '        role: adminzzzz\n      - ' \
+    'project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n        role: otherzzzzz\n' \
+    '    type: OS::Keystone::User\n\n      \n  userId2zzz:\n    properties:\n      ' \
+    'groups:\n      - {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66_userId2zzz_group}\n      ' \
+    'name: userId2zzz\n      roles:\n      - project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n' \
+    '        role: storagezzzzz\n    type: OS::Keystone::User\n\n      ' \
+    '\n  1e24981a-fa51-11e5-86aa-5e5517507c66:\n    properties:\n      description: this is a description\n' \
+    '      enabled: true\n      name: welcome_man\n    ' \
+    '  project_id: 1e24981a-fa51-11e5-86aa-5e5517507c66\n    type: OS::Keystone::Project2\n\n      \n  1e24981a-fa51-11e5-86aa-5e5517507c66_userId1zzzz_group:\n    ' \
+    'properties:\n      description: dummy\n      domain: default\n      ' \
+    'name: 1e24981a-fa51-11e5-86aa-5e5517507c66_userId1zzzz_group\n      roles:\n      - project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n' \
+    '        role: {get_resource: otherzzzzz}\n    type: OS::Keystone::Group\n\n' \
+    '      \n  1e24981a-fa51-11e5-86aa-5e5517507c66_userId2zzz_group:\n    properties:\n      description: dummy\n      ' \
+    'domain: default\n      name: 1e24981a-fa51-11e5-86aa-5e5517507c66_userId2zzz_group\n      roles:\n      ' \
+    '- project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n        role: {get_resource: storagezzzzz}\n' \
+    '    type: OS::Keystone::Group\n\n      \n\noutputs:\n  userId1zzzz_id:\n' \
+    '    value: {get_resource: userId1zzzz}\n  userId2zzz_id:\n    ' \
+    'value: {get_resource: userId2zzz}\n  1e24981a-fa51-11e5-86aa-5e5517507c66_id:\n    ' \
+    'value: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n'
+
+full_yaml_default_quotas = 'heat_template_version: 2015-1-1\n\ndescription: yaml file for region ' \
+                           '- regionname\n\nresources:\n  cinder_quota:\n    properties:\n      ' \
+                           'gigabytes: 111\n      snapshots: 111\n      tenant: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n' \
+                           '      volumes: 111\n    type: OS::Cinder::Quota\n\n   ' \
+                           '   \n  neutron_quota:\n    properties:\n      floatingip: 111\n' \
+                           '      network: 111\n      port: 111\n      router: 111\n      subnet: 111\n' \
+                           '      tenant: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n    type: OS::Neutron::Quota\n\n' \
+                           '      \n  nova_quota:\n    properties:\n      injected_files: 111\n      ' \
+                           'instances: 111\n      keypairs: 111\n      ram: 111\n      ' \
+                           'tenant: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n    ' \
+                           'type: OS::Nova::Quota\n\n      \n  tenant_metadata:\n    properties:\n      METADATA:\n      ' \
+                           '  metadata:\n          my_server_name: Apache1\n          ocx_cust: 123456889\n      ' \
+                           'TENANT_ID: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n    ' \
+                           'type: OS::Keystone::Metadata\n\n      \n  userId1:\n' \
+                           '    properties:\n      groups:\n      ' \
+                           '- {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66_userId1_group}\n      name: userId1\n' \
+                           '      roles:\n      - project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n' \
+                           '        role: admin\n      ' \
+                           '- project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n        ' \
+                           'role: other\n    type: OS::Keystone::User\n\n' \
+                           '      \n  userId2:\n    properties:\n      groups:\n' \
+                           '      - {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66_userId2_group}\n      ' \
+                           'name: userId2\n      roles:\n      - project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n' \
+                           '        role: storage\n    type: OS::Keystone::User\n\n      ' \
+                           '\n  1e24981a-fa51-11e5-86aa-5e5517507c66:\n    properties:\n      description: this is a description\n' \
+                           '      enabled: true\n      name: welcome_man\n' \
+                           '      project_id: 1e24981a-fa51-11e5-86aa-5e5517507c66\n    ' \
+                           'type: OS::Keystone::Project2\n\n      \n  1e24981a-fa51-11e5-86aa-5e5517507c66_userId1_group:\n' \
+                           '    properties:\n      description: dummy\n      domain: default\n' \
+                           '      name: 1e24981a-fa51-11e5-86aa-5e5517507c66_userId1_group\n      roles:\n' \
+                           '      - project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n        ' \
+                           'role: {get_resource: other}\n    type: OS::Keystone::Group\n\n      ' \
+                           '\n  1e24981a-fa51-11e5-86aa-5e5517507c66_userId2_group:\n    properties:\n      ' \
+                           'description: dummy\n      domain: default\n      name: 1e24981a-fa51-11e5-86aa-5e5517507c66_userId2_group\n      ' \
+                           'roles:\n      - project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n        ' \
+                           'role: {get_resource: storage}\n    type: OS::Keystone::Group\n\n      ' \
+                           '\n\noutputs:\n  userId1_id:\n    ' \
+                           'value: {get_resource: userId1}\n  userId2_id:\n    ' \
+                           'value: {get_resource: userId2}\n  1e24981a-fa51-11e5-86aa-5e5517507c66_id:\n    ' \
+                           'value: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n'
+
+full_yaml_quotas = 'heat_template_version: 2015-1-1\n\ndescription: yaml file for region - ' \
+                   'regionnametest\n\nresources:\n  cinder_quota:\n    ' \
+                   'properties:\n      gigabytes: 10\n      snapshots: 10\n      ' \
+                   'tenant: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n      volumes: 10\n    ' \
+                   'type: OS::Cinder::Quota\n\n      \n  neutron_quota:\n    ' \
+                   'properties:\n      floatingip: 10\n      network: 10\n      ' \
+                   'port: 10\n      router: 10\n      subnet: 10\n      ' \
+                   'tenant: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n    ' \
+                   'type: OS::Neutron::Quota\n\n      \n  nova_quota:\n    ' \
+                   'properties:\n      injected_files: 10\n      instances: 10\n      ' \
+                   'keypairs: 10\n      ram: 10\n      tenant: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n    ' \
+                   'type: OS::Nova::Quota\n\n      \n  tenant_metadata:\n    ' \
+                   'properties:\n      METADATA:\n        metadata:\n          my_server_name: Apache1\n' \
+                   '          ocx_cust: 123456889\n      TENANT_ID: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n' \
+                   '    type: OS::Keystone::Metadata\n\n      \n  userId1zzzz:\n    properties:\n      ' \
+                   'groups:\n      - {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66_userId1zzzz_group}\n      ' \
+                   'name: userId1zzzz\n      roles:\n      - project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n' \
+                   '        role: adminzzzz\n      - project: ' \
+                   '{get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n        role: ' \
+                   'otherzzzzz\n    type: OS::Keystone::User\n\n      \n  ' \
+                   'userId2zzz:\n    properties:\n      groups:\n      - {get_resource:' \
+                   ' 1e24981a-fa51-11e5-86aa-5e5517507c66_userId2zzz_group}\n      name: userId2zzz\n      roles:\n' \
+                   '      - project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n        ' \
+                   'role: storagezzzzz\n    type: OS::Keystone::User\n\n' \
+                   '      \n  1e24981a-fa51-11e5-86aa-5e5517507c66:\n    properties:\n      ' \
+                   'description: this is a description\n      ' \
+                   'enabled: true\n      name: welcome_man\n      ' \
+                   'project_id: 1e24981a-fa51-11e5-86aa-5e5517507c66\n    ' \
+                   'type: OS::Keystone::Project2\n\n      \n  1e24981a-fa51-11e5-86aa-5e5517507c66_userId1zzzz_group:\n' \
+                   '    properties:\n      description: dummy\n      ' \
+                   'domain: default\n      name: 1e24981a-fa51-11e5-86aa-5e5517507c66_userId1zzzz_group\n      roles:\n      ' \
+                   '- project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n        ' \
+                   'role: {get_resource: otherzzzzz}\n    type: OS::Keystone::Group\n\n' \
+                   '      \n  1e24981a-fa51-11e5-86aa-5e5517507c66_userId2zzz_group:\n    properties:\n      ' \
+                   'description: dummy\n      domain: default\n      name: 1e24981a-fa51-11e5-86aa-5e5517507c66_userId2zzz_group\n' \
+                   '      roles:\n      - project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n        ' \
+                   'role: {get_resource: storagezzzzz}\n    type: OS::Keystone::Group\n\n' \
+                   '      \n\noutputs:\n  userId1zzzz_id:\n    ' \
+                   'value: {get_resource: userId1zzzz}\n  userId2zzz_id:\n    ' \
+                   'value: {get_resource: userId2zzz}\n  1e24981a-fa51-11e5-86aa-5e5517507c66_id:\n    ' \
+                   'value: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n'
+
+full_yaml_ldap = 'heat_template_version: 2015-1-2\n\ndescription: yaml file' \
+                 ' for region - regionname\n\nresources:\n  tenant_metadata:\n    ' \
+                 'properties:\n      METADATA:\n        metadata:\n          my_server_name: Apache1\n' \
+                 '          ocx_cust: 123456889\n      TENANT_ID: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n' \
+                 '    type: OS::Keystone::Metadata\n\n      \n  userId1:\n    ' \
+                 'properties:\n      roles:\n      ' \
+                 '- project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n        ' \
+                 'role: admin\n      - project: ' \
+                 '{get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n        ' \
+                 'role: other\n      user: userId1\n    ' \
+                 'type: OS::Keystone::UserRoleAssignment\n\n      \n  ' \
+                 'userId2:\n    properties:\n      roles:\n      ' \
+                 '- project: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n        ' \
+                 'role: storage\n      user: userId2\n    ' \
+                 'type: OS::Keystone::UserRoleAssignment\n\n      \n  ' \
+                 '1e24981a-fa51-11e5-86aa-5e5517507c66:\n    properties:\n      ' \
+                 'description: this is a description\n      ' \
+                 'enabled: true\n      name: welcome_man\n      ' \
+                 'project_id: 1e24981a-fa51-11e5-86aa-5e5517507c66\n    ' \
+                 'type: OS::Keystone::Project2\n\n      \n\noutputs:\n  ' \
+                 'userId1_id:\n    ' \
+                 'value: {get_resource: userId1}\n  userId2_id:\n    ' \
+                 'value: {get_resource: userId2}\n  1e24981a-fa51-11e5-86aa-5e5517507c66_id:\n    ' \
+                 'value: {get_resource: 1e24981a-fa51-11e5-86aa-5e5517507c66}\n'
+
+
+class CreateResource(unittest.TestCase):
+    """class metohd."""
+
+    @patch.object(CustomerBuild, 'conf')
+    def test_create_customer_yaml_nousers(self, mock_conf):
+        """test valid dict to yaml output as expected without users."""
+        ver = mock_conf.yaml_configs.customer_yaml.yaml_version = '2015-1-1'
+        mock_conf.yaml_configs.customer_yaml.yaml_options.quotas = False
+        yamlfile = CustomerBuild.yamlbuilder(alldata, region_quotas)
+        yamlfile_as_json = yaml.load(yamlfile)
+        self.assertEqual(yamlfile_as_json['heat_template_version'], ver)
+        self.assertEqual(yaml.load(yamlfile), yaml.load(fullyaml_no_users_quotasoff))
+
+    @patch.object(CustomerBuild, 'conf')
+    def test_create_flavor_yaml_noquotas(self, mock_conf):
+        """test valid dict to yaml output as expected with users."""
+        ver = mock_conf.yaml_configs.customer_yaml.yaml_version = '2015-1-2'
+        mock_conf.yaml_configs.customer_yaml.yaml_options.quotas = False
+        yamlfile = CustomerBuild.yamlbuilder(alldata, region_users)
+        yamlfile_as_json = yaml.load(yamlfile)
+        self.assertEqual(yamlfile_as_json['heat_template_version'], ver)
+        self.assertEqual(yaml.load(yamlfile), yaml.load(fullyaml_with_users_quotasoff))
+
+    @patch.object(CustomerBuild, 'conf')
+    def test_create_customer_yaml_noquotas_on(self, mock_conf):
+        """test valid dict to yaml output as expected with default regions."""
+        ver = mock_conf.yaml_configs.customer_yaml.yaml_version = '2015-1-1'
+        mock_conf.yaml_configs.customer_yaml.yaml_options.quotas = True
+        yamlfile = CustomerBuild.yamlbuilder(alldata, region_users)
+        yamlfile_as_json = yaml.load(yamlfile)
+        self.assertEqual(yamlfile_as_json['heat_template_version'], ver)
+        self.assertEqual(yaml.load(yamlfile), yaml.load(full_yaml_default_quotas))
+
+    @patch.object(CustomerBuild, 'conf')
+    def test_create_customer_yaml_withquotas_on(self, mock_conf):
+        """valid dict to yaml output as expect with regions default users."""
+        ver = mock_conf.yaml_configs.customer_yaml.yaml_version = '2015-1-1'
+        mock_conf.yaml_configs.customer_yaml.yaml_options.quotas = True
+        yamlfile = CustomerBuild.yamlbuilder(alldata, region_quotas)
+        yamlfile_as_json = yaml.load(yamlfile)
+        self.assertEqual(yamlfile_as_json['heat_template_version'], ver)
+        self.assertEqual(yaml.load(yamlfile), yaml.load(full_yaml_quotas))
+
+    @patch.object(CustomerBuild, 'conf')
+    def test_create_flavor_yaml_ldap(self, mock_conf):
+        """test valid dict to yaml output as expected with ldap system."""
+        ver = mock_conf.yaml_configs.customer_yaml.yaml_version = '2015-1-2'
+        mock_conf.yaml_configs.customer_yaml.yaml_options.quotas = False
+        mock_conf.yaml_configs.customer_yaml.yaml_options.type = "ldap"
+        yamlfile = CustomerBuild.yamlbuilder(alldata, region_users)
+        yamlfile_as_json = yaml.load(yamlfile)
+        self.assertEqual(yamlfile_as_json['heat_template_version'], ver)
+        self.assertEqual(yaml.load(yamlfile), yaml.load(full_yaml_ldap))
diff --git a/orm/services/resource_distributor/rds/tests/services/test_flavor_yaml.py b/orm/services/resource_distributor/rds/tests/services/test_flavor_yaml.py
new file mode 100755
index 00000000..e1de0e3f
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/services/test_flavor_yaml.py
@@ -0,0 +1,87 @@
+"""flavor unittest module."""
+from mock import patch
+from rds.services import yaml_flavor_bulder as FlavorBuild
+import unittest
+import yaml
+
+
+alldata = {'status': 'complete', 'series': 'P2',
+           'description': 'First flavor for AMAR',
+           'ephemeral': 1, 'ram': 64, 'visibility': 'public',
+           'regions': [{'name': 'North1'}, {'name': 'North2'}], 'vcpus': 2,
+           'extra_specs': {'key2:aa': 'value2', 'key1': 'value1',
+                           'keyx': 'valuex'},
+           'tag': {'tagkey2': 'tagvalue2', 'tagkey1': 'tagvalue1'},
+           'options': {'optkey2': 'optvalue2', 'optkey1': 'optvalue1'},
+           'swap': 51231, 'disk': 512,
+           'tenants': [{'tenant_id': 'abcd-efgh-ijkl-4567'},
+                       {'tenant_id': 'abcd-efgh-ijkl-4567'}],
+           'id': 'uuid-uuid-uuid-uuid',
+           'name': 'Nice Flavor'}
+
+region = {'name': '0'}
+
+
+fullyaml = 'heat_template_version: 2015-1-1\n\ndescription: yaml file for region - 0\n\nresources:\n' \
+           '  nova_flavor:\n    properties:\n      disk: 512\n      ephemeral: 1\n' \
+           '      extra_specs: {key1: value1, "key2:aa": value2, keyx: valuex, tagkey1: tagvalue1, ' \
+           'tagkey2: tagvalue2, optkey1: optvalue1, optkey2: optvalue2}\n' \
+           '      flavorid: uuid-uuid-uuid-uuid\n' \
+           '      is_public: true\n      name: Nice Flavor\n      ram: 64\n      rxtx_factor: 1\n' \
+           '      swap: 51231\n      tenants: [abcd-efgh-ijkl-4567, abcd-efgh-ijkl-4567]\n      vcpus: 2\n' \
+           '    type: OS::Nova::Flavor\n\n      \n\noutputs:\n  nova_flavor_id:\n' \
+           '    value: {get_resource: nova_flavor}\n'
+
+alldata_rxtffactor = {'status': 'complete', 'series': 'P2',
+                      'description': 'First flavor for AMAR',
+                      'ephemeral': 1, 'ram': 64, 'visibility': 'public',
+                      'regions': [{'name': 'North1'}, {'name': 'North2'}],
+                      'vcpus': 2,
+                      'extra_specs': {'key2': 'value2', 'key1': 'value1',
+                                      'keyx': 'valuex'},
+                      'tag': {'tagkey2': 'tagvalue2', 'tagkey1': 'tagvalue1'},
+                      'options': {'optkey2': 'optvalue2', 'optkey1': 'optvalue1'},
+                      'swap': 51231, 'disk': 512,
+                      'tenants': [{'tenant_id': 'abcd-efgh-ijkl-4567'},
+                                  {'tenant_id': 'abcd-efgh-ijkl-4567'}],
+                      'id': 'uuid-uuid-uuid-uuid',
+                      'rxtx_factor': 10,
+                      'name': 'Nice Flavor'}
+
+fullyaml_rxtx = 'heat_template_version: 2015-1-1\n\ndescription: yaml file for region - 0\n\nresources:\n' \
+                '  nova_flavor:\n    properties:\n      disk: 512\n      ephemeral: 1\n' \
+                '      extra_specs: {key1: value1, key2: value2, keyx: valuex, tagkey1: tagvalue1, ' \
+                'tagkey2: tagvalue2, optkey1: optvalue1, optkey2: optvalue2}\n' \
+                '      flavorid: uuid-uuid-uuid-uuid\n' \
+                '      is_public: true\n      name: Nice Flavor\n      ram: 64\n      rxtx_factor: 10\n' \
+                '      swap: 51231\n      tenants: [abcd-efgh-ijkl-4567, abcd-efgh-ijkl-4567]\n      vcpus: 2\n' \
+                '    type: OS::Nova::Flavor\n\n      \n\noutputs:\n  nova_flavor_id:\n' \
+                '    value: {get_resource: nova_flavor}\n'
+
+
+class CreateResource(unittest.TestCase):
+    """class method flavor tests."""
+
+    @patch.object(FlavorBuild, 'conf')
+    def test_create_flavor_yaml(self, mock_conf):
+        self.maxDiff=None
+        """test valid dict to yaml output as expected."""
+        mock_conf.yaml_configs.flavor_yaml.yaml_version = '2015-1-1'
+        mock_conf.yaml_configs.flavor_yaml.yaml_args.rxtx_factor = 1
+        yamlfile = FlavorBuild.yamlbuilder(alldata, region)
+        yamlfile_as_json = yaml.load(yamlfile)
+        self.assertEqual(yamlfile_as_json['heat_template_version'],
+                         mock_conf.yaml_configs.flavor_yaml.yaml_version)
+        self.assertEqual(yaml.load(fullyaml), yamlfile_as_json)
+
+    @patch.object(FlavorBuild, 'conf')
+    def test_create_flavor_yaml_(self, mock_conf):
+        self.maxDiff = None
+        """test when extx ioncluded in the input."""
+        mock_conf.yaml_configs.flavor_yaml.yaml_version = '2015-1-1'
+        mock_conf.yaml_configs.flavor_yaml.yaml_args.rxtx_factor = 1
+        yamlfile = FlavorBuild.yamlbuilder(alldata_rxtffactor, region)
+        yamlfile_as_json = yaml.load(yamlfile)
+        self.assertEqual(yamlfile_as_json['heat_template_version'],
+                         mock_conf.yaml_configs.flavor_yaml.yaml_version)
+        self.assertEqual(yaml.load(fullyaml_rxtx), yamlfile_as_json)
diff --git a/orm/services/resource_distributor/rds/tests/services/test_image_yaml.py b/orm/services/resource_distributor/rds/tests/services/test_image_yaml.py
new file mode 100755
index 00000000..daebc399
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/services/test_image_yaml.py
@@ -0,0 +1,52 @@
+import unittest
+from mock import patch
+from rds.services import yaml_image_builder as ImageBuild
+import yaml
+import datetime
+
+json_input = {'status': 'complete', 'name': 'Ubuntu', 'internal_id': 1,
+              'url': 'https://mirrors.it.att.com/images/image-name',
+              'disk_format': 'raw', 'min_ram': 0, 'enabled': 1,
+              'visibility': 'public', 'owner': 'unknown', 'image_tags': [
+        {'image_internal_id': 1, 'tag': 'abcd-efgh-ijkl-4567'},
+        {'image_internal_id': 1, 'tag': 'abcd-efgh-ijkl-4567'}], 'regions': [
+        {'action': 'delete', 'image_internal_id': 1, 'type': 'single',
+         'name': 'North'},
+        {'action': 'create', 'image_internal_id': 1, 'type': 'single',
+         'name': 'North'}], 'image_properties': [
+        {'key_name': 'Key1', 'key_value': 'Key1.value',
+         'image_internal_id': 1},
+        {'key_name': 'Key2', 'key_value': 'Key2.value',
+         'image_internal_id': 1}], 'protected': 1, 'customers': [
+        {'customer_id': 'abcd-efgh-ijkl-4567', 'image_id': 1},
+        {'customer_id': 'abcd-efgh-ijkl-4567', 'image_id': 1}],
+              'container_format': 'bare', 'min_disk': 2,
+              'id': 'uuu1id12-uuid-uuid-uuid'}
+
+region = {'action': 'delete', 'image_internal_id': 1, 'type': 'single',
+          'name': 'North'}
+
+yaml_output = {'description': 'yaml file for region - North',
+ 'resources': {'glance_image': {'properties': {'container_format': 'bare',
+    'disk_format': 'raw',
+    'is_public': True,
+    'copy_from': 'https://mirrors.it.att.com/images/image-name',
+    'min_disk': 2,
+    'min_ram': 0,
+    'name': 'North',
+    'owner': 'unknown',
+    'protected': True,
+    'tenants': ['abcd-efgh-ijkl-4567', 'abcd-efgh-ijkl-4567']},
+   'type': 'OS::Glance::Image2'}},
+ 'heat_template_version': '2015-1-1',
+ 'outputs': {'glance_image_id': {'value': {'get_resource': 'glance_image'}}}}
+
+class CreateImage(unittest.TestCase):
+    """class method image test."""
+
+    @patch.object(ImageBuild, 'conf')
+    def test_create_image(self, mock_conf):
+        self.maxDiff = None
+        mock_conf.yaml_configs.image_yaml.yaml_version = '2015-1-1'
+        response = ImageBuild.yamlbuilder(json_input, region)
+        self.assertEqual(yaml.load(response), yaml_output)
diff --git a/orm/services/resource_distributor/rds/tests/services/test_region_resource_id_status.py b/orm/services/resource_distributor/rds/tests/services/test_region_resource_id_status.py
new file mode 100755
index 00000000..623623b4
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/services/test_region_resource_id_status.py
@@ -0,0 +1,170 @@
+from rds.tests import config as conf
+import mock
+import time
+import unittest
+
+from rds.services import region_resource_id_status
+
+
+class MyResult(object):
+    def __init__(self, resource_type, status, timestamp):
+        self.resource_type = resource_type
+        self.status = status
+        self.timestamp = timestamp
+
+
+class MockClass(object):
+    def __init__(self, regions):
+        self.regions = regions
+        self.done = False
+
+    def __call__(self, *args, **kwargs):
+        return self
+
+    def get_records_by_filter_args(self, **kw):
+        return self
+
+    def add_update_status_record(self, *args):
+        self.done = True
+
+
+class TestModel(unittest.TestCase):
+    def setUp(self):
+        region_resource_id_status.config = conf.region_resource_id_status
+
+        self.temp_connection = region_resource_id_status.factory.get_region_resource_id_status_connection
+
+        # Save the original config
+        self.temp_config = region_resource_id_status.config
+
+    def tearDown(self):
+        # Restore the original config
+        region_resource_id_status.config = self.temp_config
+
+        region_resource_id_status.factory.get_region_resource_id_status_connection = self.temp_connection
+
+    def test_validate_status_value_sanity(self):
+        test_status = 'test'
+        region_resource_id_status.config['allowed_status_values'].add(test_status)
+        # Make sure that no exception is raised
+        region_resource_id_status.validate_status_value(test_status)
+
+    def test_validate_status_value_invalid_status(self):
+        test_status = 'test'
+        if test_status in region_resource_id_status.config['allowed_status_values']:
+            region_resource_id_status.config['allowed_status_values'].remove(test_status)
+
+        self.assertRaises(region_resource_id_status.InputError,
+                          region_resource_id_status.validate_status_value,
+                          test_status)
+
+    def test_validate_operation_type_sanity(self):
+        test_operation = 'test'
+        region_resource_id_status.config['allowed_operation_type'] = {test_operation: 'A'}
+        # Make sure that no exception is raised
+        region_resource_id_status.validate_operation_type(test_operation)
+
+    def test_validate_operation_type_invalid_operation(self):
+        test_operation = 'test'
+        region_resource_id_status.config['allowed_operation_type'] = {}
+
+        self.assertRaises(region_resource_id_status.InputError,
+                          region_resource_id_status.validate_operation_type,
+                           test_operation)
+
+    def test_validate_resource_type_sanity(self):
+        test_resource = 'test'
+        region_resource_id_status.config['allowed_resource_type'] = {test_resource: 'A'}
+        # Make sure that no exception is raised
+        region_resource_id_status.validate_resource_type(test_resource)
+
+    def test_validate_resource_type_invalid_resource(self):
+        test_resource = 'test'
+        region_resource_id_status.config['allowed_resource_type'] = {}
+
+        self.assertRaises(region_resource_id_status.InputError,
+                          region_resource_id_status.validate_resource_type,
+                           test_resource)
+
+    @mock.patch.object(region_resource_id_status.factory, 'get_region_resource_id_status_connection')
+    def test_get_regions_by_status_resource_id_sanity(self, mock_factory):
+        # Make sure that no exception is raised
+        region_resource_id_status.get_regions_by_status_resource_id(1, 2)
+
+    @mock.patch.object(region_resource_id_status.factory, 'get_region_resource_id_status_connection')
+    def test_get_status_by_resource_id_sanity(self, mock_factory):
+        # Make sure that no exception is raised
+        region_resource_id_status.get_status_by_resource_id(1)
+
+    def test_add_status_sanity(self):
+        test_resource = 'test'
+        region_resource_id_status.config['allowed_resource_type'] = {test_resource: 'A'}
+        test_status = 'test'
+        region_resource_id_status.config['allowed_status_values'].add(test_status)
+        test_operation = 'test'
+        region_resource_id_status.config['allowed_operation_type'] = {test_operation: 'A'}
+
+        temp_mock = MockClass(['test'])
+        region_resource_id_status.factory.get_region_resource_id_status_connection = temp_mock
+        region_resource_id_status.add_status({'timestamp': 1,
+                                              'region': 2,
+                                              'status': test_status,
+                                              'transaction_id': 4,
+                                              'resource_id': 5,
+                                              'ord_notifier_id': 6,
+                                              'error_msg': 7,
+                                              'error_code': 8,
+                                              'resource_operation': test_operation,
+                                              'resource_type': test_resource})
+        self.assertTrue(temp_mock.done)
+
+    def test_add_status_no_regions(self):
+        test_resource = 'test'
+        region_resource_id_status.config['allowed_resource_type'] = {test_resource: 'A'}
+        test_status = 'test'
+        region_resource_id_status.config['allowed_status_values'].add(test_status)
+        test_operation = 'test'
+        region_resource_id_status.config['allowed_operation_type'] = {test_operation: 'A'}
+
+        temp_mock = MockClass([])
+        region_resource_id_status.factory.get_region_resource_id_status_connection = temp_mock
+        region_resource_id_status.add_status({'timestamp': 1,
+                                              'region': 2,
+                                              'status': test_status,
+                                              'transaction_id': 4,
+                                              'resource_id': 5,
+                                              'ord_notifier_id': 6,
+                                              'error_msg': 7,
+                                              'error_code': 8,
+                                              'resource_operation': test_operation,
+                                              'resource_type': test_resource})
+        self.assertTrue(temp_mock.done)
+
+    def test_add_status_input_error(self):
+        test_resource = 'test'
+        region_resource_id_status.config['allowed_resource_type'] = {test_resource: 'A'}
+        test_status = 'test'
+        region_resource_id_status.config['allowed_status_values'].add(test_status)
+        test_operation = 'test'
+        region_resource_id_status.config['allowed_operation_type'] = {test_operation: 'A'}
+
+        temp_mock = MockClass([])
+        region_resource_id_status.factory.get_region_resource_id_status_connection = temp_mock
+        self.assertRaises(region_resource_id_status.InputError,
+                          region_resource_id_status.add_status,
+                          {'timestamp': 1, 'region': 2, 'status': 3,
+                           'transaction_id': 4, 'resource_id': 5,
+                           'ord_notifier_id': 6, 'error_msg': 7,
+                           'error_code': 8, 'resource_operation': test_operation,
+                           'resource_type': test_resource})
+
+    def test_add_status_other_exception(self):
+        test_status = 'test'
+        region_resource_id_status.config['allowed_status_values'].add(test_status)
+
+        temp_mock = MockClass([])
+        region_resource_id_status.factory.get_region_resource_id_status_connection = temp_mock
+        self.assertRaises(KeyError, region_resource_id_status.add_status,
+                          {'timestamp': 1, 'region': 2, 'status': test_status,
+                           'transaction_id': 4, 'resource_id': 5, 'ord_notifier_id': 6,
+                           'error_msg': 7, 'error_code': 8, 'resource_type': 9})
diff --git a/orm/services/resource_distributor/rds/tests/sot/__init__.py b/orm/services/resource_distributor/rds/tests/sot/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/tests/sot/git_sot/__init__.py b/orm/services/resource_distributor/rds/tests/sot/git_sot/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/tests/sot/git_sot/test_git_base.py b/orm/services/resource_distributor/rds/tests/sot/git_sot/test_git_base.py
new file mode 100644
index 00000000..34952062
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/sot/git_sot/test_git_base.py
@@ -0,0 +1,62 @@
+import subprocess
+import unittest
+import mock
+from mock import patch
+
+from  rds.sot.git_sot import git_base
+from rds.sot.git_sot.git_base import BaseGit, GitResetError
+
+
+class BaseGitTests(unittest.TestCase):
+
+    def test_git_base_no_method_git_init_implemented(self):
+        """ Check if creating an instance and calling git_init method fail"""
+        with self.assertRaises(NotImplementedError):
+            base_git = BaseGit()
+            base_git.git_init()
+
+    def test_git_base_no_method_git_upload_changes_implemented(self):
+        """ Check if creating an instance and calling git_upload_changes method fail"""
+        with self.assertRaises(NotImplementedError):
+            base_git = BaseGit()
+            base_git.git_upload_changes()
+
+    # @patch.object(git_base, 'conf')
+    # @patch.object(subprocess, 'Popen')
+    # def test_git_base_reset_error(self, mock_popen, conf_mock):
+    #     """ Test that exception raised when stderr returns error."""
+    #     my_pipe = mock.MagicMock()
+    #     my_pipe.communicate = mock.MagicMock(return_value=('1', 'error',))
+    #     mock_popen.return_value = my_pipe
+    #
+    #     base_git = BaseGit()
+    #     callback = base_git.git_reset_changes
+    #     self.assertRaises(GitResetError, callback)
+
+    # @patch.object(git_base, 'conf')
+    # @patch.object(subprocess, 'Popen')
+    # def test_git_base_reset_no_error(self, mock_popen, conf_mock):
+    #     """ Test that no exception raised when no error returned."""
+    #     my_pipe = mock.MagicMock()
+    #     my_pipe.communicate = mock.MagicMock(return_value=('1', 'bla bla',))
+    #     mock_popen.return_value = my_pipe
+    #
+    #     base_git = BaseGit()
+    #     try:
+    #         base_git.git_reset_changes()
+    #     except GitResetError:
+    #         self.fail("No exception should be raised here")
+
+    def test_git_base_no_method_git_reset_changes_implemented(self):
+        """ Check if creating an instance and calling
+        git_reset_changes method fail"""
+        with self.assertRaises(NotImplementedError):
+            base_git = BaseGit()
+            base_git.git_reset_changes()
+
+    def test_git_base_no_method_validate_git_implemented(self):
+        """ Check if creating an instance and calling validate_git method fail"""
+        with self.assertRaises(NotImplementedError):
+            base_git = BaseGit()
+            base_git.validate_git()
+
diff --git a/orm/services/resource_distributor/rds/tests/sot/git_sot/test_git_factory.py b/orm/services/resource_distributor/rds/tests/sot/git_sot/test_git_factory.py
new file mode 100644
index 00000000..abcb5744
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/sot/git_sot/test_git_factory.py
@@ -0,0 +1,25 @@
+import unittest
+
+from rds.sot.git_sot import git_factory
+from rds.sot.git_sot.git_gittle import GitGittle
+from rds.sot.git_sot.git_native import GitNative
+
+
+class GitFactoryTests(unittest.TestCase):
+    def setUp(self):
+        super(GitFactoryTests, self).setUp()
+
+    def test_get_git_impl_with_gittle(self):
+        """Test that when given gittle the GitGittle instance returned"""
+        obj = git_factory.get_git_impl("gittle")
+        self.assertIsInstance(obj, GitGittle)
+
+    def test_get_git_impl_with_native(self):
+        """Test that when given native the GitNative instance returned"""
+        obj = git_factory.get_git_impl("native")
+        self.assertIsInstance(obj, GitNative)
+
+    def test_get_sot_no_sot_type(self):
+        """Test that when given unknown type, exception raised"""
+        with self.assertRaises(RuntimeError):
+            git_factory.get_git_impl("unknown")
\ No newline at end of file
diff --git a/orm/services/resource_distributor/rds/tests/sot/git_sot/test_git_gittle.py b/orm/services/resource_distributor/rds/tests/sot/git_sot/test_git_gittle.py
new file mode 100644
index 00000000..709e1212
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/sot/git_sot/test_git_gittle.py
@@ -0,0 +1,56 @@
+import mock
+from mock import patch
+
+import unittest
+
+from rds.sot.git_sot import git_gittle
+from rds.sot.git_sot.git_gittle import GitGittle
+from rds.sot.git_sot.git_base import GitInitError, GitUploadError
+
+
+class GitGittleTests(unittest.TestCase):
+
+    def setUp(self):
+        super(GitGittleTests, self).setUp()
+        self.addCleanup(mock.patch.stopall)
+        self.my_git = GitGittle()
+
+    def tearDown(self):
+        # Restore the original config
+        self.my_git.repo = None
+
+    ###################
+    # git_init        #
+    ###################
+
+    @patch.object(git_gittle, 'Gittle', side_effect=Exception("Failed to delete file path"))
+    def test_git_gittle_init_git_create_gittle_failed(self, gittle_mock):
+        """Test that when Gittle fail to initialize exception is raised."""
+        with self.assertRaises(GitInitError):
+            self.my_git.git_init()
+
+    @patch.object(git_gittle, 'Gittle')
+    @patch.object(git_gittle, 'conf')
+    def test_git_gittle_init_git_create_gittle_success(self, gittle_mock, conf_mock):
+        """Test that when Gittle initialize success."""
+        self.my_git.git_init()
+
+    ######################
+    # git_upload_changes #
+    ######################
+
+    @patch.object(git_gittle, 'conf')
+    def test_git_gittle_git_upload_changes_success(self, conf_mock):
+        """Test that when upload success commit id is returned."""
+        self.my_git.repo = mock.MagicMock()
+        self.my_git.repo.commit = mock.MagicMock(return_value="123")
+        commit_id = self.my_git.git_upload_changes()
+        self.assertEqual(commit_id, "123")
+
+    @patch.object(git_gittle, 'conf')
+    def test_git_gittle_git_upload_changes_commit_failed(self, conf_mock):
+        """Test that when upload failed exception raised."""
+        self.my_git.repo = mock.MagicMock()
+        self.my_git.repo.commit = mock.MagicMock(side_effect=Exception("Failed to commit"))
+        self.assertRaises(GitUploadError, self.my_git.git_upload_changes)
+
diff --git a/orm/services/resource_distributor/rds/tests/sot/git_sot/test_git_native.py b/orm/services/resource_distributor/rds/tests/sot/git_sot/test_git_native.py
new file mode 100644
index 00000000..d1cf7938
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/sot/git_sot/test_git_native.py
@@ -0,0 +1,92 @@
+"""Unittest module for git_native."""
+import mock
+from mock import patch
+import unittest
+
+from rds.sot.git_sot import git_native
+from rds.sot.git_sot.git_native import GitNativeError, GitValidateError
+
+
+class GitNativeTest(unittest.TestCase):
+    """The test case of GitNative."""
+
+    # @patch.object(git_native.subprocess, 'Popen')
+    # def test_git_operations_sanity(self, mock_popen):
+    #     """Test that no exception is raised when performing git operations."""
+    #     my_pipe = mock.MagicMock()
+    #     my_pipe.communicate = mock.MagicMock(return_value=('1', '2',))
+    #     mock_popen.return_value = my_pipe
+    #     test_git = git_native.GitNative()
+    #     for callback in [test_git._git_pull, test_git._git_add,
+    #                      test_git._git_push, test_git._git_get_commit_id]:
+    #         callback('test')
+    #
+    #     test_git._git_commit('test', 'test', 'test', 'test')
+
+    # @patch.object(git_native.subprocess, 'Popen')
+    # def test_git_operations_error(self, mock_popen):
+    #     """Test that an exception is raised when stderror returns error."""
+    #     my_pipe = mock.MagicMock()
+    #     my_pipe.communicate = mock.MagicMock(return_value=('1', 'error',))
+    #     mock_popen.return_value = my_pipe
+    #     test_git = git_native.GitNative()
+    #     for callback in [test_git._git_pull, test_git._git_add,
+    #                      test_git._git_push, test_git._git_get_commit_id]:
+    #         self.assertRaises(git_native.GitNativeError, callback, 'test')
+    #
+    #     self.assertRaises(git_native.GitNativeError,
+    #                       test_git._git_commit, 'test', 'test', 'test', 'test')
+
+    @patch.object(git_native, 'conf')
+    @patch.object(git_native.subprocess, 'Popen')
+    def test_git_init_sanity(self, mock_popen, mock_conf):
+        """Test that no exception is raised when calling git_init."""
+        my_pipe = mock.MagicMock()
+        my_pipe.communicate = mock.MagicMock(return_value=('1', '2',))
+        mock_popen.return_value = my_pipe
+        test_git = git_native.GitNative()
+        test_git.git_init()
+
+    @patch.object(git_native, 'conf')
+    @patch.object(git_native.subprocess, 'Popen')
+    def test_git_upload_changes_sanity(self, mock_popen, mock_conf):
+        """Test that no exception is raised when calling git_upload_changes."""
+        my_pipe = mock.MagicMock()
+        my_pipe.communicate = mock.MagicMock(return_value=('1', '2',))
+        mock_popen.return_value = my_pipe
+        test_git = git_native.GitNative()
+        test_git.git_upload_changes()
+
+    @patch.object(git_native, 'conf')
+    @patch.object(git_native.subprocess, 'Popen')
+    def test_git_upload_changes_error(self, mock_popen, mock_conf):
+        """Test that an exception is raised when stderror returns error."""
+        my_pipe = mock.MagicMock()
+        my_pipe.communicate = mock.MagicMock(return_value=('1', 'error',))
+        mock_popen.return_value = my_pipe
+        test_git = git_native.GitNative()
+        self.assertRaises(git_native.GitUploadError,
+                          test_git.git_upload_changes)
+
+    @patch.object(git_native, 'conf')
+    @patch.object(git_native.subprocess, 'Popen')
+    def test_git_validate_git_sanity(self, mock_popen, mock_conf):
+        """Test that no exception is raised when calling validate_git."""
+        my_pipe = mock.MagicMock()
+        my_pipe.communicate = mock.MagicMock(return_value=('1', '2',))
+        mock_popen.return_value = my_pipe
+        test_git = git_native.GitNative()
+        test_git.validate_git()
+
+    @patch.object(git_native, 'conf')
+    @patch.object(git_native.subprocess, 'Popen')
+    @patch.object(git_native.GitNative, '_git_config',
+                  side_effect=GitNativeError("Could not write to file"))
+    def test_git_native_validate_git_config_fail(self, conf,mock_popen, result):
+        """Test that no exception is raised when calling git_init.aein"""
+        my_pipe = mock.MagicMock()
+        my_pipe.communicate = mock.MagicMock(return_value=('1', '2',))
+        mock_popen.return_value = my_pipe
+        test_git = git_native.GitNative()
+        with self.assertRaises(GitValidateError):
+            test_git.validate_git()
\ No newline at end of file
diff --git a/orm/services/resource_distributor/rds/tests/sot/git_sot/test_git_sot.py b/orm/services/resource_distributor/rds/tests/sot/git_sot/test_git_sot.py
new file mode 100755
index 00000000..764c46e5
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/sot/git_sot/test_git_sot.py
@@ -0,0 +1,294 @@
+import os
+import mock
+import unittest
+import threading
+from mock import patch
+
+from rds.sot.git_sot import git_sot as sot
+from rds.sot.base_sot import SoTError
+from rds.sot.git_sot.git_base import GitUploadError, GitInitError, GitResetError
+from rds.sot.git_sot.git_base import GitValidateError
+from rds.sot import sot_factory
+
+from rds.tests import config as conf
+
+lock = mock.MagicMock()
+
+resource = {
+        "operation": "create",
+        "region_id": '1',
+        "resource_type": '2',
+        "resource_name": '3',
+        "template_data": '4'
+}
+
+resource_delete= {
+        "operation": "delete",
+        "region_id": '1',
+        "resource_type": '2',
+        "resource_name": '3',
+        "template_data": '4'
+}
+
+
+def dummy_thread_method():
+    pass
+
+
+class GitSoTTest(unittest.TestCase):
+
+    def setUp(self):
+        super(GitSoTTest, self).setUp()
+        self.addCleanup(mock.patch.stopall)
+        git_factory = mock.MagicMock()
+        git_factory.get_git_impl = mock.MagicMock()
+
+    ##################
+    ### update_sot ###
+    ##################
+
+    @patch.object(sot, 'init_git', side_effect=GitInitError("Failed to initialize Git"))
+    def test_git_sot_update_sot_init_git_fail(self, result):
+        """" init_git fails and raise exception"""
+        try:
+            sot.update_sot("", lock, '1', '2', ['3','5'], '4', '6')
+        except SoTError:
+            self.fail("Exception should have been handled inside method")
+
+    @patch.object(sot, 'handle_file_operations', side_effect=SoTError("Failed to create file path"))
+    @patch.object(sot, 'init_git')
+    def test_git_sot_update_sot_create_files_fail(self, git_repo, result):
+        """" create_files fails and raise exception"""
+        try:
+            sot.update_sot("", lock, "a", "b", ['c', 'd'], 'e', 'f')
+        except SoTError:
+            self.fail("Exception should have been handled inside method")
+
+    @patch.object(sot, 'update_git', side_effect=GitUploadError("Failed to upload file to Git"))
+    @patch.object(sot, 'init_git')
+    @patch.object(sot, 'handle_file_operations')
+    @patch.object(sot, 'cleanup')
+    def test_git_sot_update_sot_update_git_fail(self, git_repo, files_created, result, clean_result):
+        """" update git fails and raise exception"""
+        try:
+            sot.update_sot("",lock, 'a', 'b', ['c', 'd'], 'e', 'f')
+        except GitUploadError:
+            self.fail("Exception should have been handled inside method")
+
+    @patch.object(sot, 'update_git')
+    @patch.object(sot, 'init_git')
+    @patch.object(sot, 'handle_file_operations')
+    @patch.object(sot, 'cleanup')
+    def test_git_sot_update_sot_success(self, git_repo, files_created, result, cleanup_result):
+        """"no exceptions raised"""
+        try:
+            sot.update_sot("", lock, "a", "b", ['c', 'd'], 'e', 'f')
+        except SoTError:
+            self.fail("Exception should have been handled inside method")
+
+    #######################
+    #   create_dir        #
+    #######################
+
+    @patch.object(os.path, 'dirname', return_value="File path")
+    @patch.object(os.path, 'exists', return_value=False)
+    @patch.object(os, 'makedirs')
+    def test_git_sot_create_dir_path_not_exist_success(self, dir_name, exists, makedirs):
+        """create directory path when path not exist and makedir success"""
+        sot.create_dir("my_file")
+
+    @patch.object(os.path, 'dirname', return_value="File path")
+    @patch.object(os.path, 'exists', return_value=True)
+    def test_git_sot_create_dir_path_exists_success(self, dir_name, exists):
+        """create directory path when path not exist and makedir success"""
+        sot.create_dir("my_file")
+
+    @patch.object(os.path, 'dirname', return_value="File path")
+    @patch.object(os.path, 'exists', return_value=False)
+    @patch.object(os, 'makedirs', side_effect=OSError("Could not make dir"))
+    def test_git_sot_create_dir_makedir_fails(self, dir_name, exists, makedirs):
+        """create direcory path makedir throws exception and the methos throws SoTError"""
+        with self.assertRaises(SoTError):
+            sot.create_dir("my_file")
+
+    ############################
+    # save_resource_to_sot     #
+    ############################
+
+    @patch.object(threading, 'Thread', return_value=threading.Thread(target=dummy_thread_method))
+    def test_git_sot_save_resource_to_sot(self, thread):
+        """Check the save runs in a new thread"""
+        sot_factory.sot_type = "git"
+        sot_factory.git_type = "gittle"
+        git_impl = mock.MagicMock()
+        sot = sot_factory.get_sot()
+        sot.save_resource_to_sot("t_id", "tk_id", [], "a_id", "u_id")
+        self.assertNotEqual(thread, threading.Thread.getName("main_thread"))
+
+
+    ################################
+    # create_file_in_path          #
+    ################################
+
+    @patch.object(sot, 'create_dir', return_value="File path")
+    @patch.object(sot, 'write_data_to_file', return_value=True)
+    def test_git_sot_create_file_in_path_success(self, aDir, aFile):
+        """create file in path success scenario no exception raised"""
+        try:
+            sot.create_file_in_path("path", "data")
+        except SoTError:
+            self.fail("No exceptions should be thrown in this case")
+
+    @patch.object(sot, 'create_dir', side_effect=SoTError("Failed to create file path"))
+    def test_git_sot_create_file_in_path_create_dir_failed(self, aDir):
+        """create file in path fail, create file raise exception """
+        with self.assertRaises(SoTError):
+            sot.create_file_in_path("path", "data")
+
+    @patch.object(sot, 'create_dir', return_value="File path")
+    @patch.object(sot, 'write_data_to_file', side_effect=SoTError("Could not write to file"))
+    def test_git_sot_create_file_in_path_create_file_failed(self, aDir, aFile):
+        """create file in path fail,create dir success, writing data to file failed """
+        with self.assertRaises(SoTError):
+            sot.create_file_in_path("path", "data")
+
+    #############################
+    #  get_resource_file_path   #
+    #############################
+
+    def test_git_sot_get_resource_file_path_failed(self):
+        """get_resource_file_path """
+        sot_factory.sot_type = "git"
+        sot_factory.git_type = "native"
+        sot_factory.local_repository_path = conf.git["local_repository_path"]
+        sot_factory.relative_path_format = conf.git["relative_path_format"]
+        sot_factory.file_name_format = conf.git["file_name_format"]
+        sot_factory.get_sot()
+
+        name = conf.git["file_name_format"].format(resource["resource_name"])
+        path = conf.git["local_repository_path"] + \
+            conf.git["relative_path_format"].format(resource["region_id"],
+                                                    resource["resource_type"],
+                                                    name)
+
+        result_path = sot.get_resource_file_path(resource)
+        self.assertEqual(path, result_path)
+
+    #############################
+    #  handle_file_operations   #
+    #############################
+
+    # @patch.object(sot, 'create_file_in_path', return_value=True)
+    # def test_git_sot_handle_file_operations_success(self, result):
+    #     """create files """
+    #     roll_list = []
+    #     sot.handle_file_operations([resource, ])
+    #     self.assertEqual(len(roll_list), 1)
+    #
+    #
+    # @patch.object(os, 'remove')
+    # @patch.object(os.path, 'exists', return_value=True)
+    # def test_git_sot_handle_file_operations_delete_success(self,
+    #                                                        result,
+    #                                                        result2):
+    #     """delete files """
+    #     roll_list = []
+    #     sot.handle_file_operations([resource_delete, ], roll_list)
+    #     self.assertEqual(len(roll_list), 1)
+
+
+    #############################
+    #  write_data_to_file       #
+    #############################
+
+    @patch('__builtin__.open')
+    @patch.object(os, 'close')
+    @patch.object(os, 'write', return_value=True)
+    def test_git_sot_write_data_to_file_success(self, result1, result2, result3):
+        """Check create_file success """
+        try:
+            sot.write_data_to_file("file_path", "data11")
+        except SoTError:
+            self.fail("No exceptions should be thrown in this case")
+
+    @patch('__builtin__.open', side_effect=IOError("Failed writing data to file"))
+    def test_git_sot_write_data_to_file_failed(self, result1):
+        """Check create file failed , could not write to file """
+        with self.assertRaises(SoTError):
+            sot.write_data_to_file("file_path", "data")
+
+    #############################
+    #  cleanup                  #
+    #############################
+
+    def test_git_sot_cleanup_files_success(self):
+        """Check cleanup success """
+        git_impl = mock.MagicMock()
+        git_impl.git_reset_changes = mock.MagicMock()
+        try:
+            sot.cleanup(git_impl)
+        except SoTError:
+            self.fail("No exceptions should be thrown in this case")
+
+    def test_git_sot_cleanup_files_remove_failed(self):
+        """Check cleanup fail because reset git failed """
+        git_impl = mock.MagicMock()
+        git_impl.git_reset_changes = mock.MagicMock(side_effect=GitResetError("failed to reset"))
+        with self.assertRaises(SoTError):
+            sot.cleanup(git_impl)
+
+    #############################
+    #  init_git                 #
+    #############################
+
+    def test_git_sot_init_git_success(self):
+        """Check init_git success """
+        git_impl = mock.MagicMock()
+        git_impl.git_init = mock.MagicMock()
+        try:
+            sot.init_git(git_impl)
+        except GitInitError:
+            self.fail("No exceptions should be thrown in this case")
+
+    def test_git_sot_init_git_gittle_failed(self):
+        """Check init_git failed """
+        git_impl = mock.MagicMock()
+        git_impl.git_init = mock.MagicMock(side_effect=GitInitError("failed to init"))
+        with self.assertRaises(GitInitError):
+            sot.init_git(git_impl)
+
+    #############################
+    #  update_git               #
+    #############################
+
+    def test_git_sot_update_git_success(self):
+        """Check update_git success"""
+        git_impl = mock.MagicMock()
+        git_impl.git_upload_changes = mock.MagicMock(return_value="123")
+
+        commit_id = sot.update_git(git_impl)
+        self.assertEqual(commit_id, "123")
+
+    def test_git_sot_update_git_commit_faild(self):
+        """Check update_git commit failed"""
+        git_impl = mock.MagicMock()
+        git_impl.git_upload_changes = mock.MagicMock(side_effect=
+                                                     GitUploadError("Failed in upload"))
+        with self.assertRaises(GitUploadError):
+            sot.update_git(git_impl)
+
+    #############################
+    #  validate_git             #
+    #############################
+
+    def test_git_sot_validate_git_faild(self):
+        """Check validate_git failed"""
+        git_impl = mock.MagicMock()
+        git_impl.validate_git = mock.MagicMock(side_effect=
+                                               GitValidateError("Failed in upload"))
+        try:
+            sot.validate_git(git_impl, lock)
+        except GitInitError:
+            self.fail("No exceptions should be thrown in this case")
+
+
diff --git a/orm/services/resource_distributor/rds/tests/sot/test_base_sot.py b/orm/services/resource_distributor/rds/tests/sot/test_base_sot.py
new file mode 100644
index 00000000..bfad0531
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/sot/test_base_sot.py
@@ -0,0 +1,20 @@
+import unittest
+
+from rds.sot.base_sot import BaseSoT
+
+
+class BaseSoTTests(unittest.TestCase):
+
+    def test_base_sot_no_method_save_implemented(self):
+        """ Check if creating an instance and calling save method fail"""
+        with self.assertRaises(Exception):
+            sot = BaseSoT()
+            sot.save_resource_to_sot('1','2',[])
+
+    def test_base_sot_no_method_validate_implemented(self):
+        """ Check if creating an instance and calling validate method fail"""
+        with self.assertRaises(Exception):
+            sot = BaseSoT()
+            sot.validate_sot_state()
+
+
diff --git a/orm/services/resource_distributor/rds/tests/sot/test_sot_factory.py b/orm/services/resource_distributor/rds/tests/sot/test_sot_factory.py
new file mode 100644
index 00000000..8c1e6ef5
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/sot/test_sot_factory.py
@@ -0,0 +1,54 @@
+import unittest
+import mock
+
+from rds.sot import sot_factory
+from rds.sot.git_sot.git_sot import GitSoT
+
+
+class SoTFactoryTests(unittest.TestCase):
+    def setUp(self):
+        super(SoTFactoryTests, self).setUp()
+        self.addCleanup(mock.patch.stopall)
+        git_factory = mock.MagicMock()
+        git_factory.get_git_impl = mock.MagicMock()
+
+    def test_get_sot_no_sot_type(self):
+        """Check that a runtime error is raised if no git type
+            is available from config"""
+        sot_factory.sot_type = ""
+        with self.assertRaises(RuntimeError):
+            sot_factory.get_sot()
+
+    def test_get_sot_git_type(self):
+        """ Check that when 'git' type is provided the returned object
+            is instance of  GiTSoT"""
+        sot_factory.sot_type = "git"
+        obj = sot_factory.get_sot()
+        self.assertIsInstance(obj, GitSoT)
+
+    def test_get_sot_git_sot_params(self):
+        sot_factory.sot_type = "git"
+        sot_factory.local_repository_path = "2"
+        sot_factory.relative_path_format = "3"
+        sot_factory.commit_message_format = "4"
+        sot_factory.commit_user = "5"
+        sot_factory.commit_email = "6"
+        sot_factory.git_server_url = "7"
+        sot_factory.git_type = "gittle"
+
+        obj = sot_factory.get_sot()
+        self.assertEqual(GitSoT.local_repository_path, "2", "local_repository_path not match")
+        self.assertEqual(GitSoT.relative_path_format, "3", "relative_path_format not match")
+        self.assertEqual(GitSoT.commit_message_format, "4", "commit_message_format not match")
+        self.assertEqual(GitSoT.commit_user, "5", "commit_user not match")
+        self.assertEqual(GitSoT.commit_email, "6", "commit_email not match")
+        self.assertEqual(GitSoT.git_server_url, "7", "git_server_url not match")
+        self.assertEqual(GitSoT.git_type, "gittle", "git_type not match")
+
+
+
+
+
+
+
+
diff --git a/orm/services/resource_distributor/rds/tests/storage/__init__.py b/orm/services/resource_distributor/rds/tests/storage/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/tests/storage/mysql/__init__.py b/orm/services/resource_distributor/rds/tests/storage/mysql/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/tests/storage/mysql/test_region_resource_id_status.py b/orm/services/resource_distributor/rds/tests/storage/mysql/test_region_resource_id_status.py
new file mode 100755
index 00000000..def02faa
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/storage/mysql/test_region_resource_id_status.py
@@ -0,0 +1,215 @@
+"""Unittest module for mysql.region_resource_id_status."""
+import time
+
+import mock
+from mock import patch
+
+from rds.storage.mysql import region_resource_id_status
+import unittest
+
+
+class RecordMock(object):
+    def __init__(self, record=None):
+        self._record = record
+        self.timestamp = 0
+        self.status = "Submitted"
+        self.err_msg = "test"
+        self.region = "1"
+        self.transaction_id = "2"
+        self.resource_id = "3"
+        self.ord_notifier = "4"
+        self.err_code = 1
+        self.operation = "create"
+        self.resource_extra_metadata = None
+
+    def first(self):
+        return self._record
+
+    def delete(self):
+        return
+
+
+class MyFacade(object):
+    """Mock EngineFacade class."""
+
+    def __init__(self, dup_entry=False,
+                 record_exist=False,
+                 is_get_records=False):
+        """Initialize the object."""
+        self._is_dup_entry = dup_entry
+        self._is_record_exist = record_exist
+        self._is_get_records = is_get_records
+
+    def get_session(self):
+
+        session = mock.MagicMock()
+        if self._is_dup_entry:
+            dup_ent = region_resource_id_status.oslo_db.exception.DBDuplicateEntry
+            session.add = mock.MagicMock(side_effect=dup_ent('test'))
+
+        records = None
+        my_record = RecordMock()
+        if self._is_record_exist:
+            my_record = RecordMock(mock.MagicMock())
+            records = [RecordMock()]
+
+        my_filter = mock.MagicMock()
+        if not self._is_get_records:
+            my_filter.filter_by = mock.MagicMock(return_value=my_record)
+        else:
+            my_filter.filter_by = mock.MagicMock(return_value=records)
+
+        session.query = mock.MagicMock(return_value=my_filter)
+
+        return session
+
+
+class MysqlRegionResourceIdStatusTest(unittest.TestCase):
+    """Main test case of this module."""
+
+    @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade',
+                       return_value=MyFacade(False, True))
+    def test_add_update_status_record_record_exist_sanity(self, mock_db_session):
+        """Test that no exception is raised when calling add_update_status_record.
+        where record exist"""
+        my_connection = region_resource_id_status.Connection('url')
+        my_connection.add_update_status_record('timestamp',
+                                               'region',
+                                               'status',
+                                               'transaction_id',
+                                               'resource_id',
+                                               'ord_notifier',
+                                               'err_msg',
+                                               'err_code',
+                                               {"checksum": "1",
+                                                "virtual_size": "2",
+                                                "size": "3"})
+
+    @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade',
+                       return_value=MyFacade())
+    def test_add_update_status_record_record_not_exist_sanity(self, mock_db_session):
+        """Test that no exception is raised when calling add_update_status_record.
+        where record does not exist"""
+        my_connection = region_resource_id_status.Connection('url')
+        my_connection.add_update_status_record('timestamp',
+                                               'region',
+                                               'status',
+                                               'transaction_id',
+                                               'resource_id',
+                                               'ord_notifier',
+                                               'err_msg',
+                                               'create',
+                                               'err_code')
+
+    @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade',
+                       return_value=MyFacade(True,False))
+    def test_add_update_status_record_duplicate_entry(self, mock_db_session):
+        """No exception is raised when trying to add a duplicate entry."""
+        my_connection = region_resource_id_status.Connection('url')
+        my_connection.add_update_status_record('timestamp',
+                                               'region',
+                                               'status',
+                                               'transaction_id',
+                                               'resource_id',
+                                               'ord_notifier',
+                                               'err_msg',
+                                               'delete',
+                                               'err_code')
+
+    @mock.patch.object(region_resource_id_status, 'StatusModel')
+    @patch.object(region_resource_id_status.Connection,
+                  'get_timstamp_pair',
+                  return_value=(1,2))
+    @mock.patch.object(region_resource_id_status, 'Model')
+    @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade',
+                       return_value=MyFacade(False,False,True))
+    def test_get_records_by_filter_args_no_records(self, mock_db_session,
+                                                   mock_get_timestamp,
+                                                   mock_model,
+                                                   mock_statusmodel):
+        """Test that the function returns None when it got no records."""
+        my_connection = region_resource_id_status.Connection('url')
+        self.assertIsNone(my_connection.get_records_by_filter_args())
+
+    @mock.patch.object(region_resource_id_status, 'StatusModel')
+    @patch.object(region_resource_id_status.Connection,
+                  'get_timstamp_pair',
+                  return_value=(1, 2))
+    @mock.patch.object(region_resource_id_status, 'Model')
+    @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade',
+                       return_value=MyFacade(False, True, True))
+    def test_get_records_by_filter_args_with_records(self, mock_db_session,
+                                                   mock_get_timestamp,
+                                                   mock_model,
+                                                   mock_statusmodel):
+        """Test that the function returns None when it got records."""
+        my_connection = region_resource_id_status.Connection('url')
+        my_connection.get_records_by_filter_args()
+
+    @mock.patch.object(region_resource_id_status, 'StatusModel')
+    @patch.object(region_resource_id_status.Connection,
+                  'get_timstamp_pair',
+                  return_value=(1, 2))
+    @mock.patch.object(region_resource_id_status, 'Model')
+    @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade',
+                       return_value=MyFacade(False, False, True))
+    def test_get_records_by_resource_id_sanity(self, mock_db_session,
+                                                   mock_get_timestamp,
+                                                   mock_model,
+                                                   mock_statusmodel):
+        """No exception is raised when calling get_records_by_resource_id."""
+        my_connection = region_resource_id_status.Connection('url')
+        my_connection.get_records_by_resource_id('test')
+
+    @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade',
+                       return_value=MyFacade())
+    @patch.object(time, 'time', return_value=80)
+    @mock.patch.object(region_resource_id_status, 'conf')
+    def test_get_timstamp_pair_sanity(self, db_session, time_mock, conf_mock):
+        """Test get_timestamp_pair"""
+        conf_mock.region_resource_id_status.max_interval_time.default = 1
+        my_connection = region_resource_id_status.Connection('url')
+        (timestamp, ref_timestamp) = my_connection.get_timstamp_pair()
+        self.assertEqual(timestamp, 80000)
+
+    @mock.patch.object(region_resource_id_status, 'StatusModel')
+    @patch.object(region_resource_id_status.Connection,
+                  'get_timstamp_pair',
+                  return_value=(1, 2))
+    @mock.patch.object(region_resource_id_status, 'Model')
+    @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade',
+                       return_value=MyFacade(False, False, True))
+    def test_get_records_by_resource_id_and_status_no_records(self, mock_db_session,
+                                                              mock_get_timestamp,
+                                                              mock_model,
+                                                              mock_statusmodel):
+        """Test that the function returns None when it got no records."""
+        my_connection = region_resource_id_status.Connection('url')
+        self.assertIsNone(my_connection.get_records_by_resource_id_and_status('1', '2'))
+
+    @mock.patch.object(region_resource_id_status, 'StatusModel')
+    @patch.object(region_resource_id_status.Connection, 'get_timstamp_pair',
+                  return_value=(1, 2))
+    @mock.patch.object(region_resource_id_status, 'Model')
+    @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade',
+                       return_value=MyFacade(False, True, True))
+    def test_get_records_by_resource_id_and_status_sanity(self, mock_db_session,
+                                                                mock_get_timestamp,
+                                                                mock_model,
+                                                                mock_statusmodel):
+        my_connection = region_resource_id_status.Connection('url')
+        my_connection.get_records_by_resource_id_and_status('1', '2')
+
+    @mock.patch.object(region_resource_id_status, 'StatusModel')
+    @patch.object(region_resource_id_status.Connection, 'get_timstamp_pair',
+                  return_value=(1, 0))
+    @mock.patch.object(region_resource_id_status, 'Model')
+    @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade',
+                       return_value=MyFacade(False, True, True))
+    def test_get_records_by_resource_id_and_status_with_records(self, mock_db_session,
+                                                                mock_get_timestamp,
+                                                                mock_model,
+                                                                mock_statusmodel):
+        my_connection = region_resource_id_status.Connection('url')
+        my_connection.get_records_by_resource_id_and_status('1', '2')
+
diff --git a/orm/services/resource_distributor/rds/tests/storage/test_region_resource_id_status.py b/orm/services/resource_distributor/rds/tests/storage/test_region_resource_id_status.py
new file mode 100644
index 00000000..82245fea
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/storage/test_region_resource_id_status.py
@@ -0,0 +1,21 @@
+import unittest
+
+from rds.storage.region_resource_id_status import Base
+
+
+class BaseStorageTests(unittest.TestCase):
+
+    def test_storage_add_status_record_not_implemented(self):
+        """ Check if creating an instance and calling add_update_status_record method fail"""
+        with self.assertRaises(Exception):
+            Base("").add_update_status_record('1','2','3','4','5','6','7','8')
+
+    def test_storage_get_records_by_resource_id_implemented(self):
+        """ Check if creating an instance and calling get_records_by_resource_id method fail"""
+        with self.assertRaises(Exception):
+            Base("").get_records_by_resource_id('1')
+
+    def test_storage_get_records_by_filter_args_implemented(self):
+        """ Check if creating an instance and calling get_records_by_filter_args method fail"""
+        with self.assertRaises(Exception):
+            Base("").get_records_by_filter_args(abc="def")
diff --git a/orm/services/resource_distributor/rds/tests/utils/__init__.py b/orm/services/resource_distributor/rds/tests/utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/tests/utils/test_uuid_utils.py b/orm/services/resource_distributor/rds/tests/utils/test_uuid_utils.py
new file mode 100755
index 00000000..b05f30fe
--- /dev/null
+++ b/orm/services/resource_distributor/rds/tests/utils/test_uuid_utils.py
@@ -0,0 +1,30 @@
+"""UUID utils test module."""
+
+import mock
+from rds.utils import uuid_utils
+import unittest
+
+
+class MyResponse(object):
+    """A test response class."""
+
+    def json(self):
+        """Return the test dict."""
+        return {'uuid': 3}
+
+
+# class UuidUtilsTest(unittest.TestCase):
+#     """The main UUID utils test case."""
+#
+#     @mock.patch.object(uuid_utils, 'config')
+#     @mock.patch.object(uuid_utils.requests, 'post', return_value=MyResponse())
+#     def test_get_random_uuid_sanity(self, mock_post, mock_config):
+#         """Test that the function returns the expected value."""
+#         self.assertEqual(uuid_utils.get_random_uuid(), 3)
+#
+#     @mock.patch.object(uuid_utils, 'config')
+#     @mock.patch.object(uuid_utils.requests, 'post', side_effect=ValueError(
+#         'test'))
+#     def test_get_random_uuid_exception(self, mock_post, mock_config):
+#         """Test that the function lets exceptions propagate."""
+#         self.assertRaises(ValueError, uuid_utils.get_random_uuid)
diff --git a/orm/services/resource_distributor/rds/utils/__init__.py b/orm/services/resource_distributor/rds/utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/utils/authentication.py b/orm/services/resource_distributor/rds/utils/authentication.py
new file mode 100755
index 00000000..e2266a7b
--- /dev/null
+++ b/orm/services/resource_distributor/rds/utils/authentication.py
@@ -0,0 +1,111 @@
+import logging
+import requests
+import json
+from pecan import conf
+from keystone_utils import tokens
+from rds.proxies import rms_proxy as RmsService
+
+
+enabled = False
+mech_id = ""
+mech_password = False
+rms_url = ""
+tenant_name = ""
+
+
+headers = {'content-type': 'application/json'}
+
+
+logger = logging.getLogger(__name__)
+
+
+def _is_authorization_enabled():
+    return conf.authentication.enabled
+
+
+def _get_token_conf():
+    conf = tokens.TokenConf(mech_id, mech_password, rms_url, tenant_name)
+    return conf
+
+
+def get_keystone_ep_region_name():
+    # get any region that hase keystone end point
+    logger.debug("get list of regions from rms")
+    regions  = RmsService.get_regions()
+    if not regions:
+        logger.error("failto get regions from rms")
+        return None, None
+    logger.debug("got {} regions".format(len(regions)))
+    keystone_ep = None
+    region_name = None
+    for region in regions['regions']:
+        for endpoint in region['endpoints']:
+            if endpoint['type'] == 'identity':
+                keystone_ep = endpoint['publicURL']
+                break
+        if keystone_ep:
+            region_name = region['name']
+            break
+    logger.debug("Got keystone_ep {} for region name {}".format(keystone_ep,
+                                                                region_name))
+    return region_name, keystone_ep
+
+
+def get_token():
+
+    logger.debug("create token")
+    if not _is_authorization_enabled():
+        return
+
+    region, keystone_ep = get_keystone_ep_region_name()
+    if not region or not keystone_ep:
+        log_message = "fail to create token reason -- fail to get region-- " \
+                      "region:{} keystone {}".format(region, keystone_ep)
+        log_message = log_message.replace('\n', '_').replace('\r', '_')
+        logger.error(log_message)
+        return
+
+    url = keystone_ep + '/v2.0/tokens'
+    logger.debug("url :- {}".format(url))
+    data = {
+        "auth": {
+            "tenantName": conf.authentication.tenant_name,
+            "passwordCredentials": {
+                "username": conf.authentication.mech_id,
+                "password": conf.authentication.mech_pass
+            }
+        }
+    }
+    try:
+        logger.debug("get token url- {} data= {}".format(url, data))
+        respone = requests.post(url, data=json.dumps(data), headers=headers,
+                                verify=conf.verify)
+
+        if respone.status_code != 200:
+            logger.error("fail to get token from url")
+        logger.debug("got token for region {}".format(region))
+        return region, respone.json()['access']['token']['id']
+
+    except Exception as exp:
+        logger.error(exp)
+        logger.exception(exp)
+
+
+def check_permissions(token_to_validate, lcp_id):
+    logger.debug("Check permissions...start")
+    try:
+        if _is_authorization_enabled():
+            token_conf = _get_token_conf()
+            logger.debug("Authorization: validating token=[{}] on lcp_id=[{}]".format(token_to_validate, lcp_id))
+            is_permitted = tokens.is_token_valid(token_to_validate, lcp_id, token_conf)
+            logger.debug("Authorization: The token=[{}] on lcp_id=[{}] is [{}]".format(token_to_validate, lcp_id, "valid" if is_permitted else  "invalid"))
+        else:
+            logger.debug("The authentication service is disabled. No authentication is needed.")
+            is_permitted = True
+    except Exception as e:
+        msg = "Fail to validate request. due to {}.".format(e.message)
+        logger.error(msg)
+        logger.exception(e)
+        is_permitted = False
+    logger.debug("Check permissions...end")
+    return is_permitted
diff --git a/orm/services/resource_distributor/rds/utils/module_mocks/README.txt b/orm/services/resource_distributor/rds/utils/module_mocks/README.txt
new file mode 100644
index 00000000..87ddd695
--- /dev/null
+++ b/orm/services/resource_distributor/rds/utils/module_mocks/README.txt
@@ -0,0 +1,3 @@
+This directory contains mock modules for modules that are outside of this repository.
+The relative path to this directory should be included in PYTHONPATH whenever running tests (in tox.ini, for example).
+
diff --git a/orm/services/resource_distributor/rds/utils/module_mocks/__init__.py b/orm/services/resource_distributor/rds/utils/module_mocks/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/utils/module_mocks/audit_client/__init__.py b/orm/services/resource_distributor/rds/utils/module_mocks/audit_client/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/utils/module_mocks/audit_client/api/__init__.py b/orm/services/resource_distributor/rds/utils/module_mocks/audit_client/api/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/utils/module_mocks/audit_client/api/audit.py b/orm/services/resource_distributor/rds/utils/module_mocks/audit_client/api/audit.py
new file mode 100644
index 00000000..ec483bdd
--- /dev/null
+++ b/orm/services/resource_distributor/rds/utils/module_mocks/audit_client/api/audit.py
@@ -0,0 +1,6 @@
+def audit(*args, **kwargs):
+    pass
+
+
+def init(*args, **kwargs):
+    pass
diff --git a/orm/services/resource_distributor/rds/utils/module_mocks/keystone_utils/__init__.py b/orm/services/resource_distributor/rds/utils/module_mocks/keystone_utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/utils/module_mocks/keystone_utils/tokens.py b/orm/services/resource_distributor/rds/utils/module_mocks/keystone_utils/tokens.py
new file mode 100755
index 00000000..99708117
--- /dev/null
+++ b/orm/services/resource_distributor/rds/utils/module_mocks/keystone_utils/tokens.py
@@ -0,0 +1,6 @@
+def is_token_valid(token_to_validate, lcp_id, conf, token_role):
+    pass
+
+
+def TokenConf(mech_id, mech_password, rms_url, tenant_name, keystone_version):
+    pass
diff --git a/orm/services/resource_distributor/rds/utils/module_mocks/orm_common/__init__.py b/orm/services/resource_distributor/rds/utils/module_mocks/orm_common/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/utils/module_mocks/orm_common/utils/__init__.py b/orm/services/resource_distributor/rds/utils/module_mocks/orm_common/utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/services/resource_distributor/rds/utils/module_mocks/orm_common/utils/utils.py b/orm/services/resource_distributor/rds/utils/module_mocks/orm_common/utils/utils.py
new file mode 100755
index 00000000..364e5d0a
--- /dev/null
+++ b/orm/services/resource_distributor/rds/utils/module_mocks/orm_common/utils/utils.py
@@ -0,0 +1,14 @@
+"""Utils module mock."""
+
+
+def report_config(conf, dump=False):
+    """Mock report_config function."""
+
+    pass
+
+
+def set_utils_conf(conf):
+    """Mock set_utils_conf function."""
+
+    pass
+
diff --git a/orm/services/resource_distributor/rds/utils/utils.py b/orm/services/resource_distributor/rds/utils/utils.py
new file mode 100755
index 00000000..3529d9b1
--- /dev/null
+++ b/orm/services/resource_distributor/rds/utils/utils.py
@@ -0,0 +1,73 @@
+"""module"""
+import logging
+import requests
+from pecan import conf
+from rds.services.base import ErrorMesage
+from rds.proxies import ims_proxy
+
+logger = logging.getLogger(__name__)
+
+
+def post_data_to_image(data):
+    if data['resource_type'] == "image" and 'resource_extra_metadata' in data:
+        logger.debug("send metadata {} to ims :- {} for region {}".format(
+            data['resource_extra_metadata'], data['resource_id'], data['region']))
+
+        ims_proxy.send_image_metadata(
+            meta_data=data['resource_extra_metadata'],
+            resource_id=data['resource_id'], region=data['region'])
+
+    return
+
+
+def _get_all_rms_regions():
+    # rms url
+    discover_url = '%s:%d' % (conf.ordupdate.discovery_url,
+                              conf.ordupdate.discovery_port,)
+    # get all regions
+    response = requests.get('%s/v2/orm/regions' % (discover_url),
+                            verify=conf.verify)
+
+    if response.status_code != 200:
+        # fail to get regions
+        error = "got bad response from rms {}".format(response)
+        logger.error(error)
+        raise ErrorMesage(message="got bad response from rms ")
+
+    return response.json()
+
+
+def _validate_version(region, resource_type):
+    version = None
+    if 'ranger_agent' in region['version'].lower():
+        version = region['version'].lower().split('aic')[1].strip().split('.')
+        version = version[0] + '.' + ''.join(version[1:])
+    if not version or float(version) < 3:
+        return False
+    return True
+
+
+def add_rms_status_to_regions(resource_regions, resource_type):
+    rms_regions = {}
+    all_regions = _get_all_rms_regions()
+
+    # iterate through rms regions and gett regions status and version
+    for region in all_regions['regions']:
+        rms_regions[region['name']] = {'status': region['status'],
+                                       'version': region['rangerAgentVersion']}
+
+    # iterate through resource regions and add to them rms status
+    for region in resource_regions:
+        if region['name'] in rms_regions:
+            # check if version valid
+            if not _validate_version(rms_regions[region['name']],
+                                     resource_type):
+                raise ErrorMesage(
+                    message="ranger_agent version for region {} must be >=1.0 ".format(
+                        region['name']))
+
+            region['rms_status'] = rms_regions[region['name']]['status']
+            continue
+        # if region not found in rms
+        region['rms_status'] = "region_not_found_in_rms"
+    return resource_regions
diff --git a/orm/services/resource_distributor/rds/utils/uuid_utils.py b/orm/services/resource_distributor/rds/utils/uuid_utils.py
new file mode 100755
index 00000000..66b45196
--- /dev/null
+++ b/orm/services/resource_distributor/rds/utils/uuid_utils.py
@@ -0,0 +1,8 @@
+import requests
+
+from pecan import conf
+
+
+def get_random_uuid():
+    response = requests.post(conf.UUID_URL, verify=conf.verify)
+    return response.json()['uuid']
diff --git a/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/README.md b/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/README.md
new file mode 100644
index 00000000..d94aa385
--- /dev/null
+++ b/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/README.md
@@ -0,0 +1,24 @@
+# Swagger generated server
+
+## Overview
+This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project.  By using the [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate a server stub.  This is an example of building a node.js server.
+
+This example uses the [expressjs](http://expressjs.com/) framework.  To see how to make this your own, look here:
+
+[README](https://github.com/swagger-api/swagger-codegen/blob/master/README.md)
+
+### Running the server
+To run the server, follow these simple steps:
+
+```
+npm install
+node .
+```
+
+To view the Swagger UI interface:
+
+```
+open http://localhost:8080/docs
+```
+
+This project leverages the mega-awesome [swagger-tools](https://github.com/apigee-127/swagger-tools) middleware which does most all the work.
diff --git a/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/api/swagger.yaml b/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/api/swagger.yaml
new file mode 100644
index 00000000..31001e3a
--- /dev/null
+++ b/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/api/swagger.yaml
@@ -0,0 +1,296 @@
+---
+swagger: "2.0"
+info:
+  description: "RDS API"
+  version: "1.0.0"
+  title: "RDS API"
+host: "server"
+basePath: "/v1"
+schemes:
+- "http"
+consumes:
+- "application/json"
+produces:
+- "application/json"
+paths:
+  /resources:
+    post:
+      tags:
+      - "Resources"
+      summary: "New Resource"
+      description: "Creates new resource\n"
+      operationId: "resourcesPOST"
+      parameters:
+      - in: "body"
+        name: "resource"
+        description: "The new resource"
+        required: true
+        schema:
+          $ref: "#/definitions/Resource"
+      responses:
+        201:
+          description: "Created"
+          schema:
+            $ref: "#/definitions/CreatedResource"
+        default:
+          description: "Unexpected error"
+          schema:
+            $ref: "#/definitions/Error"
+      x-swagger-router-controller: "Resources"
+    delete:
+      tags:
+      - "Resources"
+      summary: "Update resource"
+      description: "Update resource\n"
+      operationId: "resourcesDELETE"
+      parameters:
+      - in: "body"
+        name: "resource"
+        description: "The new resource to update"
+        required: true
+        schema:
+          $ref: "#/definitions/Resource"
+      responses:
+        200:
+          description: "OK"
+          schema:
+            type: "string"
+        default:
+          description: "Unexpected error"
+          schema:
+            $ref: "#/definitions/Error"
+      x-swagger-router-controller: "Resources"
+  /status:
+    post:
+      tags:
+      - "Status"
+      summary: "New resource status"
+      description: "Creates new resource status\n"
+      operationId: "statusPOST"
+      parameters:
+      - in: "body"
+        name: "status_input"
+        description: "New resoure status"
+        required: true
+        schema:
+          $ref: "#/definitions/StatusInput"
+      responses:
+        201:
+          description: "Created"
+        default:
+          description: "Unexpected error"
+          schema:
+            $ref: "#/definitions/Error"
+      x-swagger-router-controller: "Status"
+  /status/resource/{id}:
+    get:
+      tags:
+      - "Status"
+      summary: "Get resource status"
+      description: "Get resource status\n"
+      operationId: "statusResourceIdGET"
+      parameters:
+      - name: "id"
+        in: "path"
+        description: "resource id"
+        required: true
+        type: "string"
+      responses:
+        200:
+          description: "resource status"
+          schema:
+            $ref: "#/definitions/ResourceStatus"
+        default:
+          description: "Unexpected error"
+          schema:
+            $ref: "#/definitions/Error"
+      x-swagger-router-controller: "Status"
+definitions:
+  Resource:
+    type: "object"
+    required:
+    - "service_template"
+    properties:
+      service_template:
+        $ref: "#/definitions/ResourceData"
+  ResourceData:
+    type: "object"
+    required:
+    - "model"
+    - "resource"
+    - "tracking"
+    properties:
+      resource:
+        $ref: "#/definitions/ResourceTypeData"
+      model:
+        type: "string"
+        description: "model"
+      tracking:
+        $ref: "#/definitions/TrackingData"
+  ResourceTypeData:
+    type: "object"
+    required:
+    - "resource_type"
+    properties:
+      resource_type:
+        type: "string"
+        description: "resource type"
+      resource_id:
+        type: "string"
+        description: "resource id"
+  TrackingData:
+    type: "object"
+    required:
+    - "external_id"
+    - "tracking_id"
+    properties:
+      external_id:
+        type: "string"
+        description: "external id"
+      tracking_id:
+        type: "string"
+        description: "tracking id"
+  CreatedResource:
+    type: "object"
+    required:
+    - "id"
+    - "links"
+    properties:
+      id:
+        type: "string"
+        description: "id"
+      created:
+        type: "string"
+        description: "tracking id"
+      links:
+        $ref: "#/definitions/links"
+      updated:
+        type: "string"
+        description: "tracking id"
+      err:
+        type: "string"
+        description: "tracking id"
+      message:
+        type: "string"
+        description: "tracking id"
+  links:
+    type: "object"
+    required:
+    - "self"
+    properties:
+      self:
+        type: "string"
+        description: "self"
+  Error:
+    type: "object"
+    properties:
+      faultcode:
+        type: "string"
+      faultstring:
+        type: "string"
+      debuginfo:
+        type: "string"
+  StatusInput:
+    type: "object"
+    required:
+    - "rds_listener"
+    properties:
+      rds_listener:
+        $ref: "#/definitions/StatusResourceData"
+  StatusResourceData:
+    type: "object"
+    required:
+    - "error-code"
+    - "error-msg"
+    - "ord-notifier-id"
+    - "region"
+    - "request-id"
+    - "resource-id"
+    - "resource-operation"
+    - "resource-template-type"
+    - "resource-template-version"
+    - "resource-type"
+    - "status"
+    properties:
+      resource-id:
+        type: "string"
+        description: "resource id"
+      request-id:
+        type: "string"
+        description: "request id"
+      resource-type:
+        type: "string"
+        description: "resource type"
+      resource-template-version:
+        type: "string"
+        description: "resource template version"
+      resource-template-type:
+        type: "string"
+        description: "resource template type"
+      resource-operation:
+        type: "string"
+        description: "resource operation"
+      ord-notifier-id:
+        type: "string"
+        description: "ord notifier id"
+      region:
+        type: "string"
+        description: "region"
+      status:
+        type: "string"
+        description: "status"
+      error-code:
+        type: "string"
+        description: "error code"
+      error-msg:
+        type: "string"
+        description: "error msg"
+  ResourceStatus:
+    type: "object"
+    required:
+    - "regions"
+    - "status"
+    properties:
+      status:
+        type: "string"
+        description: "status"
+      regions:
+        type: "array"
+        items:
+          $ref: "#/definitions/OutputResource"
+  OutputResource:
+    type: "object"
+    required:
+    - "error_code"
+    - "error_msg"
+    - "ord_notifier_id"
+    - "ord_transaction_id"
+    - "region"
+    - "resource_id"
+    - "status"
+    - "timestamp"
+    properties:
+      region:
+        type: "string"
+        description: "region"
+      timestamp:
+        type: "string"
+        description: "timestamp"
+      ord_transaction_id:
+        type: "string"
+        description: "ord transaction id"
+      resource_id:
+        type: "string"
+        description: "resource id"
+      ord_notifier_id:
+        type: "string"
+        description: "ord notifier id"
+      status:
+        type: "string"
+        description: "status"
+      error_code:
+        type: "string"
+        description: "error code"
+      error_msg:
+        type: "string"
+        description: "error msg"
diff --git a/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/controllers/Resources.js b/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/controllers/Resources.js
new file mode 100644
index 00000000..bcb96cc5
--- /dev/null
+++ b/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/controllers/Resources.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var url = require('url');
+
+
+var Resources = require('./ResourcesService');
+
+
+module.exports.resourcesDELETE = function resourcesDELETE (req, res, next) {
+  Resources.resourcesDELETE(req.swagger.params, res, next);
+};
+
+module.exports.resourcesPOST = function resourcesPOST (req, res, next) {
+  Resources.resourcesPOST(req.swagger.params, res, next);
+};
diff --git a/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/controllers/ResourcesService.js b/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/controllers/ResourcesService.js
new file mode 100644
index 00000000..14f726ba
--- /dev/null
+++ b/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/controllers/ResourcesService.js
@@ -0,0 +1,53 @@
+'use strict';
+
+exports.resourcesDELETE = function(args, res, next) {
+  /**
+   * parameters expected in the args:
+  * resource (Resource)
+  **/
+  
+  
+  var examples = {};
+  examples['application/json'] = "aeiou";
+  
+  if(Object.keys(examples).length > 0) {
+    res.setHeader('Content-Type', 'application/json');
+    res.end(JSON.stringify(examples[Object.keys(examples)[0]] || {}, null, 2));
+  }
+  else {
+    res.end();
+  }
+  
+  
+}
+
+exports.resourcesPOST = function(args, res, next) {
+  /**
+   * parameters expected in the args:
+  * resource (Resource)
+  **/
+  
+  
+  var examples = {};
+  examples['application/json'] = {
+  "err" : "aeiou",
+  "created" : "aeiou",
+  "links" : {
+    "self" : "aeiou"
+  },
+  "id" : "aeiou",
+  "message" : "aeiou",
+  "updated" : "aeiou"
+};
+  
+  if(Object.keys(examples).length > 0) {
+    res.setHeader('Content-Type', 'application/json');
+    res.end(JSON.stringify(examples[Object.keys(examples)[0]] || {}, null, 2));
+  }
+  else {
+    res.end();
+  }
+  
+  
+}
+
diff --git a/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/controllers/Status.js b/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/controllers/Status.js
new file mode 100644
index 00000000..4bd1cc04
--- /dev/null
+++ b/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/controllers/Status.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var url = require('url');
+
+
+var Status = require('./StatusService');
+
+
+module.exports.statusPOST = function statusPOST (req, res, next) {
+  Status.statusPOST(req.swagger.params, res, next);
+};
+
+module.exports.statusResourceIdGET = function statusResourceIdGET (req, res, next) {
+  Status.statusResourceIdGET(req.swagger.params, res, next);
+};
diff --git a/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/controllers/StatusService.js b/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/controllers/StatusService.js
new file mode 100644
index 00000000..4d7f33a9
--- /dev/null
+++ b/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/controllers/StatusService.js
@@ -0,0 +1,46 @@
+'use strict';
+
+exports.statusPOST = function(args, res, next) {
+  /**
+   * parameters expected in the args:
+  * statusInput (StatusInput)
+  **/
+  // no response value expected for this operation
+  
+  
+  res.end();
+}
+
+exports.statusResourceIdGET = function(args, res, next) {
+  /**
+   * parameters expected in the args:
+  * id (String)
+  **/
+  
+  
+  var examples = {};
+  examples['application/json'] = {
+  "regions" : [ {
+    "ord_transaction_id" : "aeiou",
+    "error_msg" : "aeiou",
+    "resource_id" : "aeiou",
+    "error_code" : "aeiou",
+    "region" : "aeiou",
+    "timestamp" : "aeiou",
+    "ord_notifier_id" : "aeiou",
+    "status" : "aeiou"
+  } ],
+  "status" : "aeiou"
+};
+  
+  if(Object.keys(examples).length > 0) {
+    res.setHeader('Content-Type', 'application/json');
+    res.end(JSON.stringify(examples[Object.keys(examples)[0]] || {}, null, 2));
+  }
+  else {
+    res.end();
+  }
+  
+  
+}
+
diff --git a/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/index.js b/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/index.js
new file mode 100644
index 00000000..aaa873a1
--- /dev/null
+++ b/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/index.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var app = require('connect')();
+var http = require('http');
+var swaggerTools = require('swagger-tools');
+var jsyaml = require('js-yaml');
+var fs = require('fs');
+var serverPort = 8080;
+
+// swaggerRouter configuration
+var options = {
+  swaggerUi: '/swagger.json',
+  controllers: './controllers',
+  useStubs: process.env.NODE_ENV === 'development' ? true : false // Conditionally turn on stubs (mock mode)
+};
+
+// The Swagger document (require it, build it programmatically, fetch it from a URL, ...)
+var spec = fs.readFileSync('./api/swagger.yaml', 'utf8');
+var swaggerDoc = jsyaml.safeLoad(spec);
+
+// Initialize the Swagger middleware
+swaggerTools.initializeMiddleware(swaggerDoc, function (middleware) {
+  // Interpret Swagger resources and attach metadata to request - must be first in swagger-tools middleware chain
+  app.use(middleware.swaggerMetadata());
+
+  // Validate Swagger requests
+  app.use(middleware.swaggerValidator());
+
+  // Route validated requests to appropriate controller
+  app.use(middleware.swaggerRouter(options));
+
+  // Serve the Swagger documents and Swagger UI
+  app.use(middleware.swaggerUi());
+
+  // Start the server
+  http.createServer(app).listen(serverPort, function () {
+    console.log('Your server is listening on port %d (http://localhost:%d)', serverPort, serverPort);
+    console.log('Swagger-ui is available on http://localhost:%d/docs', serverPort);
+  });
+});
diff --git a/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/package.json b/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/package.json
new file mode 100644
index 00000000..02fd5509
--- /dev/null
+++ b/orm/services/resource_distributor/rds_docs/nodejs_rds_docs/package.json
@@ -0,0 +1,16 @@
+{
+  "name": "rds-api",
+  "version": "1.0.0",
+  "description": "RDS API",
+  "main": "index.js",
+  "keywords": [
+    "swagger"
+  ],
+  "license": "MIT",
+  "private": true,
+  "dependencies": {
+    "connect": "^3.2.0",
+    "js-yaml": "^3.3.0",
+    "swagger-tools": "0.9.*"
+  }
+}
diff --git a/orm/services/resource_distributor/rds_docs/rds_swagger.yaml b/orm/services/resource_distributor/rds_docs/rds_swagger.yaml
new file mode 100755
index 00000000..06b668db
--- /dev/null
+++ b/orm/services/resource_distributor/rds_docs/rds_swagger.yaml
@@ -0,0 +1,295 @@
+# this is the RDS API
+swagger: '2.0'
+info:
+  title: RDS API
+  description: RDS API
+  version: "3.5"
+# the domain of the service
+host: server
+# array of all schemes that your API supports
+schemes:
+  - http
+# will be prefixed to all paths
+basePath: /v1/rds
+consumes:
+  - application/json
+produces:
+  - application/json
+paths:
+  /resources:
+    post:
+      summary: New Resource
+      description: |
+        Creates new resource
+      parameters:
+        - name: resource
+          in: body
+          description: The new resource
+          required: true
+          schema:
+            $ref: "#/definitions/Resource"
+      tags:
+        - Resources
+      responses:
+        201:
+          description: Created
+          schema:
+              $ref: '#/definitions/CreatedResource'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+    delete:
+      summary: Update resource
+      description: |
+        Update resource
+      parameters:
+        - name: resource
+          in: body
+          description: The new resource to update
+          required: true
+          schema:
+            $ref: "#/definitions/Resource"
+      tags:
+        - Resources
+      responses:
+        200:
+          description: OK
+          schema:
+            type: string
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'  
+  /status:
+    post:
+      summary: New resource status 
+      description: |
+        Creates new resource status
+      parameters:
+        - name: status_input
+          in: body
+          description: New resoure status
+          required: true
+          schema:
+            $ref: "#/definitions/StatusInput"
+      tags:
+        - Status
+      responses:
+        201:
+          description: Created
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'  
+  /status/resource/{id}:
+    get:
+      summary: Get resource status
+      description: |
+        Get resource status
+      parameters:
+        - name: id
+          in: path
+          description: resource id
+          required: true
+          type: string
+      tags:
+        - Status
+      responses:
+        200:
+          description: resource status
+          schema:
+              $ref: '#/definitions/ResourceStatus'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'             
+definitions:
+  Resource:
+    type: object
+    required:
+      - service_template
+    properties:
+      service_template:
+        $ref: '#/definitions/ResourceData'
+  ResourceData:
+    type: object
+    required:
+      - resource
+      - model
+      - tracking
+    properties:
+      resource:
+         $ref: '#/definitions/ResourceTypeData'    
+      model:
+         type: string
+         description: model
+      tracking:
+         $ref: '#/definitions/TrackingData' 
+  ResourceTypeData:
+    type: object
+    required:
+      - resource_type
+    properties:
+      resource_type:
+         type: string
+         description: resource type
+      resource_id:
+         type: string
+         description: resource id  
+  TrackingData:
+    type: object
+    required:
+      - external_id
+      - tracking_id
+    properties:
+      external_id:
+         type: string
+         description: external id
+      tracking_id:
+         type: string
+         description: tracking id    
+  CreatedResource:
+    type: object
+    required:
+      - id
+      - links
+    properties:
+      id:
+         type: string
+         description: id
+      created:
+         type: string
+         description: tracking id      
+      links:
+         $ref: '#/definitions/links'   
+      updated:
+         type: string
+         description: tracking id   
+      err:
+         type: string
+         description: tracking id  
+      message:
+         type: string
+         description: tracking id 
+  links:
+    type: object
+    required:
+      - self
+    properties:
+      self:
+         type: string
+         description: self
+  Error:
+    type: object
+    properties:
+      faultcode:
+        type: string
+      faultstring:
+        type: string
+      debuginfo:
+        type: string
+  StatusInput:
+    type: object
+    required:
+      - rds_listener
+    properties:
+      rds_listener:
+        $ref: '#/definitions/StatusResourceData'   
+  StatusResourceData:
+    type: object
+    required:
+      - resource-id
+      - request-id
+      - resource-type
+      - resource-template-version
+      - resource-template-type
+      - resource-operation
+      - ord-notifier-id
+      - region
+      - status
+      - error-code
+      - error-msg
+    properties:
+      resource-id:
+         type: string
+         description: resource id
+      request-id:
+         type: string
+         description: request id (transaction ID received from RDS)
+      resource-type:
+         type: string
+         description: resource type (e.g., 'customer')
+      resource-template-version:
+         type: string
+         description: resource template version (Git commit ID)
+      resource-template-type:
+         type: string
+         description: resource template type
+      resource-operation:
+         type: string
+         description: resource operation
+      ord-notifier-id:
+         type: string
+         description: ord notifier id
+      region:
+         type: string
+         description: region
+      status:
+         type: string
+         description: status
+      error-code:
+         type: string
+         description: error code
+      error-msg:
+         type: string
+         description: error msg
+  ResourceStatus:
+    type: object
+    required:
+      - status
+      - regions
+    properties:
+      status:
+        type: string
+        description: status    
+      regions:
+        type: array
+        items:
+          $ref: '#/definitions/OutputResource'  
+  OutputResource:
+    type: object
+    required:
+      - region
+      - timestamp
+      - ord_transaction_id
+      - resource_id
+      - ord_notifier_id
+      - status
+      - error_code
+      - error_msg
+    properties:
+      region:
+         type: string
+         description: region
+      timestamp:
+         type: string
+         description: timestamp
+      ord_transaction_id:
+         type: string
+         description: ord transaction id
+      resource_id:
+         type: string
+         description: resource id           
+      ord_notifier_id:
+         type: string
+         description: ord notifier id
+      status:
+         type: string
+         description: status
+      error_code:
+         type: string
+         description: error code  
+      error_msg:
+         type: string
+         description: error msg           
diff --git a/orm/services/resource_distributor/scripts/db_scripts/create_db.sql b/orm/services/resource_distributor/scripts/db_scripts/create_db.sql
new file mode 100755
index 00000000..9b58a5e5
--- /dev/null
+++ b/orm/services/resource_distributor/scripts/db_scripts/create_db.sql
@@ -0,0 +1,37 @@
+create database if not exists orm_rds DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+use orm_rds;
+
+
+#*****
+#* MySql script for Creating Table resource_status
+#*****
+
+create table if not exists resource_status
+(
+    id integer auto_increment not null,
+	timestamp bigint not null,
+	region varchar(64) not null,
+	resource_id varchar(64) not null,
+	status varchar(16) not null,
+	transaction_id varchar(64),
+	ord_notifier varchar(64) not null,
+	err_msg varchar(255),
+	err_code varchar(64),
+	operation varchar(64),
+	primary key (id),
+	unique(resource_id, region));
+
+#*****
+#* MySql script for Creating Table image_metadata
+#*****
+
+create table if not exists image_metadata
+(
+    image_meta_data_id integer not null,
+    checksum varchar(64) ,
+	virtual_size varchar(64) ,
+	size varchar(64) ,
+	foreign key (image_meta_data_id) references resource_status(id) ON DELETE CASCADE ON UPDATE NO ACTION,
+	primary key (image_meta_data_id));
+
+#
diff --git a/orm/services/resource_distributor/scripts/db_scripts/update_db.sql b/orm/services/resource_distributor/scripts/db_scripts/update_db.sql
new file mode 100755
index 00000000..05ba7230
--- /dev/null
+++ b/orm/services/resource_distributor/scripts/db_scripts/update_db.sql
@@ -0,0 +1,41 @@
+use orm_rds;
+
+
+DELIMITER ;;
+
+#*****
+#* MySql script for Creating Table image_metadata
+#*****
+DROP PROCEDURE IF EXISTS add_table_image_metadata ;;
+CREATE PROCEDURE add_table_image_metadata()
+BEGIN
+
+    create table if not exists image_metadata
+    (
+        image_meta_data_id integer not null,
+        checksum varchar(64) ,
+        virtual_size varchar(64) ,
+        size varchar(64) ,
+        foreign key (image_meta_data_id) references resource_status(id) ON DELETE CASCADE ON UPDATE NO ACTION,
+        primary key (image_meta_data_id));
+
+
+END ;;
+#
+#***********
+#* add operation field to resource_status table
+#***********
+
+DROP PROCEDURE IF EXISTS add_operation_in_resource_status ;;
+CREATE PROCEDURE add_operation_in_resource_status()
+BEGIN
+
+    IF NOT EXISTS( (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE()
+            AND COLUMN_NAME='operation' AND TABLE_NAME='resource_status') ) THEN
+            ALTER TABLE resource_status ADD operation varchar(64) DEFAULT '';
+    END IF;
+
+END ;;
+CALL add_operation_in_resource_status() ;;
+CALL add_table_image_metadata();;
+DELIMITER ;
\ No newline at end of file
diff --git a/orm/services/resource_distributor/scripts/shell_scripts/create_db.sh b/orm/services/resource_distributor/scripts/shell_scripts/create_db.sh
new file mode 100755
index 00000000..904ab727
--- /dev/null
+++ b/orm/services/resource_distributor/scripts/shell_scripts/create_db.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+echo Creating database: orm_rds
+echo Creating table: resource_status
+
+mysql -uroot -pstack < ../db_scripts/create_db.sql
+
+echo Done !
+
+
+
+
+
+
+
diff --git a/orm/services/resource_distributor/swagger/nodejs_rds_docs/README.md b/orm/services/resource_distributor/swagger/nodejs_rds_docs/README.md
new file mode 100644
index 00000000..d94aa385
--- /dev/null
+++ b/orm/services/resource_distributor/swagger/nodejs_rds_docs/README.md
@@ -0,0 +1,24 @@
+# Swagger generated server
+
+## Overview
+This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project.  By using the [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate a server stub.  This is an example of building a node.js server.
+
+This example uses the [expressjs](http://expressjs.com/) framework.  To see how to make this your own, look here:
+
+[README](https://github.com/swagger-api/swagger-codegen/blob/master/README.md)
+
+### Running the server
+To run the server, follow these simple steps:
+
+```
+npm install
+node .
+```
+
+To view the Swagger UI interface:
+
+```
+open http://localhost:8080/docs
+```
+
+This project leverages the mega-awesome [swagger-tools](https://github.com/apigee-127/swagger-tools) middleware which does most all the work.
diff --git a/orm/services/resource_distributor/swagger/nodejs_rds_docs/api/swagger.yaml b/orm/services/resource_distributor/swagger/nodejs_rds_docs/api/swagger.yaml
new file mode 100644
index 00000000..31001e3a
--- /dev/null
+++ b/orm/services/resource_distributor/swagger/nodejs_rds_docs/api/swagger.yaml
@@ -0,0 +1,296 @@
+---
+swagger: "2.0"
+info:
+  description: "RDS API"
+  version: "1.0.0"
+  title: "RDS API"
+host: "server"
+basePath: "/v1"
+schemes:
+- "http"
+consumes:
+- "application/json"
+produces:
+- "application/json"
+paths:
+  /resources:
+    post:
+      tags:
+      - "Resources"
+      summary: "New Resource"
+      description: "Creates new resource\n"
+      operationId: "resourcesPOST"
+      parameters:
+      - in: "body"
+        name: "resource"
+        description: "The new resource"
+        required: true
+        schema:
+          $ref: "#/definitions/Resource"
+      responses:
+        201:
+          description: "Created"
+          schema:
+            $ref: "#/definitions/CreatedResource"
+        default:
+          description: "Unexpected error"
+          schema:
+            $ref: "#/definitions/Error"
+      x-swagger-router-controller: "Resources"
+    delete:
+      tags:
+      - "Resources"
+      summary: "Update resource"
+      description: "Update resource\n"
+      operationId: "resourcesDELETE"
+      parameters:
+      - in: "body"
+        name: "resource"
+        description: "The new resource to update"
+        required: true
+        schema:
+          $ref: "#/definitions/Resource"
+      responses:
+        200:
+          description: "OK"
+          schema:
+            type: "string"
+        default:
+          description: "Unexpected error"
+          schema:
+            $ref: "#/definitions/Error"
+      x-swagger-router-controller: "Resources"
+  /status:
+    post:
+      tags:
+      - "Status"
+      summary: "New resource status"
+      description: "Creates new resource status\n"
+      operationId: "statusPOST"
+      parameters:
+      - in: "body"
+        name: "status_input"
+        description: "New resoure status"
+        required: true
+        schema:
+          $ref: "#/definitions/StatusInput"
+      responses:
+        201:
+          description: "Created"
+        default:
+          description: "Unexpected error"
+          schema:
+            $ref: "#/definitions/Error"
+      x-swagger-router-controller: "Status"
+  /status/resource/{id}:
+    get:
+      tags:
+      - "Status"
+      summary: "Get resource status"
+      description: "Get resource status\n"
+      operationId: "statusResourceIdGET"
+      parameters:
+      - name: "id"
+        in: "path"
+        description: "resource id"
+        required: true
+        type: "string"
+      responses:
+        200:
+          description: "resource status"
+          schema:
+            $ref: "#/definitions/ResourceStatus"
+        default:
+          description: "Unexpected error"
+          schema:
+            $ref: "#/definitions/Error"
+      x-swagger-router-controller: "Status"
+definitions:
+  Resource:
+    type: "object"
+    required:
+    - "service_template"
+    properties:
+      service_template:
+        $ref: "#/definitions/ResourceData"
+  ResourceData:
+    type: "object"
+    required:
+    - "model"
+    - "resource"
+    - "tracking"
+    properties:
+      resource:
+        $ref: "#/definitions/ResourceTypeData"
+      model:
+        type: "string"
+        description: "model"
+      tracking:
+        $ref: "#/definitions/TrackingData"
+  ResourceTypeData:
+    type: "object"
+    required:
+    - "resource_type"
+    properties:
+      resource_type:
+        type: "string"
+        description: "resource type"
+      resource_id:
+        type: "string"
+        description: "resource id"
+  TrackingData:
+    type: "object"
+    required:
+    - "external_id"
+    - "tracking_id"
+    properties:
+      external_id:
+        type: "string"
+        description: "external id"
+      tracking_id:
+        type: "string"
+        description: "tracking id"
+  CreatedResource:
+    type: "object"
+    required:
+    - "id"
+    - "links"
+    properties:
+      id:
+        type: "string"
+        description: "id"
+      created:
+        type: "string"
+        description: "tracking id"
+      links:
+        $ref: "#/definitions/links"
+      updated:
+        type: "string"
+        description: "tracking id"
+      err:
+        type: "string"
+        description: "tracking id"
+      message:
+        type: "string"
+        description: "tracking id"
+  links:
+    type: "object"
+    required:
+    - "self"
+    properties:
+      self:
+        type: "string"
+        description: "self"
+  Error:
+    type: "object"
+    properties:
+      faultcode:
+        type: "string"
+      faultstring:
+        type: "string"
+      debuginfo:
+        type: "string"
+  StatusInput:
+    type: "object"
+    required:
+    - "rds_listener"
+    properties:
+      rds_listener:
+        $ref: "#/definitions/StatusResourceData"
+  StatusResourceData:
+    type: "object"
+    required:
+    - "error-code"
+    - "error-msg"
+    - "ord-notifier-id"
+    - "region"
+    - "request-id"
+    - "resource-id"
+    - "resource-operation"
+    - "resource-template-type"
+    - "resource-template-version"
+    - "resource-type"
+    - "status"
+    properties:
+      resource-id:
+        type: "string"
+        description: "resource id"
+      request-id:
+        type: "string"
+        description: "request id"
+      resource-type:
+        type: "string"
+        description: "resource type"
+      resource-template-version:
+        type: "string"
+        description: "resource template version"
+      resource-template-type:
+        type: "string"
+        description: "resource template type"
+      resource-operation:
+        type: "string"
+        description: "resource operation"
+      ord-notifier-id:
+        type: "string"
+        description: "ord notifier id"
+      region:
+        type: "string"
+        description: "region"
+      status:
+        type: "string"
+        description: "status"
+      error-code:
+        type: "string"
+        description: "error code"
+      error-msg:
+        type: "string"
+        description: "error msg"
+  ResourceStatus:
+    type: "object"
+    required:
+    - "regions"
+    - "status"
+    properties:
+      status:
+        type: "string"
+        description: "status"
+      regions:
+        type: "array"
+        items:
+          $ref: "#/definitions/OutputResource"
+  OutputResource:
+    type: "object"
+    required:
+    - "error_code"
+    - "error_msg"
+    - "ord_notifier_id"
+    - "ord_transaction_id"
+    - "region"
+    - "resource_id"
+    - "status"
+    - "timestamp"
+    properties:
+      region:
+        type: "string"
+        description: "region"
+      timestamp:
+        type: "string"
+        description: "timestamp"
+      ord_transaction_id:
+        type: "string"
+        description: "ord transaction id"
+      resource_id:
+        type: "string"
+        description: "resource id"
+      ord_notifier_id:
+        type: "string"
+        description: "ord notifier id"
+      status:
+        type: "string"
+        description: "status"
+      error_code:
+        type: "string"
+        description: "error code"
+      error_msg:
+        type: "string"
+        description: "error msg"
diff --git a/orm/services/resource_distributor/swagger/nodejs_rds_docs/controllers/Resources.js b/orm/services/resource_distributor/swagger/nodejs_rds_docs/controllers/Resources.js
new file mode 100644
index 00000000..bcb96cc5
--- /dev/null
+++ b/orm/services/resource_distributor/swagger/nodejs_rds_docs/controllers/Resources.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var url = require('url');
+
+
+var Resources = require('./ResourcesService');
+
+
+module.exports.resourcesDELETE = function resourcesDELETE (req, res, next) {
+  Resources.resourcesDELETE(req.swagger.params, res, next);
+};
+
+module.exports.resourcesPOST = function resourcesPOST (req, res, next) {
+  Resources.resourcesPOST(req.swagger.params, res, next);
+};
diff --git a/orm/services/resource_distributor/swagger/nodejs_rds_docs/controllers/ResourcesService.js b/orm/services/resource_distributor/swagger/nodejs_rds_docs/controllers/ResourcesService.js
new file mode 100644
index 00000000..14f726ba
--- /dev/null
+++ b/orm/services/resource_distributor/swagger/nodejs_rds_docs/controllers/ResourcesService.js
@@ -0,0 +1,53 @@
+'use strict';
+
+exports.resourcesDELETE = function(args, res, next) {
+  /**
+   * parameters expected in the args:
+  * resource (Resource)
+  **/
+  
+  
+  var examples = {};
+  examples['application/json'] = "aeiou";
+  
+  if(Object.keys(examples).length > 0) {
+    res.setHeader('Content-Type', 'application/json');
+    res.end(JSON.stringify(examples[Object.keys(examples)[0]] || {}, null, 2));
+  }
+  else {
+    res.end();
+  }
+  
+  
+}
+
+exports.resourcesPOST = function(args, res, next) {
+  /**
+   * parameters expected in the args:
+  * resource (Resource)
+  **/
+  
+  
+  var examples = {};
+  examples['application/json'] = {
+  "err" : "aeiou",
+  "created" : "aeiou",
+  "links" : {
+    "self" : "aeiou"
+  },
+  "id" : "aeiou",
+  "message" : "aeiou",
+  "updated" : "aeiou"
+};
+  
+  if(Object.keys(examples).length > 0) {
+    res.setHeader('Content-Type', 'application/json');
+    res.end(JSON.stringify(examples[Object.keys(examples)[0]] || {}, null, 2));
+  }
+  else {
+    res.end();
+  }
+  
+  
+}
+
diff --git a/orm/services/resource_distributor/swagger/nodejs_rds_docs/controllers/Status.js b/orm/services/resource_distributor/swagger/nodejs_rds_docs/controllers/Status.js
new file mode 100644
index 00000000..4bd1cc04
--- /dev/null
+++ b/orm/services/resource_distributor/swagger/nodejs_rds_docs/controllers/Status.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var url = require('url');
+
+
+var Status = require('./StatusService');
+
+
+module.exports.statusPOST = function statusPOST (req, res, next) {
+  Status.statusPOST(req.swagger.params, res, next);
+};
+
+module.exports.statusResourceIdGET = function statusResourceIdGET (req, res, next) {
+  Status.statusResourceIdGET(req.swagger.params, res, next);
+};
diff --git a/orm/services/resource_distributor/swagger/nodejs_rds_docs/controllers/StatusService.js b/orm/services/resource_distributor/swagger/nodejs_rds_docs/controllers/StatusService.js
new file mode 100644
index 00000000..4d7f33a9
--- /dev/null
+++ b/orm/services/resource_distributor/swagger/nodejs_rds_docs/controllers/StatusService.js
@@ -0,0 +1,46 @@
+'use strict';
+
+exports.statusPOST = function(args, res, next) {
+  /**
+   * parameters expected in the args:
+  * statusInput (StatusInput)
+  **/
+  // no response value expected for this operation
+  
+  
+  res.end();
+}
+
+exports.statusResourceIdGET = function(args, res, next) {
+  /**
+   * parameters expected in the args:
+  * id (String)
+  **/
+  
+  
+  var examples = {};
+  examples['application/json'] = {
+  "regions" : [ {
+    "ord_transaction_id" : "aeiou",
+    "error_msg" : "aeiou",
+    "resource_id" : "aeiou",
+    "error_code" : "aeiou",
+    "region" : "aeiou",
+    "timestamp" : "aeiou",
+    "ord_notifier_id" : "aeiou",
+    "status" : "aeiou"
+  } ],
+  "status" : "aeiou"
+};
+  
+  if(Object.keys(examples).length > 0) {
+    res.setHeader('Content-Type', 'application/json');
+    res.end(JSON.stringify(examples[Object.keys(examples)[0]] || {}, null, 2));
+  }
+  else {
+    res.end();
+  }
+  
+  
+}
+
diff --git a/orm/services/resource_distributor/swagger/nodejs_rds_docs/index.js b/orm/services/resource_distributor/swagger/nodejs_rds_docs/index.js
new file mode 100644
index 00000000..aaa873a1
--- /dev/null
+++ b/orm/services/resource_distributor/swagger/nodejs_rds_docs/index.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var app = require('connect')();
+var http = require('http');
+var swaggerTools = require('swagger-tools');
+var jsyaml = require('js-yaml');
+var fs = require('fs');
+var serverPort = 8080;
+
+// swaggerRouter configuration
+var options = {
+  swaggerUi: '/swagger.json',
+  controllers: './controllers',
+  useStubs: process.env.NODE_ENV === 'development' ? true : false // Conditionally turn on stubs (mock mode)
+};
+
+// The Swagger document (require it, build it programmatically, fetch it from a URL, ...)
+var spec = fs.readFileSync('./api/swagger.yaml', 'utf8');
+var swaggerDoc = jsyaml.safeLoad(spec);
+
+// Initialize the Swagger middleware
+swaggerTools.initializeMiddleware(swaggerDoc, function (middleware) {
+  // Interpret Swagger resources and attach metadata to request - must be first in swagger-tools middleware chain
+  app.use(middleware.swaggerMetadata());
+
+  // Validate Swagger requests
+  app.use(middleware.swaggerValidator());
+
+  // Route validated requests to appropriate controller
+  app.use(middleware.swaggerRouter(options));
+
+  // Serve the Swagger documents and Swagger UI
+  app.use(middleware.swaggerUi());
+
+  // Start the server
+  http.createServer(app).listen(serverPort, function () {
+    console.log('Your server is listening on port %d (http://localhost:%d)', serverPort, serverPort);
+    console.log('Swagger-ui is available on http://localhost:%d/docs', serverPort);
+  });
+});
diff --git a/orm/services/resource_distributor/swagger/nodejs_rds_docs/package.json b/orm/services/resource_distributor/swagger/nodejs_rds_docs/package.json
new file mode 100644
index 00000000..02fd5509
--- /dev/null
+++ b/orm/services/resource_distributor/swagger/nodejs_rds_docs/package.json
@@ -0,0 +1,16 @@
+{
+  "name": "rds-api",
+  "version": "1.0.0",
+  "description": "RDS API",
+  "main": "index.js",
+  "keywords": [
+    "swagger"
+  ],
+  "license": "MIT",
+  "private": true,
+  "dependencies": {
+    "connect": "^3.2.0",
+    "js-yaml": "^3.3.0",
+    "swagger-tools": "0.9.*"
+  }
+}
diff --git a/orm/services/resource_distributor/swagger/swagger.yaml b/orm/services/resource_distributor/swagger/swagger.yaml
new file mode 100755
index 00000000..06b668db
--- /dev/null
+++ b/orm/services/resource_distributor/swagger/swagger.yaml
@@ -0,0 +1,295 @@
+# this is the RDS API
+swagger: '2.0'
+info:
+  title: RDS API
+  description: RDS API
+  version: "3.5"
+# the domain of the service
+host: server
+# array of all schemes that your API supports
+schemes:
+  - http
+# will be prefixed to all paths
+basePath: /v1/rds
+consumes:
+  - application/json
+produces:
+  - application/json
+paths:
+  /resources:
+    post:
+      summary: New Resource
+      description: |
+        Creates new resource
+      parameters:
+        - name: resource
+          in: body
+          description: The new resource
+          required: true
+          schema:
+            $ref: "#/definitions/Resource"
+      tags:
+        - Resources
+      responses:
+        201:
+          description: Created
+          schema:
+              $ref: '#/definitions/CreatedResource'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'
+    delete:
+      summary: Update resource
+      description: |
+        Update resource
+      parameters:
+        - name: resource
+          in: body
+          description: The new resource to update
+          required: true
+          schema:
+            $ref: "#/definitions/Resource"
+      tags:
+        - Resources
+      responses:
+        200:
+          description: OK
+          schema:
+            type: string
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'  
+  /status:
+    post:
+      summary: New resource status 
+      description: |
+        Creates new resource status
+      parameters:
+        - name: status_input
+          in: body
+          description: New resoure status
+          required: true
+          schema:
+            $ref: "#/definitions/StatusInput"
+      tags:
+        - Status
+      responses:
+        201:
+          description: Created
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'  
+  /status/resource/{id}:
+    get:
+      summary: Get resource status
+      description: |
+        Get resource status
+      parameters:
+        - name: id
+          in: path
+          description: resource id
+          required: true
+          type: string
+      tags:
+        - Status
+      responses:
+        200:
+          description: resource status
+          schema:
+              $ref: '#/definitions/ResourceStatus'
+        default:
+          description: Unexpected error
+          schema:
+            $ref: '#/definitions/Error'             
+definitions:
+  Resource:
+    type: object
+    required:
+      - service_template
+    properties:
+      service_template:
+        $ref: '#/definitions/ResourceData'
+  ResourceData:
+    type: object
+    required:
+      - resource
+      - model
+      - tracking
+    properties:
+      resource:
+         $ref: '#/definitions/ResourceTypeData'    
+      model:
+         type: string
+         description: model
+      tracking:
+         $ref: '#/definitions/TrackingData' 
+  ResourceTypeData:
+    type: object
+    required:
+      - resource_type
+    properties:
+      resource_type:
+         type: string
+         description: resource type
+      resource_id:
+         type: string
+         description: resource id  
+  TrackingData:
+    type: object
+    required:
+      - external_id
+      - tracking_id
+    properties:
+      external_id:
+         type: string
+         description: external id
+      tracking_id:
+         type: string
+         description: tracking id    
+  CreatedResource:
+    type: object
+    required:
+      - id
+      - links
+    properties:
+      id:
+         type: string
+         description: id
+      created:
+         type: string
+         description: tracking id      
+      links:
+         $ref: '#/definitions/links'   
+      updated:
+         type: string
+         description: tracking id   
+      err:
+         type: string
+         description: tracking id  
+      message:
+         type: string
+         description: tracking id 
+  links:
+    type: object
+    required:
+      - self
+    properties:
+      self:
+         type: string
+         description: self
+  Error:
+    type: object
+    properties:
+      faultcode:
+        type: string
+      faultstring:
+        type: string
+      debuginfo:
+        type: string
+  StatusInput:
+    type: object
+    required:
+      - rds_listener
+    properties:
+      rds_listener:
+        $ref: '#/definitions/StatusResourceData'   
+  StatusResourceData:
+    type: object
+    required:
+      - resource-id
+      - request-id
+      - resource-type
+      - resource-template-version
+      - resource-template-type
+      - resource-operation
+      - ord-notifier-id
+      - region
+      - status
+      - error-code
+      - error-msg
+    properties:
+      resource-id:
+         type: string
+         description: resource id
+      request-id:
+         type: string
+         description: request id (transaction ID received from RDS)
+      resource-type:
+         type: string
+         description: resource type (e.g., 'customer')
+      resource-template-version:
+         type: string
+         description: resource template version (Git commit ID)
+      resource-template-type:
+         type: string
+         description: resource template type
+      resource-operation:
+         type: string
+         description: resource operation
+      ord-notifier-id:
+         type: string
+         description: ord notifier id
+      region:
+         type: string
+         description: region
+      status:
+         type: string
+         description: status
+      error-code:
+         type: string
+         description: error code
+      error-msg:
+         type: string
+         description: error msg
+  ResourceStatus:
+    type: object
+    required:
+      - status
+      - regions
+    properties:
+      status:
+        type: string
+        description: status    
+      regions:
+        type: array
+        items:
+          $ref: '#/definitions/OutputResource'  
+  OutputResource:
+    type: object
+    required:
+      - region
+      - timestamp
+      - ord_transaction_id
+      - resource_id
+      - ord_notifier_id
+      - status
+      - error_code
+      - error_msg
+    properties:
+      region:
+         type: string
+         description: region
+      timestamp:
+         type: string
+         description: timestamp
+      ord_transaction_id:
+         type: string
+         description: ord transaction id
+      resource_id:
+         type: string
+         description: resource id           
+      ord_notifier_id:
+         type: string
+         description: ord notifier id
+      status:
+         type: string
+         description: status
+      error_code:
+         type: string
+         description: error code  
+      error_msg:
+         type: string
+         description: error msg           
diff --git a/orm/services/resource_distributor/tox.ini b/orm/services/resource_distributor/tox.ini
new file mode 100755
index 00000000..9891056a
--- /dev/null
+++ b/orm/services/resource_distributor/tox.ini
@@ -0,0 +1,21 @@
+[tox]
+envlist = py27, cover
+
+[testenv:cover]
+
+deps = -r{toxinidir}/requirements.txt
+       -r{toxinidir}/test-requirements.txt
+
+install_command = pip install -U {opts} {packages}
+
+setenv = PYTHONPATH = {toxinidir}:{toxinidir}/rds/utils/module_mocks/
+
+commands =
+           python setup.py testr --slowest --coverage
+           coverage report --omit=rds/storage/factory.py,rds/api/app.py,rds/tests/*,rds/utils/authentication.py,rds/sot/sot_utils.py,rds/utils/module_mocks/*
+           coverage html  --omit=rds/storage/factory.py,rds/api/app.py,rds/tests/*,rds/utils/authentication.py,rds/sot/sot_utils.py,rds/utils/module_mocks/*
+
+[testenv:pep8]
+whitelist_externals=true
+commands=true
+
diff --git a/orm/swagger/__init__.py b/orm/swagger/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/templates/error.html b/orm/templates/error.html
new file mode 100644
index 00000000..f2d97961
--- /dev/null
+++ b/orm/templates/error.html
@@ -0,0 +1,12 @@
+<%inherit file="layout.html" />
+
+## provide definitions for blocks we want to redefine
+<%def name="title()">
+    Server Error ${status}
+</%def>
+
+## now define the body of the template
+    <header>
+        <h1>Server Error ${status}</h1>
+    </header>
+    <p>${message}</p>
diff --git a/orm/templates/index.html b/orm/templates/index.html
new file mode 100644
index 00000000..f17c3862
--- /dev/null
+++ b/orm/templates/index.html
@@ -0,0 +1,34 @@
+<%inherit file="layout.html" />
+
+## provide definitions for blocks we want to redefine
+<%def name="title()">
+    Welcome to Pecan!
+</%def>
+
+## now define the body of the template
+    <header>
+        <h1><img src="/images/logo.png" /></h1>
+    </header>
+
+    <div id="content">
+
+        <p>This is a sample Pecan project.</p>
+
+        <p>
+            Instructions for getting started can be found online at <a
+            href="http://pecanpy.org" target="window">pecanpy.org</a>
+        </p>
+
+        <p>
+            ...or you can search the documentation here:
+        </p>
+
+        <form method="POST" action="/">
+            <fieldset>
+                <input name="q" />
+                <input type="submit" value="Search" />
+            </fieldset>
+            <small>Enter search terms or a module, class or function name.</small>
+        </form>
+
+    </div>
diff --git a/orm/templates/layout.html b/orm/templates/layout.html
new file mode 100644
index 00000000..40908591
--- /dev/null
+++ b/orm/templates/layout.html
@@ -0,0 +1,22 @@
+<html>
+    <head>
+        <title>${self.title()}</title>
+        ${self.style()}
+        ${self.javascript()}
+    </head>
+    <body>
+        ${self.body()}
+    </body>
+</html>
+
+<%def name="title()">
+    Default Title
+</%def>
+
+<%def name="style()">
+    <link rel="stylesheet" type="text/css" media="screen" href="/css/style.css" />
+</%def>
+
+<%def name="javascript()">
+    <script language="text/javascript" src="/javascript/shared.js"></script>
+</%def>
diff --git a/orm/tests/__init__.py b/orm/tests/__init__.py
new file mode 100644
index 00000000..78ea5274
--- /dev/null
+++ b/orm/tests/__init__.py
@@ -0,0 +1,22 @@
+import os
+from unittest import TestCase
+from pecan import set_config
+from pecan.testing import load_test_app
+
+__all__ = ['FunctionalTest']
+
+
+class FunctionalTest(TestCase):
+    """
+    Used for functional tests where you need to test your
+    literal application and its integration with the framework.
+    """
+
+    def setUp(self):
+        self.app = load_test_app(os.path.join(
+            os.path.dirname(__file__),
+            'config.py'
+        ))
+
+    def tearDown(self):
+        set_config({}, overwrite=True)
diff --git a/orm/tests/config.py b/orm/tests/config.py
new file mode 100644
index 00000000..c72b6987
--- /dev/null
+++ b/orm/tests/config.py
@@ -0,0 +1,137 @@
+from fms_rest.tests.simple_hook_mock import SimpleHookMock
+
+global SimpleHookMock
+
+# Server Specific Configurations
+server = {
+    'port': '8082',
+    'host': '0.0.0.0',
+    'name': 'fms'
+}
+
+# Pecan Application Configurations
+app = {
+    'root': 'fms_rest.controllers.root.RootController',
+    'modules': ['fms_rest'],
+    'static_root': '%(confdir)s/public',
+    'template_path': '%(confdir)s/fms_rest/templates',
+    'debug': True,
+    'errors': {
+        '__force_dict__': True
+    },
+    'hooks': lambda: [SimpleHookMock()]
+}
+
+logging = {
+    'root': {'level': 'INFO', 'handlers': ['console']},
+    'loggers': {
+        'fms_rest': {'level': 'DEBUG', 'handlers': ['console'], 'propagate': False},
+        'pecan': {'level': 'DEBUG', 'handlers': ['console'], 'propagate': False},
+        'py.warnings': {'handlers': ['console']},
+        '__force_dict__': True
+    },
+    'handlers': {
+        'console': {
+            'level': 'DEBUG',
+            'class': 'logging.StreamHandler',
+            'formatter': 'color'
+        }
+    },
+    'formatters': {
+        'simple': {
+            'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]'
+                       '[%(threadName)s] %(message)s')
+        },
+        'color': {
+            '()': 'pecan.log.ColorFormatter',
+            'format': ('%(asctime)s [%(padded_color_levelname)s] [%(name)s]'
+                       '[%(threadName)s] %(message)s'),
+            '__force_dict__': True
+        }
+    }
+}
+
+database = {
+    'host': 'localhost',
+    'username': 'root',
+    'password': 'root',
+    'db_name': 'orm_fms_db',
+
+}
+
+# this table is for calculating default extra specs needed
+extra_spec_needed_table = {
+    "ns": {
+        "aggregate_instance_extra_specs____ns": "true",
+        "hw____mem_page_size": "large"
+    },
+    "nd": {
+        "aggregate_instance_extra_specs____nd": "true",
+        "hw____mem_page_size": "large"
+    },
+    "nv": {
+        "aggregate_instance_extra_specs____nv": "true",
+        "hw____mem_page_size": "large"
+    },
+    "gv": {
+        "aggregate_instance_extra_specs____gv": "true",
+        "aggregate_instance_extra_specs____c2": "true",
+        "hw____numa_nodes": "2"
+    },
+    "ss": {
+        "aggregate_instance_extra_specs____ss": "true"
+    }
+}
+
+# any key will be added to extra_spec_needed_table need to be added here
+default_extra_spec_calculated_table = {
+    "aggregate_instance_extra_specs____ns": "",
+    "aggregate_instance_extra_specs____nd": "",
+    "aggregate_instance_extra_specs____nv": "",
+    "aggregate_instance_extra_specs____gv": "",
+    "aggregate_instance_extra_specs____c2": "",
+    "aggregate_instance_extra_specs____ss": "",
+    "aggregate_instance_extra_specs____c2": "",
+    "aggregate_instance_extra_specs____c4": "",
+    "aggregate_instance_extra_specs____v": "",
+    "hw____mem_page_size": "",
+    "hw____cpu_policy": "",
+    "hw____numa_nodes": ""
+}
+
+database['connection_string'] = 'mysql://{0}:{1}@{2}:3306/{3}'.format(database['username'],
+                                                                      database['password'],
+                                                                      database['host'],
+                                                                      database['db_name'])
+
+application_root = 'http://localhost:{0}'.format(server['port'])
+
+api = {
+    'uuid_server': {
+        'base': 'http://127.0.0.1:8090/',
+        'uuids': 'v1/uuids'
+    },
+    'rds_server': {
+        'base': 'http://127.0.0.1:8777/',
+        'resources': 'v1/rds/resources',
+        'status': 'v1/rds/status/resource/'
+    },
+    'audit_server': {
+        'base': 'http://127.0.0.1:8776/',
+        'trans': 'v1/audit/transaction'
+    }
+
+}
+
+verify = False
+
+authentication = {
+    "enabled": False,
+    "mech_id": "admin",
+    "mech_pass": "stack",
+    "rms_url": "http://172.20.90.174:8080",
+    "tenant_name": "admin",
+    "keystone_version": "2.0",
+    # "policy_file": "/opt/app/orm/aic-orm-fms/fms_rest/etc/policy.json",
+    "policy_file": "/orm/aic-orm-fms/fms_rest/etc/policy.json"
+}
diff --git a/orm/tests/functional/__init__.py b/orm/tests/functional/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orm/tests/test_functional.py b/orm/tests/test_functional.py
new file mode 100644
index 00000000..8ecb5357
--- /dev/null
+++ b/orm/tests/test_functional.py
@@ -0,0 +1,22 @@
+from unittest import TestCase
+from webtest import TestApp
+from orm.tests import FunctionalTest
+
+
+class TestRootController(FunctionalTest):
+
+    def test_get(self):
+        response = self.app.get('/')
+        assert response.status_int == 200
+
+    def test_search(self):
+        response = self.app.post('/', params={'q': 'RestController'})
+        assert response.status_int == 302
+        assert response.headers['Location'] == (
+            'http://pecan.readthedocs.org/en/latest/search.html'
+            '?q=RestController'
+        )
+
+    def test_get_not_found(self):
+        response = self.app.get('/a/bogus/url', expect_errors=True)
+        assert response.status_int == 404
diff --git a/orm/tests/test_units.py b/orm/tests/test_units.py
new file mode 100644
index 00000000..573fb682
--- /dev/null
+++ b/orm/tests/test_units.py
@@ -0,0 +1,7 @@
+from unittest import TestCase
+
+
+class TestUnits(TestCase):
+
+    def test_units(self):
+        assert 5 * 5 == 25
diff --git a/orm/tests/unit/__init__.py b/orm/tests/unit/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/public/css/style.css b/public/css/style.css
new file mode 100644
index 00000000..55c9db54
--- /dev/null
+++ b/public/css/style.css
@@ -0,0 +1,43 @@
+body {
+  background: #311F00;
+  color: white;
+  font-family: 'Helvetica Neue', 'Helvetica', 'Verdana', sans-serif;
+  padding: 1em 2em;
+}
+
+a {
+  color: #FAFF78;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+div#content  {
+  width: 800px;
+  margin: 0 auto;
+}
+
+form {
+  margin: 0;
+  padding: 0;
+  border: 0;
+}
+
+fieldset {
+  border: 0;
+}
+
+input.error {
+  background: #FAFF78;
+}
+
+header {
+  text-align: center;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  font-family: 'Futura-CondensedExtraBold', 'Futura', 'Helvetica', sans-serif;
+  text-transform: uppercase;
+}
diff --git a/public/images/logo.png b/public/images/logo.png
new file mode 100644
index 00000000..a8f403e4
Binary files /dev/null and b/public/images/logo.png differ
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 00000000..c8d1bf5b
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,15 @@
+# The order of packages is significant, because pip processes them in the order
+# of appearance. Changing the order has an impact on the overall integration
+# process, which may cause wedges in the gate later.
+
+pbr>=2.0 # Apache-2.0
+pecan==1.0.2
+netifaces==0.10.4
+SQLAlchemy==0.9.7
+WSME>=0.6
+MySQL-python==1.2.5
+requests==2.2.1
+oslo.db==1.7.2
+oslo.serialization
+oslo.config
+oslo.policy
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 00000000..fe935e9c
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,77 @@
+[metadata]
+name = ORM
+version = 2016.3.0
+summary = AIC OpenStack Resource Manager
+description-file =
+    README.rst
+author = OpenStack
+author-email = openstack-dev@lists.openstack.org
+home-page = http://www.openstack.org/
+classifier =
+    Environment :: OpenStack
+    Intended Audience :: Information Technology
+    Intended Audience :: System Administrators
+    License :: OSI Approved :: Apache Software License
+    Operating System :: POSIX :: Linux
+    Programming Language :: Python
+    Programming Language :: Python :: 2
+    Programming Language :: Python :: 2.7
+
+
+[global]
+setup-hooks =
+    pbr.hooks.setup_hook
+
+[files]
+packages = orm
+data_files =
+    /etc/orm =
+       etc/orm.conf
+       
+
+[entry_points]
+console_scripts=
+    orm-fms = orm.cmd.fms:main
+    orm-cms = orm.cmd.cms:main
+    orm-rms = orm.cmd.rms:main
+    orm-rds = orm.cmd.rds:main
+    orm-ims = orm.cmd.ims:main
+    orm-audit = orm.cmd.audit:main
+    orm-uuidgen = orm.cmd.uuidgen:main
+
+[build_sphinx]
+source-dir = doc/source
+build-dir = doc/build
+all_files = 1
+
+[upload_sphinx]
+upload-dir = doc/build/html
+
+[compile_catalog]
+directory = orm/locale
+domain = orm
+
+[update_catalog]
+domain = orm
+output_dir = orm/locale
+input_file = orm/locale/orm.pot
+
+[extract_messages]
+keywords = _ gettext ngettext l_ lazy_gettext
+mapping_file = babel.cfg
+output_file = orm/locale/orm.pot
+
+[wheel]
+universal = 1
+
+[pbr]
+autodoc_index_modules = 1
+warnerrors = true
+
+
+[nosetests]
+match=^test
+where=orm
+nocapture=1
+cover-package=orm
+cover-erase=1
diff --git a/setup.py b/setup.py
new file mode 100644
index 00000000..70aab5a0
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+try:
+    from setuptools import setup, find_packages
+except ImportError:
+    from ez_setup import use_setuptools
+    use_setuptools()
+    from setuptools import setup, find_packages
+
+setup(
+    name='orm',
+    version='0.1',
+    description='',
+    author='',
+    author_email='',
+    install_requires=[
+        "pecan",
+    ],
+    test_suite='orm',
+    zip_safe=False,
+    packages=find_packages(),
+    include_package_data=True,
+    setup_requires=['pbr'],
+    pbr=True)
diff --git a/test-requirements.txt b/test-requirements.txt
new file mode 100644
index 00000000..bedac3d2
--- /dev/null
+++ b/test-requirements.txt
@@ -0,0 +1,16 @@
+# The order of packages is significant, because pip processes them in the order
+# of appearance. Changing the order has an impact on the overall integration
+# process, which may cause wedges in the gate later.
+
+hacking>=0.12.0,<0.13 # Apache-2.0
+
+coverage>=4.0,!=4.4 # Apache-2.0
+python-subunit>=0.0.18 # Apache-2.0/BSD
+sphinx>=1.6.2 # BSD
+oslotest>=1.10.0 # Apache-2.0
+testrepository>=0.0.18  # Apache-2.0/BSD
+testtools>=1.4.0 # MIT
+openstackdocstheme>=1.11.0  # Apache-2.0
+# releasenotes
+reno>=1.8.0 # Apache-2.0
+
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 00000000..b36a1698
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,39 @@
+[tox]
+minversion = 2.0
+envlist = py34,py27,pypy,pep8
+skipsdist = True
+
+[testenv]
+usedevelop = True
+install_command = pip install -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} {opts} {packages}
+setenv =
+   VIRTUAL_ENV={envdir}
+   PYTHONWARNINGS=default::DeprecationWarning
+deps = -r{toxinidir}/test-requirements.txt
+
+[testenv:pep8]
+commands = flake8 {posargs}
+
+[testenv:venv]
+commands = {posargs}
+
+[testenv:cover]
+commands = python setup.py test --coverage --testr-args='{posargs}'
+
+[testenv:docs]
+commands = python setup.py build_sphinx
+
+[testenv:releasenotes]
+commands =
+  sphinx-build -a -E -W -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html
+
+[testenv:debug]
+commands = oslo_debug_helper {posargs}
+
+[flake8]
+# E123, E125 skipped as they are invalid PEP-8.
+
+show-source = True
+ignore = E123,E125,H101,H104,H238,H401,H404,H405,H306,E901,E128,E226,E501,F401,F841,F841,W191,W391,E101,E121,E122,E126,E231,H233,H301,H303,H304,F403,F811,E401,H201,E265,E111,W292,E201,E127,H202,E251,H403,F821,E303,E225,H234,E712,E124,E131,E203,E202,E221,E271,E302
+builtins = _
+exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build