Repository: deathbeds/wtypes

Issue:
Observable interface and evented validation.

Discussion:

Patch:
diff --git a/wtypes.ipynb b/wtypes.ipynb
index 242ab26..ade3721 100644
--- a/wtypes.ipynb
+++ b/wtypes.ipynb
@@ -125,16 +125,24 @@
     "            cls._type = schema.pop('type', None) or cls._type\n",
     "            # Combine metadata across the module resolution order.\n",
     "            cls._merge_annotations(), cls._merge_schema()\n",
-    "            if schema.get('type', 'null') not in simpleTypes:\n",
-    "                cls._type = schema.pop('type')\n",
     "            cls._schema.update(schema)\n",
     "            \n",
     "            jsonschema.validate(cls._schema, cls._meta_schema, format_checker=jsonschema.draft7_format_checker)\n",
     "            \"\"\"Validate the proposed schema against the jsonschema schema.\"\"\"\n",
     "            return cls\n",
+    "        def example(cls):\n",
+    "            \"\"\"Generate an example from a schema. \n",
+    "            \n",
+    "            \n",
+    "        Note\n",
+    "        ----\n",
+    "        Requires hypothesis_jsonschema\n",
+    "        \"\"\"\n",
+    "            return __import__('hypothesis_jsonschema').from_schema(cls._schema).example()\n",
     "        \n",
     "        def create(cls, name: str, **schema):\n",
     "            \"\"\"Create a new schema type.\n",
+    "            \n",
     "    \n",
     "    Parameters\n",
     "    ----------\n",
@@ -323,7 +331,7 @@
     "                if 'default' in cls._schema:\n",
     "                    return cls._schema.default,\n",
     "                elif 'properties' in cls._schema:\n",
-    "                    return {k: v['default'] for k, v in cls._schema['properties'] if 'default' in v},                \n",
+    "                    return {k: v['default'] for k, v in cls._schema['properties'].items() if 'default' in v},                \n",
     "            return args"
    ]
   },
@@ -543,7 +551,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 41,
+   "execution_count": 10,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -567,7 +575,10 @@
     "        def __init_subclass__(cls, **kwargs): \n",
     "            cls._schema = copy.deepcopy(cls._schema)\n",
     "            cls._schema.update(kwargs)\n",
-    "            cls._schema.update(Properties[cls.__annotations__]._schema)\n",
+    "            if 'properties' in cls._schema:\n",
+    "                cls._schema.properties.update(Properties[cls.__annotations__]._schema.properties)\n",
+    "            else:\n",
+    "                cls._schema.update(Properties[cls.__annotations__]._schema)\n",
     "            required = []\n",
     "            for key in cls.__annotations__:\n",
     "                if hasattr(cls, key):\n",
@@ -623,7 +634,7 @@
     "        \n",
     "        def __setitem__(self, key, object):\n",
     "            \"\"\"Only test the key being set to avoid invalid state.\"\"\"\n",
-    "            properties = self._schema.get('properties', None)\n",
+    "            properties = self._schema.get('properties', {})\n",
     "            if key in properties:\n",
     "                jsonschema.validate(object, self._schema.get('properties', {}).get(key, {}), format_checker=jsonschema.draft7_format_checker)\n",
     "            else:\n",
@@ -641,7 +652,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 43,
+   "execution_count": 11,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -690,7 +701,7 @@
     "        def __setattr__(self, key, object):\n",
     "            \"\"\"Only test the attribute being set to avoid invalid state.\"\"\"\n",
     "            if isinstance(object, dict): object = object.get(key)\n",
-    "            properties = self._schema.get('properties', None)\n",
+    "            properties = self._schema.get('properties', {})\n",
     "            (\n",
     "                jsonschema.validate(object, self._schema.get('properties', {}).get(key, {}), format_checker=jsonschema.draft7_format_checker)\n",
     "                if key in properties else \n",
@@ -725,7 +736,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 12,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -787,7 +798,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 13,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -945,7 +956,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 14,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1032,7 +1043,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": 15,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1042,7 +1053,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": 16,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1053,16 +1064,16 @@
     "        https://json-schema.org/understanding-json-schema/reference/non_json_data.html\n",
     "    \"\"\"\n",
     "    \n",
-    "    class Format(Enum[_formats], _NoInit, _NoTitle): ...\n",
+    "    class Format(Trait, _NoInit, _NoTitle, metaclass=_ConstType): ...\n",
     "\n",
-    "    for key in Format._schema.enum: locals()[key.capitalize()] = String + Format[key]\n",
+    "    for key in _formats: locals()[key.capitalize()] = String + Format[key]\n",
     "    Regex.compile = re.compile\n",
     "    del key"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": 17,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1078,6 +1089,124 @@
     "        \"\"\"else condition type\"\"\""
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "    class Link:\n",
+    "        _registered_links = None\n",
+    "        _registered_id = None\n",
+    "        _deferred_changed = None\n",
+    "        _deferred_prior = None\n",
+    "        _depth = 0        \n",
+    "        def __enter__(self):\n",
+    "            self._depth +=1\n",
+    "\n",
+    "        def __exit__(self, *e):\n",
+    "            self._depth -= 1\n",
+    "            self._deferred_changed and e == (None, None, None) and self._propagate()\n",
+    "\n",
+    "        def link(this, source, that, target):\n",
+    "            this.dlink(source, that, target)\n",
+    "            that.dlink(target, this, source)\n",
+    "            return this\n",
+    "                    \n",
+    "        def dlink(self, source, that, target, callable=None): \n",
+    "            self._registered_links = self._registered_links or {}\n",
+    "            self._registered_id = self._registered_id or {}\n",
+    "            self._registered_links[source] = self._registered_links.get(source, {})\n",
+    "            if id(that) not in self._registered_links[source]:\n",
+    "                self._registered_links[source][id(that)] = {}\n",
+    "            if target not in self._registered_links[source][id(that)]:\n",
+    "                self._registered_links[source][id(that)][target] = None\n",
+    "            if id(that) not in self._registered_id:\n",
+    "                self._registered_id[id(that)] = that\n",
+    "            self._registered_links[source][id(that)][target] = callable\n",
+    "            return self\n",
+    "        def observe(self, source, callable=None): \n",
+    "            \"\"\"The callable has to define a signature.\"\"\"\n",
+    "            self._registered_links = self._registered_links or {}\n",
+    "            self._registered_id = self._registered_id or {}\n",
+    "            self._registered_links[source] = self._registered_links.get(source, {})\n",
+    "            if id(self) not in self._registered_links[source]:\n",
+    "                self._registered_links[source][id(self)] = []\n",
+    "            if id(self) not in self._registered_id:\n",
+    "                self._registered_id[id(self)] = self\n",
+    "            self._registered_links[source][id(self)].append(callable)\n",
+    "            return self\n",
+    "        \n",
+    "        def _propagate(self, *changed, **prior):\n",
+    "            self._deferred_changed = list(self._deferred_changed or changed)\n",
+    "            self._deferred_prior = {**prior, **(self._deferred_prior or {})}\n",
+    "\n",
+    "            if self._depth > 0: return\n",
+    "            with self:\n",
+    "                while self._deferred_changed:\n",
+    "                    key = self._deferred_changed.pop(-1)\n",
+    "                    old = self._deferred_prior.pop(key, None)\n",
+    "                    for hash in self._registered_links[key] if self._registered_links else []:\n",
+    "                        thing = self._registered_id[hash]\n",
+    "                        if hash == id(self):\n",
+    "                            for func in self._registered_links[key][hash]:\n",
+    "                                func(self, dict(\n",
+    "                                    new=getattr(self, key, None), old=old, object=self, name=key\n",
+    "                                ))\n",
+    "                        else:\n",
+    "                            for to, value in self._registered_links[key][hash].items():\n",
+    "                                if callable(value):\n",
+    "                                    thing.update({to: callable(self[key])})\n",
+    "                                else:\n",
+    "                                    if thing.get(to, None) is not self.get(key, inspect._empty):\n",
+    "                                        thing.update({to: self[key]})\n",
+    "            \n",
+    "        def __setitem__(self, key, object):\n",
+    "            with self:\n",
+    "                prior = self.get(key, None)\n",
+    "                super().__setitem__(key, object)\n",
+    "                if object is not prior: self._propagate(key, **{key: prior})\n",
+    "            \n",
+    "        def update(self, *args, **kwargs):\n",
+    "            with self:\n",
+    "                args = dict(*args, **kwargs)\n",
+    "                prior = {x: self[x] for x in args if x in self}\n",
+    "                super().update(args)\n",
+    "                prior = {k: v for k, v in prior.items() if v is not self.get(k, inspect._empty)}\n",
+    "                prior and self._propagate(*prior, **prior)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "    class Evented(Link, Bunch):\n",
+    "        \"\"\"An evented dictionary/bunch\n",
+    "    \n",
+    "    Examples\n",
+    "    --------\n",
+    "    \n",
+    "        >>> e, f = Evented(), Evented()\n",
+    "        >>> e.link('a', f, 'b')\n",
+    "        Evented({})\n",
+    "        >>> e['a'] = 1\n",
+    "        >>> f.toDict()\n",
+    "        {'b': 1}\n",
+    "        >>> e.update(a=100)\n",
+    "        >>> f.toDict()\n",
+    "        {'b': 100}\n",
+    "        \n",
+    "        >>> f['b'] = 2\n",
+    "        >>> assert e['a'] == f['b']\n",
+    "        >>> e = Evented().observe('a', print)\n",
+    "        >>> e['a'] = 2\n",
+    "        Evented({'a': 2}) {'new': 2, 'old': None, 'object': Evented({'a': 2}), 'name': 'a'}\n",
+    "        \n",
+    "        \"\"\""
+   ]
+  },
   {
    "cell_type": "markdown",
    "metadata": {},
@@ -1087,7 +1216,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 20,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1097,7 +1226,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": null,
    "metadata": {},
    "outputs": [
     {
@@ -1105,1282 +1234,9 @@
      "output_type": "stream",
      "text": [
       "[NbConvertApp] Converting notebook wtypes.ipynb to python\n",
-      "[NbConvertApp] Writing 27842 bytes to wtypes.py\n",
-      "Fixing /Users/tonyfast/webtypes/wtypes.py\n",
-      "\u001b[22;0t\u001b]0;IPython: tonyfast/webtypes\u0007TestResults(failed=0, attempted=81)\n",
-      "Name                                                        Stmts   Miss  Cover\n",
-      "-------------------------------------------------------------------------------\n",
-      "/Users/tonyfast/.local/lib/python3.7/site-packages/six.py     472    433     8%\n",
-      "wtypes.py                                                     367     73    80%\n",
-      "-------------------------------------------------------------------------------\n",
-      "TOTAL                                                         839    506    40%\n"
+      "[NbConvertApp] Writing 32656 bytes to wtypes.py\n",
+      "Fixing /Users/tonyfast/webtypes/wtypes.py\n"
      ]
-    },
-    {
-     "data": {
-      "image/svg+xml": [
-       "<svg height=\"353pt\" viewBox=\"0.00 0.00 4960.50 353.00\" width=\"4961pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
-       "<g class=\"graph\" id=\"graph0\" transform=\"scale(1 1) rotate(0) translate(4 349)\">\n",
-       "<title>classes_wtypes</title>\n",
-       "<polygon fill=\"#ffffff\" points=\"-4,4 -4,-349 4956.5,-349 4956.5,4 -4,4\" stroke=\"transparent\"/>\n",
-       "<!-- 0 -->\n",
-       "<g class=\"node\" id=\"node1\">\n",
-       "<title>0</title>\n",
-       "<polygon fill=\"none\" points=\"2945.5,-130 2945.5,-200 3052.5,-200 3052.5,-130 2945.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2999\" y=\"-184.8\">AdditionalItems</text>\n",
-       "<polyline fill=\"none\" points=\"2945.5,-177 3052.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"2945.5,-153 3052.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2999\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 45 -->\n",
-       "<g class=\"node\" id=\"node46\">\n",
-       "<title>45</title>\n",
-       "<polygon fill=\"none\" points=\"1908,-267 1908,-337 1962,-337 1962,-267 1908,-267\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1935\" y=\"-321.8\">Trait</text>\n",
-       "<polyline fill=\"none\" points=\"1908,-314 1962,-314 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"1908,-290 1962,-290 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1935\" y=\"-274.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 0&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge1\">\n",
-       "<title>0-&gt;45</title>\n",
-       "<path d=\"M2969.0314,-200.0883C2959.4368,-209.0861 2948.1273,-217.7085 2936,-223 2933.1759,-224.2322 2153.5265,-284.9883 1972.3155,-299.0959\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1971.9076,-295.617 1962.2094,-299.8826 1972.4509,-302.5959 1971.9076,-295.617\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 52 -->\n",
-       "<g class=\"node\" id=\"node53\">\n",
-       "<title>52</title>\n",
-       "<polygon fill=\"none\" points=\"2499,-267 2499,-337 2559,-337 2559,-267 2499,-267\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2529\" y=\"-321.8\">_NoInit</text>\n",
-       "<polyline fill=\"none\" points=\"2499,-314 2559,-314 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"2499,-290 2559,-290 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2529\" y=\"-274.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 0&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge2\">\n",
-       "<title>0-&gt;52</title>\n",
-       "<path d=\"M2967.6488,-200.1324C2958.2653,-208.7958 2947.4112,-217.2335 2936,-223 2871.6559,-255.5156 2658.8044,-285.5161 2569.2558,-297.0285\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2568.6931,-293.5718 2559.2158,-298.308 2569.5781,-300.5156 2568.6931,-293.5718\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 53 -->\n",
-       "<g class=\"node\" id=\"node54\">\n",
-       "<title>53</title>\n",
-       "<polygon fill=\"none\" points=\"3162.5,-267 3162.5,-337 3229.5,-337 3229.5,-267 3162.5,-267\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3196\" y=\"-321.8\">_NoTitle</text>\n",
-       "<polyline fill=\"none\" points=\"3162.5,-314 3229.5,-314 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"3162.5,-290 3229.5,-290 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3196\" y=\"-274.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 0&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge3\">\n",
-       "<title>0-&gt;53</title>\n",
-       "<path d=\"M3033.873,-200.1596C3042.4278,-208.0579 3051.7837,-216.1271 3061,-223 3090.2393,-244.8047 3125.9595,-265.476 3153.3109,-280.2008\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3151.7728,-283.3471 3162.2443,-284.9595 3155.0639,-277.169 3151.7728,-283.3471\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 1 -->\n",
-       "<g class=\"node\" id=\"node2\">\n",
-       "<title>1</title>\n",
-       "<polygon fill=\"none\" points=\"3070.5,-130 3070.5,-200 3203.5,-200 3203.5,-130 3070.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3137\" y=\"-184.8\">AdditionalProperties</text>\n",
-       "<polyline fill=\"none\" points=\"3070.5,-177 3203.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"3070.5,-153 3203.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3137\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 1&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge4\">\n",
-       "<title>1-&gt;45</title>\n",
-       "<path d=\"M3099.8373,-200.2459C3088.2407,-209.2471 3074.8385,-217.8319 3061,-223 2941.894,-267.4809 2616.8282,-250.0892 2490,-259 2294.994,-272.7009 2061.6509,-291.5966 1972.3028,-298.9239\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1971.8127,-295.4523 1962.1327,-299.759 1972.3856,-302.4288 1971.8127,-295.4523\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 1&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge5\">\n",
-       "<title>1-&gt;52</title>\n",
-       "<path d=\"M3098.7582,-200.1113C3087.3406,-208.8832 3074.3022,-217.3815 3061,-223 2971.7208,-260.7092 2677.4213,-289.2081 2569.3033,-298.6385\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2568.7978,-295.169 2559.1362,-299.5168 2569.4004,-302.1431 2568.7978,-295.169\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 1&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge6\">\n",
-       "<title>1-&gt;53</title>\n",
-       "<path d=\"M3152.194,-200.2809C3159.6953,-217.6993 3168.825,-238.8988 3176.8044,-257.4272\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3173.6875,-259.0385 3180.8575,-266.8387 3180.1167,-256.2697 3173.6875,-259.0385\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 2 -->\n",
-       "<g class=\"node\" id=\"node3\">\n",
-       "<title>2</title>\n",
-       "<polygon fill=\"none\" points=\"831,-130 831,-200 885,-200 885,-130 831,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"858\" y=\"-184.8\">AllOf</text>\n",
-       "<polyline fill=\"none\" points=\"831,-177 885,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"831,-153 885,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"858\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 2&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge7\">\n",
-       "<title>2-&gt;45</title>\n",
-       "<path d=\"M872.6441,-200.1598C878.0445,-209.0441 885.0845,-217.5886 894,-223 981.3553,-276.0214 1722.6575,-296.9335 1897.9532,-301.1618\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.8968,-304.6613 1907.9772,-301.4002 1898.0633,-297.6633 1897.8968,-304.6613\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 2&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge8\">\n",
-       "<title>2-&gt;52</title>\n",
-       "<path d=\"M872.3153,-200.102C877.7363,-209.1 884.8694,-217.7192 894,-223 945.8234,-252.9727 1911.2243,-255.6993 1971,-259 2165.3017,-269.7288 2397.1148,-289.9893 2488.8192,-298.3005\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2488.5115,-301.7868 2498.7874,-299.2069 2489.1455,-294.8156 2488.5115,-301.7868\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 3 -->\n",
-       "<g class=\"node\" id=\"node4\">\n",
-       "<title>3</title>\n",
-       "<polygon fill=\"none\" points=\"903.5,-130 903.5,-200 958.5,-200 958.5,-130 903.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"931\" y=\"-184.8\">AnyOf</text>\n",
-       "<polyline fill=\"none\" points=\"903.5,-177 958.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"903.5,-153 958.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"931\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 3&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge9\">\n",
-       "<title>3-&gt;45</title>\n",
-       "<path d=\"M946.2578,-200.1435C951.8115,-209.0275 958.997,-217.576 968,-223 1048.8659,-271.7192 1729.7236,-295.6948 1897.6689,-300.9006\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.6531,-304.4017 1907.7557,-301.2097 1897.8676,-297.405 1897.6531,-304.4017\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 3&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge10\">\n",
-       "<title>3-&gt;52</title>\n",
-       "<path d=\"M945.9124,-200.1075C951.4883,-209.1057 958.7719,-217.7235 968,-223 1016.4042,-250.6768 1915.3305,-255.8573 1971,-259 2165.2884,-269.9681 2397.109,-290.0934 2488.8173,-298.3345\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2488.5121,-301.8211 2498.786,-299.2331 2489.1406,-294.8493 2488.5121,-301.8211\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 4 -->\n",
-       "<g class=\"node\" id=\"node5\">\n",
-       "<title>4</title>\n",
-       "<polygon fill=\"none\" points=\"687,-130 687,-200 741,-200 741,-130 687,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"714\" y=\"-184.8\">Bool</text>\n",
-       "<polyline fill=\"none\" points=\"687,-177 741,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"687,-153 741,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"714\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 4&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge11\">\n",
-       "<title>4-&gt;45</title>\n",
-       "<path d=\"M728.6121,-200.2127C734.012,-209.0978 741.0598,-217.6296 750,-223 850.5034,-283.3726 1707.8445,-298.8278 1897.822,-301.5241\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.824,-305.0244 1907.8717,-301.6636 1897.9212,-298.0251 1897.824,-305.0244\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 5 -->\n",
-       "<g class=\"node\" id=\"node6\">\n",
-       "<title>5</title>\n",
-       "<polygon fill=\"none\" points=\"108,-.5 108,-70.5 162,-70.5 162,-.5 108,-.5\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"135\" y=\"-55.3\">Bunch</text>\n",
-       "<polyline fill=\"none\" points=\"108,-47.5 162,-47.5 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"108,-23.5 162,-23.5 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"135\" y=\"-8.3\"> </text>\n",
-       "</g>\n",
-       "<!-- 15 -->\n",
-       "<g class=\"node\" id=\"node16\">\n",
-       "<title>15</title>\n",
-       "<polygon fill=\"none\" points=\"101.5,-130 101.5,-200 164.5,-200 164.5,-130 101.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"133\" y=\"-184.8\">Dict</text>\n",
-       "<polyline fill=\"none\" points=\"101.5,-177 164.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"101.5,-153 164.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"start\" x=\"109.5\" y=\"-137.8\">update()</text>\n",
-       "</g>\n",
-       "<!-- 5&#45;&gt;15 -->\n",
-       "<g class=\"edge\" id=\"edge12\">\n",
-       "<title>5-&gt;15</title>\n",
-       "<path d=\"M134.4588,-70.5446C134.2253,-85.6604 133.9493,-103.5338 133.7005,-119.6429\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"130.1966,-119.8745 133.5417,-129.9274 137.1958,-119.9827 130.1966,-119.8745\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 6 -->\n",
-       "<g class=\"node\" id=\"node7\">\n",
-       "<title>6</title>\n",
-       "<polygon fill=\"none\" points=\"0,-.5 0,-70.5 90,-70.5 90,-.5 0,-.5\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"45\" y=\"-55.3\">Configurable</text>\n",
-       "<polyline fill=\"none\" points=\"0,-47.5 90,-47.5 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"0,-23.5 90,-23.5 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"45\" y=\"-8.3\"> </text>\n",
-       "</g>\n",
-       "<!-- 11 -->\n",
-       "<g class=\"node\" id=\"node12\">\n",
-       "<title>11</title>\n",
-       "<polygon fill=\"none\" points=\"10.5,-130 10.5,-200 83.5,-200 83.5,-130 10.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"47\" y=\"-184.8\">DataClass</text>\n",
-       "<polyline fill=\"none\" points=\"10.5,-177 83.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"10.5,-153 83.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"47\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 6&#45;&gt;11 -->\n",
-       "<g class=\"edge\" id=\"edge13\">\n",
-       "<title>6-&gt;11</title>\n",
-       "<path d=\"M45.5412,-70.5446C45.7747,-85.6604 46.0507,-103.5338 46.2995,-119.6429\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"42.8042,-119.9827 46.4583,-129.9274 49.8034,-119.8745 42.8042,-119.9827\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 7 -->\n",
-       "<g class=\"node\" id=\"node8\">\n",
-       "<title>7</title>\n",
-       "<polygon fill=\"none\" points=\"977,-130 977,-200 1031,-200 1031,-130 977,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1004\" y=\"-184.8\">Const</text>\n",
-       "<polyline fill=\"none\" points=\"977,-177 1031,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"977,-153 1031,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1004\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 7&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge14\">\n",
-       "<title>7-&gt;45</title>\n",
-       "<path d=\"M1018.6873,-200.0891C1024.0884,-208.9722 1031.1179,-217.5339 1040,-223 1114.0212,-268.5531 1737.5461,-294.6677 1897.6495,-300.6626\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.8165,-304.1711 1907.9393,-301.0439 1898.0758,-297.1759 1897.8165,-304.1711\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 7&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge15\">\n",
-       "<title>7-&gt;52</title>\n",
-       "<path d=\"M1018.333,-200.0715C1023.7543,-209.0689 1030.8832,-217.6953 1040,-223 1129.4772,-275.0633 1867.651,-253.022 1971,-259 2165.273,-270.2374 2397.1023,-290.2106 2488.8151,-298.3727\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2488.5127,-301.8596 2498.7843,-299.2626 2489.1351,-294.8873 2488.5127,-301.8596\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 8 -->\n",
-       "<g class=\"node\" id=\"node9\">\n",
-       "<title>8</title>\n",
-       "<polygon fill=\"none\" points=\"3222,-130 3222,-200 3288,-200 3288,-130 3222,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3255\" y=\"-184.8\">Contains</text>\n",
-       "<polyline fill=\"none\" points=\"3222,-177 3288,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"3222,-153 3288,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3255\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 8&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge16\">\n",
-       "<title>8-&gt;45</title>\n",
-       "<path d=\"M3236.5356,-200.1242C3230.0306,-209.1227 3221.8364,-217.7366 3212,-223 3141.1796,-260.8956 2570.1596,-253.8972 2490,-259 2294.9081,-271.419 2061.6149,-291.0586 1972.2914,-298.7545\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1971.786,-295.2851 1962.1243,-299.6326 1972.3883,-302.2591 1971.786,-295.2851\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 8&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge17\">\n",
-       "<title>8-&gt;52</title>\n",
-       "<path d=\"M3236.0894,-200.0206C3229.6164,-208.9026 3221.5507,-217.4809 3212,-223 3101.548,-286.8278 2699.4137,-299.1437 2569.66,-301.4704\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2569.3148,-297.9756 2559.3753,-301.6439 2569.4329,-304.9746 2569.3148,-297.9756\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 8&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge18\">\n",
-       "<title>8-&gt;53</title>\n",
-       "<path d=\"M3239.806,-200.2809C3232.3047,-217.6993 3223.175,-238.8988 3215.1956,-257.4272\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3211.8833,-256.2697 3211.1425,-266.8387 3218.3125,-259.0385 3211.8833,-256.2697\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 9 -->\n",
-       "<g class=\"node\" id=\"node10\">\n",
-       "<title>9</title>\n",
-       "<polygon fill=\"none\" points=\"4161,-130 4161,-200 4275,-200 4275,-130 4161,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4218\" y=\"-184.8\">ContentEncoding</text>\n",
-       "<polyline fill=\"none\" points=\"4161,-177 4275,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"4161,-153 4275,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4218\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 9&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge19\">\n",
-       "<title>9-&gt;52</title>\n",
-       "<path d=\"M4186.274,-200.1408C4175.9915,-209.2578 4163.8853,-217.9311 4151,-223 4047.7414,-263.6202 3263.8085,-253.1851 3153,-259 2932.4951,-270.5715 2668.5949,-290.8897 2569.3564,-298.7591\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2568.8655,-295.287 2559.1744,-299.5687 2569.4204,-302.2649 2568.8655,-295.287\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 9&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge20\">\n",
-       "<title>9-&gt;53</title>\n",
-       "<path d=\"M4185.7774,-200.0682C4175.566,-209.0655 4163.6222,-217.6927 4151,-223 4066.2743,-258.6247 3416.198,-291.6126 3239.9546,-299.97\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3239.5794,-296.4837 3229.7555,-300.4511 3239.9094,-303.4759 3239.5794,-296.4837\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 10 -->\n",
-       "<g class=\"node\" id=\"node11\">\n",
-       "<title>10</title>\n",
-       "<polygon fill=\"none\" points=\"3306.5,-130 3306.5,-200 3431.5,-200 3431.5,-130 3306.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3369\" y=\"-184.8\">ContentMediaType</text>\n",
-       "<polyline fill=\"none\" points=\"3306.5,-177 3431.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"3306.5,-153 3431.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3369\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 10&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge21\">\n",
-       "<title>10-&gt;45</title>\n",
-       "<path d=\"M3334.4855,-200.0923C3323.4239,-209.208 3310.5132,-217.8927 3297,-223 3213.0405,-254.732 2579.5892,-253.5326 2490,-259 2294.8763,-270.9078 2061.6015,-290.844 1972.2872,-298.687\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1971.7755,-295.2184 1962.1211,-299.5822 1972.3896,-302.1914 1971.7755,-295.2184\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 10&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge22\">\n",
-       "<title>10-&gt;52</title>\n",
-       "<path d=\"M3333.5513,-200.2077C3322.6527,-209.0927 3310.0628,-217.6257 3297,-223 3163.0533,-278.1082 2707.9111,-296.4733 2569.3551,-300.8579\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2569.069,-297.365 2559.182,-301.1725 2569.2854,-304.3616 2569.069,-297.365\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 10&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge23\">\n",
-       "<title>10-&gt;53</title>\n",
-       "<path d=\"M3325.6767,-200.0652C3316.2441,-207.6533 3306.3032,-215.6151 3297,-223 3277.6461,-238.3631 3256.0873,-255.2558 3237.8743,-269.4633\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3235.4968,-266.8788 3229.7615,-275.787 3239.8003,-272.3997 3235.4968,-266.8788\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 11&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge24\">\n",
-       "<title>11-&gt;45</title>\n",
-       "<path d=\"M66.5998,-200.1967C73.4134,-209.1968 81.9227,-217.7934 92,-223 175.1412,-265.9564 1643.225,-296.3353 1897.5941,-301.2879\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.7302,-304.7911 1907.7961,-301.4856 1897.8658,-297.7924 1897.7302,-304.7911\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 55 -->\n",
-       "<g class=\"node\" id=\"node56\">\n",
-       "<title>55</title>\n",
-       "<polygon fill=\"none\" points=\"22.5,-267 22.5,-337 157.5,-337 157.5,-267 22.5,-267\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"90\" y=\"-321.8\">_Object</text>\n",
-       "<polyline fill=\"none\" points=\"22.5,-314 157.5,-314 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"22.5,-290 157.5,-290 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"start\" x=\"30.5\" y=\"-274.8\">from_config_file(cls)</text>\n",
-       "</g>\n",
-       "<!-- 11&#45;&gt;55 -->\n",
-       "<g class=\"edge\" id=\"edge25\">\n",
-       "<title>11-&gt;55</title>\n",
-       "<path d=\"M58.0736,-200.2809C63.5156,-217.6194 70.1335,-238.7044 75.9299,-257.172\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"72.6299,-258.3457 78.964,-266.8387 79.3086,-256.2494 72.6299,-258.3457\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 12 -->\n",
-       "<g class=\"node\" id=\"node13\">\n",
-       "<title>12</title>\n",
-       "<polygon fill=\"none\" points=\"1049,-130 1049,-200 1107,-200 1107,-130 1049,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1078\" y=\"-184.8\">Default</text>\n",
-       "<polyline fill=\"none\" points=\"1049,-177 1107,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"1049,-153 1107,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1078\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 12&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge26\">\n",
-       "<title>12-&gt;45</title>\n",
-       "<path d=\"M1093.9016,-200.0736C1099.6091,-208.9565 1106.9328,-217.5219 1116,-223 1183.6101,-263.8478 1745.8072,-293.0854 1897.4423,-300.2811\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.4845,-303.7869 1907.6381,-300.761 1897.8137,-296.7946 1897.4845,-303.7869\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 12&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge27\">\n",
-       "<title>12-&gt;52</title>\n",
-       "<path d=\"M1093.5207,-200.0898C1099.2518,-209.0875 1106.6833,-217.7096 1116,-223 1198.6837,-269.9511 1876.0841,-253.3463 1971,-259 2165.2534,-270.5707 2397.0938,-290.3557 2488.8123,-298.4201\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2488.5133,-301.9072 2498.7821,-299.2991 2489.1282,-294.9343 2488.5133,-301.9072\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 13 -->\n",
-       "<g class=\"node\" id=\"node14\">\n",
-       "<title>13</title>\n",
-       "<polygon fill=\"none\" points=\"3449.5,-130 3449.5,-200 3544.5,-200 3544.5,-130 3449.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3497\" y=\"-184.8\">Dependencies</text>\n",
-       "<polyline fill=\"none\" points=\"3449.5,-177 3544.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"3449.5,-153 3544.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3497\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 13&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge28\">\n",
-       "<title>13-&gt;45</title>\n",
-       "<path d=\"M3470.8425,-200.0579C3462.1182,-209.1726 3451.6227,-217.8655 3440,-223 3343.3771,-265.6847 2595.4561,-252.919 2490,-259 2294.8374,-270.2538 2061.5852,-290.5695 1972.2821,-298.6006\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1971.7623,-295.1332 1962.1173,-299.5177 1972.3914,-302.1049 1971.7623,-295.1332\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 13&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge29\">\n",
-       "<title>13-&gt;52</title>\n",
-       "<path d=\"M3470.3891,-200.0068C3461.7193,-209.0028 3451.3667,-217.6446 3440,-223 3400.0198,-241.8364 2740.1161,-287.6895 2569.176,-299.2956\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2568.8327,-295.8108 2559.0922,-299.979 2569.306,-302.7948 2568.8327,-295.8108\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 13&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge30\">\n",
-       "<title>13-&gt;53</title>\n",
-       "<path d=\"M3467.7461,-200.2223C3459.4638,-208.5764 3449.9678,-216.8391 3440,-223 3376.2184,-262.422 3290.7676,-284.164 3239.7548,-294.4277\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3238.8638,-291.0355 3229.7202,-296.3876 3240.2057,-297.9057 3238.8638,-291.0355\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 14 -->\n",
-       "<g class=\"node\" id=\"node15\">\n",
-       "<title>14</title>\n",
-       "<polygon fill=\"none\" points=\"3563,-130 3563,-200 3645,-200 3645,-130 3563,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3604\" y=\"-184.8\">Description</text>\n",
-       "<polyline fill=\"none\" points=\"3563,-177 3645,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"3563,-153 3645,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3604\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 14&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge31\">\n",
-       "<title>14-&gt;45</title>\n",
-       "<path d=\"M3581.2396,-200.0276C3573.4518,-209.1414 3563.9096,-217.8414 3553,-223 3446.1628,-273.5179 2607.9963,-252.434 2490,-259 2294.8152,-269.8612 2061.5759,-290.4047 1972.2791,-298.5487\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1971.7545,-295.082 1962.1151,-299.4789 1972.3925,-302.0529 1971.7545,-295.082\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 14&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge32\">\n",
-       "<title>14-&gt;52</title>\n",
-       "<path d=\"M3580.8357,-200.0356C3573.0927,-209.0322 3563.6758,-217.6672 3553,-223 3530.5679,-234.2053 2756.5035,-286.7426 2569.406,-299.2994\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2568.9266,-295.8235 2559.1832,-299.9848 2569.395,-302.8079 2568.9266,-295.8235\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 14&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge33\">\n",
-       "<title>14-&gt;53</title>\n",
-       "<path d=\"M3579.5337,-200.0011C3571.9412,-208.6639 3562.928,-217.1342 3553,-223 3500.0654,-254.2757 3322.8262,-283.4537 3239.7147,-295.8004\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3238.9682,-292.3724 3229.5843,-297.2911 3239.9873,-299.2979 3238.9682,-292.3724\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 15&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge34\">\n",
-       "<title>15-&gt;45</title>\n",
-       "<path d=\"M150.2843,-200.1247C156.4797,-209.1233 164.3694,-217.737 174,-223 252.3102,-265.7957 1650.2168,-296.1964 1897.7069,-301.2551\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.9046,-304.7597 1907.9738,-301.4638 1898.047,-297.7612 1897.9046,-304.7597\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 15&#45;&gt;55 -->\n",
-       "<g class=\"edge\" id=\"edge35\">\n",
-       "<title>15-&gt;55</title>\n",
-       "<path d=\"M121.9264,-200.2809C116.4844,-217.6194 109.8665,-238.7044 104.0701,-257.172\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"100.6914,-256.2494 101.036,-266.8387 107.3701,-258.3457 100.6914,-256.2494\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 16 -->\n",
-       "<g class=\"node\" id=\"node17\">\n",
-       "<title>16</title>\n",
-       "<polygon fill=\"none\" points=\"3663,-130 3663,-200 3717,-200 3717,-130 3663,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3690\" y=\"-184.8\">Else</text>\n",
-       "<polyline fill=\"none\" points=\"3663,-177 3717,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"3663,-153 3717,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3690\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 16&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge36\">\n",
-       "<title>16-&gt;45</title>\n",
-       "<path d=\"M3675.6931,-200.1165C3670.2723,-209.1149 3663.1372,-217.7306 3654,-223 3597.9545,-255.3214 2554.6029,-255.5002 2490,-259 2294.7995,-269.5747 2061.5693,-290.2845 1972.2771,-298.5109\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1971.7488,-295.0447 1962.1135,-299.4507 1972.3934,-302.015 1971.7488,-295.0447\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 16&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge37\">\n",
-       "<title>16-&gt;52</title>\n",
-       "<path d=\"M3675.3756,-200.1923C3669.9755,-209.0771 3662.9307,-217.6138 3654,-223 3651.0274,-224.7928 2769.243,-285.4892 2569.0849,-299.2464\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2568.7409,-295.7617 2559.0045,-299.9392 2569.2209,-302.7452 2568.7409,-295.7617\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 16&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge38\">\n",
-       "<title>16-&gt;53</title>\n",
-       "<path d=\"M3674.6397,-200.2252C3669.2877,-208.8889 3662.4518,-217.3036 3654,-223 3586.4694,-268.515 3340.6802,-291.3697 3239.7329,-299.0013\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3239.2878,-295.5246 3229.5741,-299.7546 3239.8056,-302.5054 3239.2878,-295.5246\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 17 -->\n",
-       "<g class=\"node\" id=\"node18\">\n",
-       "<title>17</title>\n",
-       "<polygon fill=\"none\" points=\"759,-130 759,-200 813,-200 813,-130 759,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"786\" y=\"-184.8\">Enum</text>\n",
-       "<polyline fill=\"none\" points=\"759,-177 813,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"759,-153 813,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"786\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 17&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge39\">\n",
-       "<title>17-&gt;45</title>\n",
-       "<path d=\"M800.627,-200.1879C806.0272,-209.0726 813.0713,-217.6104 822,-223 915.9041,-279.683 1714.8282,-297.9044 1897.7804,-301.3523\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.907,-304.8552 1907.9701,-301.541 1898.0366,-297.8564 1897.907,-304.8552\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 18 -->\n",
-       "<g class=\"node\" id=\"node19\">\n",
-       "<title>18</title>\n",
-       "<polygon fill=\"none\" points=\"1125,-130 1125,-200 1197,-200 1197,-130 1125,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1161\" y=\"-184.8\">Examples</text>\n",
-       "<polyline fill=\"none\" points=\"1125,-177 1197,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"1125,-153 1197,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1161\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 18&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge40\">\n",
-       "<title>18-&gt;45</title>\n",
-       "<path d=\"M1181.0534,-200.0845C1187.8317,-208.9675 1196.2088,-217.5303 1206,-223 1266.86,-256.9984 1757.2852,-290.6534 1897.6138,-299.6618\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.6522,-303.1713 1907.8548,-300.3153 1898.098,-296.1855 1897.6522,-303.1713\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 18&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge41\">\n",
-       "<title>18-&gt;52</title>\n",
-       "<path d=\"M1180.6137,-200.1698C1187.4276,-209.1693 1195.9337,-217.7723 1206,-223 1281.5178,-262.2181 1886.0693,-253.7304 1971,-259 2165.2242,-271.0508 2397.081,-290.5647 2488.8081,-298.4883\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2488.5142,-301.9759 2498.7789,-299.3517 2489.1182,-295.002 2488.5142,-301.9759\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 19 -->\n",
-       "<g class=\"node\" id=\"node20\">\n",
-       "<title>19</title>\n",
-       "<polygon fill=\"none\" points=\"1215,-130 1215,-200 1345,-200 1345,-130 1215,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1280\" y=\"-184.8\">ExclusiveMaximum</text>\n",
-       "<polyline fill=\"none\" points=\"1215,-177 1345,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"1215,-153 1345,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1280\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 19&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge42\">\n",
-       "<title>19-&gt;45</title>\n",
-       "<path d=\"M1317.0679,-200.2275C1328.1833,-209.0005 1340.9197,-217.4704 1354,-223 1453.2341,-264.9507 1785.5782,-291.538 1897.6981,-299.4877\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.6255,-302.9911 1907.8458,-300.1988 1898.1149,-296.0083 1897.6255,-302.9911\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 19&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge43\">\n",
-       "<title>19-&gt;52</title>\n",
-       "<path d=\"M1316.039,-200.2837C1327.3273,-209.2858 1340.4115,-217.8615 1354,-223 1482.466,-271.5792 1833.9693,-249.7233 1971,-259 2165.1533,-272.1438 2397.0502,-291.0405 2488.7981,-298.6437\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2488.5159,-302.1322 2498.7712,-299.4714 2489.095,-295.1562 2488.5159,-302.1322\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 20 -->\n",
-       "<g class=\"node\" id=\"node21\">\n",
-       "<title>20</title>\n",
-       "<polygon fill=\"none\" points=\"1363,-130 1363,-200 1491,-200 1491,-130 1363,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1427\" y=\"-184.8\">ExclusiveMinimum</text>\n",
-       "<polyline fill=\"none\" points=\"1363,-177 1491,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"1363,-153 1491,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1427\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 20&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge44\">\n",
-       "<title>20-&gt;45</title>\n",
-       "<path d=\"M1464.0462,-200.1591C1474.922,-208.8225 1487.3207,-217.2536 1500,-223 1571.4401,-255.3775 1806.0558,-286.4085 1897.7784,-297.6076\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.3806,-301.0849 1907.729,-298.8129 1898.2225,-294.1357 1897.3806,-301.0849\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 20&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge45\">\n",
-       "<title>20-&gt;52</title>\n",
-       "<path d=\"M1462.5438,-200.1272C1473.6793,-209.1258 1486.5887,-217.739 1500,-223 1597.7218,-261.3348 1866.3358,-250.9673 1971,-259 2165.0271,-273.891 2396.9953,-291.8011 2488.7801,-298.892\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2488.5174,-302.382 2498.7573,-299.6628 2489.0567,-295.4028 2488.5174,-302.382\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 21 -->\n",
-       "<g class=\"node\" id=\"node22\">\n",
-       "<title>21</title>\n",
-       "<polygon fill=\"none\" points=\"183,-130 183,-200 237,-200 237,-130 183,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"210\" y=\"-184.8\">Float</text>\n",
-       "<polyline fill=\"none\" points=\"183,-177 237,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"183,-153 237,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"210\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 21&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge46\">\n",
-       "<title>21-&gt;45</title>\n",
-       "<path d=\"M224.3605,-200.0245C229.7824,-209.0208 236.9048,-217.6585 246,-223 319.656,-266.2574 1655.9683,-296.1681 1897.6811,-301.2363\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.6568,-304.7365 1907.7276,-301.4458 1897.8028,-297.738 1897.6568,-304.7365\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 22 -->\n",
-       "<g class=\"node\" id=\"node23\">\n",
-       "<title>22</title>\n",
-       "<polygon fill=\"none\" points=\"4293.5,-130 4293.5,-200 4350.5,-200 4350.5,-130 4293.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4322\" y=\"-184.8\">Format</text>\n",
-       "<polyline fill=\"none\" points=\"4293.5,-177 4350.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"4293.5,-153 4350.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4322\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 22&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge47\">\n",
-       "<title>22-&gt;52</title>\n",
-       "<path d=\"M4306.5138,-200.1509C4300.7835,-209.15 4293.3437,-217.7575 4284,-223 4229.1749,-253.761 3215.7856,-255.8386 3153,-259 2932.4711,-270.1043 2668.585,-290.6975 2569.3534,-298.6998\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2568.8573,-295.2284 2559.1721,-299.5233 2569.4217,-302.2056 2568.8573,-295.2284\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 22&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge48\">\n",
-       "<title>22-&gt;53</title>\n",
-       "<path d=\"M4306.1814,-200.2128C4300.4752,-209.0979 4293.1314,-217.6296 4284,-223 4192.7808,-276.6478 3431.4687,-296.8377 3239.711,-301.0981\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3239.6337,-297.5988 3229.7128,-301.3171 3239.7871,-304.5971 3239.6337,-297.5988\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 23 -->\n",
-       "<g class=\"node\" id=\"node24\">\n",
-       "<title>23</title>\n",
-       "<polygon fill=\"none\" points=\"3735,-130 3735,-200 3789,-200 3789,-130 3735,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3762\" y=\"-184.8\">If</text>\n",
-       "<polyline fill=\"none\" points=\"3735,-177 3789,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"3735,-153 3789,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3762\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 23&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge49\">\n",
-       "<title>23-&gt;45</title>\n",
-       "<path d=\"M3747.6991,-200.127C3742.2785,-209.1256 3735.1419,-217.7388 3726,-223 3666.4601,-257.2653 2558.5985,-255.3457 2490,-259 2294.79,-269.399 2061.5653,-290.2108 1972.2758,-298.4877\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1971.7453,-295.0218 1962.1126,-299.4334 1972.3939,-301.9917 1971.7453,-295.0218\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 23&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge50\">\n",
-       "<title>23-&gt;52</title>\n",
-       "<path d=\"M3747.4011,-200.2348C3742.0014,-209.1203 3734.9505,-217.6467 3726,-223 3671.2529,-255.7444 3216.6543,-254.8072 3153,-259 2932.6692,-273.5128 2668.6665,-292.0998 2569.3785,-299.1324\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2568.9189,-295.6561 2559.1913,-299.8544 2569.4138,-302.6386 2568.9189,-295.6561\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 23&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge51\">\n",
-       "<title>23-&gt;53</title>\n",
-       "<path d=\"M3746.9111,-200.051C3741.5327,-208.8223 3734.6153,-217.3354 3726,-223 3645.9896,-275.6074 3351.9398,-294.692 3239.8229,-300.1497\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3239.3773,-296.6668 3229.5541,-300.636 3239.7085,-303.659 3239.3773,-296.6668\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 24 -->\n",
-       "<g class=\"node\" id=\"node25\">\n",
-       "<title>24</title>\n",
-       "<polygon fill=\"none\" points=\"255,-130 255,-200 311,-200 311,-130 255,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"283\" y=\"-184.8\">Integer</text>\n",
-       "<polyline fill=\"none\" points=\"255,-177 311,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"255,-153 311,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"283\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 24&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge52\">\n",
-       "<title>24-&gt;45</title>\n",
-       "<path d=\"M297.9564,-200.0311C303.5333,-209.0276 310.8064,-217.6637 320,-223 390.4994,-263.9208 1662.9182,-295.6276 1897.8645,-301.1466\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.875,-304.6477 1907.9541,-301.3824 1898.0386,-297.6496 1897.875,-304.6477\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 25 -->\n",
-       "<g class=\"node\" id=\"node26\">\n",
-       "<title>25</title>\n",
-       "<polygon fill=\"none\" points=\"3807,-130 3807,-200 3861,-200 3861,-130 3807,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3834\" y=\"-184.8\">Items</text>\n",
-       "<polyline fill=\"none\" points=\"3807,-177 3861,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"3807,-153 3861,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3834\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 25&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge53\">\n",
-       "<title>25-&gt;45</title>\n",
-       "<path d=\"M3819.7045,-200.1364C3814.284,-209.1352 3807.1462,-217.7461 3798,-223 3734.9656,-259.2092 2562.5943,-255.1912 2490,-259 2294.7818,-269.2426 2061.5619,-290.1451 1972.2747,-298.467\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1971.7422,-295.0015 1962.1118,-299.4179 1972.3944,-301.971 1971.7422,-295.0015\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 25&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge54\">\n",
-       "<title>25-&gt;52</title>\n",
-       "<path d=\"M3819.4252,-200.2753C3814.0259,-209.1613 3806.9691,-217.678 3798,-223 3736.2708,-259.6282 3224.6391,-254.5326 3153,-259 2932.6198,-272.7428 2668.6461,-291.783 2569.3723,-299.0347\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2568.9046,-295.5594 2559.1865,-299.7796 2569.4152,-302.5408 2568.9046,-295.5594\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 25&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge55\">\n",
-       "<title>25-&gt;53</title>\n",
-       "<path d=\"M3818.9755,-200.1498C3813.5976,-208.922 3806.6645,-217.4109 3798,-223 3705.3659,-282.7544 3362.2611,-297.6018 3239.7922,-301.0348\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3239.5603,-297.5397 3229.6578,-301.3067 3239.7482,-304.5371 3239.5603,-297.5397\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 26 -->\n",
-       "<g class=\"node\" id=\"node27\">\n",
-       "<title>26</title>\n",
-       "<polygon fill=\"none\" points=\"329,-107.5 329,-222.5 453,-222.5 453,-107.5 329,-107.5\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"391\" y=\"-207.3\">List</text>\n",
-       "<polyline fill=\"none\" points=\"329,-199.5 453,-199.5 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"329,-175.5 453,-175.5 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"start\" x=\"337\" y=\"-160.3\">append(object)</text>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"start\" x=\"337\" y=\"-145.3\">extend(object)</text>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"start\" x=\"337\" y=\"-130.3\">insert(id, object)</text>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"start\" x=\"337\" y=\"-115.3\">pop(index, default)</text>\n",
-       "</g>\n",
-       "<!-- 26&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge56\">\n",
-       "<title>26-&gt;45</title>\n",
-       "<path d=\"M453.1988,-219.0639C456.0931,-220.5276 459.0313,-221.851 462,-223 599.5448,-276.2333 1682.2778,-297.6312 1897.7739,-301.3834\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.8788,-304.8856 1907.9376,-301.5584 1897.9994,-297.8866 1897.8788,-304.8856\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 27 -->\n",
-       "<g class=\"node\" id=\"node28\">\n",
-       "<title>27</title>\n",
-       "<polygon fill=\"none\" points=\"3879.5,-130 3879.5,-200 3952.5,-200 3952.5,-130 3879.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3916\" y=\"-184.8\">MaxItems</text>\n",
-       "<polyline fill=\"none\" points=\"3879.5,-177 3952.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"3879.5,-153 3952.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"3916\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 27&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge57\">\n",
-       "<title>27-&gt;45</title>\n",
-       "<path d=\"M3896.1118,-200.0158C3889.1055,-209.1293 3880.348,-217.8321 3870,-223 3801.3878,-257.2658 2566.5903,-255.0366 2490,-259 2294.7745,-269.1026 2061.5588,-290.0863 1972.2738,-298.4485\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1971.7395,-294.9832 1962.1111,-299.4041 1972.3949,-301.9525 1971.7395,-294.9832\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 27&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge58\">\n",
-       "<title>27-&gt;52</title>\n",
-       "<path d=\"M3895.7981,-200.1625C3888.8294,-209.1619 3880.1708,-217.7666 3870,-223 3799.0718,-259.4962 3232.6259,-254.2579 3153,-259 2932.5822,-272.1269 2668.6307,-291.5296 2569.3675,-298.9565\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2568.8933,-295.4821 2559.1829,-299.7198 2569.4165,-302.4626 2568.8933,-295.4821\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 27&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge59\">\n",
-       "<title>27-&gt;53</title>\n",
-       "<path d=\"M3895.3331,-200.0374C3888.4016,-208.9197 3879.8789,-217.4939 3870,-223 3761.0364,-283.732 3371.1443,-298.0456 3239.6568,-301.1788\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3239.471,-297.6821 3229.5535,-301.4095 3239.6308,-304.6802 3239.471,-297.6821\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 28 -->\n",
-       "<g class=\"node\" id=\"node29\">\n",
-       "<title>28</title>\n",
-       "<polygon fill=\"none\" points=\"3971,-130 3971,-200 4053,-200 4053,-130 3971,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4012\" y=\"-184.8\">MaxLength</text>\n",
-       "<polyline fill=\"none\" points=\"3971,-177 4053,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"3971,-153 4053,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4012\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 28&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge60\">\n",
-       "<title>28-&gt;45</title>\n",
-       "<path d=\"M3989.27,-200.0922C3981.483,-209.2078 3971.9337,-217.8927 3961,-223 3886.9354,-257.5971 2571.6408,-254.8412 2490,-259 2294.7664,-268.9451 2061.5554,-290.0203 1972.2727,-298.4277\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1971.7364,-294.9627 1962.1103,-299.3886 1972.3954,-301.9316 1971.7364,-294.9627\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 28&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge61\">\n",
-       "<title>28-&gt;52</title>\n",
-       "<path d=\"M3988.9444,-200.2578C3981.2038,-209.2593 3971.761,-217.8412 3961,-223 3879.9638,-261.8483 3242.7226,-253.9106 3153,-259 2932.5461,-271.505 2668.6158,-291.2738 2569.3629,-298.8776\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2568.8821,-295.4041 2559.1794,-299.6593 2569.418,-302.3835 2568.8821,-295.4041\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 28&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge62\">\n",
-       "<title>28-&gt;53</title>\n",
-       "<path d=\"M3988.4847,-200.1627C3980.7901,-209.047 3971.4867,-217.5908 3961,-223 3833.8023,-288.6101 3383.1451,-299.7343 3239.99,-301.6172\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3239.7864,-298.1194 3229.8302,-301.7419 3239.8724,-305.1188 3239.7864,-298.1194\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 29 -->\n",
-       "<g class=\"node\" id=\"node30\">\n",
-       "<title>29</title>\n",
-       "<polygon fill=\"none\" points=\"1509.5,-130 1509.5,-200 1584.5,-200 1584.5,-130 1509.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1547\" y=\"-184.8\">Maximum</text>\n",
-       "<polyline fill=\"none\" points=\"1509.5,-177 1584.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"1509.5,-153 1584.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1547\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 29&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge63\">\n",
-       "<title>29-&gt;45</title>\n",
-       "<path d=\"M1568.7933,-200.2512C1575.5923,-208.8087 1583.7657,-217.1636 1593,-223 1643.8586,-255.1445 1819.7357,-284.7024 1897.5096,-296.5393\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.3997,-300.0622 1907.8095,-298.0904 1898.4422,-293.1402 1897.3997,-300.0622\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 29&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge64\">\n",
-       "<title>29-&gt;52</title>\n",
-       "<path d=\"M1567.5531,-200.2456C1574.4828,-209.1312 1583.033,-217.655 1593,-223 1603.0508,-228.3899 2310.8237,-284.7283 2488.758,-298.8192\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2488.5061,-302.3101 2498.7511,-299.6102 2489.0585,-295.3319 2488.5061,-302.3101\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 30 -->\n",
-       "<g class=\"node\" id=\"node31\">\n",
-       "<title>30</title>\n",
-       "<polygon fill=\"none\" points=\"4071.5,-130 4071.5,-200 4142.5,-200 4142.5,-130 4071.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4107\" y=\"-184.8\">MinItems</text>\n",
-       "<polyline fill=\"none\" points=\"4071.5,-177 4142.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"4071.5,-153 4142.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4107\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 30&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge65\">\n",
-       "<title>30-&gt;45</title>\n",
-       "<path d=\"M4087.6948,-200.0217C4080.845,-209.1354 4072.2425,-217.8368 4062,-223 3983.9946,-262.3226 2577.2466,-254.6244 2490,-259 2294.7586,-268.7917 2061.5522,-289.9559 1972.2717,-298.4074\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1971.7334,-294.9427 1962.1095,-299.3735 1972.3959,-301.9113 1971.7334,-294.9427\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 30&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge66\">\n",
-       "<title>30-&gt;52</title>\n",
-       "<path d=\"M4087.411,-200.2177C4080.5976,-209.2183 4072.0857,-217.8098 4062,-223 3972.1233,-269.2513 3253.9308,-253.525 3153,-259 2932.5159,-270.9603 2668.6034,-291.0497 2569.3591,-298.8084\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2568.8724,-295.3357 2559.1764,-299.6064 2569.4194,-302.3143 2568.8724,-295.3357\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 30&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge67\">\n",
-       "<title>30-&gt;53</title>\n",
-       "<path d=\"M4087.0061,-200.1921C4080.2288,-209.0768 4071.8373,-217.6136 4062,-223 3989.4378,-262.7314 3406.2836,-292.34 3240.0703,-300.0338\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3239.5637,-296.5533 3229.7349,-300.5088 3239.8851,-303.5459 3239.5637,-296.5533\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 31 -->\n",
-       "<g class=\"node\" id=\"node32\">\n",
-       "<title>31</title>\n",
-       "<polygon fill=\"none\" points=\"1938.5,-130 1938.5,-200 2017.5,-200 2017.5,-130 1938.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1978\" y=\"-184.8\">MinLength</text>\n",
-       "<polyline fill=\"none\" points=\"1938.5,-177 2017.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"1938.5,-153 2017.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1978\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 31&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge68\">\n",
-       "<title>31-&gt;45</title>\n",
-       "<path d=\"M1966.9264,-200.2809C1961.4844,-217.6194 1954.8665,-238.7044 1949.0701,-257.172\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1945.6914,-256.2494 1946.036,-266.8387 1952.3701,-258.3457 1945.6914,-256.2494\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 31&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge69\">\n",
-       "<title>31-&gt;52</title>\n",
-       "<path d=\"M2000.2174,-200.1006C2007.4094,-208.8723 2016.1183,-217.3733 2026,-223 2105.2791,-268.1422 2383.7187,-291.8473 2488.6151,-299.3371\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2488.5728,-302.8427 2498.7934,-300.0517 2489.0631,-295.8599 2488.5728,-302.8427\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 31&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge70\">\n",
-       "<title>31-&gt;53</title>\n",
-       "<path d=\"M1999.4081,-200.0797C2006.687,-209.0772 2015.6439,-217.7017 2026,-223 2133.4625,-277.9788 2447.5638,-250.8771 2568,-259 2787.305,-273.7912 3049.6587,-291.8834 3152.0439,-298.9593\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3152.0864,-302.4705 3162.3039,-299.6685 3152.5691,-295.4871 3152.0864,-302.4705\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 32 -->\n",
-       "<g class=\"node\" id=\"node33\">\n",
-       "<title>32</title>\n",
-       "<polygon fill=\"none\" points=\"1602.5,-130 1602.5,-200 1675.5,-200 1675.5,-130 1602.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1639\" y=\"-184.8\">Minimum</text>\n",
-       "<polyline fill=\"none\" points=\"1602.5,-177 1675.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"1602.5,-153 1675.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1639\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 32&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge71\">\n",
-       "<title>32-&gt;45</title>\n",
-       "<path d=\"M1660.7442,-200.0832C1667.3469,-208.5387 1675.2125,-216.8852 1684,-223 1750.6552,-269.3821 1845.7592,-289.441 1897.669,-297.3699\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.359,-300.8617 1907.7593,-298.8406 1898.3687,-293.9348 1897.359,-300.8617\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 32&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge72\">\n",
-       "<title>32-&gt;52</title>\n",
-       "<path d=\"M1659.0017,-200.1778C1665.7792,-209.0623 1674.1688,-217.6026 1684,-223 1719.7423,-242.6229 2325.6245,-287.3886 2488.8,-299.1345\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2488.672,-302.6342 2498.8971,-299.8598 2489.1736,-295.6522 2488.672,-302.6342\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 33 -->\n",
-       "<g class=\"node\" id=\"node34\">\n",
-       "<title>33</title>\n",
-       "<polygon fill=\"none\" points=\"1693.5,-130 1693.5,-200 1772.5,-200 1772.5,-130 1693.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1733\" y=\"-184.8\">MultipleOf</text>\n",
-       "<polyline fill=\"none\" points=\"1693.5,-177 1772.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"1693.5,-153 1772.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1733\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 33&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge73\">\n",
-       "<title>33-&gt;45</title>\n",
-       "<path d=\"M1758.3077,-200.2627C1765.1033,-208.3321 1772.8479,-216.4518 1781,-223 1816.986,-251.9058 1865.2329,-274.566 1898.0702,-288.0684\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.1522,-291.4719 1907.7358,-291.9616 1899.7676,-284.9788 1897.1522,-291.4719\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 33&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge74\">\n",
-       "<title>33-&gt;52</title>\n",
-       "<path d=\"M1754.7883,-200.1268C1762.0247,-209.0105 1770.8641,-217.5631 1781,-223 1843.6575,-256.6095 2341.1213,-290.2127 2488.1896,-299.4929\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2488.3606,-303.0104 2498.5602,-300.1435 2488.799,-296.0241 2488.3606,-303.0104\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 34 -->\n",
-       "<g class=\"node\" id=\"node35\">\n",
-       "<title>34</title>\n",
-       "<polygon fill=\"none\" points=\"471,-130 471,-200 525,-200 525,-130 471,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"498\" y=\"-184.8\">Not</text>\n",
-       "<polyline fill=\"none\" points=\"471,-177 525,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"471,-153 525,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"498\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 34&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge75\">\n",
-       "<title>34-&gt;45</title>\n",
-       "<path d=\"M512.5767,-200.2719C517.9761,-209.158 525.0324,-217.6754 534,-223 594.3182,-258.8143 1680.5087,-294.1421 1897.472,-300.8592\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.6047,-304.3649 1907.7079,-301.1748 1897.8205,-297.3682 1897.6047,-304.3649\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 35 -->\n",
-       "<g class=\"node\" id=\"node36\">\n",
-       "<title>35</title>\n",
-       "<polygon fill=\"none\" points=\"543,-130 543,-200 597,-200 597,-130 543,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"570\" y=\"-184.8\">Null</text>\n",
-       "<polyline fill=\"none\" points=\"543,-177 597,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"543,-153 597,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"570\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 35&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge76\">\n",
-       "<title>35-&gt;45</title>\n",
-       "<path d=\"M584.5872,-200.2543C589.9867,-209.1401 597.0405,-217.6618 606,-223 719.691,-290.739 1693.6567,-300.504 1897.6343,-301.8098\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.8133,-305.3108 1907.8345,-301.872 1897.8561,-298.311 1897.8133,-305.3108\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 36 -->\n",
-       "<g class=\"node\" id=\"node37\">\n",
-       "<title>36</title>\n",
-       "<polygon fill=\"none\" points=\"1790.5,-130 1790.5,-200 1845.5,-200 1845.5,-130 1790.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1818\" y=\"-184.8\">OneOf</text>\n",
-       "<polyline fill=\"none\" points=\"1790.5,-177 1845.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"1790.5,-153 1845.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1818\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 36&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge77\">\n",
-       "<title>36-&gt;45</title>\n",
-       "<path d=\"M1838.6902,-200.2292C1843.7148,-207.9606 1849.2939,-215.9404 1855,-223 1868.6879,-239.9348 1885.6375,-257.1116 1900.407,-271.1039\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1898.208,-273.8394 1907.9029,-278.1125 1902.9888,-268.7262 1898.208,-273.8394\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 36&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge78\">\n",
-       "<title>36-&gt;52</title>\n",
-       "<path d=\"M1833.5729,-200.2427C1839.1014,-209.0158 1846.195,-217.482 1855,-223 1908.8777,-256.7647 2351.1682,-289.7608 2488.489,-299.2746\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2488.3714,-302.7747 2498.5883,-299.97 2488.8523,-295.7913 2488.3714,-302.7747\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 37 -->\n",
-       "<g class=\"node\" id=\"node38\">\n",
-       "<title>37</title>\n",
-       "<polygon fill=\"none\" points=\"1864,-130 1864,-200 1920,-200 1920,-130 1864,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1892\" y=\"-184.8\">Pattern</text>\n",
-       "<polyline fill=\"none\" points=\"1864,-177 1920,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"1864,-153 1920,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"1892\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 37&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge79\">\n",
-       "<title>37-&gt;45</title>\n",
-       "<path d=\"M1903.0736,-200.2809C1908.5156,-217.6194 1915.1335,-238.7044 1920.9299,-257.172\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1917.6299,-258.3457 1923.964,-266.8387 1924.3086,-256.2494 1917.6299,-258.3457\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 37&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge80\">\n",
-       "<title>37-&gt;52</title>\n",
-       "<path d=\"M1907.6245,-200.1609C1913.1535,-208.9333 1920.2345,-217.4194 1929,-223 2022.5597,-282.5647 2369.8949,-297.6139 2488.7833,-301.0595\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2488.817,-304.5617 2498.9103,-301.3407 2489.0113,-297.5644 2488.817,-304.5617\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 38 -->\n",
-       "<g class=\"node\" id=\"node39\">\n",
-       "<title>38</title>\n",
-       "<polygon fill=\"none\" points=\"2035.5,-130 2035.5,-200 2148.5,-200 2148.5,-130 2035.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2092\" y=\"-184.8\">PatternProperties</text>\n",
-       "<polyline fill=\"none\" points=\"2035.5,-177 2148.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"2035.5,-153 2148.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2092\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 38&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge81\">\n",
-       "<title>38-&gt;45</title>\n",
-       "<path d=\"M2052.2471,-200.0032C2043.6031,-207.5952 2034.5016,-215.5743 2026,-223 2007.5839,-239.0855 1987.016,-256.9496 1970.0996,-271.6156\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1967.3786,-269.3423 1962.1139,-278.5366 1971.9631,-274.6321 1967.3786,-269.3423\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 38&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge82\">\n",
-       "<title>38-&gt;52</title>\n",
-       "<path d=\"M2124.9105,-200.2873C2134.5137,-208.8447 2145.5321,-217.1905 2157,-223 2268.2026,-279.3337 2417.7242,-295.5439 2488.5533,-300.1724\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2488.6291,-303.6834 2498.8234,-300.7975 2489.0545,-296.6964 2488.6291,-303.6834\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 38&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge83\">\n",
-       "<title>38-&gt;53</title>\n",
-       "<path d=\"M2123.0809,-200.1167C2132.9836,-209.1151 2144.6138,-217.7308 2157,-223 2180.2928,-232.909 2957.4833,-285.9065 3152.1376,-299.0493\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3152.069,-302.5525 3162.2819,-299.7337 3152.5403,-295.5684 3152.069,-302.5525\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 39 -->\n",
-       "<g class=\"node\" id=\"node40\">\n",
-       "<title>39</title>\n",
-       "<polygon fill=\"none\" points=\"2166.5,-130 2166.5,-200 2239.5,-200 2239.5,-130 2166.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2203\" y=\"-184.8\">Properties</text>\n",
-       "<polyline fill=\"none\" points=\"2166.5,-177 2239.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"2166.5,-153 2239.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2203\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 39&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge84\">\n",
-       "<title>39-&gt;45</title>\n",
-       "<path d=\"M2180.2559,-200.1586C2173.5603,-208.5136 2165.675,-216.7927 2157,-223 2099.6244,-264.0545 2018.8045,-285.647 1972.1654,-295.3679\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1971.3085,-291.97 1962.1948,-297.373 1972.6886,-298.8326 1971.3085,-291.97\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 39&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge85\">\n",
-       "<title>39-&gt;52</title>\n",
-       "<path d=\"M2225.2248,-200.2589C2231.9742,-208.713 2240.0153,-217.015 2249,-223 2324.1891,-273.0861 2430.9998,-291.7482 2488.5382,-298.4471\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2488.367,-301.9493 2498.6897,-299.5636 2489.1323,-294.9913 2488.367,-301.9493\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 39&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge86\">\n",
-       "<title>39-&gt;53</title>\n",
-       "<path d=\"M2223.5497,-200.2519C2230.4794,-209.1376 2239.0304,-217.6599 2249,-223 2289.3266,-244.6006 2970.8389,-288.0849 3152.0467,-299.308\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3152.0743,-302.8163 3162.2712,-299.9399 3152.5062,-295.8296 3152.0743,-302.8163\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 40 -->\n",
-       "<g class=\"node\" id=\"node41\">\n",
-       "<title>40</title>\n",
-       "<polygon fill=\"none\" points=\"2258,-130 2258,-200 2362,-200 2362,-130 2258,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2310\" y=\"-184.8\">PropertyNames</text>\n",
-       "<polyline fill=\"none\" points=\"2258,-177 2362,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"2258,-153 2362,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2310\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 40&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge87\">\n",
-       "<title>40-&gt;45</title>\n",
-       "<path d=\"M2278.6865,-200.0286C2269.5265,-208.5865 2258.997,-216.9972 2248,-223 2156.8111,-272.7758 2033.569,-291.8877 1972.5058,-298.6446\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1971.7772,-295.202 1962.1997,-299.732 1972.5118,-302.1633 1971.7772,-295.202\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 40&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge88\">\n",
-       "<title>40-&gt;52</title>\n",
-       "<path d=\"M2343.2831,-200.0254C2351.8852,-208.102 2361.4307,-216.2844 2371,-223 2408.585,-249.3765 2456.2503,-271.9222 2489.3492,-286.0959\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2488.1276,-289.3793 2498.7015,-290.0442 2490.8501,-282.9304 2488.1276,-289.3793\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 40&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge89\">\n",
-       "<title>40-&gt;53</title>\n",
-       "<path d=\"M2339.2144,-200.2579C2348.4349,-209.1437 2359.2994,-217.6646 2371,-223 2442.4175,-255.5662 2991.489,-290.0123 3152.0418,-299.4726\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3151.8583,-302.9678 3162.0461,-300.0593 3152.2681,-295.9798 3151.8583,-302.9678\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 41 -->\n",
-       "<g class=\"node\" id=\"node42\">\n",
-       "<title>41</title>\n",
-       "<polygon fill=\"none\" points=\"2380,-130 2380,-200 2448,-200 2448,-130 2380,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2414\" y=\"-184.8\">Required</text>\n",
-       "<polyline fill=\"none\" points=\"2380,-177 2448,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"2380,-153 2448,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2414\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 41&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge90\">\n",
-       "<title>41-&gt;45</title>\n",
-       "<path d=\"M2394.4106,-200.2337C2388.0131,-208.8974 2380.156,-217.31 2371,-223 2304.0759,-264.5899 2065.0693,-290.2052 1972.2405,-298.7804\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1971.8191,-295.3041 1962.1773,-299.6958 1972.4533,-302.2754 1971.8191,-295.3041\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 41&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge91\">\n",
-       "<title>41-&gt;52</title>\n",
-       "<path d=\"M2439.1321,-200.0955C2444.8625,-207.7564 2451.0266,-215.7405 2457,-223 2467.9361,-236.2906 2480.3988,-250.3206 2491.8465,-262.8096\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2489.4663,-265.3912 2498.8204,-270.3663 2494.6104,-260.6438 2489.4663,-265.3912\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 41&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge92\">\n",
-       "<title>41-&gt;53</title>\n",
-       "<path d=\"M2432.8799,-200.074C2439.3524,-208.9569 2447.4255,-217.5222 2457,-223 2517.4958,-257.6107 3002.293,-290.0732 3152.0758,-299.3591\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3152.0744,-302.8656 3162.2708,-299.9874 3152.505,-295.8788 3152.0744,-302.8656\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 42 -->\n",
-       "<g class=\"node\" id=\"node43\">\n",
-       "<title>42</title>\n",
-       "<polygon fill=\"none\" points=\"615,-130 615,-200 669,-200 669,-130 615,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"642\" y=\"-184.8\">String</text>\n",
-       "<polyline fill=\"none\" points=\"615,-177 669,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"615,-153 669,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"642\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 42&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge93\">\n",
-       "<title>42-&gt;45</title>\n",
-       "<path d=\"M656.5989,-200.2347C661.9986,-209.1201 669.0496,-217.6466 678,-223 785.1038,-287.0606 1700.8686,-299.6919 1897.795,-301.6754\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1897.8914,-305.1764 1907.9251,-301.7743 1897.9598,-298.1768 1897.8914,-305.1764\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 43 -->\n",
-       "<g class=\"node\" id=\"node44\">\n",
-       "<title>43</title>\n",
-       "<polygon fill=\"none\" points=\"2466,-130 2466,-200 2520,-200 2520,-130 2466,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2493\" y=\"-184.8\">Then</text>\n",
-       "<polyline fill=\"none\" points=\"2466,-177 2520,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"2466,-153 2520,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2493\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 43&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge94\">\n",
-       "<title>43-&gt;45</title>\n",
-       "<path d=\"M2477.9029,-200.0385C2472.5243,-208.8096 2465.609,-217.3258 2457,-223 2376.8154,-275.8504 2078.1364,-295.1117 1972.3957,-300.3613\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1972.0201,-296.8752 1962.2005,-300.8533 1972.3577,-303.8671 1972.0201,-296.8752\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 43&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge95\">\n",
-       "<title>43-&gt;52</title>\n",
-       "<path d=\"M2502.2709,-200.2809C2506.806,-217.5395 2512.3165,-238.5102 2517.1533,-256.9166\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2513.8339,-258.0565 2519.7605,-266.8387 2520.6041,-256.2775 2513.8339,-258.0565\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 43&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge96\">\n",
-       "<title>43-&gt;53</title>\n",
-       "<path d=\"M2507.9788,-200.2212C2513.3562,-208.9942 2520.3005,-217.4656 2529,-223 2581.6185,-256.4747 3012.0705,-289.1698 3152.1376,-299.0124\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3152.2621,-302.5295 3162.4817,-299.7347 3152.7498,-295.5465 3152.2621,-302.5295\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 44 -->\n",
-       "<g class=\"node\" id=\"node45\">\n",
-       "<title>44</title>\n",
-       "<polygon fill=\"none\" points=\"2538,-130 2538,-200 2592,-200 2592,-130 2538,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2565\" y=\"-184.8\">Title</text>\n",
-       "<polyline fill=\"none\" points=\"2538,-177 2592,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"2538,-153 2592,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2565\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 44&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge97\">\n",
-       "<title>44-&gt;45</title>\n",
-       "<path d=\"M2549.9691,-200.1399C2544.5912,-208.9121 2537.6596,-217.4034 2529,-223 2436.1162,-283.0297 2087.7984,-297.839 1972.3991,-301.1345\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1972.1879,-297.6388 1962.2871,-301.4105 1972.3789,-304.6362 1972.1879,-297.6388\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 44&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge98\">\n",
-       "<title>44-&gt;52</title>\n",
-       "<path d=\"M2555.7291,-200.2809C2551.194,-217.5395 2545.6835,-238.5102 2540.8467,-256.9166\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2537.3959,-256.2775 2538.2395,-266.8387 2544.1661,-258.0565 2537.3959,-256.2775\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 44&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge99\">\n",
-       "<title>44-&gt;53</title>\n",
-       "<path d=\"M2580.0301,-200.1412C2585.408,-208.9133 2592.3398,-217.4043 2601,-223 2692.4242,-282.0722 3030.875,-297.3418 3152.2916,-300.9606\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3152.2474,-304.4607 3162.3434,-301.2481 3152.4476,-297.4635 3152.2474,-304.4607\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 46 -->\n",
-       "<g class=\"node\" id=\"node47\">\n",
-       "<title>46</title>\n",
-       "<polygon fill=\"none\" points=\"327,-.5 327,-70.5 381,-70.5 381,-.5 327,-.5\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"354\" y=\"-55.3\">Tuple</text>\n",
-       "<polyline fill=\"none\" points=\"327,-47.5 381,-47.5 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"327,-23.5 381,-23.5 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"354\" y=\"-8.3\"> </text>\n",
-       "</g>\n",
-       "<!-- 46&#45;&gt;26 -->\n",
-       "<g class=\"edge\" id=\"edge100\">\n",
-       "<title>46-&gt;26</title>\n",
-       "<path d=\"M364.0127,-70.5446C366.4271,-78.9949 369.0877,-88.3071 371.7689,-97.691\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"368.4482,-98.8093 374.5608,-107.4629 375.1789,-96.8862 368.4482,-98.8093\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 47 -->\n",
-       "<g class=\"node\" id=\"node48\">\n",
-       "<title>47</title>\n",
-       "<polygon fill=\"none\" points=\"399,-.5 399,-70.5 457,-70.5 457,-.5 399,-.5\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"428\" y=\"-55.3\">Unique</text>\n",
-       "<polyline fill=\"none\" points=\"399,-47.5 457,-47.5 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"399,-23.5 457,-23.5 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"428\" y=\"-8.3\"> </text>\n",
-       "</g>\n",
-       "<!-- 47&#45;&gt;26 -->\n",
-       "<g class=\"edge\" id=\"edge101\">\n",
-       "<title>47-&gt;26</title>\n",
-       "<path d=\"M417.9873,-70.5446C415.5729,-78.9949 412.9123,-88.3071 410.2311,-97.691\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"406.8211,-96.8862 407.4392,-107.4629 413.5518,-98.8093 406.8211,-96.8862\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 48 -->\n",
-       "<g class=\"node\" id=\"node49\">\n",
-       "<title>48</title>\n",
-       "<polygon fill=\"none\" points=\"2610.5,-130 2610.5,-200 2699.5,-200 2699.5,-130 2610.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2655\" y=\"-184.8\">UniqueItems</text>\n",
-       "<polyline fill=\"none\" points=\"2610.5,-177 2699.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"2610.5,-153 2699.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2655\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 48&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge102\">\n",
-       "<title>48-&gt;45</title>\n",
-       "<path d=\"M2629.7049,-200.0729C2621.5514,-208.9558 2611.7966,-217.5214 2601,-223 2489.3885,-279.6362 2095.5502,-296.8617 1972.215,-300.9276\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1972.0169,-297.432 1962.134,-301.2502 1972.2409,-304.4285 1972.0169,-297.432\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 48&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge103\">\n",
-       "<title>48-&gt;52</title>\n",
-       "<path d=\"M2622.5519,-200.2809C2605.3004,-219.0384 2584.0162,-242.1808 2566.11,-261.6502\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2563.3684,-259.4608 2559.1751,-269.1905 2568.5207,-264.1994 2563.3684,-259.4608\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 48&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge104\">\n",
-       "<title>48-&gt;53</title>\n",
-       "<path d=\"M2680.1473,-200.0806C2688.0946,-208.8522 2697.5599,-217.358 2708,-223 2784.7392,-264.4708 3047.2815,-289.8913 3152.1828,-298.604\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3152.1667,-302.1143 3162.4191,-299.4425 3152.7382,-295.1376 3152.1667,-302.1143\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 49 -->\n",
-       "<g class=\"node\" id=\"node50\">\n",
-       "<title>49</title>\n",
-       "<polygon fill=\"none\" points=\"4856.5,-130 4856.5,-200 4941.5,-200 4941.5,-130 4856.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4899\" y=\"-184.8\">_ConstType</text>\n",
-       "<polyline fill=\"none\" points=\"4856.5,-177 4941.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"4856.5,-153 4941.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4899\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 57 -->\n",
-       "<g class=\"node\" id=\"node58\">\n",
-       "<title>57</title>\n",
-       "<polygon fill=\"none\" points=\"4601.5,-259.5 4601.5,-344.5 4728.5,-344.5 4728.5,-259.5 4601.5,-259.5\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4665\" y=\"-329.3\">_SchemaMeta</text>\n",
-       "<polyline fill=\"none\" points=\"4601.5,-321.5 4728.5,-321.5 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"4601.5,-297.5 4728.5,-297.5 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"start\" x=\"4609.5\" y=\"-282.3\">create(cls, name)</text>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"start\" x=\"4609.5\" y=\"-267.3\">validate(cls, object)</text>\n",
-       "</g>\n",
-       "<!-- 49&#45;&gt;57 -->\n",
-       "<g class=\"edge\" id=\"edge105\">\n",
-       "<title>49-&gt;57</title>\n",
-       "<path d=\"M4871.7798,-200.2732C4864.3539,-208.4342 4855.8854,-216.5933 4847,-223 4814.1826,-246.6626 4773.1662,-265.2422 4738.383,-278.4217\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"4736.9078,-275.2358 4728.7496,-281.9956 4739.3426,-281.7987 4736.9078,-275.2358\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 50 -->\n",
-       "<g class=\"node\" id=\"node51\">\n",
-       "<title>50</title>\n",
-       "<polygon fill=\"none\" points=\"4845.5,-.5 4845.5,-70.5 4952.5,-70.5 4952.5,-.5 4845.5,-.5\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4899\" y=\"-55.3\">_ContainerType</text>\n",
-       "<polyline fill=\"none\" points=\"4845.5,-47.5 4952.5,-47.5 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"4845.5,-23.5 4952.5,-23.5 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4899\" y=\"-8.3\"> </text>\n",
-       "</g>\n",
-       "<!-- 50&#45;&gt;49 -->\n",
-       "<g class=\"edge\" id=\"edge106\">\n",
-       "<title>50-&gt;49</title>\n",
-       "<path d=\"M4899,-70.5446C4899,-85.6604 4899,-103.5338 4899,-119.6429\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"4895.5001,-119.9274 4899,-129.9274 4902.5001,-119.9275 4895.5001,-119.9274\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 51 -->\n",
-       "<g class=\"node\" id=\"node52\">\n",
-       "<title>51</title>\n",
-       "<polygon fill=\"none\" points=\"4369,-130 4369,-200 4459,-200 4459,-130 4369,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4414\" y=\"-184.8\">_ListSchema</text>\n",
-       "<polyline fill=\"none\" points=\"4369,-177 4459,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"4369,-153 4459,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4414\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 51&#45;&gt;57 -->\n",
-       "<g class=\"edge\" id=\"edge107\">\n",
-       "<title>51-&gt;57</title>\n",
-       "<path d=\"M4442.0345,-200.1154C4449.813,-208.3742 4458.6968,-216.6184 4468,-223 4505.5374,-248.749 4552.719,-268.043 4591.4969,-281.116\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"4590.5705,-284.4959 4601.1637,-284.3058 4592.764,-277.8485 4590.5705,-284.4959\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 54 -->\n",
-       "<g class=\"node\" id=\"node55\">\n",
-       "<title>54</title>\n",
-       "<polygon fill=\"none\" points=\"4477.5,-130 4477.5,-200 4594.5,-200 4594.5,-130 4477.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4536\" y=\"-184.8\">_NumericSchema</text>\n",
-       "<polyline fill=\"none\" points=\"4477.5,-177 4594.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"4477.5,-153 4594.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4536\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 54&#45;&gt;57 -->\n",
-       "<g class=\"edge\" id=\"edge108\">\n",
-       "<title>54-&gt;57</title>\n",
-       "<path d=\"M4569.2207,-200.2809C4583.9161,-215.8876 4601.4696,-234.5298 4617.5113,-251.5663\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"4615.3562,-254.3831 4624.7597,-259.2642 4620.4526,-249.5844 4615.3562,-254.3831\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 56 -->\n",
-       "<g class=\"node\" id=\"node57\">\n",
-       "<title>56</title>\n",
-       "<polygon fill=\"none\" points=\"4612.5,-130 4612.5,-200 4717.5,-200 4717.5,-130 4612.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4665\" y=\"-184.8\">_ObjectSchema</text>\n",
-       "<polyline fill=\"none\" points=\"4612.5,-177 4717.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"4612.5,-153 4717.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4665\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 56&#45;&gt;57 -->\n",
-       "<g class=\"edge\" id=\"edge109\">\n",
-       "<title>56-&gt;57</title>\n",
-       "<path d=\"M4665,-200.2809C4665,-215.1846 4665,-232.8565 4665,-249.2547\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"4661.5001,-249.2642 4665,-259.2642 4668.5001,-249.2643 4661.5001,-249.2642\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 58 -->\n",
-       "<g class=\"node\" id=\"node59\">\n",
-       "<title>58</title>\n",
-       "<polygon fill=\"none\" points=\"4736,-130 4736,-200 4838,-200 4838,-130 4736,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4787\" y=\"-184.8\">_StringSchema</text>\n",
-       "<polyline fill=\"none\" points=\"4736,-177 4838,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"4736,-153 4838,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"4787\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 58&#45;&gt;57 -->\n",
-       "<g class=\"edge\" id=\"edge110\">\n",
-       "<title>58-&gt;57</title>\n",
-       "<path d=\"M4755.582,-200.2809C4741.684,-215.8876 4725.083,-234.5298 4709.9118,-251.5663\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"4707.0933,-249.4685 4703.0567,-259.2642 4712.3209,-254.1238 4707.0933,-249.4685\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 59 -->\n",
-       "<g class=\"node\" id=\"node60\">\n",
-       "<title>59</title>\n",
-       "<polygon fill=\"none\" points=\"2717.5,-130 2717.5,-200 2814.5,-200 2814.5,-130 2717.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2766\" y=\"-184.8\">maxProperties</text>\n",
-       "<polyline fill=\"none\" points=\"2717.5,-177 2814.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"2717.5,-153 2814.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2766\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 59&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge111\">\n",
-       "<title>59-&gt;45</title>\n",
-       "<path d=\"M2738.4722,-200.202C2729.709,-209.087 2719.3185,-217.6213 2708,-223 2640.9883,-254.8448 2118.2979,-290.2983 1972.5949,-299.6412\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1972.1343,-296.1634 1962.3775,-300.2931 1972.5801,-303.1492 1972.1343,-296.1634\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 59&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge112\">\n",
-       "<title>59-&gt;52</title>\n",
-       "<path d=\"M2735.0866,-200.1174C2726.8176,-208.2823 2717.5166,-216.4821 2708,-223 2664.0077,-253.13 2606.6644,-276.0127 2568.8834,-289.2075\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2567.5715,-285.9572 2559.247,-292.511 2569.8416,-292.5789 2567.5715,-285.9572\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 59&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge113\">\n",
-       "<title>59-&gt;53</title>\n",
-       "<path d=\"M2793.9385,-200.0406C2802.4267,-208.7036 2812.3529,-217.1641 2823,-223 2879.6149,-254.0321 3066.5259,-283.6418 3152.2909,-295.9785\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3151.8391,-299.4494 3162.2331,-297.3963 3152.8274,-292.5195 3151.8391,-299.4494\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 60 -->\n",
-       "<g class=\"node\" id=\"node61\">\n",
-       "<title>60</title>\n",
-       "<polygon fill=\"none\" points=\"2832.5,-130 2832.5,-200 2927.5,-200 2927.5,-130 2832.5,-130\" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2880\" y=\"-184.8\">minProperties</text>\n",
-       "<polyline fill=\"none\" points=\"2832.5,-177 2927.5,-177 \" stroke=\"#000000\"/>\n",
-       "<polyline fill=\"none\" points=\"2832.5,-153 2927.5,-153 \" stroke=\"#000000\"/>\n",
-       "<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"2880\" y=\"-137.8\"> </text>\n",
-       "</g>\n",
-       "<!-- 60&#45;&gt;45 -->\n",
-       "<g class=\"edge\" id=\"edge114\">\n",
-       "<title>60-&gt;45</title>\n",
-       "<path d=\"M2853.0886,-200.2937C2844.4788,-209.1801 2834.2331,-217.6923 2823,-223 2803.4228,-232.2504 2139.204,-285.72 1972.6045,-299.0102\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"1972.0529,-295.5429 1962.3626,-299.8265 1972.6092,-302.5208 1972.0529,-295.5429\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 60&#45;&gt;52 -->\n",
-       "<g class=\"edge\" id=\"edge115\">\n",
-       "<title>60-&gt;52</title>\n",
-       "<path d=\"M2851.2542,-200.2687C2842.9002,-208.7227 2833.2424,-217.0222 2823,-223 2740.7531,-271.0022 2628.64,-290.5685 2569.4462,-297.9477\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"2568.8894,-294.4892 2559.3741,-299.1486 2569.7182,-301.44 2568.8894,-294.4892\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "<!-- 60&#45;&gt;53 -->\n",
-       "<g class=\"edge\" id=\"edge116\">\n",
-       "<title>60-&gt;53</title>\n",
-       "<path d=\"M2908.2859,-200.0558C2916.493,-208.5114 2925.9701,-216.8649 2936,-223 3004.9997,-265.2055 3098.1965,-286.3129 3152.2307,-295.6515\" fill=\"none\" stroke=\"#000000\"/>\n",
-       "<polygon fill=\"none\" points=\"3151.7329,-299.1168 3162.173,-297.3129 3152.8867,-292.2125 3151.7329,-299.1168\" stroke=\"#000000\"/>\n",
-       "</g>\n",
-       "</g>\n",
-       "</svg>"
-      ],
-      "text/plain": [
-       "<IPython.core.display.SVG object>"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
     }
    ],
    "source": [
diff --git a/wtypes.py b/wtypes.py
index 7c7a2f2..42a6f5b 100644
--- a/wtypes.py
+++ b/wtypes.py
@@ -110,8 +110,6 @@ _type
         cls._type = schema.pop("type", None) or cls._type
         # Combine metadata across the module resolution order.
         cls._merge_annotations(), cls._merge_schema()
-        if schema.get("type", "null") not in simpleTypes:
-            cls._type = schema.pop("type")
         cls._schema.update(schema)
 
         jsonschema.validate(
@@ -122,8 +120,19 @@ _type
         """Validate the proposed schema against the jsonschema schema."""
         return cls
 
+    def example(cls):
+        """Generate an example from a schema. 
+        
+        
+    Note
+    ----
+    Requires hypothesis_jsonschema
+    """
+        return __import__("hypothesis_jsonschema").from_schema(cls._schema).example()
+
     def create(cls, name: str, **schema):
         """Create a new schema type.
+        
 
 Parameters
 ----------
@@ -339,7 +348,7 @@ object
                 return (
                     {
                         k: v["default"]
-                        for k, v in cls._schema["properties"]
+                        for k, v in cls._schema["properties"].items()
                         if "default" in v
                     },
                 )
@@ -579,7 +588,12 @@ class _Object(metaclass=_ObjectSchema):
     def __init_subclass__(cls, **kwargs):
         cls._schema = copy.deepcopy(cls._schema)
         cls._schema.update(kwargs)
-        cls._schema.update(Properties[cls.__annotations__]._schema)
+        if "properties" in cls._schema:
+            cls._schema.properties.update(
+                Properties[cls.__annotations__]._schema.properties
+            )
+        else:
+            cls._schema.update(Properties[cls.__annotations__]._schema)
         required = []
         for key in cls.__annotations__:
             if hasattr(cls, key):
@@ -602,6 +616,9 @@ Examples
 --------
 
     >>> assert istype(Dict, __import__('collections').abc.MutableMapping)
+    >>> assert (Dict + Default[{'b': 'foo'}])() == {'b': 'foo'}
+    >>> assert (Dict + Default[{'b': 'foo'}])({'a': 'bar'}) == {'a': 'bar'}
+
 
     >>> assert isinstance({}, Dict)
     >>> assert not isinstance([], Dict)
@@ -624,14 +641,18 @@ Examples
     """
 
     def __new__(cls, *args, **kwargs):
-        return super().__new__(cls, dict(*args, **kwargs))
+        if not (args or kwargs):
+            args = cls._resolve_defaults()
+        else:
+            args = (dict(*args, **kwargs),)
+        return super().__new__(cls, *args)
 
     def _validate(self):
         type(self).validate(self)
 
     def __setitem__(self, key, object):
         """Only test the key being set to avoid invalid state."""
-        properties = self._schema.get("properties", None)
+        properties = self._schema.get("properties", {})
         if key in properties:
             jsonschema.validate(
                 object,
@@ -692,6 +713,7 @@ Examples
 
     def __new__(cls, *args, **kwargs):
         self = super(Trait, cls).__new__(cls)
+        # dataclass instantiates the defaults for us.
         self.__init__(*args, **kwargs)
         return self
 
@@ -703,7 +725,7 @@ Examples
         """Only test the attribute being set to avoid invalid state."""
         if isinstance(object, dict):
             object = object.get(key)
-        properties = self._schema.get("properties", None)
+        properties = self._schema.get("properties", {})
         (
             jsonschema.validate(
                 object,
@@ -780,6 +802,7 @@ Examples
 --------
 
     >>> assert isinstance('abc', String)
+    >>> assert (String+Default['abc'])() == 'abc'
     
 String patterns
 
@@ -869,6 +892,7 @@ Tuple
     _schema = dict(type="array")
 
     def __new__(cls, *args, **kwargs):
+        args = cls._resolve_defaults(*args)
         if args and isinstance(args[0], tuple):
             args = (list(args[0]) + list(args[1:]),)
         return super().__new__(cls, *args, **kwargs)
@@ -1080,11 +1104,11 @@ class ContentEncoding(
 """
 
 
-class Format(Enum[_formats], _NoInit, _NoTitle):
+class Format(Trait, _NoInit, _NoTitle, metaclass=_ConstType):
     ...
 
 
-for key in Format._schema.enum:
+for key in _formats:
     locals()[key.capitalize()] = String + Format[key]
 Regex.compile = re.compile
 del key
@@ -1106,6 +1130,128 @@ class Else(Trait, _NoInit, _NoTitle, metaclass=_ContainerType):
     """else condition type"""
 
 
+class Link:
+    _registered_links = None
+    _registered_id = None
+    _deferred_changed = None
+    _deferred_prior = None
+    _depth = 0
+
+    def __enter__(self):
+        self._depth += 1
+
+    def __exit__(self, *e):
+        self._depth -= 1
+        self._deferred_changed and e == (None, None, None) and self._propagate()
+
+    def link(this, source, that, target):
+        this.dlink(source, that, target)
+        that.dlink(target, this, source)
+        return this
+
+    def dlink(self, source, that, target, callable=None):
+        self._registered_links = self._registered_links or {}
+        self._registered_id = self._registered_id or {}
+        self._registered_links[source] = self._registered_links.get(source, {})
+        if id(that) not in self._registered_links[source]:
+            self._registered_links[source][id(that)] = {}
+        if target not in self._registered_links[source][id(that)]:
+            self._registered_links[source][id(that)][target] = None
+        if id(that) not in self._registered_id:
+            self._registered_id[id(that)] = that
+        self._registered_links[source][id(that)][target] = callable
+        return self
+
+    def observe(self, source, callable=None):
+        """The callable has to define a signature."""
+        self._registered_links = self._registered_links or {}
+        self._registered_id = self._registered_id or {}
+        self._registered_links[source] = self._registered_links.get(source, {})
+        if id(self) not in self._registered_links[source]:
+            self._registered_links[source][id(self)] = []
+        if id(self) not in self._registered_id:
+            self._registered_id[id(self)] = self
+        self._registered_links[source][id(self)].append(callable)
+        return self
+
+    def _propagate(self, *changed, **prior):
+        self._deferred_changed = list(self._deferred_changed or changed)
+        self._deferred_prior = {**prior, **(self._deferred_prior or {})}
+
+        if self._depth > 0:
+            return
+        with self:
+            while self._deferred_changed:
+                key = self._deferred_changed.pop(-1)
+                old = self._deferred_prior.pop(key, None)
+                for hash in (
+                    self._registered_links[key] if self._registered_links else []
+                ):
+                    thing = self._registered_id[hash]
+                    if hash == id(self):
+                        for func in self._registered_links[key][hash]:
+                            func(
+                                self,
+                                dict(
+                                    new=getattr(self, key, None),
+                                    old=old,
+                                    object=self,
+                                    name=key,
+                                ),
+                            )
+                    else:
+                        for to, value in self._registered_links[key][hash].items():
+                            if callable(value):
+                                thing.update({to: callable(self[key])})
+                            else:
+                                if thing.get(to, None) is not self.get(
+                                    key, inspect._empty
+                                ):
+                                    thing.update({to: self[key]})
+
+    def __setitem__(self, key, object):
+        with self:
+            prior = self.get(key, None)
+            super().__setitem__(key, object)
+            if object is not prior:
+                self._propagate(key, **{key: prior})
+
+    def update(self, *args, **kwargs):
+        with self:
+            args = dict(*args, **kwargs)
+            prior = {x: self[x] for x in args if x in self}
+            super().update(args)
+            prior = {
+                k: v for k, v in prior.items() if v is not self.get(k, inspect._empty)
+            }
+            prior and self._propagate(*prior, **prior)
+
+
+class Evented(Link, Bunch):
+    """An evented dictionary/bunch
+
+Examples
+--------
+
+    >>> e, f = Evented(), Evented()
+    >>> e.link('a', f, 'b')
+    Evented({})
+    >>> e['a'] = 1
+    >>> f.toDict()
+    {'b': 1}
+    >>> e.update(a=100)
+    >>> f.toDict()
+    {'b': 100}
+    
+    >>> f['b'] = 2
+    >>> assert e['a'] == f['b']
+    >>> e = Evented().observe('a', print)
+    >>> e['a'] = 2
+    Evented({'a': 2}) {'new': 2, 'old': None, 'object': Evented({'a': 2}), 'name': 'a'}
+    
+    """
+
+
 # ## Configuration classes
 
 


Test patch:
diff --git a/test_wtypes.ipynb b/test_wtypes.ipynb
index 9c3e258..2a3877b 100644
--- a/test_wtypes.ipynb
+++ b/test_wtypes.ipynb
@@ -156,6 +156,18 @@
    "execution_count": 10,
    "metadata": {},
    "outputs": [],
+   "source": [
+    "    def test_complex_dict():\n",
+    "        with invalid: (Dict[{'a': Email}] + Required['a']+ Default[{}] + AdditionalProperties[False])({})\n",
+    "        with invalid: (Dict[{'a': Email}] + Default[{}] + AdditionalProperties[False])({'a': 'no'})\n",
+    "        assert (Dict[{'a': Email}] + Default[{}] + AdditionalProperties[False])({'a': 'no@yes'})"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "    def test_dataclass():\n",
     "        class Thing(DataClass):\n",