diff --git a/.gitignore b/.gitignore index 2680a0ac..990dbbf3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ - .vscode/ node_modules/ diff --git a/Graph_viz.ipynb b/Graph_viz.ipynb new file mode 100644 index 00000000..99faa44f --- /dev/null +++ b/Graph_viz.ipynb @@ -0,0 +1,10881 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1da83b41", + "metadata": {}, + "source": [ + "### Test OOPNET" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "6f3592ac", + "metadata": {}, + "outputs": [], + "source": [ + "import oopnet as on\n", + "network = on.Network()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "d185688f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAm8AAAGnCAYAAADhZbDMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAB7CAAAewgFu0HU+AACzIklEQVR4nOzdd1gUyfY38O8wwJCzKCBGFDNGzLjmnHNc17zmnHNO65rXnHZXrznnvOaAOYAYkKAiCIpEh5nz/uHL/BwmdQ8ggufzPP08l+6qU9Uz3jvnVndVSYiIwBhjjDHGsgWTrO4AY4wxxhgTjpM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFshJM3xhhjjLFsxDSrO8AYYyz7evnyJf73v//h3bt3cHJygoeHB54+fYqEhAR4e3uja9eucHV1zepuMpajSIiIsroTjDHGflwJCQn49OkTnJycIJPJAABJSUkYNGgQNm3aZLB++fLlsWbNGlSqVCmzu8rYT4EfmzLGGNPqv//+Q61atWBjYwN3d3dYW1ujVq1aePDgAbp37y4ocQOAO3fuwNfXF3Pnzs3kHjP2c+CRN8YYYxrWrVuH/v37a70mkUhg7E/Hzp070aFDh/R0jbGfHidvjDHG1Dx+/BilS5c2OkHTp2zZsrhz5w4kEkmGx2bsZ8GPTRljjKmZO3dupiRuAHDv3j28fPkyU2Iz9rPg5I0xxpiaEydOZGr8mJiYTI3PWE7HS4UwxhhTk5SUlKnx3d3dtZ4PCgrCo0ePYG5ujipVqsDZ2TlT+8FYdsUjb4wxxtS4uLhkWuzChQtrJG8PHjxA7dq1UbRoUbRp0wbNmjWDh4cHevfujY8fP2ZaXxjLrjh5Y4wxpqZ3796ZFnv69Olqf/v7+6N69eq4cOGC2vnk5GRs2rQJtWvXRmxsbKb1h7HsiGebMsYYUyOXy5ErVy58+vQpQ+NWqlQJN2/eVP1NRChXrhzu37+vt9748eMxb968DO0LY9kZj7wxxhhTY2Zmhjt37sDBwUHrdRMTE8yYMUNUzAoVKuDUqVNq565fv24wcQOA9evXQy6Xi2qPsZyMkzfGGGMaChUqhDdv3mDWrFnw9PSEpaUlnJyc0KtXLzx58gRTp05F165d9cawt7dH1apVsWHDBly9elUjGbx165agvnz48AGvXr0y9lYYy3F4tiljjDGtLC0tMXnyZEyePFnjmlwu13hPTSqVwtHREe3atcP8+fNhb2+vN76YhXp5UV/G/g8nb4wxxkRJSUnBoEGDEB4ernZ+0qRJmDp1KqRSqaA4VapUEVTO1dUVBQsWFN1PxnIqfmzKGGNMsOTkZLRs2RLr16/XuDZz5kx06NABKSkpgmJVrFgRFStWNFiuf//+MDXlsQbGUnHyxhhjTLApU6bg2LFjOq/v27cPc+bMERRLIpFg06ZNOidGAEDlypUxbtw4sd1kLEfjpUIYY4wJEhcXB3d3d3z+/FlvORcXF4SGhsLCwkJQ3ICAAHTt2hV37txRnZNIJBg8eDDmzp0LGxubdPWbsZyGR94YY4wJcuXKFYOJGwBERUXh9u3bguMWK1YMo0ePVjtXvHhxLF++nBM3xrTg5I0xxpggcXFxmVIWAL58+aL2t6Wlpaj6jP1MOHljjDEmiK4N5bXZtGmTqB0a0i7Ca2ZmJrguYz8bTt4YY4wJ4u/vL7js7t27UaJECRw+fFhQ+bQjb+bm5qL6xtjPhJM3xhhjBimVSixfvlxUnTdv3qBFixbo0qULIiMj9Zbl5I0x4XjhHMYYYwYdO3YMQUFBesvY2NhALpcjOTlZ7fyOHTtw+vRprFixAh07dsSnT5+wf/9+hIeHw9HRES1btuTHpoyJwEuFMMYYM6hevXo4e/asxvlixYrBzs4OgYGBqnfcLCwskJSUpDWOt7c3QkJCkJiYqDonlUpRpkwZ3L17V3WuZcuWOHDgQMbeBGM5BI+8McYY0+vBgwdaEzczMzOYmZnh5s2baudTEzepVAqFQqF2LTAwUCOOQqFQS9wAfmzKmD78zhtjjDG9li1bpvV8kSJF8PDhQ531FAoFChUqZFSb/NiUMd145I0xxrKB6OhoPH/+HBYWFihevPh3S27ev3+Pf//9V+O8lZUVXrx4YbD+y5cvjWqXR94Y041H3hhj7Af28uVLdOrUCblz50blypXh4+OD/PnzY86cORov+WeGNWvWaExAAICmTZtqPZ9ReOSNMd04eWOMsR/UkydP4Ovri507dyIlJUV1/u3bt5g8eTKqV6+uscRGRrl+/TpGjBiBefPmaVxzcHBAkyZNMqXdVDzyxphu/NiUMcZ+QESEbt264cOHDzrL3Lp1CyVKlMCTJ08yLNm5fPkyWrRogZiYGJ1lxo4di0qVKmVIe7pw8saYbjzyxhhjP6Br165pzMDU5sWLF+jcuXOGtHn16lXUrFlTb+JmZmaGoUOHomTJkqhSpYrBmHXq1EFERARCQkLg6OgouC/82JQx3Th5Y4yxH9Dly5cFl92/fz/evXuX7jbbtGljsIxcLsehQ4cAfJ2Fqm8DeXt7e6xYsQKurq7w9PTE7t27BW84zyNvjOnGyRtjjP2Avn3HzRAiwoYNG9LVnr+/PyIiIgSVHTduHADA19cXZ86cgbe3t0YZHx8fXLhwASVKlFCdq1u3Lm7cuIGOHTvC1PT/3tqpV68eqlevrlafkzfGdON33hhj7AdUtmxZUeWFLNuhj9AN5AEgLCwMRIRLly7h8uXL6NSpE0xNTSGVSmFqaopq1aqhWrVqkEgkGnVLly6N//3vf4iPj0dUVBQcHBxgb2+PZs2aqZXjx6aM6cbJG2OM/YAaNmwIZ2dnvRMWvuXm5pau9rQlWroQEQoWLIjXr1+rnff09MT69es1RtG0sba2hrW1tervtMue8MgbY7rxY1PGGPsBSaVSTJs2TXD5wYMHp6s9Ie+7fStt4gYAoaGhaNasGc6dOye6/bRLnvDIG2O6cfLGGGPfWWxsLJ49e4bIyEidZR4/fozZs2cLivfLL7/A3d09XX0qXbo0cuXKla4YwNd39YYOHQoiElUvbfLGI2+M6cbJG2OMZbCPHz9i69atmD9/PjZs2ID3798DAO7du4d27drByckJ3t7ecHV1hZ+fH44dO6ZW/+TJk6hUqZKqnj5FixbFiRMnjO4rEeHcuXOoVatWhu3Y8PjxY1y/fl1w+cjISISEhKidCw8Pz5C+MJYjEWOMsQyhUCho8uTJZGlpSQBUh5mZGbVo0YJkMpna+W+PJUuWEBHRtm3bSCKR6CwHgCQSCXl4eNDChQtJqVQa3d/o6GgqVqyY3ra+PdLel76ja9eulJiYaLAPhw8fJhsbG60x+vbtSykpKUbfH2M5lYRI5Ng2Y4wxrYYMGYKVK1caXb9SpUq4deuWwXI1a9bEqVOnYGFhYXRbCoUCJUqUwLNnz/SWs7W1RbFixTBq1Ch4e3ujXLlygttwc3PD6NGj0b9/f7XJCSkpKQgMDMS9e/fQq1cvvVt8jR07FgsWLBDcJmM/A07eGGMsA9y7d09UYpNe9evXx6FDh4xO4A4cOIDWrVsbLGdjY4PY2FhIJBLI5XLkz58fb9++FdWWi4sLRowYgX79+mHDhg1YuXKl4MeiMpkM4eHhcHZ2FtUmYzkZv/PGGGMZYP369d+1vdOnT2PWrFlG1xc6mhUXF4eLFy8C+DoD1JhZrVFRUZg0aRLc3NwwYcIEUe+zJScnY9++faLbZCwn4+SNMcYywOPHj797m6GhoUbXffXqleCy58+fV/3nMWPGoHnz5jrLFi5cGLVq1dJ6TcyuEd/KiK2/GMtJOHljjLEMIJPJvnub9erVM7qulZWV4LJHjhxBcHAwgK+jb/v27cOKFSvUtsVyc3PDtGnTcPfuXVy4cAHXrl3T2DXBWC4uLhkSh7Gcgt95Y4yxDLBgwQKMHz/+u7bp5OSEs2fPit5KCwCmTJkieB054GvS1r9/f0yaNAl58uQB8HWZkaioKKSkpCB37twwMdEcD7h79y6mTJmCo0ePiu4jAJiamiI0NFTVJmOMkzfGGMsQkZGRKFSoEOLi4r5ru3ny5MGTJ0/g6OgoqDwR4eDBg1i8eDGuXLkiuj1LS0sMHToUY8eOhZOTk6A6ISEhyJ8/v+i2AGDAgAH466+/jKrLWE7Fj00ZYywD5MqVC//++6/ObZ0kEgnatm0LW1vbDG333bt32Lhxo6CyRISePXuidevWRiVuAJCYmIgFCxagYMGCmDVrFj5//mywjru7u1GPPlu1aoWlS5ca0UvGcjZO3hhjLIO0aNECV65cQcuWLdUeIdavXx9nzpzBnj178ObNG/j4+GRou7t27RJUbuLEidi2bZugsuXLl8etW7cwfPhwre/zxcbGYurUqShUqBD+/PNPJCUl4fLly6hTpw4sLCxgamoKJycn9O7dG7GxsahQoYKoe9q4cSP27dunajsuLg7h4eFISkoSFYexnIgfmzLGWCb49OkToqKi4OTkpPZI8/Pnz/Dy8hK09ZVQBQsWxMuXL/WWUSgUMDU1FRTv6tWrqFq1qurv0NBQzJo1C5s2bYJCodBax9bWVuconEQiEbXXqaurKyIiIgB8nem6YMECnDp1CkQEmUyG9u3bY+LEiShevLjgmIzlJDzyxhhjmcDe3h6FCxfWeBdt8eLFGolbkyZNULFiRaPbevXqFZo0aYL169erkp60Jk+eLDjet0uDAICnpyfWrVuHp0+fokuXLpBIJBp19D0+FTtGMGfOHADA2rVrUadOHZw8eVIVIzk5Gf/88w8qVaqE//77T1RcxnIKHnljjLHv5M2bNyhSpAgSEhJU55o2bYojR46AiODo6IhPnz6lqw2JRIJ27dph8eLFyJcvn+q8m5ub4PXSmjRpond26IMHDzBlyhQcOnTIqD5aW1sjPj5e67XU7bAePXoEHx8fKJVKnXFcXFwQHBystvUWYz8DHnljjLHvZNq0aWqJm4mJCRYuXAjga9IVERGhlnAZg4iwe/du5M+fH+7u7lizZg3kcjnkcrngGIbWrCtTpgwOHjyI69evw8/PT3BcU1NTnD17FnFxcfjf//6HUqVKwc7ODk5OTmjQoAEePnyo2vlh+fLlehM34OvODb///jt69+6NXr164a+//kJsbKzg/jCWXfHIG2OMfQePHz9GmTJl1BKSvn37Yt26dRplX7x4gaFDh8Lf31/nY1AxChYsCAcHB9y9e1dQ+X79+mH16tWQSqUGy7569QqFChUSFNfU1BRfvnzByZMnsXjxYoSHh8PBwQG9evVCt27dkJycjOjoaLi6uqJMmTKidoFIZWtri7Vr16Jz586i6zKWXXDyxhhj30HTpk1x7Ngx1d/W1tYICgqCm5ubzjpbt25Fz549M6R9MzMzUaNvVapUwaZNmwxOCkhISICtra3BUbJUDg4O+Pjxo8Z5ExMTVQwTExOYmZkhOTlZcH+/JZFIcPjwYTRt2tSo+oz96PixKWOMZbJz586pJW4AMHr0aL2JGwCjdk7QRUziBgDXr19H2bJlMW/ePKSkpEChUODEiRNYsmQJVq1ahcDAQABft9mqXbu24LjaEjcAasmfUqk0OnEDvj46HjdunOiJEoxlFzzyxhhjmUipVKJSpUq4c+eO6lyePHkQFBQEGxsbg/W1zez83goVKoTExES8fftW7XyjRo2wceNGfPr0CaVKlRI8+va93Lx5E5UqVcrqbjCW4XjkjTHGMtGOHTvUEjcAmDFjhqDEDQCqVauWGd1SsbKyQq1atRAbG4uLFy/Cy8tLo8zLly81EjcAOHHiBGrVqgVXV1ccPHhQ5zpy2vY8/R6Cg4OzpF3GMhuPvDHGWCZJSkqCt7c3QkJCVOeKFy+OBw8eCF4w97///kOtWrUyq4tISUlRm5iQkJCAadOmYcmSJYJH0qpVq4bnz58jMjISEokEJiYmkEqlsLe3R8eOHdGnTx/4+vqm61GoMY4fP45GjRp91zYZ+x545I0xxjLJihUr1BI3AFiwYIHgxA0A/Pz8MHbs2Izumsr9+/fV/rayssKiRYtw9epVeHp6Copx9epVvH//HkQEpVKJlJQUJCcno2TJkggNDUWFChXSlbjlyZMHZcqUEVXH3t5e1DImjGUnPPLGGGOZ4MOHDyhcuLDaoru1atXC+fPnRb/HRkTYuHEjFixYgOfPn6vO586dG0SUrq222rRpg71792q9NmPGDEyfPt3o2Flp0qRJmD17dlZ3g7FMwSNvjDGWCWbPnq2xW8LixYuNmoAgkUjQp08fBAYG4sGDB/jvv//w4sULvHv3DhEREXjy5AksLS2N6qe+98KsrKyMipnV2rRpg2nTpmV1NxjLNJy8McZYBnvx4gVWrVqldq5z587p2r8U+Prif+nSpVGzZk21hXGLFy+Ot2/folmzZqJjFixYUOc1MUuAGGJhYYGSJUtmWDxtrK2tsWPHDuzevRtmZmaZ2hZjWYmTN8YYy2ATJ05UW1fN3Nwcc+fOzdA2wsPDcfz4cZw+fRrR0dGwt7fH4cOHsWjRIlFxAgIC1B7FfqtixYqoWrVquvvar18/vHv3Dvfv38eYMWMEz7QVy8nJCZ06dcqy2a2MfS/8zhtjjGWgGzduoEqVKmrnRo0ahcWLF2dI/JcvX2LkyJE4fPiwajaoTCZD165dsWjRIjg6OsLMzAwKhUJwTH1bSr148QJ+fn548+aN0X0uUKAAevTogU2bNiEsLMzoOIb4+vrixo0bmRafsR8F/98TxhjLANHR0Zg3bx7q1Kmjdt7e3h6TJk3KkDaCgoJQpUoVHDx4UG0Zj+TkZGzatAnly5fHihUrRCVuAPD582d06dIFffr0QUJCgup8SkoKjh8/nu5+BwcHY+bMmZmauAFAt27dMjU+Yz8KHnljjLF0evToERo0aKB1IVsrKytcuHAhQ1b6r1evHs6ePZvuOJUrV0ZMTAyePXumca1EiRLYtWsXChcujCpVqmgsJZKZ7OzsEBcXZ9RODQULFsT9+/dha2ubCT1j7MfCyRtjjKVDfHw8SpQoobGe27dy5cqFwMBAODo6Gt1OYGAgihUrZlRdiUSCGzduoGjRorCzs4NEIkF8fDwGDx6MLVu2aJSXyWQwMTFBYmKi0f0FviZjsbGx6YohhJeXF44fP651dwjGciJ+bMoYY+mwY8cOvYkbAERGRmLz5s3paufmzZtG1+3atSsqVaoEe3t71VIl1tbW2Lx5M/7++29YW1urlU9OThacuKW+y+bt7Q0LCwtYWlrC19cXhw8fRnR0NHr27Gl0v4UYPHgwHj16xIkb+6lw8sYYY+mwf/9+QeV0LYT7PQwaNEjntW7duuHOnTsoW7asUbHNzc3x22+/ISAgAImJiUhISMCNGzfQrFkzSKVS1KhRw8heG7Zy5UqsWLECMpks09pg7EfEyRtjjKVDTEyMoHIfP35MVzvpeWdu6dKleq8XLVoU165dQ69evUTHDg8PR0JCAjZu3IiOHTuiRYsWGDNmDAICAgAAv/zyixE9Nqxjx456k1LGcjJO3hhjLB2cnZ0FlQsLC8PTp0+NbqdYsWJGJ0L79u1TW3dOGwsLCxQuXFh07AsXLsDd3R19+vTBrl27cPjwYSxevBjFixfH0KFDUaBAAXh7exvVb306deqU4TEZyy44eWOMsXRISkoSVC42NhblypXD3LlzsXjxYri6ukIikUAikcDS0hKdO3c2uHn7mjVrBCeL35LL5Th9+jSSkpLg7++P69evax0JDA8PFx07MTFRYxuwVCtWrMDkyZMzbI27VMWKFTNqNwnGcgqebcoYY0Z6+PAhypQpk2HxzMzMcPv2bb0xg4KCMGLECBw7dgxi/ue7Vq1aePDggeoxr0wmQ8eOHTF37lx4eHgA+Lr36pgxY9J3E5nM09MT58+fN2qUkLGcgpM3xhgzUuPGjXHixAm9ZSwsLASPzgFfJwC8ffsWTk5OesuFhISgYcOGqnfLjGVmZoZSpUqhWbNmaNKkieDtsCwtLdO9lIgYJiYmmDBhAsaMGQN7e/vv1i5jPyJO3hhjzAhnzpxB/fr11c717NkTpqamiIiIgIuLCzp27IgaNWpg2rRp+OOPPwTHFrqd1tSpUzFr1izRfddFIpFAKpUiJSVFb7lKlSph37598PT0TFd73bp1Q0REBE6fPm2w7IULF1CrVq10tcdYTsHJG2OMiaRUKlGhQgXcu3dPdc7NzQ1BQUEaa6almjZtGmbOnCkovqOjI6Kjo/WWSU5OhpeXV6ZvOaVLvnz5EBoaKurRrbH++OMPjBw5MtPbYSy74AkLjDEm0j///KOWuAHAzJkzdSZuAETtrvDp0yedSVFsbCwOHjyI5s2bf5fEzdbWFiYmmj8VISEhmZK4pU7iMDU1hZ+fH/z9/TlxYywNTt4YY0yExMRETJ48We1cyZIl8dtvv+mtJ2a5jNSRvYMHD6oSpNjYWNSsWRP29vZo1aqVzkeNqcmPh4cHhg8fLrhNXYoWLWrUXqPGCgoKglKphFwux8WLF1G+fPnv1jZj2QU/NmWMMRHmz5+PCRMmqJ07evQomjRpordeSkoKbGxsDC4HklbZsmUxatQo9O3b1+DEB5lMhpiYGFhYWEAikeDz589wcXHBly9fRLWZlebMmYOJEydmdTcY+6HxyBtjjAkUFRWFefPmqZ2rU6cOGjdubLCuqakpZsyYIbrNe/fuoXv37oJmrCYnJ2PgwIG4dOkS4uPjsXHjxmyVuAHAnTt3sroLjP3wOHljjDGBZs2ahdjYWLVzixYtUm32bkijRo30XpdIJHBzczO6fwCwZcsW1KpVC87OzhgxYkS6YmUFqVSa1V1g7IfHyRtjjAnw/PlzrF69Wu1c165dRb2TlfZdOeBrwiaTydCqVSu8ePECoaGh+Pfff1GsWLF09Vfs49kfRfXq1bO6C4z98PidN8YYE6B9+/bYs2eP6m+ZTIbAwEDkz59fUP1r166hWrVqaudmz56NSZMmaS2vUCiwa9cudOnSxfhOf2PBggWoVq0aatasKaqeubl5uh695s+fH69fvxZU1tbWFiEhIXBwcDC6PcZ+BjzyxhhjBly7dk0tcQOAoUOHGkzcnj17hlGjRsHPz0/jvbhcuXJh2LBhOutKpVK0bNnS+E5/w9HREaNHj8bOnTtF103vO3MuLi6Cy27ZsoUTN8YEMM3qDjDG2I+MiDB69Gi1c05OTgZnRM6ZM0frY9JU/fr1g42Njd4Y06dPF9xPfWJiYvDmzRtBOxlktGLFisHf399gudKlS6NNmzbfoUeMZX888sYYY3rs378fV69eVTs3ZcoUvSNEkydP1pu4AV+XHNm2bZveMhcvXhTcT0O2b9+OwMDADIlVtWpVFCxYUFA5oQvsZsfJFYxlFX7njTHGdJDL5ShZsiSCgoJU5woVKoSnT5/C3Nxca53g4GBBiQ3wdbLChQsX4Ofnp/W6r68vbt26Jb7jaZiZmUGpVEKhUKQ7llDm5uY4f/48qlWrhvLly+Pu3bs6y1aoUAFXrlyBTCb7bv1jLDvjkTfGGNNh7dq1aokbAMybN09n4gYAnTt3FhyfiDB37lyd12vUqCE4lj5yufy7Jm7u7u44cuQIqlWrho8fP+LVq1c6y9avXx8nT57kxI0xEXjkjTHGtPj06RO8vLwQFRWlOle5cmVcu3ZN77puZmZmSElJEdVWdHS01r1P4+LiYGtrKypWVnJ3d8fSpUvRsmVLVYI7adIkjQS1TZs28Pb2Rps2bVCxYsWs6Cpj2RpPWGCMMS0WLFiglrgBwOLFi/UmbgqFQnTiBgCvX7/WmrzZ2NigadOmOHr0qOiYEokkUzaO1+fNmzcoUqSIKnF79+4dli5dqlamXbt22L1793ftF2M5DY+8McZYGqGhoShatKjallStWrXC/v379dYjIkilUtFJk4ODA8aMGYMhQ4YgISEBkyZNwt69e/H582fBjztNTEzw999/QyaTwczMDO3btzdqmQ83Nze8fftWdL1UU6dOxbNnz3Dx4kXExMSofYYmJiZ4/PhxuhcgZuxnx8kbY4yl8dtvv2HLli2qv6VSKR4/fgxvb2+DdT08PPDmzRuj2rW3t0dcXJzo99O8vb1x+vRpeHp6Akj/49YiRYpovOuXEXr06IGtW7dmeFzGfjb82JQxxr5x//59jQSjX79+ghK369evazxqFePTp08Gy0gkEhw+fBgxMTGwt7fHL7/8opGoWVtbw8HBAR8/fjSqHwqFAlu3bsXmzZsRFBQEKysrvH79Ot0L9hrbH8aYOp5tyhhj3xg7dqzaY08bGxtMmzbNYL1Hjx6hSZMmghMcCwsLVK5cWXT/iAhKpRLdunVD8+bNtY6wSSQSdO/eXXTsVC9fvkSRIkVw/vx5hIWF4dmzZxgyZIjR8VIdPnwYYWFh6Y7D2M+OkzfGWI5GRLh8+TJWrFiB1atX4/79+zrLnjp1CqdOnVI7N27cOOTOnVtvGy9fvkSDBg0QExOjs4xEIoGdnR0qV66MWbNm4dWrV7h+/Tru3LmDFi1aiLqnJUuWaD1PRDh9+jTatm2LAwcOiIqZ1pw5c/DhwwfV31OmTEGZMmXSFZOIjNqiizGWBjHGWA517do1KlWqFAFQO2rUqEHPnj1TK5uSkkJlypRRK+fu7k7x8fF623jz5g0VKlRIo43Uo0+fPiSXyw321d7eXmeMtIdEIqHk5GSN/vfo0UNwDCGHlZUVzZs3jxISEoiIKDo6mnr37k0WFhZq5ezs7ATH7N+/v8hvkTGWFo+8McZypBs3bqBOnTp49OiRxrXLly+jRo0aCA4OVp37+++/8eDBA7Vys2bNgpWVlc42YmJiULduXbx8+VLrdUtLS8yYMQOmpoZfLzY0uvctIkJycrLauRkzZhjcbkushIQETJgwAQULFsS2bdtgZ2eHDRs2IDw8HMePH8ehQ4fw6tUr5MmTR3BMMffJGNMhq7NHxhjLDBUrVjQ4CtS5c2ciIoqPjycPDw+1a6VLl6aUlBSd8ePi4qhgwYJ640+aNElQX58+fUo1a9YUPHrl7u5OSqVSVf/z58+CRr+kUmm6RuKKFStGJ0+e1Oh/3bp1BccIDw8X+U0yxtLikTfGWI5z9+5d3L5922C5PXv24MOHD1i6dCnCw8PVri1cuBBSqVRrveTkZFSuXFnvtk8SiUTQu2x//vknSpYsiUuXLhksm6p3795qiwWfOXMGsbGxBuspFAqcPHkSv//+u84yzs7OOq8FBASgYcOGqF27Ns6fP4/Zs2fD19dX776l3/Lw8IC7u7ugsowx3Th5Y4zlONoelWojl8tx/fp1zJ8/X+18vXr10LBhQ611FAoFunbtisePH+uNTUT4448/9JbZu3cvRo4cCaVSKai/AODl5YURI0aonYuOjhZc38TEBKtXr4a/vz/69OmDUqVKoVSpUujVqxdu3bqF9+/fY9u2bXofb164cAF16tTBlClTcOvWLcHtnzlzRnA/GWN6ZPXQH2OMZbQdO3YIfozXvn17jckAd+/e1RpXqVRSv379BMc2NTWlmJgYnbHSTpAwdPzyyy8UFhamEev48eOCYzg4ONCSJUsoMTFR72eYmJhICxYsIGtr63Q9ak39HA4dOiT2a2SM6cDJG2MsxwkNDSUTExNBiUza98B69OihM+748eNFJy4PHz7UGuvJkyeCY/z666/k7++vs1/JycmUJ08eUf3y9PSkjRs3GpwJ++HDBxoxYgSZmpqKvneJREIDBgygV69eCfreGGPC8GNTxliOkzdvXrRp08ZgOVdXV7WtqCwsLDB79mytZRcuXKjxeFWIWbNmaV2YNjIyUnCMOnXqoHz58jqvm5ubY9CgQaL6FRoait69e6N06dLYt2+fzv1YnZycsGTJEgQFBaFjx46i2iAiNGzYEAUKFBBVjzGmH+9tyhjLkd6+fYt8+fIhJSVF6/WyZcvi3r17aufGjx+PefPmITw8HDt37sSbN2/g5OQEpVKJKVOmGN0XCwsLDB8+HOPHjwcRYfPmzdi+fbugSRUAcPz4cTRq1EjjfFBQENauXYsbN24gICBA59ZcFhYWKFWqlN72fH19MW/ePNSpU0dvX2QymahtshYuXIgxY8YILs8YEyBLx/0YYyyTHDhwQOujvDx58tD06dOpcuXKauednZ0pKiqKhg4dKmhJjUqVKol+jGhnZ0c2Njai6ri6umosyEtEtHjxYr2PhgsUKEBNmzalefPmUUREBBF9XbS4Vq1aeturX78+3bp1S+fnWqBAAVH9X7lyZaZ9x4z9rDh5Y4zlSGnXHitRogQFBASQXC6n3bt3ayQZy5Yto169eglKSP744w8aNmyY3jLGvCOm7Vi6dKnGvf37778G6y1fvlzr56JUKunEiRNUrlw5vfXbt29PAQEBGvUnTpwoqv9BQUEZ/t0y9rPj5I0xluM8fvxYI4nYvHkzEX19ub9w4cJq17y8vOjGjRuCkpFWrVpRSEgIyWQytfMSiYQsLCyoUaNGdOzYMXrz5g0NGDAgXQvjjh8/Xm0xXiIihUJBRYoUMVi3QIECehcZVigUtHPnTr2xpFIp9enTh0JDQ4no6wzUlStXkkQiEdR/Ozu7TPuOGfuZcfLGGMtxBg4cqJZEuLi4qJbGWLZsmUaSsXv3bho0aJCghKRevXoaI3Smpqb07NkzjUSLiCggIIDatGkjOnEbPHiw1nu7ffu24BiXL182+Fl9+fKF1q5dS+7u7jrjyGQyat++Pbm6uoq6h5YtW6bre2SMacezTRljOcqnT5+wdetWtXN9+/aFhYUFPn78iJkzZ6pdq1q1Ktq2bYugoCBB8Z88eYItW7aonevXrx+KFCmitutBKm9vb+zduxfm5uai7uPIkSNaz797905wjPfv3xssY2Zmhn79+iEoKAgLFiyAo6OjRpnk5GTs3r1bULxvDRw4UFR5xpgwnLwxxnKULVu2ID4+XvW3VCpVbQc1f/58fPjwQa384sWLIZFI9G5A/63Pnz+r7YhgZWUlaCaqiYm4/7kNDg7WOqszV65cgmN8/vxZcFkrKyuMHTsWL1++xMSJE2FpaSm4rjYtW7ZE/fr10xWDMaYdJ2+MsRxDqVRi5cqVaudatWoFT09PhISEYOnSpWrX2rRpg2rVqgGA1qU4tEmbEI0cORJ58uQxWE8mkwmK/y1t+51WrFgRBQsWFFS/X79+WLVqlWoNt+vXr6NLly7IlSsX7OzsULlyZWzYsEEtSXRwcMCcOXPw4sULDBw4UOf+rrqYmJjgt99+w//+9z+tI5GMsQyQ1c9tGWMsI8TFxdGmTZs03ru6cOECERF1795d63tq7969o0mTJlG+fPkMvsOV9kV9Z2dn+vTpk6D+lSpVyqhJC+3ataPg4GAiIvr8+TNt2bKFmjVrJipGkyZNaOrUqTqvV6tWTed9/PPPP4Lb6dKlC71+/TpjvlDGmE68SC9jLFu7d+8eZs+ejf3792ts8F6qVCk8ePAA9+7dQ4UKFdR2ERg8eDD69u2L+vXrC3qXy8TERCP+kiVLNDaJ12X27NlGL/Qrk8lQu3ZtXLlyRdSjUDFKlCgBLy8v2NjYoEOHDmjWrBmkUilu376NSpUqCYpx8OBBtGjRIlP6xxj7P5y8McayraNHj6Jly5ZqW1x9q3Llyrh27Rrq16+Ps2fPqs7b2dnh0aNHqFGjBkJCQvS2YWpqitatW+POnTt48eKF6ny+fPkQGBgICwsLAIBCoUBKSorOx6Pv379Hvnz5kJycLPY2DZJIJChZsiSqVq2K3377DTt37sSyZcvSFdPFxQWnTp1C6dKlUaBAAYSHh+stb21tjfDwcNjb26erXcaYYfzOG2MsW4qMjESrVq10Jm4AcOPGDXTu3FktcQO+boN1/vx5g4kb8PWdtubNm6slbgAwc+ZMyGQyHDhwALVr14a5uTksLCzg5eWFBQsWqE2aAIDY2FidW3WlqlChAvbt24e//voLzs7OBvuWiojQrVs3rFu3DlWrVsXSpUtx/Phx5M6dW3CMtKKiolC1alWEhIRg+PDhBsv37duXEzfGvpesfGbLGGPGatWqlVHvkOXNm5cSEhKobdu2gsqXKFGC8ufPr3auVKlSJJfLaejQoTrr+fj40IcPH1T91bbWm5OTE5UuXZqmTJlCISEhavf34cMHGjx4sOAFcQsXLqzxGUVERJCTk5NRn9O3fSxRooTeNd4aNmxISUlJmf6dM8a+4semjLFsR6lUwtbWFgkJCaLrbt68GT179kSDBg1w+vRpg+UdHBzw8eNHtXOHDx9GTEwMevToobdu69atsW3bNly7dg0NGjRQuzZmzBgsXLjQYPsdO3bErl27DJYDgC9fvsDMzEztnLe3N549eyaovlgFCxbEpEmT8Ouvv8LU1DRT2mCMaeL/tjHGsp3Q0FCjEjdbW1u0b98eAAQvtxEXF6f2d40aNdCkSROULFnSYN39+/fD1tZW47yzszMmTpwoqP28efMKKieVSnHz5k2UKlVK7fGlg4ODoPpiFS9eHA8fPhS9lAhjLP34nTfGWLajbfFaIT5//ozRo0cDAHr27CmoTtr31BYsWIB3794hICDAqD4AwOTJkwUnVUIXulUoFKhRowbc3NzQp08f1QzazJr9WaNGDU7cGMsinLwxxrIdDw8P1SxPsTZu3IiIiAhUqVIFnp6eesum3RWhRYsWqFatmsYuDWKlnfygT4MGDeDl5SW4fGJiIjZu3Ihq1arh3bt36Nu3b7p3S9Dm1q1bGR6TMSYMPzZljGUrYWFhaN26NZKSkoyqL5fL4efnB4VCgdDQUJ3l3Nzc8PbtW9XfJiYmmDt3LgCke8Rp/fr1KFy4MIKCgmBhYYF69eqhYcOGWrfQMjExgbe3N54/fy6qjRcvXqBixYrInTs35HJ5uvqrzevXrzM8JmNMGJ6wwBjLNuLj41GxYsV0PbLUxdzcHK1bt4abmxuqVq2KLl26qC1D0rNnT2zevBkA8OHDB7i4uGRo+8WKFcOePXs03qW7e/cuypcvn6FtSaVS5MmTB8nJyYiKijIqhoODA2JiYjK0X4wxYfixKWMs29i0aVOmJG7A12Rk69at+PPPP3HgwAG1xE0mk2HGjBmqv52dnVG2bNkMbT8gIAC//PKLxtpzEyZMUPvb1tYWmzZtMrodqVSKJ0+eYPny5UYnbsDXRXkZY1mDkzfGWLaxdevWTIv9/v17lCtXDkWLFsWOHTvUrg0ePBj58uVTO2fsVlf6REVFYd68eaq/z507h5MnT6qVGT9+vEZfxFAoFPD29kbbtm3VztvZ2WH16tWCN5OXy+W4efOm0f1gjBmPH5syxrKNXLlypWu0yBi2trZ49eqV1h0PZsyYgenTp2doezKZDLt370ZYWBgWLVqEV69eqa65ubkhKCgI8fHx8PDwMLhjgxjLli3D0KFDUaBAAVHvs1WrVg0jR45Eq1atePYpY98JJ2+MsWyjcOHCePny5XdtM1euXHj37p3WyQQAcP78eSxduhTnzp1DQkKCxub1GWnNmjXo378/AKBTp07YuXNnhsVu2bIlihcvjt27d4uaDZuqQIECGDZsGHr16gU7Ozt8+PABGzduxL59+xATE4O8efOie/fu6NSpk9EzhRljX3HyxhjLNkaOHIk///xTdD0bGxuNxXbF2L9/P1q1amWwXGZuPm9hYYHo6GjVsh8hISGoUqWK2ozYH4GdnR2aNm2KkydPIjo6WuN6qVKlcPLkSbi7u2dB7xjLGfidN8ZYtjF48GCjRm3SOzN0/vz5gsq9e/cuUxI3AEhKSlLbID5fvny4evUqGjdunCnt6dKzZ0/MnTtX584PsbGx2LFjh9bEDQAePXqEli1bZuoIJWM5HY+8McaylcOHD6NDhw6i1nkrX748Pn36ZNTjQABwd3dHeHi4wXItWrTA4cOHVX+bmpqiZs2a8PLygrOzs+AkUJ+rV6+iatWqaudevHiBGzduICIiAiNHjkx3G2k1b94cPj4+6NGjB4oUKQLg64SFPXv2YMmSJbh9+7bomMeOHfvuiSdjOUYmb3zPGGMZ7tmzZzR48GCysrIiAAaPAQMG0PPnz6lIkSKCyqc9LCws6NKlS3r7dOXKFY16M2fOVF2PiYkR3F99R8uWLfX2Y8GCBeluI+3Rq1cvne0plUq6dOkStW7dmiQSieCYPXv2FPWdM8b+Dz82ZYxlOx4eHmjYsCEGDBggqPyAAQNQuHBhPHjwANu2bUOTJk3g6+sreNuopKQk1KxZE40aNVJbHiMuLg5jxoxB3bp10bx5c7U6uXLlUnvM6eDgIHgzen0OHz6MhIQEndfHjh2LPXv2oECBAuluK9XZs2d1XpNIJKhRowb27duHoKAgwZ/p9541zFiOktXZI2OMCaVQKGjWrFnk4OAgeIRnwoQJOuOtX7/eqJGo5s2bU+fOncnExERnmT///FOjPaVSSRMnThQ1QqXtePbsmaDPKzQ0lPz9/aly5crpas/FxUXwd1SmTBlBMfv06SM4JmNMHb/zxhjLNvr27YsNGzYIKuvm5oaJEydi0KBBOheeff/+Pdzd3dV2U8god+7cQbly5bReCw4OVu0WIZPJcPz4cVGb3bu4uGDixIkYMGCAoJGu2NhY1KxZEw8ePBDcxrdKlSqFhw8fCiq7YMECjB8/3mC58+fP45dffjGqP4z99LI6e2SMMSFWrVolaETHwcGBjh07Rl++fDEYc8iQITrjeHt706lTp2jZsmWUO3du0aNV5cuX19u2UqmkefPmkYuLi9EjYu7u7rRq1SpKSkoyeK9yuZz+/fdfKlu2LDk4OJBUKhXczvbt2wV/T9HR0eTh4aE3Xu3atUmpVAqOyRhTx8kbY+yH9/jxYzI1NRWcbPz9998GYz5//pzMzMw0HodeuXKFwsPD1crGx8fTokWLRCVaEomEEhMTtbatVCqpbNmy6XqU+e2RL18+2rBhg6CENSEhgRYvXky2traC4799+1bYF/X/PXnyhAoUKKA1Vs2aNSk6OlpUPMaYOn5syhj74bVv3x579uwRXL5FixY4ePCg3jJpdyiQyWR49uyZ3n1DP3/+DB8fH7Utq/S5desWKlasqHG+SZMmOH78uKAYqaytrVGiRAncunVLZ5nChQtj+vTp6Ny5s9atqj5+/IiaNWvi0aNHgttt1KiR6L4CQGJiInbt2oW9e/eqdljo0aMHGjZsqHO3CsaYQFmdPTLGmD7R0dGiHvEBoOrVq+uNefPmTY06o0ePFtSfxo0bC+5Hly5dNEatIiMjRd1L2bJladGiRRQVFUVERNeuXaN69erprVO8eHHatWsXKRQKtbbbtWsnqm0rKyt6+PChiG+LMfY98P/9YYz90EJDQ0VPKNC39RIRYdy4cWrnHBwcMGHCBEGxu3TpIrgf27dvR+HChTFx4kTExMQAADp06CC4PgCEhYVh9OjRcHZ2BgBUqVIFp0+fxoULF1CzZk2tdZ4+fYoOHTqgXLlyOHToEIgIwcHBokYvCxYsiLNnz6JUqVKi+ssYy3ycvDHGfmi2trai63Tr1k3ntRMnTuD8+fNq5wYPHiy4na5du4rqU0JCAubNm4dChQph/vz5uHz5suC6wNf10Jo0aQJ7e3tYWlrC3d0dI0eOhK+vLy5evIiTJ0/C19dXa90HDx6gZcuW8PX1FbWbgaWlJYKCglClShVRfWWMfR/8zhtj7IdGRChVqhSePHkiqLyzszMiIiK0vvOlUChQrlw5rcte2NjYoGvXrpgwYQLy58+vt42ePXti69atwm4gk1haWuLixYuoVKkSiAhHjx7FlClTcO/evXTHlkqlSElJAfB16629e/ciKioKefLkQYcOHXTua8oY+06y8pktY4wJsXHjRsHvae3atUtnnC1bthis7+zsTPfu3dMZ4927d2Rtba21roWFBf3222/06tUr6tOnj+h39cQelpaWajNjFQoF7dmzh0qUKJHu2E2bNqWmTZtqLCgslUpp4MCBgma2MsYyB4+8McZ+eE+ePEHJkiUNlqtXrx5OnjypdTZjUlISihYtitDQUINxChcujICAAJiammpcGzZsGJYvX6527t9//4WPjw9KlCihtiBwYGAgpk6dil27dhls01gFChRAvnz5EB8frzri4uIQGxubKYsPp+ratSv+/vtvnQsgM8YyDydvjLEfXosWLXD48GG9ZZo1a4Z///0XdnZ2Wq8vWrQIY8eOFdzm/v370apVK7VzwcHBKFq0KORyuepcz549sXnzZr2x7ty5g4YNG+a4/TyvXr2KqlWrZnU3GPvp8IQFxtgPS6lUYvHixToTt6ZNm2L48OG4efMmDh8+rDNxi46Oxty5c0W1feTIEdV/fvnyJY4ePYp+/fqpJW7m5uaYPn26wVjly5dH+fLlRbWfVWxsbASX3bhxYyb2hDGmi+YzAcYY+wGcPHkSnTt3Vi2xkVbfvn2xbt06QbHmzZuHjx8/im7/+PHjGDZsGIKCgrSW+f333w1ObkhVsWJFnDp1SlBZS0tLJCYmCu5rRjAxMcHTp0+RJ08eFCpUSNBeq7o+F8ZY5uKRN8bYD+fEiRNo3LixzsQNAKpXry4oVkhICFasWCG6D2FhYWjSpInOBEUikWDkyJGC4/Xt21fQzgJHjhxBQkICKlWqJDh2KhsbG3Tv3h1HjhzBrVu38PTpU9y8eVPQ5vV9+/ZF0aJFYWdnp3eXiW8JicsYy3icvDHGfjgdOnSAoddx+/Xrh9jYWIOxpkyZguTk5IzqmgoRYdWqVYLLe3h4CHq5P3UduCVLloieDBAXF4e///4b3bp1w6FDh7BgwQJUrVrV4Che6dKl1e6lQYMGgtpr2LChqP4xxjIGT1hgjP0wUncGELr35ujRo7Fo0SKd1+/fv49y5cqpJYJubm54+/ZtuvsKfF1A+OPHj4JG1IROmLCxscGnT59gYmKCrVu3olevXlAqlRrlpFIpypYtC39/f6P6DnzdL7Vv3774448/1O7h9evX8Pb21pv0Ojg44OXLl3B0dDS6fcaYcXjkjTGWJT5//oyQkBAkJCQA+Dri5OPjI2rT9H///Vfv9fHjx6slbra2tpg1a5ZxHdbi8+fPePfuncFyRIQlS5YIihkXF6eK+euvvyIsLAwdO3aEk5MTZDIZnJ2d0bt3bwQFBeH27du4ffs2WrZsaVT/T548iT///FMj+cyfPz/++ecfmJmZaa1nZWWFPXv2cOLGWFbJovXlGGM/qYsXL1KjRo1Ui7+amppSs2bNyNTUVPRCslKpVGc7Z8+e1Sg/a9YsUiqV9Ouvv2bYQrnfLpKry8mTJ0XFHDZsGH3+/FnU53r37l1q06aNqHZ69uypN6a/vz917NiRzMzMVIsC9+zZk548eSKqb4yxjMXJG2Msw4SEhNCGDRto6dKldOjQIY1V+Ddt2qSxYn96j8GDB9O7d+/o4cOH1KBBA527Gri5uVFcXBwRfd2JYPHixZQ3b161MnXr1iVLS0tR7U+bNo0SExN1fiYKhYLKlSsn+r5cXV1p2bJllJSUJPjzDwgIENVG5cqVBcVNTk6mDx8+kFwuF9wXxljm4eSNMZZuHz9+pM6dO5OJiYlGwvT3338TEVFgYGCmbRclZNRu9erVGv2Wy+Xk7+9PFy5coODgYCIicnBwEN2+l5cXHT9+XOtns3379nTdm6enJ23cuFFQ4rRs2TJRsWvVqmX8l84YyzL8zhtjLF0SExPRoEED7NixQ+PF+rdv36J79+7YuHEjFixYkGnbNaVuoq7P6NGj8ffff6udMzU1Rfny5VGrVi3Vem1ClyD51vPnz9G4cWO0bdsWr1+/xu7du9GgQQO4ubmhR48eouN9KzQ0FL1790bJkiWxa9curZMXUsXHx4uKXb9+/XT1jTGWNXi2KWMsXZYuXYoRI0Z893alUqlRyeBff/2FAQMG6Lz+/PlzFClSxOh+mZiY6E2wjO13qrJly2LOnDlo3LixxlIiy5Ytw/DhwwXFsbKywsuXL5E7d26j+8IYyxo88sYYSxehuxxkpH/++QcvX75Er169RNcdOnSo3t0DvLy8UK1aNb0xZDIZbty4oXVfT32JGwDMnDkTZcqUUTtnamqKbt26YeHChXB1ddVb/969e2jatClq1qyJ//77T3V+586dghM3ExMT7NixgxM3xrIpHnljjBktJSVF53ISmWXNmjXo37+/6m+xC9kCwMiRI/HHH39ovfbx40cUKlRI5+4OpUqVwo0bN2BlZQWlUoktW7Zg3Lhxgjedr169Oi5duoTbt2/j6dOnsLS0hJ+fnyqRiouLw59//okFCxYIegzasGFD5M+fX3ASLZPJsHfvXjRt2lRQecbYj4eTN8aY0ZRKJczNzTPtXba0JBKJ2sgWEUEqlRrcjSGtAgUK4NWrV1qvTZo0SWMT+379+qF8+fLo2LEjHBwcNOpER0ejTZs2uHjxoqD23759izx58ugtExkZiTlz5mDVqlWC3ukTwtLSEv7+/ihevHiGxGOMZQ1+bMoYM5qJiQn8/PwElV23bh2aNGmSrvbSjrIlJCSITtwAIDg4GOvXr4dcLodCocD+/ftRp04d5MmTB/PmzVMr265dO6xduxb9+/fXmrgBgJOTE5o1aya4fX17tqbKlSsXli5dimfPnqFbt26CY+uTlJQELy+vDInFGMs6PPLGGEuXAwcOoHXr1nrLFCpUCM+ePYNcLseQIUOwefNmo0brzM3N1bZsSklJgYWFhdEjf56envjy5QsiIiJ0lnn69CmKFStmMNb//vc/dO7cWVC7lSpVwsqVK+Hr6yu4r/fv38eECRNw/PhxwXW0iYqKgrOzc7piMMayFo+8McbSpWXLlhg8eLDO63Z2dti5cyekUiksLCywfv16oyc5pN2OydTUNF2bo4eGhupN3ABg69atgmI1b94c9vb2gsreunULlStXRo8ePRAeHq46/+rVK+zYsQP//vsvAgIC1Or4+Pjg2LFjOH/+vKikL605c+YgNjbW6PqMsR9AFq0vxxjLQZRKJW3cuJFKliypWgDWzMyMOnfuTAEBAWplv3z5YvSCtR4eHhptb9u2LVMW/k09JBIJhYWFCfocRo0aJTq+lZUVjRgxgho1aqRx7ZdfftG6FZVSqaS9e/cafU+5c+emLVu2kEKhMO4LZ4xlKX5syhjLMESEkJAQxMXFIW/evBojUUSEIkWK4MWLF0bF9/DwQFhYmNq5Nm3aYP/+/Ub3WYjhw4dj0qRJcHFx0VuuVatWOHjwoNZr1tbWsLOzw9u3b0W17ejoiCtXrmidZGBiYmLUO3+pKleujBUrVqBSpUpGx2CMfX/82JQxlmEkEgny58+PkiVLan2EuHHjRqMTNwCwtbVV+/vx48eiEjcrKyuDCZg2S5cuRa5cuVClShXs27dPa5nr169rJG5FixZFu3btsHLlSrx58wavXr3CokWLYGdnJ7jtmJgYlChRAlKpFMWKFVO73/S+u3bjxg1UrlwZffr0wfv379MVizH2HWXpuB9j7KehVCrJxcVF9CM+MzMzcnZ2pmLFitHu3bvp8ePHVLduXcqVKxeZmZlplB84cCAlJSXR1atXqXfv3lSzZk1q2LAhLVmyhKKjoyk+Pp5KlCiRrkep06ZN07i3WrVqqZVxdnamT58+af0sIiIiqF+/fiSRSIxqf+DAgURENHv2bEHlTU1NKTAwkJo1a6azjJ2dHf3555/05cuXzP6nwBhLJ07eGGPfxdOnT9OVMFWqVIm8vb31lpHJZPThwweDfWnRokW6+gKAWrZsSU5OTiSVSkkqlWpcX7JkicF+rF+/3uj2bW1tydTUVFDZlStXqto8evQoFSlSRGfZ4sWL06lTp9L1XTPGMhc/NmWMfRchISHpqn/r1i0EBgbqLVOjRg04OTkZjCV0bTp9Dh48iOjoaCgUCo2lStzd3fH7778bjOHt7W10+58/fxa0eO+gQYMwaNAg1d9NmjTBw4cPsWDBAtjY2GiUf/r0KRo0aIDWrVvj5cuXRvePMZZ5OHljjH0X32NtsbNnzwp6gX/48OEwNTXNtH4kJSUZ3Dbs3bt3OHjwoFHbexliamqKihUr4vz581i5cqXGdZlMhrFjxyIwMBDdu3fXGuPAgQMoUaIEpk6dioSEBNX5Z8+e4fDhwzh79izi4uIyvO+MMcM4eWOMfRfpmaggxrJlywyWkUql6Nq1a6b1ITo6Wu9Eivv376NMmTL4448/0jVbVJcJEybg1q1b+OWXX/SWc3d3x7Zt23DlyhWUL19e43pycjJmzZqFYsWKYe7cufDz84O3tzdatGiBevXqwcPDA6NHj0ZSUlKG3wNjTDdeKoQxlun++OMPjB49WnD5/v37499//zVqZKd8+fLw9/fXW0Yul6NEiRJ4/vy56PhClStXDnfu3NE4n5iYCG9vb4SGhmZa2/b29oiKihI1uqhQKLB582ZMmDABUVFRotqrU6cOjh8/DnNzc7FdZYwZgUfeGGOZ6uHDhxgzZozg8lWrVsVff/2F6OhojBw5UnR74eHh+PTpk94yGzdu1EjcatWqhb59++LgwYMZkoToesdv586dmZq4AcCnT59EJ6ZSqRR9+vTBs2fPMGzYMEilUsF1z507h9WrV4vtJmPMWFk7X4IxltMNGDBA8AzK2rVrU2Jiolp9e3t70TMxHR0dac6cOfT582dVnISEBFq2bBkNHjyYbG1t1cr7+vqSUqlUlV20aFG6Z6M6Ojpq3cGgTZs26Y4t5Bg+fDjFxsYa/b09evSI6tSpI7i9IkWKqH2GjLHMw8kbYyxTfbtllr6jatWqWuvnyZPH6ATGxcWFFixYQO3bt9e6nEfqce7cOY12V65cSQ4ODulKoHx8fOjIkSNqSU29evUE1RW6DIi+w8nJiWbOnEkxMTFGfXdKpZLatWsnuL3o6Gij2mGMicOPTRljmSrtMhq6yGQyrec7dOhgdNtRUVEYN24cdu/erbMfjo6OqF27tsb5QYMGITw8HNu3b8ecOXOwYsUKXLp0SdTjxPv376NZs2aoWbMmLl26hDNnzuDJkyeC6iqVSrRu3drgrFV9oqOjMXXqVOTLlw8TJ05EZGSkqPoSiUTrtly6jB49Gq9evRLbTcaYWFmdPTLGcrZOnToJfsynzaNHjwTVNzMzEzVK9O2xf/9+wfezbt26dI+IZdVhaWlJw4cPp7CwMLV7io6OpqNHj9LevXspICBA7dqRI0dEtSGVSql79+70+PFj0f9WGGPCcPLGGMtU58+fF/Sj/+TJE50xChcubLD+gQMHiIjo7t271Lx5c1EJR5kyZQTfT48ePfQmR6NGjRL8qDijj6pVq9L+/fupZcuWesuZm5vTgAED6MGDB9SvXz+ysLBQu16zZk3y9/cnIqKUlBQqUKCAUf1p3bo13bx5M33/gBhjGjh5Y4xlKqVSSQULFtT7Iz9p0iSd9ePi4jSSi7TH9OnTNeoNGzZMcJJhY2Mj6F7u37+vsR9p5cqVafz48XT8+HHVu20pKSm0bds2o5IeNzc3UeXt7e1p7Nix9ODBA42+duzY0ej9U62srOj69etERHTx4kWSyWQ6yxpqo379+nT+/Hme0MBYBuHkjTGWqe7evavzR93FxYWWLl2q8aOemJhI27Zto27duunch9Pc3JyaNm1Kp0+f1tpusWLFBCcqMpmMUlJSDN5LkyZN1OrZ2trS+/fvdZZPTk6mFStW6J0s8e3xyy+/kFKp1JsopT2cnZ319jkgIIB69uwpuA/fHsWLF1d9N3PnztW4bmtrSyNHjqRnz57RiBEjyMrKSm+8KlWq0KFDh7QmcUqlkt68eUPPnj2j+Ph4g98FYz8zTt4YY5kiKSmJQkJCqEGDBhojOsuWLaPDhw9TUlKSRr0bN26Qu7u73lGekJAQvaM4crlcdKJStmxZunz5ss6YFy5c0Kgzc+ZMQZ+F0NG0pk2bEhGRiYmJ4H6bmZkJ6sOrV69owIABZG5uLupzuXDhAhERjRo1Su18hQoV1JZiISKKjIykKVOmGJylW7p0adq+fTvJ5XJSKpW0evVqte9cKpVSu3bt6Pnz54LujbGfDSdvjLEMFRwcTP369SNra2utP9yzZ8/WWffFixcG13Xz8fEx2AeFQmHUSBMA6tGjB717946IviYjQ4YMoTp16pCjo6Naudy5c2skL7oIXR5k9OjRRESiE6xOnTrRy5cvBfUlLCyMevfuLTj2woULiYioRo0aauenTp2qs41Pnz7RggULKHfu3HpjFypUiEqVKqXzuqmpKZ08eVLQfTH2M+HkjTGWYe7fv08uLi46f4wtLS31Jjx9+/Y1mExYWFhQVFSUwb7Url3bqOQN+Po4sEKFCnrLrF69WvDn8r///U9Qu6kzPYUme98eUqmUhg0bRpGRkQb78/r1a8FxFy1aRF++fCFLS0u180ePHjXYTkJCAq1evdroCQ/A15HWO3fuCP6sGfsZcPLGGMsQKSkpOt9P+/bQNZLy5csXnaN1aY+//vrLYH/2799vMI6VlZXRM0MbNWok+N2sL1++aOzqkPYYNWqUqvyLFy+MTnasra1pzpw5evuWkpJCHh4eguJdunSJ/P39Nc4LSRK/vf9t27ZR8eLFjbqnXLlyaey8wdjPjBfpZYxliOPHjyMoKMhguWXLlmk9HxMTg/j4eEFt6do39FuVKlXSu6Cuvb09/vvvP9y9exdLly6FnZ2doLZTnThxAt27dxdUdufOnfj8+bPWa1ZWVpg+fTq6d++Oxo0bw97eHsWKFRPVl2/Fx8dj0qRJKFSoEDZs2ICUlBSNMlKpFL///rvBWGXKlEH16tVx48YNtfNeXl5wcXER3CczMzN0794djx49wr59+1CxYkXBdQEgMjISe/bsEVWHsZyMkzfGWIY4c+aM4HJEpHHe1tYWJibC/ifJwcHBYJmZM2dq3VXB3NwcXbt2xa1bt1ChQgWYmZlh2LBhCAwMRI8ePQS1n2rfvn24deuW3jKJiYmYNGmS2rncuXNjxowZ2LRpE8LDwyGTyVC2bFmcOHECsbGxkMvlemN6e3tj6dKlyJ8/v84yERER6Nu3L0qWLIlDhw5pfOYjR45EjRo1dNa3s7PDli1bIJFINJK3ypUr6+2fLiYmJmjdujVu3ryJuXPniqp75MgRo9pkLEfK6qE/xlj2FxMTozGrVN+hbcN2IqLGjRsLqp92F4C0nj59qjFhoUuXLvT48WP69OmTznpyuVzUTE8ANGjQIL19mT9/vkadQ4cOqa4fPXrUYBumpqa0fft2Onr0KH348EFVNzk5mZYtW0ZOTk4GY1SrVo2uXr2q1re4uDgaMWKExiPdRo0a0aNHj1TlvL291a4vX75c7z0Loe1RrL6jSZMm6W6TsZyCkzfGmNGSkpJo2LBhomZHent764x37tw5g/VbtWplsF+tW7dWq2NpaUnh4eEG64WFhYl+H6t58+Y640VGRpKdnZ1a+Vq1aqktc5IvXz5B7WzatElnO58+faLJkycbXMw49fNLm/yGhobSunXraP369RqzVqOjozVipHfXhPDwcOrUqZOoBYQNJcmM/Uw4eWOMGUUul1OjRo1EJzuLFi3SGXPPnj1661apUoViYmK01v3w4QMdPHiQZs6cqVFP3w4O34qIiBB9P926ddP4XA4dOkSzZ8+m6tWra5S/deuWWp+FtlO+fHmD/X/z5g3169fP4OihiYkJ9e/fn65du0YdO3YkU1NT1bW8efPS4sWLVYsWnzx5Uq2uTCaj5ORkQZ+nNosWLTJq14fbt28b3SZjOQ0nb4wxo2zZskX0D7CPjw/FxcVpjSeXy8nV1VWjjo2NDVWpUoXWr1+vNWmIjY2lvn376tyVwNnZmT5+/CjonpRKpaidGYCvj/MiIiKI6Osj0Dx58ugs26VLF7X2du3aJbgdDw8Pwd/N06dPDe5vauho06YNpaSk0IwZMzQSaGPt3r3bqL507tzZ6DYZy4k4eWOMGaVKlSqifoCbN2+ud322P//8U6NO6dKl9fYhPj6efH199bY7ZMgQUff1119/iU4ubGxsqHXr1gZHlC5duqRqR6lUUt26dQW34enpKeo+iIiuXLlCVatWNTqBW716tcaWYMOHDxfdj1T61gDUdfTs2VPrThyM/cw4eWOMGcXMzEzwD7ChLZzi4uK0rvHm7++vt96sWbMMtl2wYEFB+5amevTokdHJjqGjR48eqnb++OMPUXWlUilt3bpV8H2kUiqVdODAASpatKjo/np6epKzs7PauR07dojuA5Hm41d9h7e3N02dOpUCAwONaouxnI6TN8aYUcRMUjAxMdEba+TIkRp16tSpo7eOQqGgvHnzCmr/+PHjgu8r7WSH1EMikZCZmRkVLlyYatasKSp5TT1kMhl9+vSJkpKSjBqFAkADBgwwaiRKLpfT+vXrDW5ZZeh49eqV6LaJiCpVqiS4jfr166uSznr16pGlpSWZm5tTlSpVaMuWLSSXy43qA2M5BSdvjDGjVKxYUdSPfqtWrVTLT8TGxlLLli3VXpRPmyi9ePFCb/tv3rwR3PasWbME3dPVq1c16g4cOJAePXqk8a5ecHAw/frrr6KTn/v379OxY8fSlUD5+vrS69evjfre4uPjjU4cXV1d1WbKCvXff/+JaqdDhw7Up08fndcbN27Mj1LZT40X6WWMGWXkyJGiyh84cAClS5dGjRo1YGdnh4MHD2pd/R8AqlatCjc3N73xhC7oK7QsEWHcuHFq55ydnTF37lyULFkS1tbWatfy58+PLVu24Pjx44L7AQAJCQkai/bqkydPHo1zN2/eRPny5QUvjPwtKysrFClSRFBZiUSi9nflypU1zhmSkpKCLl26iKrj4eGBDRs26Lx+/PhxTJgwQVRMxnISTt4YY6KkpKRg0KBBoncjAL4mSFeuXDFY7urVq/Dw8MDKlSu17sYAAK6urihUqJCgdqtWrWqwzNGjR3Hp0iW1c5MnT4a9vb3eemXKlBHUB+DrNlE9evTA3bt3Bdc5e/Ys/vnnH1haWqqd//DhAxo2bIi5c+dCqVQKjgcAnTp1ElTOwsJC7e8qVaqIagcADh06hLCwMMHlnZ2dsW/fPoPl1q1bh0+fPonuD2M5QhaP/DHGshGFQkENGzYU/PhLIpFoLFIr9liwYIHO/ixevNhg/RIlShh81JeSkqKxQX3+/PkFPZpTKpUaOxBk1FG2bFlV3x88eEBeXl5ayzVv3lzn+nfafPz4kaysrAy2n3a9uDNnzghuI9XAgQNF3fP//vc/wWX37dsnuj+M5QQ88sYYE2zXrl04efKkoLKp+1j6+/tj2rRpGo8dhZo0aRLevn2r9dqvv/4KU1NTnXVtbW2xbds2g4/6/v77bzx+/Fjt3OzZsyGTyQz2TyKRYOjQoQbLGWPKlCmqvpcuXRq3b99Gy5YtNcodPnwYFStWxP379wXFtbe3x549e/R+dj179lQb0ZNIJKhUqZKo/gcHB+PYsWOCy//6668GH5d/6/Pnz6L6w1iOkdXZI2Mse4iPjzd6FK1z5850/fp1o0eg5s6dq7VPaReQTT0kEgk1adJEbX9OXRISEjRmrfr4+Ojcf1Wbt2/f6px8kZ7j2rVrGm0pFAqaN2+e1l0ULC0tRS0ncvPmTY113EqXLk179uzRWHevZMmSguNeunRJ1F63AMjW1pYSExPp9evXguv8999/gvvEWE7CyRtjTJCuXbumKxERuoenruQvrQ8fPmgkk35+fnTmzBkKDQ0VfF8LFy7UaO/EiROiPpshQ4Zo7beVlRX9/vvv9PDhQ/r9999F3/fGjRt1tnnmzBnKlSuX1nq///67qNmYkZGR9ODBAwoJCSGir4+CW7RooRazV69egmKtXbvWqO942bJlqhhCFi/28vISlWAzlpNw8sYYMygwMDBdiVt6j19//ZWIviYV69evp6ZNm1KhQoXUykgkEnrw4IGo+4qOjiYHBwe1OHXq1BG8HEZ8fDzdvXtXY9StTZs29OzZM0pMTFQr7+npKeq+q1SpQkFBQTrbDw0NpcqVK2ut6+vrq0rGhFIqlbRp0yYqVaqURrw5c+YYrH/37l2j9i2tVKmS2mclZBstft+N/cw4eWOM6aVUKrXufvA9Dzc3Nxo9erTel+zF7n+pUCho7NixGnFu3rxp8PPYvn27zu3BzM3NKTg4WGvd7t27i753U1NTGjhwIL19+1ZrzKSkJJ2TAlxcXOj06dOCPg+lUql3coGDgwPdv39fb4zffvtN9P3VrFlTY7KFroWSga9bkRmz0wRjOQknb4wxvVq1apWliZvQY8qUKQbvJTo6mmbMmEEFCxbUGqNDhw566yuVSurXr5/efvz+++8661+7ds3o+7OysqJJkybRx48ftcbetm0bWVpaatQzMTGhOXPmGHzEKGS0q1ixYnrjuLu7i76vtMnlhQsXNMqUKVOGevfuTatWrdJ5/4z9TDh5Y4zp9OXLlyxPyoQeFhYWeh93BgcH60zaUo8jR47o/Tw2bNhgsB+NGjXSWV+hUBi1rda3h5OTEy1evFjjkSwR0f3796lw4cJa67Vo0YLCwsJo48aN1LdvX+rTpw+tXbuWYmNjiYioZs2agto/efKkzvtL+wja0CGRSOj9+/dqn0/58uXVyri4uIhaBoWxnwEnb4wxrRITE6latWrfJfEyMzOj0qVLq/6WSqVUo0YNKl68uKg4mzdv1novSqWSKlSoICjG2LFjtSaBCoVC8KQLfe+pjRs3LkM+M09PT9q0aZPGPp8xMTEakw1SD20zVO3t7Wn79u2C31UbN26cxj1FRERQ//79Rb/vVqZMGbU4W7du1SizatUqAf9aGfu5cPLGGNPw5s0btWTqexxdu3YlCwsL1d8FCxakJUuW6N3jMu3Rp08frfdz/vx5UX1ZuHChWn2lUkm9evUSXH/16tVa+6FUKqlOnTp66+bNm5dmzpxJ9vb2gtoqXrw47d+/Xy3hVCgUNHfuXK3JmtCkTtcxfPhwjX8raSePCD38/f0pIiKC1q1bR9OnT9cYuStevDhvQs+YFpy8McbUKBQK8vX1/a6Jm75D12xKbUehQoXo8ePHGvc0atQoUW06OTlRQkKCqv5ff/0lqv7ixYu1frbbt2/XmjiZmppSwYIFafPmzap3yqKjo2n8+PFa32PTdlSpUoUuXLig1t7p06cFb0Jvbm4uqFza5Uv0TS4wdLRs2VLvY+SjR4+m958zYzkSJ2+MMTUnT57M8oQtPYeJiQn17NlTNeNTqVRS06ZNRcfZv38/EX1NZg29K5f2OHjwoMbn+vHjR8qTJ49aOU9PT/r8+bPe7+PNmzc0cOBAwYsAN27cmO7du6eqf+7cuQz7bO3s7NT6+/r1a1GjdmKOvHnzCl6yhbGfDW+PxRhTs3v37qzuQroolUps2bIFRYsWxbBhw1CzZk0cPXpUdJyIiAgAwMOHD/Hq1SvB9fLkyYPGjRsD+Lp90z///IP58+ejVatWePfunVrZZcuWwcbGRm88Nzc3rFq1CgEBAejatavB9o8fP45y5cqhW7duePnyJdavXy+47+bm5nqvL126VK2/V69eVdtCKyOFhYXhzp07mRKbsWwvq7NHxtiPJbssDZLZx+7du4mI6OLFi6Lq7dixg5RKJc2fP59sbW11lmvatKlRI0sPHjyg5s2bC+qLMQvmajtMTExo5cqVGn35+++/M/U7GDBgQLr/PTOWE/HIG2NMjbu7e1Z3QZSqVavi8ePHmDZtmsFRLKFsbW3RqFEjAEC+fPkE15s4cSI6deqEKVOmYPz48To3TjcxMcHSpUtVm86LUbp0aRw6dAhXrlxBrVq19JYlItHxtVEqlVo3vffx8REVRyKRICAgAHny5BFU/vHjx6LiM/bTyOrskTH2Y7l8+fJ3G91K78iQlZUVvXz5UtX3iIgIGjZsWLrXUps6daraZyJkDbQCBQpQSkoKPX/+XNB97dixI93flVKppBMnTmisjZYZh5WVlWpNuG+JWU6mdOnSRETk4+MjqHy9evXS/RkxlhPxyBtjTE21atVQunTp79LWzJkz0zXSl5CQgD/++EP1t6urK5YuXYp169YZHbN3796YOnWq2rnRo0cbrDdv3jxIpVL06NFD0IiXmHfRdJFIJGjYsCFu3bqFXbt2oWjRoumOqUtCQgKePXumcX7VqlWwsLAQFGPChAkAgLp16woqX6dOHeEdZOxnktXZI2MsawQHB9Pu3btp9+7d9OrVK3rw4AF16dKFatWqpXcP0dSjQIEC6R7NKVWqFE2cODFdMxbt7e013h0rV66cqBhFihShLl260MWLF7V+VsOGDdNZVyaT0Zo1a4iI6OHDh4LbzJ07d4Z/p3K5nDZs2EB58+bNlNG3u3fvam33zp07JJPJ9NZt1KiRahmUoKAgkkqlBkf6IiIiMvwzYiwn4OSNsZ9McHAwNW/eXNQjy2+Tq5IlS9KCBQsEL10h5PD29iY3Nzej68fHx6vdo5DkM/VwcXHR+3m9ePFC4zFsgQIFqFOnTrRo0SK17Z2GDBkiuN18+fJlyvdL9HV3jIxO3JycnCgpKUlre8HBwTrXiZPJZDRixAi1xXYTExPJyclJZ1tmZmZ04MCBTPt8GMvuTMEY+2mEhISgWrVqePPmjeA6ZmZmiI6Oxvv372FlZYXcuXNj0KBBSElJUZUxNTWFQqEw+gX5wMBAo+oBgIWFhcZjOzHLVzRo0ABEpHPywOTJkyGXy1V/m5ub4/z58yhQoIBG2bt37wpuNzMfCaZ+JklJSRkWs3v37pDJZFqvTZ06FV++fFH9LZVKMXv2bJQrVw61atXS+H5WrVqF6OhojTgmJiZo3rw5Jk6cCF9f3wzrO2M5TlZnj4yx76ddu3ZGjbpMmzZNFSMkJERjJKpevXqi4tnY2GTYiFC3bt007rNo0aKiYnh6eqo2pQ8ICKAqVaqQhYWF1kd7I0aM0Pn51qpVS3Cb/v7+Gf79fsvY71rfkXZ3BaKvS5ekHcUdOnSozn5FR0eTo6OjWvlq1apRUFAQffz4MTM/EsZyDE7eGPtJvH371uB7RrqO3Llzk7+/Py1dulRjdqG5uTnNnz9fcCw3NzdSKBS0fft2Kly4cLqSCTMzM63vYW3atMmoePrWZQO+vocVFRWl8zOeOHGioHaqV6+ead+zQqGgkydPUtu2bTM8eQNAx48fV2uvWbNmatdtbGz0vqs2duxYjZg3btzItM+DsZyIkzfGfhLHjx/PlB/zQYMG0bNnzwSXT10iQ6lU0unTp6lmzZpGTViQyWS0Z88erfeqVCoNJmLGHt8uTZJWcHCwoHcBHz16lCnf8bt376hKlSqZct+ph5ubm6q9S5cuaVyfPn26zv69fv1aY2JD+/btM+WzYCwn43feGPtJmJhkzspAderUQZEiRWBjY4O4uDi9Zc3NzWFmZoZHjx6he/fuuHfvnuj2nJ2d0bNnTwwaNAgFCxZUu6ZQKJCUlIQbN27oXCBXIpGgdu3aiI2Nxe3bt0W337RpUzx58kTrtfz586N48eJ4+PChzvpz585FyZIlRbdryJcvX9CkSRODW0o5OjqiQ4cOKFOmDAYNGiS6nbdv32LAgAEICQnB9evX1a7lypULLVu2xPz58xEVFQU3Nzd06NABnp6eAL6+G5ecnKwqb2pqirlz54ruA2M/vazOHhlj30dkZKTOGYHpOWxsbAwuE5GRh7W1NU2ZMkX1fpRCoaClS5eSt7e3agQv7eNha2tr+vXXX2nmzJkUExOj+kyuXbtGxYsXF92HsLAwrZ+xkAWOt2/fninf7/bt2wX1/dChQ0T0dcP7jP5uKlSooHHOxMSEBgwYQLdv39Z4N27QoEGZ8lkwltNx8sbYT6R79+7fLcnK7MPR0ZGGDh1KuXLlMlh29erVej+XDh06iGr76NGjGjGUSqXGTgxOTk4aCU2zZs0y5btt1KiRoL63bdtWVSftxIHMPNIuBWPo3TjGmG68wwJjP5HFixejSJEi36UtExMTmJubZ1r8mJgYLF++HJGRkQb70blzZ53XiUj0I+X169cjKSkJycnJGDVqFNzc3GBpaYlLly6plZs2bRqGDRumdu7EiRP48OGDqPaECA0NFVQuLCwMAODv74+YmJgM74cub9++Vft7zJgxcHV1/W7tM5aTcPLG2E/E1dUVly9fRrdu3TK9LaVSqbb2V3pUqlQJ7dq1M2ojd6VSicqVKyM2NlbjGhGhX79++N///icq5oEDB2BnZwdLS0ssWbIE7969U3uXC/j6bln//v3RqlUrtXXOUlJSsGfPHtH3YYijo6Ogcg4ODgCAffv2ZXgfhMqTJw9GjhyZZe0zlt1x8sbYT8bV1RXbtm3TeNk/LUtLSzg5OX2nXul3+fJl7N69G48ePULbtm1F13/27Bn69euncf6vv/7Chg0bjOqTXC7XuyhxTEwMtm3bBltbW7Ro0ULt2vbt241qU582bdoIKpf6+WlbJPd7mT59OmxsbLKsfcayOwnp+18fxliOtHXrVvTs2VPndScnJ+zevRuXLl3C9OnTv1u/dFEoFGqPNnfs2IEuXbqIiiGRSPDixQtV0hofH49cuXIhMTExQ/v6LRMTE8THx+PkyZNo1aqV2rXXr18jX758GdbWx48f4e3tjffv3+sskzdvXgQEBMDa2hpz5szB5MmTBcWWSCRG756RlrW1Nd69e8fJG2PpwCNvjP1k3r59i+HDh6uds7a2RoMGDdC2bVv89ddfCA4ORp06dTB+/HjUr18/azr6/zk7O2u8k1axYkXRcYgIhw8fVv09Z84cUYmbh4cHunbtCqlUKriOUqnE7Nmz0ahRI9XjylRiH9Vq8/btW9y/fx9v3ryBg4MDjh49ChcXF61l8+TJg2PHjsHa2hoA0KVLF0GPoX/99VdERERobHFlrPj4eLi5uYnaSowxlkYWTpZgjH0HsbGxtHz5cvL19SUPDw+ys7PTmAl48OBBnfWTk5NpwYIFlC9fviyZVTp37lyNPikUCnJ1dRUda+DAgUT0dWaou7u74HpDhgxRtf306VNRbVaqVImIiPr06aN23sfHx+jv9MyZMxpbcdWoUYNOnDhBERERNGPGDCpRogTlypWLSpUqRXPnztW6M0S/fv309t3Z2ZlCQ0OJiGj48OEZ+r3a2trS69evjf4MGPuZcfLGWA724sULg1tQdenSRVAshUJBr169osDAwO+WuNnZ2Wn0Izk5mXbv3k3Vq1c3KmaXLl3o1KlTours3btX1X54eLioulZWVvT8+XM6d+6cxrU9e/ZQUlKSqO9069atGuulpR4SiYTWr18vOFZycjL16NFDaywPDw+1/VeTk5MzfMutIUOGkEKhEHX/jDEifueNsRxKLpfDx8cHT58+1VlGIpHg8ePHKF68uN5YSqUSZ86cgb+/P0JDQ/HXX39ldHe12rdvH1q3bq36+8iRI+jRo8d3XeLC2toa0dHRqmVPlEolLCwsIJfLRcWpXbs2Hj58iKioKLXzlpaWaNmyJdavX2/wPbCQkBAUKVJE7yxeU1NTBAQEoHDhwoL7dvfuXWzevBkvXryAjY0NmjRpgg4dOsDS0lKtHBHh6NGjWLt2LR48eACpVIrQ0FCkpKQIbkub3Llzo1u3bhg+fDjy5s2brliM/RSyOHlkjGWS3bt3Cxr9mDlzpt44a9asEb1PqJ+fH61fv57y589v9KiMiYmJWj9Onz6tc8QpM49JkyZpfCb9+/fP8HYsLS0NbtA+adIkQbFGjx4t/h+MkcaMGZNhn4GTkxPdunXru/WdseyKkzfGcqhOnToJ/tEsWLAgrV27ViPGvHnzDNaVSCTUsGFDql69Oo0dO5aSk5NV9ZOTk2nNmjWUN29e0T/ka9asUcVRKpVUrFgxoxICqVRKderUMWqjend3d62P9RISEsjDwyPDEzgLCwu9G9/XqFFDUJzU9+y+h+TkZGrVqlWGfQZubm4UFxf33frPWHbEyRtjOVT9+vVF/3D6+PjQly9fiIgoIiJC0EiXr6+vwb4kJSWJmiAwf/58tfpXr14VXFcikVDHjh2pc+fONHPmTNUL91FRUdS8eXNRn8f169fV+qFUKunKlSu0Zs0aqlu3rs56JiYm1KlTJ/L09BT9Heh6B1EulwueNFK2bFlj/skYTaFQ0M6dO8nPz0+1v2x6DjHv7TH2M+KlQhjLoYx5d+j+/fuqBWUXLVokaG2v+/fvG3znSSaTiXoH6/3792rvhj179kxwXSJC48aNsX37dkyZMkX1OTg7O4teG65QoUKq/3zlyhWUKVMG1atXx4ABA3D27Fm1snny5EHr1q2xdOlSJCcnY8eOHQgODkazZs1Etbl79258/vxZ7dy+fftgY2ODkJAQQTHKlCkjqs30MjExQYcOHXDx4kW8fv3a4ALQhuzdu1f1nx8+fIhq1aqhSJEiqFu3Lt69e5fe7jKW/WV19sgYyxxnz541euTjzZs3VLFiRcHlAwICDPbnzz//FNUHW1tbmjFjBsXGxoqu6+zsrHUZiidPnoiK4+fnRzdu3KDVq1cbHFG6du2aRntTpkwx6vN/9OiRKsaZM2dEv+t3+fLl9P3jSSeFQkGjR482ehROIpHQ6NGjydLSUut1FxcX1QgxYz8jTt4Yy6GUSiXVqVPHqB/Prl27koWFheDyDx8+NNifiIgIkkqlovvi7OxsVD0/Pz+t/fD29jbqMzF0DBgwQK2dqKgokslkRsVyd3enM2fOEBGRm5ubqLp9+/ZN/z+eDBIXF0fDhg2jfPnykYWFBZmZmWXoZ16/fn168uRJVt8mY98dJ2+M5TCJiYkUFBREYWFhFB0dTdWqVcuUZCX1kEqlel8wT05Opk+fPtG0adP0xrG0tCRTU9MM7dvdu3dV/YiOjqYlS5ZQpUqVMuVzsLa2pvj4eFV7f/31V7pj5s6dW3BZc3NzmjJlCqWkpGTmP690+eeffzLls69Zs6baZ89YTsfvvDGWQ4SFhaF///5wdnZGkSJFkDdvXtSoUQOvX7/O1HYbNWqk2nLpWwcPHkSJEiUgk8lgb2+PGTNmqF2XyWRwcnJC8eLFMXPmTLx+/RrPnj1D9+7dBW3bJMSZM2cAfH1frUiRIhg5ciRu3bplsF7arayEiI+Px5UrVxAbGwsAgt9P0yciIkJw2UaNGmHmzJmitu/63jp06IDKlStneNxLly7B09MTly9fzrA9WBn7oWV19sgYM55SqaSjR49S7dq1M2SWn9jD1taW3r59q9EvQ2t/SSQStdX703r48CG1aNEi3f2bPXs2vXr1SuuWYGn7Y2trSy1atKBnz55RYmIiLV682Oh2q1atqnPngsw6vLy8tH4XP5oPHz5QgwYNtN5DvXr1qFChQun6HOrXr08xMTFZfZuMZSreYYGxbEqhUKBXr17Ytm1blrRfvHhxnDhxAvny5VM7f+rUKTRs2FBvXYlEgsjISDg7O+st5+PjgwcPHhjdx7179+K///7DsmXLDJa9f/++2izNxMREWFlZGd22GBUrVsSQIUPg6+uLrl274s6dO0bFsba2xrhx4zBq1Kjv1ndj+fv7Y/fu3fjw4QPc3d3RpUsXeHt748yZM6hfv366YteqVQvnzp2DiQk/XGI5VFZnj4wx4xh6hywzj9mzZ+vsV/ny5QXFEPJifbNmzYzuY+7cuSk5OVnwe2MTJkxQa/vo0aPf5bM8duyYxn0fOnQoXTE9PDxoy5Yt2XLf0NDQ0Ez7XBnLKfj/ljCWDSUkJGDx4sVZ1r6np6fW80qlEnfv3hUU4/DhwwbL9O7dW1S/vrV8+XKkpKQIfm/s/fv3an9HRkYa3bYQEokEq1evRuPGjTWu+fn5pSt2eHg4evbsiQoVKuDcuXPpivW95c2bN0NGDbds2ZL+zjD2g+LkjbFs6Pz584iPj8+y9ps3b671vEKhEPzCuJD+N2/eHI6OjqL6Bnx9fHjw4EFREw9y5cql9rebm5vodg0xNzeHh4cHfvvtN9y5cwe///671nL29vaCJx5IJBK0atVK67V79+6hbt26aN68OQICAlTn3759i3/++Qfr1q3DuXPnoFQqRd9LZlq7dm26Y4SGhmZATxj7QWX10B9jTLxZs2Zl2GM7YyY69O3bV20P029ZW1sLbveff/4hpVKp916XLl36XR5ffrusCBHRly9fKE+ePBnahpmZGUVERAj6jjt37iw4rlQqNfg9SqVS6tOnD7Vt21ajrKWlJU2dOlVQv76XqVOnpuuzbtSoUVbfAmOZhpM3xrIhY5K3KlWqkIODg9qPebt27WjJkiVG/ThWr16d3r17p9G3Ll26iIpTt25dCgwM1HqfSUlJVLBgQZ117e3tacmSJfT7778btZBv6tGsWTOt7adnxqmuQ+i7WK9fv87wtoV8DoaS6e8pKCiImjRpYtT6f+vWrcvq7jOWaTh5YywbOnnypKgfsqJFi1J0dDQlJCTQrVu36Nq1a6rlFKKjo41eHDdv3rx09epVmjFjhlpiKPYwNzen6dOnU2JiIsnlcvr777+pdevWVLx4cY2yo0aNojVr1tDly5fVXsgPDAyktm3bim67du3a9OnTJ62fs77RH3Nzc6PutX///jpHLb+lb3cMqVSa4aOCqcePuim8XC6nX3/9VdDn7uHhoXfhaMayO07eGMuGEhISyMrKStCPsZeXF71580ZnrFOnTgmK07VrV517TYpN1PT96Opro3r16gZHhkaPHi24L46Ojjp3JIiKiiJbW1u18i4uLlS3bl2aOnUqhYaG0oQJE4z6DAoUKEBbtmzR2XZAQIBGHRsbG1q2bBndv3+fiL6OSlaoUEFQe2L2RvX09PyhRt/SSk5OphUrVuj89+/q6kr37t3L6m4ylqk4eWMsG0pISBA18tKpUyet2we9ePGCHB0d9daVSqX0119/ERHR3bt3KX/+/KISFRsbG8qXLx+VL1+etmzZQl++fKEDBw6Qp6en6KRHyPIimzdvFhzPysqKQkNDVXVfvXpFo0aNomLFimks7CuRSNQ2jCf6ukjyzJkzRW8cn3oUL16c9u7dS0qlkm7dukV+fn5kY2OjNd6///6rca+tW7cW1I7YUdHg4GCx/yS/u/DwcJo0aRJ5eXmRg4MDeXt704wZMwS/U8hYdsaL9DKWDfXu3RubNm0SVad8+fKYNm0ajhw5gqCgIJibm+Phw4d4+/atRjlTU1PIZDLUrVsXffv2hbu7u+p6ZGQk2rdvj4sXLwpq18zMDMnJyRpbXsXFxWHatGlYtmwZFAqFoFhSqRSxsbF6l5IIDw9H3rx5BcUDAAsLCwwZMgQFChTA0KFDdfalffv22LVrl8b5+Ph4VKtWLV2LCefOnVvvkiZOTk748OGDxvnu3bvjn3/+MRg/b968CAsLE9yfhw8folSpUoLLM8a+s6zOHhlj4mzYsEHrCJK1tTXZ2NhQvXr1qGfPnkaNBrVp00bQwq7x8fGi4qY+6tPm7t275OPjIzjWrFmzDPavRIkSRo2E6TvKlCmjta25c+dmeFvajrSLCBMJ3+i9T58+VLRoUUFlpVIpby/F2A+OkzfGspE7d+6QTCZT+7G1tramJ0+eaJQ9duyYwT09vz28vLwoNjZWUD+OHTsmKvFYsGCB3nhidhRo0qSJwf69e/cuUxKoOXPmqLWjVCpFP0YGQMWKFTOq/R07dqi1n5SURHnz5tVbx8TEhB48eEBbtmwR1Ebbtm0F/RtgjGUdXqSXsR+UUqnEnj17UK9ePTg4OMDBwQHVq1dHcnKyWrmNGzeiePHiGvUbN26M69evI3/+/ILaq1ChAmxtbQWVDQ8PF1Qu1YULF9C8eXN06NABy5cvx8ePH9WuC20XAJKSknRei4qKwokTJzBr1iydZczMzDBq1CgMHDgQpqamgtsFgGnTpqk9vvz06RNev34tKoarqyvu3buHnTt3inq8CwCLFi1SWwRZJpPhwIEDcHJy0lrexMQE69evR+nSpdG9e3dUq1ZNb3wrKyvMmDFDVJ8YY1kgq7NHxpgmuVwu6NHf0KFDDcaaPn26oBEXGxsbwXthil2qRFtb+/fvV8VLTEwUvE6bVCqlOXPm0JcvX1T1IyMjqUePHjpnsnp6etKYMWNox44dajMpg4KCRI1OAqA//vhDVT82Nlb0vU+ZMkVVv0+fPqLrh4WFaXwfwcHBNHjwYLK3tycAZGpqSm3atKErV66olVMoFNSuXTutj9Rz586tUZ4x9mPi5I2xH5Cbm5vBH/ECBQoIWi9sxIgRghMDXeudpZWYmGj0DMvUw9TUlP777z9VTLGPH8uVK0cnT56koUOHGlynbtu2bVrv4/Pnz6L73aFDB7UYYt7Xq1Klitr6Y23atBHd/sWLFzXuIyEhgU6dOkX/+9//6MyZMwb/Xbx//54mTJhALVu2pJ49e9LOnTsF/VtijP0YOHlj7AczbNgwQT/i7u7uJJfLDcabPXu2oHhmZmY61x1La9q0aelK3FKP4sWL04YNGzIsnq6jXr16Wu8jNDRUdCxPT0969uwZ7d+/X/AkABMTExo2bBh9/vxZrf1+/fqJbt/CwoLGjx9P0dHRFBkZSXXq1NFIpAsXLkz79u0T9F0yxrIfXiqEsR+Mubk55HK5oLI3b95EpUqV9JYJCAjQ+k6cNmPHjsXcuXP1bop+7NgxNGvWTPAG9BnB29sbFStWxI4dO4zeRD0wMBBFixZVO5eYmAg7OzukpKRkRDe1sra2xsmTJ1G9enWNawcOHEDr1q2NimtjY4OEhAS9n8emTZvw22+/GRWfMfbj4gkLjP1AkpKSBCduwNcX5g3ZvXu34HgLFy5Eo0aNtK4pBgCvXr1Ct27d1BI3ExMTVK9eHdbW1jA1NYWTk5PoiQBpbd68GVeuXMGJEycQFhaGgIAA/PPPP7h27RpKlixpVMybN29qnLO0tETbtm3T1Vd92rZtC39/f62JGwA0a9ZM8ISStOLi4gwmsgMGDND5XTLGsi9O3hj7gaSdhWmIoR/+//3vf5g6daqomGfOnEHFihVx9+5dpKSk4Ny5c/jnn39Uo0QxMTFq5RctWoTLly8jLi4OcrkcHz58MHp0DPg6G7Rz586oVq0aGjZsCA8PD9U1X19f+Pv7o0iRIkbHT2vs2LEaCwhnlF69esHb21vndVNTU3h5eQmKlT9/fr0jotp8+fIFW7duFVWHMfbj4+SNsR+Iq6ur4LKWlpZ6k5hr166hZ8+eauckEgkqVKgALy8v+Pj4YMyYMZg9ezbMzMzUygUHB8PX1xeurq6oW7cuunfvjtatW+P+/ftq5dq1a4cRI0ZotJ328aQYcrkcO3fu1HldJpPBzc1NdFxfX1+t52/dumXwEXCZMmWwY8cOjBs3TlSba9as0Xv95s2bOHv2rME4LVq0QGBgIJ48eYIOHTqI6sOFCxdElWeMZQNZ+sYdY0yDk5OToBfXFy5cqDPGy5cvKVeuXBp1li1bprX8lStXRO2VCoDy5s2rc1HfJUuWpGuCQcGCBfV+Rj169MiQCQufP3+m3Llzq5W1t7enX375hVq3bk1Lly6le/fuqZYXUSqVotp1d3fXex9169bVaHvIkCFUsWJFKlWqFLVr146OHz+usVG8of1ovz3q1q2rtw+MseyHkzfGfiABAQFkaWlp8AfZwcFBZ4yPHz9qXSNu4MCBGknAt968eUPVqlUTlZwcOXJEa6y4uDgqVaqU0cmbRCLRmEn75csXunHjBp0+fZrWrl0rKt6AAQMoPDycFixYQLVq1aKKFStSx44dqVu3bhplz507p/c7ErMunKmpKe3Zs0ftc//8+TOdPXtW6yzgRYsW6W07lZgdGsaMGSMoJmMs++DkjbEfRExMjKClJ1xdXSkpKYmIvi66unfvXmrUqBHlz5+fihYtqnW7pEaNGglaViQ5OZnKlSsnODFwdHTUGSsiIoLq1atndAJ3+fJl1T0uWrSI3N3djY4FfF2uw1AZIVtvGbO8R4UKFejgwYM0YsQIsrW11VrGw8ODEhISBP1bWbx4seC2IyMjBcVkjGUfnLwxlkViYmJUa5z98ccf5Ofnp/HD6+npSU5OTmRjY0MFCxakvXv3quonJCRQo0aNDP54lyxZkj5+/Ci4X2ITruPHj+uNd+/ePZo5cyZ5e3uLinv69GlSKpXUs2fPdCVtQg+JREIPHz40+PnExsaSmZlZhrc/duxYwd9RXFycajcFfUfXrl0Fx2SMZR+cvDH2nSmVSpo5cyZZWVnp/eEtV66c2mr8afXu3dvgj7eDgwO9evVKVP8aNGggKukYNGiQoLhiRosAUGBgIO3bt8+oRMjOzo78/PwM7rzw7WFiYkKBgYEG7yM6Olrn6Fl6jiJFigjenoyI6OnTp2Rtba0znp+fn6h4jLHsg2ebMvadTZw4EVOnTkVCQoLOMrly5cKBAwdgbW2t9Xp4eDi2bNlisC1PT09ER0cjNjZWcP90rUmmi4mJ4f8ZCQwMxMyZM0XFrV+/vuA6rVu3xrlz57Bt2zYcPHgQ4eHhuHjxIm7fvi2ofwCgVCqxfPlyg+Xmz5+Pz58/67zu5eWFtWvXYufOnXqXCUkrKChI0MzTVMWKFUNERAT69u0LBwcHtfa3b9+O8+fPC753xlg2k9XZI2M/kxcvXgjaE3TSpEl646xatUrUqI5MJqNff/2VQkNDDfZR7GSABQsW6I336dMnUS/YG3P06tVLa9uJiYmi4ri5uem9l9DQULKwsFCr06FDBwoKCqILFy7QvXv31Ea75HI5LV26VHD7s2bNMvj96KJQKHikjbGfBP/fMsa+o02bNgnaVsrQ2lxiV81PTk7G1q1b4evri5cvX+osd/v2bQwfPlxU7PHjx2POnDla70upVKJ79+4ICAhQO1+6dGmtC84au1iurs9UJpPBzs5OcBxDiyTPmDEDSUlJqr9NTU0xe/ZseHl5oVatWvDx8VEb7TI1NUXnzp0Ft3/y5ElER0cjODgYY8aMgbe3N/LkyYPKlStj9erVekdrTUxMeKSNsZ9E+vawYYyJ8vTpU0Hl0iY7aX2764AYb9++Ra9evbQmh+Hh4WjZsiUSExNFxSQiTJ48GXfu3MHatWtx9uxZ+Pv7w8TEBK9fv8ahQ4fUyvv4+ODKlSuQyWRYsWIFrl69CplMhq5du6JcuXJo27Ytrl69KqoPuvZ3lUgkaN68Of79919BcVJSUvDff//Bz88PABAfH4/Xr1+r/vPGjRvVyvfp08fgbg+5cuVC/vz5VXH0uXz5Mjw9PSGXy9W2SYuIiMDNmzexatUqnD59Gu7u7oLuhzGWM/HG9Ix9R127dsX27dsNlnN3d0d4eLjO6zExMXB1dTV6Q/X79++jTJkyqr/j4+NRs2ZN3L17V61chw4dcPv2bY3ROktLS61JnlQqhUKh0Nmus7Mzbt++jQIFCugsc/36dVStWlXgnXzdoD08PFzrCFtycjKqVKmCe/fuCY4HQLUzxY4dO5CcnKy1jJWVFZ4/fy5ot4f58+djwoQJovqgi6+vL65fv55pW3oxxn58PPLG2HdUr149QclbUlISwsLCkDdvXq3XDx8+bHTiBgDbt2/Hli1b8PHjR+TJkwdXr17VSNxq166Nv//+G+bm5ggODsaBAwegUCjQsGFDlCxZEosWLcKECRPU9jHVl7iZmJhg165dehM3AIiMjBR8HxKJBGvXrtX5aHTo0KGiEzcAgiaD9O/fX/A2XZ07d8akSZPStedrqps3b+L8+fOoU6dOumMxxrKprHzhjrGfTUJCgsZ2TLoONzc3unHjBsnlclqzZg116tSJevbsSVOnTiVzc/NMnQBQpEgR+vDhg8H7OXnyJDk4OAiKWaxYMUGf0eXLlwX3c968eTrjrFmzRqO8rvXZ0k5CEHLUr19f8Pc+ePBgnXFq1qxJe/fupU6dOglue+DAgYLbZozlPPzYlLHv7MqVK2jcuLHe5SZSpb6AbmjEpkGDBiAinD9/Pl0jcgDg4OCAGzduCN5cfv/+/WjTpo2gsqGhoTpHE1OlpKQgT548giZldOnSBRs2bIClpaXa+StXrqB27dpq741ZWlri2rVrSElJwZYtW/D69WvY2dmhVatWaNasGdasWYPx48frfEyqzYsXL1CoUCG9ZV6+fIlixYqp9aVBgwYYOHAgihUrpraciKWlpdqECF06d+4saASXMZZDZXHyyNhPKSAggH799VeSyWSq0ZRq1aoZtQXUt6Mww4YNS/eo27Bhw0Tdyz///CM49oULFwzGe/z4sdrnYuioWLEiLVq0iHx8fCh37txUqFAhrYvX7tixw2DbEyZMEPVZLV++3GDMLl26qNWRyWQUEhKitWyRIkUEtcv7lTL2c+N55YxlAW9vb9U7Z6GhoYiNjcWVK1fw8OFD1K1bV1SskJAQ1VIZkydPhpeXV7r6dvnyZVHldS0krI2VlZXe69HR0WjRooWo0a/bt29jzJgxuH//PiIiIvDy5UvEx8erlRk7diw6depkMJaYZUUA6J1UAgD37t3TGCEbPHgwPD09tZbv3r27oHaFlmOM5UycvDGWhSwsLJA3b17Y2toCAJycnHD8+HFRCdGRI0dUS3+4uLjgv//+Q4sWLYyejRgYGCiqvJ+fH8zNzQWVvXbtms412eRyOTp06IAXL16onc+fPz8KFy6MwoULo0uXLpg3bx5sbGwE969GjRqYO3euoLLfzsAVIjUJi4iIwIEDB7Bnzx61zy/tDFM7Ozu9s059fHxgYWGht81OnTqhdOnSovrJGMthsnrojzGm7unTp6IfdWrbgPzFixe0efNmWrt2LUmlUsGxTE1NqUKFCtS7d2+6f/++wf6GhYWRpaWl4Pj9+vWj5ORkIiJKSUmhuLg4UiqVNGTIEK2PRBMSEjTafPTokeCJEt27dxf82SckJIiaDJInTx6qXbu2xh6qfn5+tH79eo3yc+bM0dn2rFmzDLbXrl07rZ8HY+znwskbYz+YsWPHik7eXF1dadOmTRQfH681pr4NzA0dFStWpGfPnmmNm5CQQBUrVhQd08fHh1q0aKF6t83KykqjjJubG4WFhen8nITO2rWxsRH82Q8YMMDoz0lIohcXF6e13YMHDxqsX6tWLcH3wRjL2fixKWM/mOfPn4uu8/79e/Tq1Qt58+bFgQMHNK77+voa3Z/bt2/Dx8cHN27cUDtPROjTpw9u376tdv7b99rKlSuHJk2aaMS8f/8+Dh06pHq3Le22TzKZDPv379e7k4TQ9eDi4uIElVuzZg3WrFkjqKwxpk+frvNx+OLFiw3Wv3jxIoKCgjK6W4yxbIiTN8Z+MGLed0srJiYG7dq1w+nTp9XOz5gxI119SkxMROvWrdWWsVi4cKHGy/iFCxdGaGgo4uLikJCQgDt37uDo0aP43//+p7Gchz6rV69G5cqV9ZbRtjeqNkLex7t06RKGDBmidk4mk6Fu3bqQyWSqc+7u7pg2bZpq+yyhpFKp1iQW+Lqf6qVLlwTFOXLkiKh2GWM5EydvjP1gmjZtmq76CoUCI0aMUJsYEBERkd5u4e3bt9izZw+Ar0lE2hfvbW1tcejQITg5OcHa2lotWevYsSOuXLkiODE1MzMzWEboaOKXL18wduxYnbs/hISEoG3bthrr423ZsgVnzpxBXFwcQkND8f79e4SFhWH69OlYuXKloLZTKRQKLF26VOs1Iev9GVOWMZZzcfLG2A9GzDIZujx+/Bj3798H8PWR6u+//57umABw+vRpPHnyBF26dFFLDiUSCbZv344SJUrorFuuXDk4OzsLauf48eMGy5QsWVJQLABYtGgRGjdujOjoaKSkpODGjRs4deoU7t69i1atWmk8gh0/frxqaRFTU1PkzZsXuXLlUs3gTV08WYwtW7YgMTFR1YdUrq6ugkclDW0txhj7OfAOC4z9QG7dugU/Pz9Bq+wb0qxZM5QtWxbHjx+Hv7+/2rWhQ4eiWLFiiIiIEPVItWrVqqq11L41f/58jBs3zmB9V1dXQe+qtWjRAgcPHtR5/fz586hXr57ovUIdHR0hl8v1vgfXuHFjHD58WO9j2S9fvsDd3V3QLhDfMjMzg1wuh7W1NTp37oyxY8eiSJEi6NOnDzZu3Ki3rq2tLd68eSNqmRTGWA6VpdMlGGMq4eHhWndYsLGxIeDr/ps1atRI96zHNm3akFKpJCKiL1++kJubW7ridenSRRXPkGrVqgmK2bRpU50xgoODycXFRW/9UqVK0ZgxY3TuZarrKFq0KMXExAi6lwoVKqT7uzA1NaU//viDAgMDDS7nsmTJEkH9YozlfJy8MWaEz58/07Jly6h8+fLk4uJChQsXplGjRtHLly+JiEipVNKVK1do4sSJNGzYMFq+fDlFRkaqxXjx4gUNHDiQWrVqRQMHDqRSpUpp/GAPHDiQlEolJSYmkkKhoOfPn6crWbC2tqaIiAi1fqxatcroeGXLlhW17tj06dMFxx47dizJ5XJSKpUUHh5OAQEBFBERQeXKldMoO2XKFAoICKCbN2/Su3fvVO1duXKF8uTJI7jNmzdvCrqPLVu2pDtx+/bQty2WmZkZzZ8/X3CCzBjL+Th5Y0ykkJAQKlq0qNYfWktLS9qyZQtVqVJF45pMJqM5c+ZQYmIiVa1a1eAPeu3atenLly9qbX/58kXUvp9pD3Nzc42RJaVSSePHjzcqXsmSJVUL7hoSFRVFBQoUEBXfy8tL6xpw3x7NmzcnhUKhs93Xr1+TRCIR1N7KlSsN3setW7fS9R0IORwdHalnz560cOFCtWSUMcaIOHljTBSFQqF15Ofbw1Ci4OTkZPDH28PDg6KiorT2YeDAgelKDFatWqU17uXLl6lw4cKi423YsMHg5yaXy6lu3brp+ty0Hd7e3vTx40e9bZ84cUJwvLZt2+qNFRERQZ6enhr1FixYoPW8scf27dsNfqaMsZ8XzzZlTITTp0/j7t27esuQgTlA0dHRBtuJiorCmzdvtF6bPHky3NzcDMbQJSAgQOv56tWr4/nz5wbXV0tr/PjxuHXrlt4yo0ePxtmzZ9XOlSpVCpMmTcKwYcOwcOFChISEYO3atYKWCUm1Z88e2Nvb6y3z6tUrwfH0TWRI3Xs1NDRU7fyQIUMwduxYPHz4EDNmzEC+fPkAfF3bzdA+pbpcv37dqHqMsZ9EVmePjGUn/fr1y9THZd8eNWrU0NmPoKAgo1+YHz16tN57dHV1NSru4MGDtT6+3LRpk0ZZNzc3Cg8P19q+mJEyISNU//77r+B4lStXJrlcrjXO8OHDNcr7+flpPNomIkpMTKSUlBSqV6+eUZ+ltbU1ffr0yeC9McZ+TjzyxpgIHz9+/G5tXb58GY8ePdJ6zcvLC7du3cKlS5cwbdo0jBs3DsWLFxcU99q1a3oXe01dy0yslStXYu7cuRptDRgwQO2cubk59u3bB3d3d61xTpw4IapNQxo0aABTU1NB8W7cuIFGjRohICAAAwcOhI+PD8qUKYPatWtrLLKbN29e7Nq1S+tIoYWFBaRSKXr37i2o3bTi4+Nx9epVo+oyxn4CWZ09MpadjBw58ruNvAGgLVu2COqXQqGg6tWrC45bokQJnZvNt27d2uj+2tvbqzZfDwsL0zrT09A9+fn5CW4vV65cNHv2bDp69KjO2ZgREREGJz2IPWQymaCZqXK5nGrVqmVUG3v37iWFQkEXL16kTZs20c6dOzVmLDPGfk6cvDEmwt27d79r8vb3338L6te0adOMSrSOHTtGRF+Tv/DwcHrz5g2tXLkyXX3u3bs37dixg8qXL69xbfjw4QbvpUWLFka1a21tTYsWLVKLJZfL6ZdffjFYV+xkiU2bNgn+NxMbG0sFCxYUfT9lypShQoUKqZ2TSqXk5+dHN2/epNjYWMF9YIzlLJy8MSZSx44dv1vyNnLkSL3LYBAR7dq1S6Petwu+2tnZUYsWLcjBwUFrG/Xr16e8efOq/jYxMcmUe6lbt67O98m+tW/fvnS1M2jQIHr48CEFBwfTqFGjNK7b2NiQqakpmZubU5UqVejIkSN05coVypUrl6D4UqnU4HfyrR07dmTK5ymRSKhdu3Z0//59wX1hjOUMnLwxJlJCQgK1b9/+uyVwLVq00Lnqv7+/P1laWqqVNzExoZMnT9KnT5/ozZs3qhfqX7x4QWXKlPlu/f72KFSokM6lT9K6evVqpvXDw8NDY5Fioq9r3eXLl09wHKFLeTx8+FDjka2JiYlRy6LoOiwtLens2bOC+sMYyxl4wgJjIkVHR6Ns2bJo3LgxSpQogYoVK6Jr167YvXs3Bg0alOHtHTp0CJUqVcKDBw/w8OFDzJw5EyNHjsSMGTPQrFkzJCYmqpX/888/0aBBA9jZ2cHNzU31Qn2hQoVw9epVdOzYUXDbbm5u2LVrF/r27Qs7Ozuj72H+/PmCNqUPDw9H27ZtjW5HHzMzM+zduxeurq4a1y5fvoyQkBDBsW7fvm2wzMePH9GmTRskJCSonV+zZg0uXLiA/Pnza9RxcnISvbxIYmIi2rdvr3eZE8ZYDpPV2SNj2YVSqaRZs2aRqampxuiHp6en6gX2ZcuWGT2KYm5uTmXLltU6MiPkcWbfvn0NbqOkVCqpd+/egvpja2tLnz9/JiJxS3ikPfr372/w842Pj6eKFStm2qhbvnz5KCUlRWvbYrbtAkAzZ87Uey8KhYKaN2+uUa9Pnz6qMnK5nA4ePEjjx4+ncePG0d69e+nLly9GL0ezdu1ag58xYyxn4OSNMYEWLlyo98fTwcGBAgMDacGCBaJ/eL29venIkSOqR4unT582uPl62sPPz0/QVlUHDx4U9dju3Llzqrrr1q3TmrwaOqpUqaK3T0qlUuu7hLVr16YPHz7Q/fv36cGDB+lO4HQ97pwwYYKoOF26dKGkpCSd9zNr1iyNOhUrVqTExESD34+29/SEHO3btzcYmzGWM3DyxhgRRUdH0+nTp+nEiRP05s0bjeufPn0iGxsbgz+gYreXcnJyooULF1J8fLxGmyEhIeTr6ys41uXLlw3eZ3x8vOh9OVNnpKZ68eIFjRkzhipXrix4CQ59Cw4TaU92ChcurPGenL29fbqSt19++UVr+2IW8k09qlatqlpoWKlU0ufPn+nLly90/PhxjeTYxcWFXr9+bfD7ITJ+wka9evUExWeMZX+cvLGfWlRUFPXu3ZssLCxUP4JSqZTatm1Lr169UpXbsmVLupIGXcdff/2lt39JSUmUO3duQbEM7ZxARLRkyRLRfXz58qXOeELXvStYsCBFR0dTUlISXbp0iY4fP04BAQFERLR3716N8nZ2dvTkyRON9kaMGJGuz9vJyUnrfcTFxZGZmZnoeLly5aJKlSqpjUamTdxMTEzozJkzBr+bVHK53Kh9UgcOHCi4DcZY9iZs2XHGcqDo6Gj4+fnhyZMnaucVCgX27t2LK1eu4MqVKyhUqBBev36d4e2bmpqiVatWesvIZDIoFApB8Z4/f26wzN69ewXFSuXj44OCBQvqvK7v2rdevXqFggULIjk5GUlJSarzuXPn1tjr1cTEBP/73/+07hixYMEC7NmzR2N/UaF07Zu6YsUKyOVyvXUtLS2hUCjw5csX1bnIyEhERkaqlaM0e9vOmzcPdevW1Rv7wYMHWL58OU6cOIGEhATY2trqLa/N8OHDRddhjGVPPNuU/bSmTJmikbh96927dxg4cCAApGumpS59+/ZFnjx5DJaztrYWFE/ILMXk5GRBsVLpmyH64MEDjB8/XnCsT58+qSVuABAREaGRNC1evBiNGzfWGsPMzAyBgYGoVauWUdt4xcfHY+DAgXB3d4eJiQmsra1RsWJFTJgwQW+9Jk2a4NWrV7h586bghBX4mvANHjxYb5kNGzagXLly2LhxI8LDwxETEyNq5isA1KpVC0WKFBFVhzGWjWX10B9jWeHz589kbW0t6HHU8+fPKSgoKEMfl7Zp00bvC+/fEjr7sHjx4gbXUvvtt99E9dPX11drnMjISCpQoIDeuj4+PjoXBtZ19OrVy+Bs2VRRUVE0e/Zsox4xGjpmzJhBCxcupBUrVqge76b68OEDlS5dWnCskSNH6ryHy5cvp3vNtwIFCmh9Z5IxlnNx8sZ+SteuXRP141i+fHmjZllqO9q3by84QSEiGjZsmODYBQsWpIcPH+qM9ejRI1F9rVmzJimVStq3bx/Vq1eP7OzsyM7OjhwdHbUmXsHBweTv70+hoaFGtSd2sdnhw4dneOI2e/Zsg+3Wr19fcDwbGxvVcitpNWnSRFCMI0eOUKtWrdSWi7G0tKShQ4dy4sbYT4iTN/ZTyoxV/IsXLy6onEQioaVLlwpK4LTNXBSSLBw4cEAjlkKhEJwspB5WVlZUrVo1g+WqVKmidSRx/fr1opNFoTZv3qxR39nZmcqVK6f2mZUuXZqcnJwEfzdxcXEG2xbymXx7fLvcCtHX2alTp04VXH/WrFlERPT27Vs6f/48XblyhZM2xn5inLyxn9KnT580tpUSc8hkMrK0tCRHR0fq0KEDLVu2TPSeoL1799b76PT58+daHzumjgDa29tT+/btde7JOWrUKGrVqhXZ2dmRubl5uu5X32Fra6t1eRUioilTpoiOJcS1a9fI3Nxcra65uTldv36diL4+2nz06JFqBLBt27aC+7B582aD7ffs2VPUfR09elStvth15YTMJGaM/Tw4eWM/rb59+xqdsJQqVUo1cvb8+XODIzu63q+rUaOG2l6b79+/p5cvX1JkZKTW96rmzZtHcrmcYmNjVZujh4eHi1oPLvWws7MTveabtsPR0VHn4sB//PGHqFjW1tYGv7ewsDDKkyePRt0tW7borNOgQQPBfWjVqpXBPoSEhIi6r4sXL6rqvnr1SvRoqpAdKhhjPw9O3thPKzIykooUKWJ00uLj40NNmzalggULalwbNmwYbdu2jdasWUNnz54luVyucwsmT09PGj9+PLm7u6vOaftxb9eunc5HrYmJidS9e3dR/T958iS9f/+eZs2aRSVLlqTcuXNT6dKlaerUqaKSnbTJybfETvTInTs3ffnyRXVPHz58UCWpqecqVaqkUW/EiBF6v+v+/fsL7kOFChUM/tsRu16es7Oz6n2+adOmGfXvbcKECSSXyw32jTGW83Hyxn4qafe2jIiIoC5dumTYZATg68jNtwnHt/bs2SN4V4Jvj5IlS+p86T2VUqmkRYsWCY45ffp0nbECAgJE9e/QoUM6Y7Vp00ZUrOLFi6vNZDU1NaVSpUrRiBEjqFGjRhrl69evbzCpuXXrluD2HR0dVY9btblw4QJJpVLR36GJiQnVrFnTqLqph5+fn9quDhEREfT+/XtRE2AYY9kfJ28sxwsNDaVRo0apdiqws7Oj3377jR49eqQq8+7dOzp06BBNmjQpXYlbqVKlDCZZd+/eFbW8hUQioadPnwq+X6GJaMGCBXXGuHz5sqj7vnr1qs5Yo0ePTtdnqu8oXLgwffjwIUM/F+DrdlYnTpwgoq+PskePHk2//vorzZs3T+ues9oeP6d9Jy+jDhcXF+rVqxflz59fdc7Ly4uWLFkiaG9bxlj2x8kby9H8/f3J2dlZ64+gubm5xqzMxMREneWFHNOmTRPUr3fv3lGJEiUExz18+LDgexaTBOjy7NkzUfddokQJev78ORF9ndUaHR1NiYmJtGfPHkH1jVnrzNraWi0B1+fgwYNGfZ/alkRJe0ydOpUUCgWdPHmSZs2aRbNnz6bTp09TTEwMtWjRwuh/Sy1atKClS5eK2rarXr16lJiYKPjfCmMse+LkjeVY8fHx5OHhoffHTiaTUVBQkFq9xYsXG/2DW6hQIcH9K1eunOC4v/76q95YsbGxtGrVKqpbt67gRMjLy0tnPKVSSUWLFhV17/b29tSuXTtV8iuRSDRm4JqYmNDChQupR48e1KpVK5o/fz5FR0fTtWvXRCdwrVu3FvQ5P3v2jOzs7Iz+TvUdjRs3pri4ODp37hwdOnSIHj9+rNa2QqGgPn36GBX75s2bRER048YNtVE2Q8f48eMFfS6MseyLkzeWY23atEnQj52FhQWNHj1a9fhNqVQa/ahPyGxJoq9LWYiJ26JFC52x7t+/bzBJ1XbMnz9fZ8yQkBCyt7fP8GRn+fLlWtsTu5gv8HXkUNe7hak+f/5MJUuWFPS9GXM/vXr10hid8/X1pQsXLqj6oO09PUPHsmXLNP69CI3j4ODAa8AxlsNx8sZyLDFrewGgokWL0tu3b1X17969S/3796dKlSoJXsPN3t5eUN8CAwNF9W3cuHFa40RFRane5RNz2NnZqWZ1ppWQkEAVKlTI8MStQYMGOl+sP3XqlFEx9b3vplQqqWPHjhp1unTpQq9fv6b169fTkiVLaP/+/ZScnEzHjx8X9JhUyGFqakpHjhwhIhI1o9nDw4NOnz6t9X4OHz4sOM5///2n758fYyybMwVjOVRcXJyo8s+ePUO/fv1w6NAhAEDZsmWxZs0aAICfnx8uXbpkMIZSqURISAjy5cunt5yrq6uovn369AkpKSkwNVX/r+y6desQEREhKpaNjQ1u3rwJMzMzjWtEhAEDBsDf31/tfIECBZAnTx4oFAqUL18eVapUwfjx40W1LZFIdG4mnytXLlH3kMrCwkLntT///BM7d+5UO1e6dGmsW7cO1tbW6NOnj9q1Ro0a4c6dO6hYsSI+fPhgVH9SpaSk4LfffkNISAicnJwE1+vWrRvq1aun9VpSUpLgOGLKMsayoazOHhnLLL///rtRoyapL95/S8xWRrly5aJLly4Z7J/YLZYaNGhA0dHRajHKlCkjKoahXR2WLl2qUcfLy0ujXaKvs3iFbgmG/z8apesxp0KhEL2JfalSpXTex/nz5zWW5LC3t9d4v1EbIY9ZhR5///03zZs3T3B5a2tr2rVrl9Z+PXz4UHCc4OBgg/fJGMu+TLTkc4zlCD179jSq3rlz5/Do0SMsWrQI06dPx8yZMzF//nzB9SMjI1GnTh2sX79eZ5mQkBA8ffpUVL9OnTqFypUrIyAgQHXu/fv3omJYWVlBJpNpvXbu3DmMGjVK7ZyNjQ0OHDgAR0dHjfJ58+ZF27ZtBbedkpKClJQUrdeio6N1jsrpYmVlpRpdffToESZOnIjffvsN/fv3R5s2baBQKNTK//vvv/Dy8jIYVyqViuqHPjdu3Ph/7d15XE35/wfwV3XTra5Km5I1lCUphOg7RVHCaJAtwxdfMfbsvmNmMIOZr+ExmyVqbBNZv8iSR6jsS8q+XI1QqNBGkrr38/vDt36uu31ORW7ez8fjPB7jnM/nfT7n3HmM95xzPp83Ro8ejVq1anG1LywsxKBBgzB9+nSUlJQgOzsbu3fvxtatWyGTydCoUSOtMXr27MnVjhCiw6o7eyTkfZHL5Wzo0KGCn5Y4OzsLau/g4MDs7e1VHps4cSJ7/fo1k8vlLCMjg0mlUvb06VOumaZubm4ql4moXbs2CwkJEbRWXNn22WefqbxXaWlpKpdI2b17t8Z7PGXKFO5zW1hYqPzmraSkhPn6+lboyVbLli2Zl5eX1na8S7gwxtioUaOq7MnbpEmTGGOM7d69W3DtW6FPIgEwiUTCLl++zH2thBDdRMkbqdF+/PHHKvuLuGybPHkyKygoYDdv3ixfkDc3N1ftbEBnZ2eFZTdUrbDfvHlz1q1bN9a1a1cWGhrKLly4wBhj7NSpUxWakKBu8/X1VbpHhYWFrG3btkptv/32W633V8grQQBs/PjxrLi4mKWkpLCoqCi2e/duNnHiRKV2VVFztWwLCAjQOiv1befOnauyc2/atKk87pkzZ5i/v7/CcVtbWxYREVElCaOzszM7d+4c93USQnSXHmOMgZAa6MSJE/jss8+qNKa+vj6ysrJgbW2tdEwmk2HevHlYtmyZoJhOTk44d+4cLCwsVB5PT09HUFAQkpOTKzJkBW3atMGxY8ewb98+XLt2Debm5jh16hTi4uIU2vXt2xd79uyBvr7mLyvS0tLg6OgoaAwmJiZ4+fKl2uP16tVDUlISUlJSsHLlSpw+fRpyuRzt2rWDl5cXfv/9d+Tn53OfLzw8HKGhoYLGGBYWhl9++UVQn3eZm5sjMzNTaVJFTk4OsrOzYWVlVT5RgzGGiIgITJo0Ca9fv+aKHxAQgM6dO0NPTw+enp7w9fXV+nsRQmqIak4eCXlvvvjiiyp/6gaArV69WuN5N2/ezP3kSF9fn6v0VWFhIfPz86uS8WtbDLdFixYsPz+f6x4vX768Su+tSCTSWGqLMcZSU1MFTSrw8PDgupa3ldWJVVUKi3f74YcfBJ938+bN3PEDAwMFxyeE1Az0v2mkRmKMITY29r3E1jbRYPjw4Thx4oTKpTjeJZfL8eTJE63tTExM0LlzZ+4xasI0PGwvm6BgZmamNc7hw4cxa9asKhlTmcDAQHh6emps07RpUyxYsIA75o0bNwSPQ09PDzNnzkRGRgYOHTqETZs24fDhw2jZsiV3jKFDhwo+7/Hjx7nbJiYmCo5PCKkZaJ03UiMxxlBUVMTV1tjYmLstoHltsTItWrRASUkJV7z4+Hj84x//UHv88ePH+M9//oPVq1dzj/Ftrq6uuHnzJtd4fHx84OzsrLXdnTt3MGTIEMjlcoX9PXr0QElJCUxNTdGrVy9YWVlh3LhxKCgo4BrrxYsXIZfLtb7+440HgPs1pCpGRkYICAgo/3OfPn24Zgk3aNBA8Otk4M1vzYvWciPk00XJG6mR9PX10axZM6SmpmptKyRxA94kKNoUFxdzx9PU9s6dO/Dx8cGjR4+441lbWyMpKQm5ubmoW7cu7OzsYG5uzpW8xcfHQyaTaVwuo6CgAP369UNeXp7C/u+//x7z589Xat+0aVN07NiRa+wPHz5EdnY27OzsNLYTsqivsbExd1ttxo8fjxUrVigtQ/Kuin4vJ2TxZnt7+wqdgxCi++i1KamxxowZU+Uxzc3N4evrq7WdpaWl1gSkjLrkgjGG4OBgQYkbAIwaNQqNGjWCm5sb7O3tsW3bNjx//pyrb2FhIXJyctQel8lkCAkJUXr6NHDgQHz99deCxqkOz0f3fn5+StUm1CkqKsKBAwcqOywAgKOjY3nVDXXCwsLQv3//CsXv168fd1uhkzAIITVI9X5yR8j7U1BQIKgCAM9Wu3ZthaLjmsyfP58rppGREdu2bZtS/2PHjgkeX/369VlWVhZj7M1H9//+978Fxyhb/kSVefPmKbVv27Yte/Hihdo+KSkp3OfW19fnWqfs9OnTgtdNmzx5MpNKpeybb75hvr6+zMfHh82YMYPdunWL49dUFBsbyzp37qwQ38nJicXExAiO9bbS0lKuf2dtbGw01nUlhNRslLyRGu3Ro0fMx8dH6S8/sVhc4dmbIpGIhYeHaz13Xl4ea9GiBXfc7777TmE9sjlz5ggal5ubm0Jpr8mTJ1fo+nbt2qXyerZu3arU1traWmsppuLiYmZpacl9flNTU7Zz50618TIyMpidnV2Frk3VTFs9PT22aNEilQsIa5Oens4uXrzI0tPTBfdVJzU1lTVs2FDtNdjZ2TGpVFpl5yOE6B5K3sgnISkpiS1YsIDNmDGDrVy5kj179oxt3769QgnA209ySkpKNJ43MzOTBQYGKvWtVauWypjBwcGssLCQ5ebmsp49e3KPZcKECQrJx+nTpyt1bXPmzGERERGsV69ezMPDg3l7eyuNWSQSscTERK33Pjs7u0LVAubPn1+ezObk5LCMjAxWUFDAPDw8tN5PGxsb1qZNG0Hn07YEzIeUk5PDlixZwho1asQMDAxYrVq1WPPmzdmqVatYaWlpdQ+PEFLNaJFe8sl69eoVLC0ttU5YCAkJQX5+Pvbv3690rEePHti2bZvK2p9vu337No4cOYKioiI4OTnBz88P06dPR3h4uFJba2trPH/+XNCkhxUrViAsLKz8z66urrh69Sp3/4pYvXo1xo8fr7FNUVERunfvjrNnz1boHO7u7igsLIRUKgUAGBoaKk286NGjB/bv34+UlBQ8fvwYVlZW8PT0hIGBAdauXYtp06Zxz8y0sLDAwoULMWXKlAqNlxBCPojqzh4J+VCKiorYhg0bWM+ePZmrq6vKklDvbnXr1mUPHjxgpaWlbPbs2SrbNG/evELfTcnlcvbbb78J/nZL1fb2grB3794V3F/oGEJDQ7Ven0wmYwMHDlTq+3a9VolEwry8vLQuHKxuc3R01Prt1/79+wXH7dixo+DfkxBCPhRK3sgnQSqVCv5OytXVVan6waZNm1S+8jQ3N2exsbEVGtvhw4eZubl5pRO4sm/mYmNjBSdAUqmU/frrr9xJlKZv0sqoSnYbNmzIMjIymFQqZTdv3mRFRUWMMcbi4+MFVzPQ19dnV69e1TqOhISECt3P8ePHV+j3JISQ941em5IaLycnBw0aNNBYTxMAOnToAG9vb4jFYvj5+cHb2xt6enpK7c6ePYugoCBkZWUp7NfX18fy5csxdepUlf00SU5ORocOHTRWP+Dh6emJ7Oxs/P3331ztHRwc8ODBg/LlOVxcXHD9+nWt/QYPHozo6Gi1x9euXYtx48Yp7DMzM8Pp06fRunVrlX3S09PRv39/JCUlcY0dABISEuDt7a2xzfXr1+Hi4sIds4yhoSGKi4sF/5aEEPK+0TpvpMb74osvtCZuAJCUlARHR0f88MMP8PHxUfuXdufOnXHhwgW4u7sr7JfL5QgLC8PYsWMFr+ovk8kEJ24SiURp35kzZ7gTNwD48ccfFdZV47lPAJCdna32WGxsLCZMmKCwTyQSYdeuXWoTN+BNVYITJ06gVatWXGMAgLi4OK1tWrVqJaisVZmSkhJcvnxZcD9CCHnfKHkjNVpmZiZOnDjB3X769OlctUbLEo3g4GClY5GRkfD19dWY4LwtKysLe/bs4R5jSEgIjh07hry8PKxYsUJjNQRNunTpguHDhyvs413hX12JsMuXLyM4OFipAkF4eDj8/Py44lpZWXGNAeArEaWnp6ey8gOPjIyMCvUjhJD3icpjkRotLi5O0BOt4uJibNy4ETNnzlTb5tWrV9i7dy+uX78OV1dXmJubIyIiQqHNyZMn0bFjR+zbtw+urq5qzxUWFoZ169ahtLSUe4xff/11+ZOksLAwuLm5wd/fn7uWKvBmFqeqp1b9+vXDuXPntPZPTEzEoUOHAAD79+/HixcvYG1tjaioKLx48UJpvKNHj+Yem6GhIXfbgoICXLp0CVu3bsXjx49hbW2NQYMGoVOnTgpPTocNG4Z79+4JrgLBU+eVEEI+uGr94o6Q92zVqlWCP1QPCQlRGy86OprZ2Ngo9WnWrBkTi8VK+01NTdmePXuU4shkMta3b1/BY/Px8VE5LolEwv2R/7Jly8onCrw7pl69elV64sTb29ChQwUvfstbmULT5ufnp3IW6qVLl7iv0dTUVNC4CSHkQ6HXpqRGa9q0qeA+6mprbt++HUOGDFH5WjU1NRUSiUSpWHhhYSGCgoKwZMkShSeAe/fuRUxMjKBxWVpaYvXq1SqP8T65E4vFmDlzpsrXnt9++23507Sq4OXlhfXr1wv+4N/IyKjS5z5y5Ah69+6t9DSybdu2MDEx4YqxZMmSSo+DEELei+rOHgl5n0pKSlj9+vUFPbVxcHBgK1euZHPmzGHz589nR44cYcXFxVxLjYwYMYJ5enqqfQr18uVLxhhjAQEBgsbk7++vci05mUzGcnJymK2tLVcca2trlfcpOjpa5ZOnTp06MRcXF9ajRw+2du1a1r9/f+4x89Qofdf+/furZN27si06Oloh/tKlS7n6ffXVV4LHTgghHwolb6TG27ZtW6WTAGNjY652EomE5eXlsZEjR6o83r59exYdHa3yFStvAsIYY48fP2bTp08XVDMUeFPHc8WKFWznzp1sxIgRLCgoiA0ZMoQZGRkptBOJRCw+Pl7pvHK5nHtNuiVLlgj6nS5evMhMTU01xqxbty5bu3atUlF4dZu/v395/EOHDqlsY2RkxAwNDZlYLGYdOnRQWtuPEEI+NpS8kU/Cxo0bub8Lq+yWmprK5HI5W7ZsWYUrB7y97dixQ+Fabt26xezt7d/rNaxcuVLlfSwtLeWOwVOFocz9+/dVXtP8+fPZtWvXWFxcHEtJSSmvddq1a1euMTg7OzPG3hR7V7W4sru7e3lMQgjRFfTNG/kkjBgxAo8ePcKaNWvQrVs3hVqkenp6WmuTCmFsbAw9PT3MnDkTMTExqF27dqXivT37Ui6XY8CAAXj8+HFlh6nWuHHj8NVXX6k8pq+vD1NTU644vO3y8/PRu3dvpWsaPnw4Fi1ahNatW8PPzw9ubm7l3yOamZlxxX748CHc3d3h4uKitPaelZUVEhIS1H7jSAghHyuqsEA+SYwxSKVSFBQUoH79+khOTkafPn0qHbd169a4evWqwkf6N27cQEBAANLT0ysU08HBAVu3bsXt27cRFRWFhIQErX3MzMxgZWUFS0tLTJ06FXfv3sWCBQu4znfx4kW0a9dO7fHBgwdj+/btWuN4enoiNjZWY6JVUlKCwMBAHDlyRGG/t7c3Dh8+rHbywpo1a9QmmDxEIhGuXLlSocV7CSGk2lXzkz9CPgq//vprlbxuXLduncr4M2bM+CCvbMs2IyMjpSU66tWrx9V31qxZGu9VSEgI9zhat27N7t69qzKOXC5nY8aMUerTokULlpOTo3EMz58/F1yr9u1t165dGuMTQsjHjBbpJQTgXj5Ck9GjR2PMmDEqjxUUFFQ6vhDFxcWQy+UK1Rfy8vK4+mp6Qrhz505ERUVxj+P69evo2LEjVq1ahUuXLuHo0aN4/fo12rVrhzp16iAyMlKhva2tLQ4ePKj1NbZEIkFMTAwCAgLw7Nkz7vEAb179aquHSgghHzP62IMQAH5+fhUuQO7u7o4NGzYgIiJCbQwbGxuuWAYGBpg4cSISEhLQtWvXCo0HABwdHZXKZllYWHD1VVf66tatWxg1apTCPn19fZiZmcHQ0BDOzs4YN26cUuL19OlTDBo0CEuWLMG5c+eQkpKCyMhI/PzzzwrtjI2NERMTgyZNmnCNs0OHDrhy5Qrmzp2LBg0acH+7JpfL8ccff3C1JYSQj1J1P/oj5GMxYMAAQa/ePv/8c5abm6sx5suXL9n69etZYGAgV8zx48eX912+fHmFXwsuXrxYaSyqXlGq2mxtbdnFixfZq1ev2IEDB1hERASLjo5mzs7OSm3XrFmjdJ6///6btWrVStB49fT02O7duyv1+7m4uHCfr127dpU6FyGEVCdK3gj5n9u3bwv6juro0aMa423YsIHVrl2bO56JiQm7fft2ef8uXbpUKHFzdnZm+fn5CmMpLi5mHh4e3DFEIpHWsY8cOVJt6av8/HxBpba0fWfHo2nTptznMzY2rvT5CCGkutBrU/JJY4xh3bp1aNiwIZydnZGZmcnVz9DQEF26dFF5TCqVon379vjnP/+J58+fc8WTSCT473//Cycnp/J97xZ45+Hj44P4+HiFGZ6MMUyaNAkXLlzgjlNaWqpx7G5ubli9erXa18RmZmaCisDfu3ePu606vK9bAaCoqAgymazS5ySEkOpAExbIJ4sxhi+//FLQB/hlJkyYoPLbsLS0NHh5eamsf6pK+/bt8fnnnyM0NBR2dnYKxxo1aoQrV65wj6lJkyaIj49HUVERsrOzUadOHRgaGuK3337DunXrFNpKJBJYWVnhxYsXaNSoEfr3748DBw7gzJkzXOeaM2cOjI2NNbbJysriHvuZM2ewdOlSiMVihISEwNbWlrtvGd76rgBQr149pW8CCSFEZ1Tzkz9Cqs2ff/5ZodeSLi4uLC8vT2XMwYMHC4qlbmkRxhiLiooSFKtOnTrMx8envKqDSCRibm5uKl8ZJiUlKZ2vuLiYtW3blutcw4YN03hvX7x4wRYtWlSh+wuA1a9fn6Wnp3P/ln/88Yeg+HPnzuWOTQghHxt6bUo+WdOmTRPU3sjICGPGjMHx48dhbm6udPzp06fYtWuXoJgZGRkKf5bL5SgoKEBpaSnOnz8vKFZubi4SEhLA/rfudmlpKS5duqTUbuPGjWjfvr3S/lq1anHPSE1OTla5Xy6XY/HixXBwcMC3337LPfZ3ZWRkoHHjxrh//77WtomJiZg8eTJ3bFtbW0yZMqXCYyOEkOpGr03JJyk2NpZ77TUrKytERUXBw8MDlpaWatvdvn1b0Ks74P/Xl0tLS8PPP/+Mv/76CwUFBTAwMHgv32QtXLgQwcHBao+LRHz/SVD3ynHatGn4/fffKzS2d8lkMnh6euLRo0dq29y/fx8BAQHlCWsZY2NjFBUVKbVv3Lgx9u3bB3t7+yoZIyGEVAdK3sgn5cWLF9iyZQsWLVrE3efly5fw9vZWu/5ZmVq1agkez19//YUWLVpgxIgRyM/PL9/Pm7iJxWKIRCKuyQ0mJiaYP3++xjZeXl44evSo1lhPnjxBRkYG6tevX74vKSmpyhK3Mo8fP0ZaWprKyQiFhYXw9PTEq1evFPZLJBLcuXMH2dnZ2LBhA+7evQuJRII+ffqgf//+FfqdCCHkY0K1TcknIzExEQMHDsTTp08F961Xrx7mzZuHf/3rX2qTuFevXsHe3p67koFQs2bNgkQiwY0bNyAWi9G9e3cMGjQIjo6O3IXqtdUtffjwIZo0aYKSkhKtsWxsbLBjx47yagVjx45FREQE38UIEBoaivDwcIV9crkcnp6eSq+WDQwMcP78eY3XSAghuo6SN/JJuHHjBjw8PPDy5ctKxalXrx7mzJmDsWPHQiwWIzExEZGRkZBKpRCLxUhJSeFeHkSIrl274uTJkyqPWVhYKDy102TLli0YOnSoymOFhYW4f/8+hg8fjpSUFK54BgYGWLx4MSwsLDB79uz3UgbMxcUFV69eVdg3ZswY/Pnnn0ptNV0fIYTUFJS8kU9Chw4dcPHixSqLZ2dnh7p16+Ly5cuC+hkbG2PatGnYsWMHUlNTufs1bdpUbXs3NzfucezZswf9+vVT2JeRkYEFCxZgy5YtKr8TK+Ps7Iy8vDxBS4BUBUtLSyxcuBBRUVGQyWSwsLBAXFycUru5c+di6dKlH3RshBBSLapvoishH0Zlyky5u7tXuK++vn75P1tYWLCwsDCWk5PDGGMsNzeXmZmZcceyt7dXe33r1q3jimFkZMSePXum0PfOnTvM3t5ebR8DAwMWExPDbt++zeRyOcvJyeEu9fUht8DAQLXVHgghpKahpUJIjVZQUIBvvvmmQn3Dw8ORnJyM48ePw9fXV3D/Pn36QCqV4tatW8jMzMSKFSvKi7ZbWFhofMr1rmbNmqk9NnLkSDRo0EBrjJEjRyrMlmX/W6RY0/dyMpkM6enpcHJygp6eHurUqYOYmJhKLQNS1ZycnLBnzx611R4IIaTGqe7skZD3KSIiQvBTnM6dO7ODBw8qxTpx4gTz8/PjjmNsbMxKSkrUjs3ExIQ71vr16zVeZ3Z2tsa6rF26dGHPnz9X6HP+/Hmuc7do0ULlU63GjRsLvrft2rWr8qduT5484fuXgRBCagh68kZqNKlUKqj90KFDcebMGfTq1UvpmJeXF+Li4jBkyBCuWEVFRRqX8CibpalN8+bNMWzYMI1tbGxskJ6eju+++w5169Yt39+oUSP89NNPOHLkCCQSiUKfhIQErvPfunUL2dnZSvuFTP7o0qULDh48iLNnz2LAgAHc/Xj88ssvVRqPEEI+dpS8kRqtbBFcXkZGRlrbuLm5ccUSi8VKCdPbpk6dyhXj5MmTXGuTiUQiLFiwAJmZmcjNzcWzZ8+QlpaG2bNnq6xD+vr1a60xy6haOoS3/mhwcDBOnTqFXr16wdDQEFu3bq3SBO7IkSNVFosQQnQBJW+kRlP1BE2Tli1bam0zcOBAru+rBg4cqLFigb+/P2bOnKn2uLGxMY4ePVqhIu0WFhawtLTUOM42bdpwxbKysoKdnZ3S/sGDB3P1HzNmjMKf1SVw+vr6CAoKwk8//YTZs2dzxQb4q0IQQkiNUd3vbQl5n+RyOevUqRPXt1P6+vqssLCQK+6XX36pMZaRkRG7fPky1/g2bdrEXF1dy/uKRCIWHBzMrl27VtnL1+j169fMwcFB632ZNWuWyv7Z2dnMxsZGY9+OHTsymUym9vwDBgxgwJtZrdu3b1eIzfObAWCrVq16L/eHEEI+VrTOG6nx0tPT0bp1a62L544dOxZr167lillUVITg4GAcOHBA6ZiJiQmio6PRt29f7jEyxvDgwQM8f/4c9evX5y4QX1kxMTEICgqCXC5Xebx58+Y4e/as2pquycnJ6N27NzIzM5WOubu74+DBgyqf2pWRyWSIi4uDo6MjnJycFI41aNAAGRkZGscvEonw+vVrmmlKCPmkUPJGPglZWVnw8vJSu9Bt3759sXfvXkFJAGMMsbGxiIyMxJ07d2BiYgJ/f3+EhoaiXr16VTX09+7AgQOYNGkS7t27p7A/MDAQkZGRGpMvAMjPz8eGDRuwa9cu5OXlwcHBASNGjMCAAQMqVUf00aNHaNiwocY6r9u2bcOgQYMqfA5CCNFFlLyRTwZjDDExMVi6dCmuX78OPT09uLi44Pvvv0f37t2re3jVSiaT4ejRo7h58ybEYjG6deum9CSsOjx69Aienp548OCBwn4zMzNs2bIFvXv3rqaREUJI9aHkjRDy0Xv27Bk2b96MV69eoXfv3tyTLQghpCai5I0QQgghRIfQUiGEEEIIITqEkjdCCCGEEB1CyRshhBBCiA6h5I0QQgghRIdQ8kYIIYQQokMoeSOEEEII0SGUvBFCCCGE6BBK3gghhBBCdAglb4QQQgghOoSSN0IIIYQQHULJGyGEEEKIDqHkjRBCCCFEh1DyRgghhBCiQyh5I4QQQgjRIZS8EUIIIYToEEreCCGEEEJ0CCVvhBBCCCE6hJI3QgghhBAdQskbIYQQQogOoeSNEEIIIUSHUPJGCCGEEKJDKHkjhBBCCNEhlLwRQgghhOgQSt4IIYQQQnQIJW+EEEIIITqEkjdCCCGEEB1CyRshhBBCiA6h5I0QQgghRIdQ8kYIIYQQokP+Dy9k2ydlZzu9AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "filename = \"ky1.inp\"\n", + "network = on.Network.read(filename)\n", + "\n", + "network.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "121a3100", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "id": "0f30390e", + "metadata": {}, + "outputs": [], + "source": [ + "default_elevation = 0\n", + "default_demand = 0" + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "id": "627207b2", + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "def convert_oopnet_junctions_to_df(net):\n", + " # Get the junctions and add them to a pandas dataframe.\n", + " df = pd.DataFrame(columns=[\"node\",\"xcoord\",\"ycoord\",\"elevation\",\"demand\"])\n", + " for j in on.get_junctions(net):\n", + " df = pd.concat([df,pd.DataFrame([{\"node\":j.id,\"xcoord\":j.xcoordinate,\"ycoord\":j.ycoordinate,\"elevation\":j.elevation,\"demand\":j.demand}])])\n", + "\n", + " df = df.reset_index(drop=True)\n", + " return df\n", + "def convert_oopnet_nodes_to_df(net):\n", + " # Get the junctions and add them to a pandas dataframe.\n", + " df = pd.DataFrame(columns=[\"node\",\"xcoord\",\"ycoord\"])\n", + " for j in on.get_nodes(net):\n", + " df = pd.concat([df,pd.DataFrame([{\"node\":j.id,\n", + " \"xcoord\":j.xcoordinate,\"ycoord\":j.ycoordinate,\n", + " \"elevation\":default_elevation,\"demand\":default_demand}])])\n", + "\n", + " df = df.reset_index(drop=True)\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "id": "d42532df", + "metadata": {}, + "outputs": [], + "source": [ + "def convert_oopnet_pipes_to_df(net):\n", + " df = pd.DataFrame(columns=[\"id\",\"node1\",\"node2\",\"length\",\"diameter\",\"roughness\",\"minorloss\",\"status\"])\n", + " #;ID Node1 Node2 Length Diameter Roughness MinorLoss Status\n", + " for j in on.get_pipes(net):\n", + " new_row = pd.DataFrame(\n", + " [{\"id\":j.id,\"node1\":j.startnode.id,\"node2\":j.endnode.id,\n", + " \"length\":j.length,\"diameter\":j.diameter,\n", + " \"roughness\":j.roughness,\"minorloss\":j.minorloss,\"status\":j.status}])\n", + " df = pd.concat([df,new_row])\n", + " \n", + " df = df.reset_index(drop=True)\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "id": "cd72a979", + "metadata": {}, + "outputs": [], + "source": [ + "def drop_y(df):\n", + " # list comprehension of the cols that end with '_y'\n", + " to_drop = [x for x in df if x.endswith('_y')]\n", + " df.drop(to_drop, axis=1, inplace=True)\n", + "def rename_x(df):\n", + " for col in df:\n", + " if col.endswith('_x'):\n", + " df.rename(columns={col:col.rstrip('_x')}, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 286, + "id": "0f5d7b78", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nodexcoordycoordelevationdemand
0J-14389474.533834988.000.00.0
1J-24389026.723834207.000.00.0
2J-34389734.413835428.000.00.0
3J-44389551.273835089.000.00.0
4J-54390452.763836810.000.00.0
..................
854I-Pump-24389909.613836728.000.00.0
855O-Pump-24389909.613836728.000.00.0
856T-54392183.933840660.560.00.0
857T-14389737.793830153.170.00.0
858R-14389911.833836727.000.00.0
\n", + "

859 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " node xcoord ycoord elevation demand\n", + "0 J-1 4389474.53 3834988.00 0.0 0.0\n", + "1 J-2 4389026.72 3834207.00 0.0 0.0\n", + "2 J-3 4389734.41 3835428.00 0.0 0.0\n", + "3 J-4 4389551.27 3835089.00 0.0 0.0\n", + "4 J-5 4390452.76 3836810.00 0.0 0.0\n", + ".. ... ... ... ... ...\n", + "854 I-Pump-2 4389909.61 3836728.00 0.0 0.0\n", + "855 O-Pump-2 4389909.61 3836728.00 0.0 0.0\n", + "856 T-5 4392183.93 3840660.56 0.0 0.0\n", + "857 T-1 4389737.79 3830153.17 0.0 0.0\n", + "858 R-1 4389911.83 3836727.00 0.0 0.0\n", + "\n", + "[859 rows x 5 columns]" + ] + }, + "execution_count": 286, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nodes = convert_oopnet_nodes_to_df(network)\n", + "junctions = convert_oopnet_junctions_to_df(network)\n", + "nodes = nodes.merge(junctions,on='node',how='outer')\n", + "drop_y(nodes)\n", + "rename_x(nodes)\n", + "nodes" + ] + }, + { + "cell_type": "code", + "execution_count": 287, + "id": "1df43094", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnode1node2lengthdiameterroughnessminorlossstatus
0P-1J-1J-2274.685760914.4100.00.0OPEN
1P-2J-3J-4117.591535914.4100.00.0OPEN
2P-3J-5J-6155.417215914.4100.00.0OPEN
3P-4J-7J-3286.999375914.4100.00.0OPEN
4P-5J-8J-138.404800914.4100.00.0OPEN
...........................
979P-3751J-3348J-33493.779215508.0100.00.0OPEN
980P-3752J-116J-33480.030480203.2100.00.0OPEN
981P-3753J-3349J-1034.754880508.0100.00.0OPEN
982P-3680T-5J-4865.913120508.0100.00.0OPEN
983P-72T-1J-7123.164800508.0100.00.0OPEN
\n", + "

984 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + " id node1 node2 length diameter roughness minorloss status\n", + "0 P-1 J-1 J-2 274.685760 914.4 100.0 0.0 OPEN\n", + "1 P-2 J-3 J-4 117.591535 914.4 100.0 0.0 OPEN\n", + "2 P-3 J-5 J-6 155.417215 914.4 100.0 0.0 OPEN\n", + "3 P-4 J-7 J-3 286.999375 914.4 100.0 0.0 OPEN\n", + "4 P-5 J-8 J-1 38.404800 914.4 100.0 0.0 OPEN\n", + ".. ... ... ... ... ... ... ... ...\n", + "979 P-3751 J-3348 J-3349 3.779215 508.0 100.0 0.0 OPEN\n", + "980 P-3752 J-116 J-3348 0.030480 203.2 100.0 0.0 OPEN\n", + "981 P-3753 J-3349 J-103 4.754880 508.0 100.0 0.0 OPEN\n", + "982 P-3680 T-5 J-486 5.913120 508.0 100.0 0.0 OPEN\n", + "983 P-72 T-1 J-71 23.164800 508.0 100.0 0.0 OPEN\n", + "\n", + "[984 rows x 8 columns]" + ] + }, + "execution_count": 287, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "edges = convert_oopnet_pipes_to_df(network)\n", + "edges" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "id": "f3d46a09", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 J-1\n", + "1 J-2\n", + "2 J-3\n", + "3 J-4\n", + "4 J-5\n", + " ... \n", + "854 I-Pump-2\n", + "855 O-Pump-2\n", + "856 T-5\n", + "857 T-1\n", + "858 R-1\n", + "Name: node, Length: 859, dtype: object" + ] + }, + "execution_count": 174, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nodes['node']" + ] + }, + { + "cell_type": "code", + "execution_count": 175, + "id": "cc5ce895", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnode1node2lengthdiameterroughnessminorlossstatus
0P-1J-1J-2274.685760914.4100.00.0OPEN
1P-2J-3J-4117.591535914.4100.00.0OPEN
2P-3J-5J-6155.417215914.4100.00.0OPEN
3P-4J-7J-3286.999375914.4100.00.0OPEN
4P-5J-8J-138.404800914.4100.00.0OPEN
\n", + "
" + ], + "text/plain": [ + " id node1 node2 length diameter roughness minorloss status\n", + "0 P-1 J-1 J-2 274.685760 914.4 100.0 0.0 OPEN\n", + "1 P-2 J-3 J-4 117.591535 914.4 100.0 0.0 OPEN\n", + "2 P-3 J-5 J-6 155.417215 914.4 100.0 0.0 OPEN\n", + "3 P-4 J-7 J-3 286.999375 914.4 100.0 0.0 OPEN\n", + "4 P-5 J-8 J-1 38.404800 914.4 100.0 0.0 OPEN" + ] + }, + "execution_count": 175, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "edges.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "id": "fd67d338", + "metadata": {}, + "outputs": [], + "source": [ + "#edges = edges.drop(edges[~edges['node1'].isin(nodes['node'])].index)" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "id": "9ce47971", + "metadata": {}, + "outputs": [], + "source": [ + "#edges = edges.drop(edges[~edges['node2'].isin(nodes['node'])].index)" + ] + }, + { + "cell_type": "code", + "execution_count": 288, + "id": "0ca6245d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnode1node2lengthdiameterroughnessminorlossstatus
0P-1J-1J-2274.685760914.4100.00.0OPEN
1P-2J-3J-4117.591535914.4100.00.0OPEN
2P-3J-5J-6155.417215914.4100.00.0OPEN
3P-4J-7J-3286.999375914.4100.00.0OPEN
4P-5J-8J-138.404800914.4100.00.0OPEN
...........................
979P-3751J-3348J-33493.779215508.0100.00.0OPEN
980P-3752J-116J-33480.030480203.2100.00.0OPEN
981P-3753J-3349J-1034.754880508.0100.00.0OPEN
982P-3680T-5J-4865.913120508.0100.00.0OPEN
983P-72T-1J-7123.164800508.0100.00.0OPEN
\n", + "

984 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + " id node1 node2 length diameter roughness minorloss status\n", + "0 P-1 J-1 J-2 274.685760 914.4 100.0 0.0 OPEN\n", + "1 P-2 J-3 J-4 117.591535 914.4 100.0 0.0 OPEN\n", + "2 P-3 J-5 J-6 155.417215 914.4 100.0 0.0 OPEN\n", + "3 P-4 J-7 J-3 286.999375 914.4 100.0 0.0 OPEN\n", + "4 P-5 J-8 J-1 38.404800 914.4 100.0 0.0 OPEN\n", + ".. ... ... ... ... ... ... ... ...\n", + "979 P-3751 J-3348 J-3349 3.779215 508.0 100.0 0.0 OPEN\n", + "980 P-3752 J-116 J-3348 0.030480 203.2 100.0 0.0 OPEN\n", + "981 P-3753 J-3349 J-103 4.754880 508.0 100.0 0.0 OPEN\n", + "982 P-3680 T-5 J-486 5.913120 508.0 100.0 0.0 OPEN\n", + "983 P-72 T-1 J-71 23.164800 508.0 100.0 0.0 OPEN\n", + "\n", + "[984 rows x 8 columns]" + ] + }, + "execution_count": 288, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "edges" + ] + }, + { + "cell_type": "code", + "execution_count": 296, + "id": "28d3070e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnode1node2lengthdiameterroughnessminorlossstatus
\n", + "
" + ], + "text/plain": [ + "Empty DataFrame\n", + "Columns: [id, node1, node2, length, diameter, roughness, minorloss, status]\n", + "Index: []" + ] + }, + "execution_count": 296, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "edges[(edges[\"node1\"]=='J-71') & (edges[\"node2\"] == 'T-1')]" + ] + }, + { + "cell_type": "code", + "execution_count": 297, + "id": "207b414a", + "metadata": {}, + "outputs": [], + "source": [ + "import networkx as nx\n", + "G = nx.from_pandas_edgelist(edges, 'node1', 'node2',\n", + " edge_attr=[\"length\", \"diameter\",\"roughness\"],\n", + " create_using=nx.DiGraph())" + ] + }, + { + "cell_type": "code", + "execution_count": 303, + "id": "aab33801", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "OutEdgeDataView([('J-71', 'J-72'), ('J-71', 'J-380')])" + ] + }, + "execution_count": 303, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "G.edges('J-71')" + ] + }, + { + "cell_type": "code", + "execution_count": 300, + "id": "3e6287b5", + "metadata": {}, + "outputs": [], + "source": [ + "nx.set_node_attributes(G, nodes[['xcoord','node']].set_index('node',drop=True)['xcoord'].to_dict(), 'xcoord')\n", + "nx.set_node_attributes(G, nodes[['ycoord','node']].set_index('node',drop=True)['ycoord'].to_dict(), 'ycoord')\n", + "nx.set_node_attributes(G, nodes[['demand','node']].set_index('node',drop=True)['demand'].to_dict(), 'demand')\n", + "nx.set_node_attributes(G, nodes[['elevation','node']].set_index('node',drop=True)['elevation'].to_dict(), 'elevation')" + ] + }, + { + "cell_type": "code", + "execution_count": 301, + "id": "f68c578d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnode1node2lengthdiameterroughnessminorlossstatus
0P-1J-1J-2274.685760914.4100.00.0OPEN
1P-2J-3J-4117.591535914.4100.00.0OPEN
2P-3J-5J-6155.417215914.4100.00.0OPEN
3P-4J-7J-3286.999375914.4100.00.0OPEN
4P-5J-8J-138.404800914.4100.00.0OPEN
...........................
979P-3751J-3348J-33493.779215508.0100.00.0OPEN
980P-3752J-116J-33480.030480203.2100.00.0OPEN
981P-3753J-3349J-1034.754880508.0100.00.0OPEN
982P-3680T-5J-4865.913120508.0100.00.0OPEN
983P-72T-1J-7123.164800508.0100.00.0OPEN
\n", + "

984 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + " id node1 node2 length diameter roughness minorloss status\n", + "0 P-1 J-1 J-2 274.685760 914.4 100.0 0.0 OPEN\n", + "1 P-2 J-3 J-4 117.591535 914.4 100.0 0.0 OPEN\n", + "2 P-3 J-5 J-6 155.417215 914.4 100.0 0.0 OPEN\n", + "3 P-4 J-7 J-3 286.999375 914.4 100.0 0.0 OPEN\n", + "4 P-5 J-8 J-1 38.404800 914.4 100.0 0.0 OPEN\n", + ".. ... ... ... ... ... ... ... ...\n", + "979 P-3751 J-3348 J-3349 3.779215 508.0 100.0 0.0 OPEN\n", + "980 P-3752 J-116 J-3348 0.030480 203.2 100.0 0.0 OPEN\n", + "981 P-3753 J-3349 J-103 4.754880 508.0 100.0 0.0 OPEN\n", + "982 P-3680 T-5 J-486 5.913120 508.0 100.0 0.0 OPEN\n", + "983 P-72 T-1 J-71 23.164800 508.0 100.0 0.0 OPEN\n", + "\n", + "[984 rows x 8 columns]" + ] + }, + "execution_count": 301, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "edges" + ] + }, + { + "cell_type": "code", + "execution_count": 304, + "id": "d680c22b", + "metadata": {}, + "outputs": [], + "source": [ + "import plotly.graph_objects as go\n", + "edge_x = []\n", + "edge_y = []\n", + "for edge in G.edges():\n", + " x0 = G.nodes[edge[0]]['xcoord']\n", + " y0 = G.nodes[edge[0]]['ycoord']\n", + " x1 = G.nodes[edge[1]]['xcoord']\n", + " y1 = G.nodes[edge[1]]['ycoord']\n", + " edge_x.append(x0)\n", + " edge_x.append(x1)\n", + " edge_x.append(None)\n", + " edge_y.append(y0)\n", + " edge_y.append(y1)\n", + " edge_y.append(None)\n", + "\n", + "edge_trace = go.Scatter(\n", + " x=edge_x, y=edge_y,\n", + " line=dict(width=0.5, color='#888'),\n", + " hoverinfo='none',\n", + " mode='lines')\n", + "\n", + "node_x = []\n", + "node_y = []\n", + "for node in G.nodes():\n", + " x = G.nodes[node]['xcoord']\n", + " y = G.nodes[node]['ycoord']\n", + " node_x.append(x)\n", + " node_y.append(y)\n", + "\n", + "node_trace = go.Scatter(\n", + " x=node_x, y=node_y,\n", + " mode='markers',\n", + " hoverinfo='text',\n", + " marker=dict(\n", + " showscale=True,\n", + " # colorscale options\n", + " #'Greys' | 'YlGnBu' | 'Greens' | 'YlOrRd' | 'Bluered' | 'RdBu' |\n", + " #'Reds' | 'Blues' | 'Picnic' | 'Rainbow' | 'Portland' | 'Jet' |\n", + " #'Hot' | 'Blackbody' | 'Earth' | 'Electric' | 'Viridis' |\n", + " colorscale='YlGnBu',\n", + " reversescale=True,\n", + " color=[],\n", + " size=10,\n", + " colorbar=dict(\n", + " thickness=15,\n", + " title='Node Connections',\n", + " xanchor='left',\n", + " titleside='right'\n", + " ),\n", + " line_width=2))" + ] + }, + { + "cell_type": "code", + "execution_count": 305, + "id": "0d4513e6", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hoverinfo": "none", + "line": { + "color": "#888", + "width": 0.5 + }, + "mode": "lines", + "type": "scatter", + "x": [ + 4389474.53, + 4389026.72, + null, + 4389474.53, + 4389483.25, + null, + 4389474.53, + 4389101.4, + null, + 4389734.41, + 4389551.27, + null, + 4390452.76, + 4390216.69, + null, + 4390452.76, + 4390942.61, + null, + 4390178.73, + 4389734.41, + null, + 4389536.81, + 4389474.53, + null, + 4389536.81, + 4389586.22, + null, + 4390226.09, + 4390178.73, + null, + 4389018.49, + 4388886.06, + null, + 4388886.06, + 4388631.39, + null, + 4392317.5, + 4392147.54, + null, + 4392317.5, + 4392354.49, + null, + 4392147.54, + 4392021.88, + null, + 4392355.02, + 4392316.23, + null, + 4392355.02, + 4392341.64, + null, + 4392021.88, + 4391864.68, + null, + 4392531.38, + 4392451.05, + null, + 4392531.38, + 4392310.51, + null, + 4392776.2, + 4392756.08, + null, + 4392776.2, + 4392630.41, + null, + 4392756.08, + 4392748.94, + null, + 4392748.94, + 4392566.26, + null, + 4392748.94, + 4392752.7, + null, + 4392566.26, + 4392363.44, + null, + 4392349.71, + 4391942.49, + null, + 4391942.49, + 4391901, + null, + 4392637.62, + 4392776.2, + null, + 4392637.62, + 4392531.38, + null, + 4392637.62, + 4392632.63, + null, + 4392360.83, + 4392355.02, + null, + 4392363.44, + 4392360.83, + null, + 4392363.44, + 4392375.14, + null, + 4390403.31, + 4390607.91, + null, + 4390403.31, + 4390386.15, + null, + 4390607.91, + 4390611.99, + null, + 4390255.73, + 4390394.82, + null, + 4390255.73, + 4390239.68, + null, + 4390394.82, + 4390403.31, + null, + 4390082.98, + 4390088.56, + null, + 4390082.98, + 4389814.93, + null, + 4390082.98, + 4390853.92, + null, + 4390088.56, + 4390089.84, + null, + 4390088.56, + 4390506.76, + null, + 4388724.71, + 4388943.42, + null, + 4388943.42, + 4388960.33, + null, + 4390216.3, + 4390255.73, + null, + 4389809.48, + 4389804.19, + null, + 4389804.19, + 4389591.59, + null, + 4389591.59, + 4389573.87, + null, + 4389591.59, + 4390034.48, + null, + 4389944.49, + 4390042.29, + null, + 4390042.29, + 4390072.6, + null, + 4390042.29, + 4390050.11, + null, + 4388960.33, + 4388974.2, + null, + 4388960.33, + 4389002.18, + null, + 4388974.2, + 4389368.75, + null, + 4389573.87, + 4389210.75, + null, + 4390945.47, + 4391388.97, + null, + 4391388.97, + 4391607.16, + null, + 4390611.99, + 4390647.74, + null, + 4390647.74, + 4390657.76, + null, + 4390647.74, + 4390188.71, + null, + 4391607.16, + 4391869.13, + null, + 4391607.16, + 4391157.97, + null, + 4391607.16, + 4392055.12, + null, + 4391869.13, + 4391931.69, + null, + 4391869.13, + 4391402.36, + null, + 4391931.69, + 4391939.97, + null, + 4391939.97, + 4391957.27, + null, + 4391125.91, + 4391128.45, + null, + 4391128.45, + 4391377.13, + null, + 4391128.45, + 4391183.93, + null, + 4390154.2, + 4390166.86, + null, + 4390154.2, + 4390166.21, + null, + 4390166.86, + 4390195.27, + null, + 4390921.32, + 4390945.47, + null, + 4390921.32, + 4391127.92, + null, + 4389690.83, + 4389704.66, + null, + 4389704.66, + 4389537.68, + null, + 4389704.66, + 4389718.3, + null, + 4391377.13, + 4391382.47, + null, + 4389948.85, + 4390154.2, + null, + 4389948.85, + 4389957.15, + null, + 4389775.6, + 4389783.31, + null, + 4389775.6, + 4389788.35, + null, + 4389783.31, + 4389809.48, + null, + 4389783.31, + 4389804.19, + null, + 4390753.05, + 4391109.1, + null, + 4390753.05, + 4390834.41, + null, + 4391109.1, + 4391125.91, + null, + 4391382.47, + 4391388.97, + null, + 4391382.47, + 4391349.7, + null, + 4391957.27, + 4392092.64, + null, + 4392092.64, + 4392110.43, + null, + 4388581.93, + 4388299.2, + null, + 4388581.93, + 4388999.43, + null, + 4388581.93, + 4388570.88, + null, + 4388229.43, + 4388645.45, + null, + 4388645.45, + 4388724.71, + null, + 4388645.45, + 4388653.24, + null, + 4389210.75, + 4388910, + null, + 4389210.75, + 4389645.24, + null, + 4388910, + 4388581.93, + null, + 4388910, + 4389327.67, + null, + 4389814.93, + 4389809.48, + null, + 4389537.68, + 4389298.45, + null, + 4389537.68, + 4389517.34, + null, + 4389368.75, + 4389690.83, + null, + 4389368.75, + 4388998.97, + null, + 4390195.27, + 4390216.3, + null, + 4392341.08, + 4392451.05, + null, + 4392341.08, + 4392138.56, + null, + 4390657.76, + 4390753.05, + null, + 4389718.3, + 4389948.85, + null, + 4388865.86, + 4388877.15, + null, + 4388877.15, + 4388881.97, + null, + 4392110.43, + 4392349.71, + null, + 4392156.41, + 4392158.53, + null, + 4392156.41, + 4392332.22, + null, + 4392158.53, + 4392159.88, + null, + 4392158.53, + 4391596.8, + null, + 4392159.88, + 4392174.18, + null, + 4390435, + 4390447.72, + null, + 4390435, + 4390466.67, + null, + 4390466.67, + 4390536.49, + null, + 4389283.66, + 4388881.97, + null, + 4388881.97, + 4388887.87, + null, + 4389298.45, + 4389283.66, + null, + 4392138.56, + 4392151.26, + null, + 4392151.26, + 4392154.02, + null, + 4390072.6, + 4390435, + null, + 4390536.49, + 4390921.32, + null, + 4392160.72, + 4392151.32, + null, + 4392160.72, + 4392141.97, + null, + 4392160.72, + 4392159.88, + null, + 4392151.32, + 4392151.26, + null, + 4388401.93, + 4388299.2, + null, + 4389906.12, + 4391942.74, + null, + 4391942.74, + 4391836.43, + null, + 4392310.51, + 4392228.34, + null, + 4392630.41, + 4392531.38, + null, + 4392632.63, + 4392630.41, + null, + 4389958.62, + 4389947.69, + null, + 4389947.69, + 4389944.49, + null, + 4389740.9, + 4390049.94, + null, + 4390049.94, + 4390378.76, + null, + 4390049.94, + 4390376.68, + null, + 4390187.75, + 4390188.71, + null, + 4390188.71, + 4390396.02, + null, + 4391550.08, + 4391918.38, + null, + 4391550.08, + 4391109.1, + null, + 4391918.38, + 4391932.42, + null, + 4391918.38, + 4391920.01, + null, + 4388071.63, + 4388229.43, + null, + 4388071.63, + 4387670.68, + null, + 4391434.07, + 4391435.98, + null, + 4391435.98, + 4391475.9, + null, + 4389769.02, + 4389766.94, + null, + 4389769.02, + 4389771.93, + null, + 4389766.94, + 4389768.85, + null, + 4389766.94, + 4389762.31, + null, + 4387618.47, + 4387776.9, + null, + 4387776.9, + 4387935.07, + null, + 4390378.76, + 4390741.2, + null, + 4390378.76, + 4390704.5, + null, + 4392968.65, + 4392964.15, + null, + 4392964.15, + 4392803.58, + null, + 4392964.15, + 4393406.02, + null, + 4390678.52, + 4390893.54, + null, + 4390893.54, + 4390894.17, + null, + 4391068.55, + 4391048.12, + null, + 4391068.55, + 4391058.54, + null, + 4391048.12, + 4391040.82, + null, + 4391048.12, + 4391274.59, + null, + 4386940.78, + 4386942.16, + null, + 4386940.78, + 4386752.79, + null, + 4386942.16, + 4387238.98, + null, + 4386942.16, + 4387374.18, + null, + 4388887.87, + 4388893.87, + null, + 4388893.87, + 4388886.06, + null, + 4388893.87, + 4389026.72, + null, + 4387863.44, + 4387903.31, + null, + 4387903.31, + 4387917.42, + null, + 4387903.31, + 4387891.07, + null, + 4392269.3, + 4392264.78, + null, + 4392269.3, + 4391847.33, + null, + 4392264.78, + 4392058.22, + null, + 4392264.78, + 4392269.65, + null, + 4391932.42, + 4392813.84, + null, + 4391932.42, + 4391928.24, + null, + 4386658.88, + 4386665.3, + null, + 4386665.3, + 4386696.45, + null, + 4389298.59, + 4389482.04, + null, + 4389298.59, + 4389300.87, + null, + 4389482.04, + 4389692.72, + null, + 4389482.04, + 4389948.85, + null, + 4391402.36, + 4391623.56, + null, + 4391623.56, + 4391638.36, + null, + 4391623.56, + 4391448.32, + null, + 4389772.7, + 4389878.22, + null, + 4389878.22, + 4389896.03, + null, + 4390183.67, + 4390180.03, + null, + 4390183.67, + 4390185.96, + null, + 4390180.03, + 4389769.02, + null, + 4392795.04, + 4392773.82, + null, + 4392795.04, + 4392797.78, + null, + 4392773.82, + 4392752.7, + null, + 4392773.82, + 4392774.62, + null, + 4391644.64, + 4391864.68, + null, + 4391644.64, + 4391447.69, + null, + 4393110.74, + 4393263.42, + null, + 4393110.74, + 4393723.78, + null, + 4393263.42, + 4393264.99, + null, + 4393263.42, + 4393550.95, + null, + 4391401.26, + 4391402.36, + null, + 4390056.17, + 4390187.75, + null, + 4390942.61, + 4390948.2, + null, + 4390942.61, + 4391401.26, + null, + 4390948.2, + 4391437.83, + null, + 4387338.76, + 4387472.71, + null, + 4387472.71, + 4387547.96, + null, + 4389834.27, + 4389836.55, + null, + 4389834.27, + 4389815.96, + null, + 4389836.55, + 4389935.96, + null, + 4390636.75, + 4390396.02, + null, + 4390636.75, + 4390677.12, + null, + 4391127.92, + 4391134.47, + null, + 4391134.47, + 4391138.36, + null, + 4392774.62, + 4392782.71, + null, + 4389935.96, + 4389993.74, + null, + 4389935.96, + 4390359.47, + null, + 4389993.74, + 4390041.96, + null, + 4387238.98, + 4387338.76, + null, + 4391157.97, + 4391164.32, + null, + 4391164.32, + 4391401.26, + null, + 4391164.32, + 4390841.77, + null, + 4392116.61, + 4392510.23, + null, + 4392510.23, + 4392527.21, + null, + 4392784.6, + 4392776.2, + null, + 4391118.92, + 4391143.5, + null, + 4391143.5, + 4391147.48, + null, + 4393264.99, + 4393547.4, + null, + 4393264.99, + 4394029.68, + null, + 4391072.19, + 4391434.07, + null, + 4391072.19, + 4391446.34, + null, + 4391451.84, + 4391422.04, + null, + 4391422.04, + 4391068.55, + null, + 4391422.04, + 4391630.18, + null, + 4392969.77, + 4393110.74, + null, + 4392813.84, + 4393107.89, + null, + 4392813.84, + 4392681.29, + null, + 4387935.07, + 4388071.63, + null, + 4393107.89, + 4393208.32, + null, + 4393107.89, + 4393096.95, + null, + 4393208.32, + 4393223.59, + null, + 4390894.17, + 4390909.87, + null, + 4390909.87, + 4390921.32, + null, + 4390909.87, + 4390945.47, + null, + 4389692.72, + 4389771.66, + null, + 4389692.72, + 4390138.48, + null, + 4391149.33, + 4391434.07, + null, + 4391149.33, + 4391418.14, + null, + 4389788.35, + 4389814.93, + null, + 4389788.35, + 4389800.31, + null, + 4387670.68, + 4387238.98, + null, + 4387670.68, + 4387682.09, + null, + 4387670.68, + 4387643.77, + null, + 4391138.36, + 4391157.97, + null, + 4391138.36, + 4390841.28, + null, + 4391040.82, + 4390611.99, + null, + 4391040.82, + 4391029.7, + null, + 4391437.83, + 4391658.68, + null, + 4391437.83, + 4391862.09, + null, + 4391658.68, + 4391679.5, + null, + 4387492.51, + 4386658.88, + null, + 4387492.51, + 4387618.47, + null, + 4392788.61, + 4392794.72, + null, + 4392794.72, + 4392784.6, + null, + 4392794.72, + 4393090.28, + null, + 4389782.05, + 4389834.27, + null, + 4389782.05, + 4389778.68, + null, + 4392063.07, + 4392116.61, + null, + 4387917.42, + 4388175.63, + null, + 4387547.96, + 4387556.05, + null, + 4388175.63, + 4388546.88, + null, + 4391862.09, + 4391901, + null, + 4391638.36, + 4391644.64, + null, + 4386696.45, + 4386940.78, + null, + 4392782.71, + 4392788.61, + null, + 4392803.58, + 4392795.04, + null, + 4392803.58, + 4393281.71, + null, + 4387556.05, + 4387863.44, + null, + 4389771.66, + 4389777.55, + null, + 4389771.66, + 4389745.6, + null, + 4389777.55, + 4389782.05, + null, + 4389777.55, + 4389763.68, + null, + 4389736.84, + 4389690.83, + null, + 4389736.84, + 4389740.9, + null, + 4389286.65, + 4389298.59, + null, + 4389286.65, + 4389276.71, + null, + 4389724.22, + 4389728.16, + null, + 4389728.16, + 4390187.75, + null, + 4390677.12, + 4390678.52, + null, + 4390677.12, + 4391125.91, + null, + 4389768.85, + 4389772.7, + null, + 4391066.82, + 4391072.19, + null, + 4389935.84, + 4389958.62, + null, + 4391147.48, + 4391149.33, + null, + 4388546.88, + 4388821.73, + null, + 4388546.88, + 4388181.32, + null, + 4390041.96, + 4390056.17, + null, + 4393547.4, + 4394043.65, + null, + 4388821.73, + 4388887.91, + null, + 4388821.73, + 4388845.13, + null, + 4388887.91, + 4389243.34, + null, + 4392228.34, + 4392141.96, + null, + 4392228.34, + 4392202.61, + null, + 4392141.96, + 4392135.53, + null, + 4392135.53, + 4391942.74, + null, + 4392141.97, + 4392141.96, + null, + 4389896.03, + 4389935.84, + null, + 4389896.03, + 4389929.5, + null, + 4390432.22, + 4390466.67, + null, + 4392058.22, + 4392063.07, + null, + 4390741.2, + 4391066.82, + null, + 4390741.2, + 4391096.9, + null, + 4391847.33, + 4391451.84, + null, + 4391847.33, + 4391630.18, + null, + 4389282.13, + 4389573.87, + null, + 4389282.13, + 4389421.67, + null, + 4393799.27, + 4393844.33, + null, + 4393844.33, + 4393879.65, + null, + 4393223.59, + 4393234.55, + null, + 4393234.55, + 4393476.04, + null, + 4393681.65, + 4393799.27, + null, + 4393681.65, + 4393733.42, + null, + 4387266.99, + 4387492.51, + null, + 4393879.65, + 4394409.42, + null, + 4387052.76, + 4387266.99, + null, + 4393476.04, + 4393681.65, + null, + 4393859.41, + 4393849.38, + null, + 4393849.38, + 4393823.24, + null, + 4392760.39, + 4392777.86, + null, + 4392760.39, + 4392756.08, + null, + 4392777.86, + 4392785.11, + null, + 4391918.59, + 4392214.39, + null, + 4391918.59, + 4392094.13, + null, + 4392214.39, + 4392254.49, + null, + 4392553.95, + 4392566.26, + null, + 4393287.77, + 4393599.5, + null, + 4393287.77, + 4393833.24, + null, + 4393599.5, + 4393621.37, + null, + 4392278.6, + 4393065.66, + null, + 4392278.6, + 4392265.75, + null, + 4392332.49, + 4392283.94, + null, + 4392332.49, + 4392945.43, + null, + 4392283.94, + 4392269.3, + null, + 4393748.94, + 4393758.13, + null, + 4393758.13, + 4393975.79, + null, + 4392050.99, + 4391983.64, + null, + 4388631.39, + 4388547.91, + null, + 4388631.39, + 4388881.97, + null, + 4388547.91, + 4388524.43, + null, + 4394475.74, + 4394546.35, + null, + 4394546.35, + 4394650.91, + null, + 4392588.44, + 4392435.36, + null, + 4392588.44, + 4392593.48, + null, + 4392435.36, + 4392278.6, + null, + 4391762.28, + 4391829.95, + null, + 4391829.95, + 4391918.59, + null, + 4391829.95, + 4391435.98, + null, + 4393628.11, + 4393635.15, + null, + 4393628.11, + 4393636.34, + null, + 4393635.15, + 4393241.01, + null, + 4393635.15, + 4393627.8, + null, + 4393657.51, + 4393354.62, + null, + 4393354.62, + 4393342.08, + null, + 4392375.14, + 4392405.43, + null, + 4389327.67, + 4389645.24, + null, + 4389327.67, + 4389361.22, + null, + 4389645.24, + 4390034.48, + null, + 4389645.24, + 4389669.47, + null, + 4390751.49, + 4391096.9, + null, + 4390751.49, + 4390973.46, + null, + 4391096.9, + 4391131.4, + null, + 4392785.11, + 4392794.72, + null, + 4393626.47, + 4393628.11, + null, + 4393626.47, + 4393630.81, + null, + 4392424.63, + 4392553.95, + null, + 4392872.06, + 4393077.43, + null, + 4393077.43, + 4393068.62, + null, + 4394323.73, + 4394253.37, + null, + 4394253.37, + 4394036.49, + null, + 4389729.61, + 4389739.19, + null, + 4389729.61, + 4389989.33, + null, + 4389739.19, + 4389857.87, + null, + 4394458.46, + 4394451.68, + null, + 4394458.46, + 4394460.02, + null, + 4394451.68, + 4394356.67, + null, + 4393342.08, + 4393640.68, + null, + 4393640.68, + 4394039.63, + null, + 4393640.68, + 4393650.26, + null, + 4393975.79, + 4394036.49, + null, + 4389957.15, + 4390340.23, + null, + 4393736.96, + 4393748.94, + null, + 4393621.37, + 4393736.96, + null, + 4393621.37, + 4392924.27, + null, + 4394409.42, + 4394411.19, + null, + 4394409.42, + 4394402.2, + null, + 4394411.19, + 4394412.95, + null, + 4394411.19, + 4394402.2, + null, + 4392405.43, + 4392426.56, + null, + 4392426.56, + 4392591.17, + null, + 4392614.86, + 4392645.34, + null, + 4392645.34, + 4392657.26, + null, + 4392645.34, + 4392988.52, + null, + 4393090.28, + 4393241.01, + null, + 4393727.42, + 4393740.83, + null, + 4393740.83, + 4393476.04, + null, + 4392326.66, + 4392332.49, + null, + 4392326.66, + 4392281.91, + null, + 4390530.91, + 4390862.39, + null, + 4392238.5, + 4392069.58, + null, + 4392238.5, + 4392253.1, + null, + 4392069.58, + 4392050.99, + null, + 4392069.58, + 4392903.41, + null, + 4387948.92, + 4388300.45, + null, + 4387948.92, + 4388396.39, + null, + 4388300.45, + 4388601.17, + null, + 4392945.43, + 4392966.3, + null, + 4390034.48, + 4390058.22, + null, + 4390340.23, + 4390376.68, + null, + 4390376.68, + 4390704.5, + null, + 4389724.62, + 4389729.61, + null, + 4389724.62, + 4389728.16, + null, + 4392254.49, + 4392320.46, + null, + 4392254.49, + 4392027.85, + null, + 4392495.7, + 4392349.71, + null, + 4392591.17, + 4392872.06, + null, + 4392591.17, + 4392809.69, + null, + 4394194.85, + 4393438.73, + null, + 4394194.85, + 4394203.15, + null, + 4394036.49, + 4393867.42, + null, + 4391131.4, + 4391446.34, + null, + 4391131.4, + 4391141.6, + null, + 4391446.34, + 4391536.55, + null, + 4393241.01, + 4393243.7, + null, + 4388707.69, + 4388999.43, + null, + 4388999.43, + 4389327.67, + null, + 4388999.43, + 4389030.77, + null, + 4390773.36, + 4391118.92, + null, + 4393867.42, + 4393657.51, + null, + 4393867.42, + 4393876.75, + null, + 4391058.54, + 4390857.27, + null, + 4391058.54, + 4391420.92, + null, + 4391877.13, + 4392576.08, + null, + 4392576.08, + 4392593.48, + null, + 4392576.08, + 4392587.6, + null, + 4389989.33, + 4390183.67, + null, + 4393681.74, + 4393727.42, + null, + 4392593.48, + 4392614.86, + null, + 4392657.26, + 4393438.73, + null, + 4394356.67, + 4394323.73, + null, + 4394356.67, + 4394376.38, + null, + 4393293.58, + 4393281.71, + null, + 4393293.58, + 4393342.08, + null, + 4393281.71, + 4393269.47, + null, + 4391536.55, + 4391762.28, + null, + 4391536.55, + 4391822.7, + null, + 4389058.48, + 4389087.15, + null, + 4389087.15, + 4389255.29, + null, + 4389087.15, + 4389101.4, + null, + 4394039.63, + 4394045.58, + null, + 4394045.58, + 4394177.57, + null, + 4393269.47, + 4393084.78, + null, + 4393103.97, + 4393287.77, + null, + 4392809.69, + 4392662.38, + null, + 4392809.69, + 4392856.72, + null, + 4390704.5, + 4390751.49, + null, + 4388653.24, + 4388707.69, + null, + 4393823.24, + 4393740.83, + null, + 4393823.24, + 4393836.83, + null, + 4392251.06, + 4392243.98, + null, + 4392251.06, + 4391937.33, + null, + 4392243.98, + 4392238.5, + null, + 4392243.98, + 4392059.53, + null, + 4394412.95, + 4394414.72, + null, + 4394414.72, + 4394475.74, + null, + 4388601.17, + 4388913.53, + null, + 4388601.17, + 4388910, + null, + 4389049.52, + 4389058.48, + null, + 4389049.52, + 4389062.97, + null, + 4390185.96, + 4390214.27, + null, + 4390185.96, + 4390177.18, + null, + 4393886.87, + 4393859.41, + null, + 4394029.44, + 4394065.1, + null, + 4394029.44, + 4393979.08, + null, + 4394065.1, + 4394061.67, + null, + 4392662.38, + 4392495.7, + null, + 4389255.29, + 4389459.9, + null, + 4390506.76, + 4390530.91, + null, + 4390857.27, + 4391216.97, + null, + 4389406.88, + 4389471.5, + null, + 4389243.34, + 4389244.95, + null, + 4393979.08, + 4393886.87, + null, + 4392988.52, + 4392989.78, + null, + 4389586.22, + 4389724.22, + null, + 4389586.22, + 4389601.59, + null, + 4390214.27, + 4390216.69, + null, + 4390214.27, + 4390678.52, + null, + 4389246.72, + 4389406.94, + null, + 4389246.72, + 4389244.95, + null, + 4390225.65, + 4390432.22, + null, + 4392989.78, + 4393103.97, + null, + 4392989.78, + 4393325.87, + null, + 4389471.88, + 4389491.5, + null, + 4389471.88, + 4389471.5, + null, + 4389491.5, + 4389551.27, + null, + 4389491.5, + 4389935.96, + null, + 4389459.9, + 4389467.67, + null, + 4394141.11, + 4394399.39, + null, + 4394141.11, + 4393799.27, + null, + 4394241.16, + 4394194.85, + null, + 4393217.28, + 4393438.73, + null, + 4393600.38, + 4393626.47, + null, + 4393084.78, + 4393077.43, + null, + 4388913.53, + 4389282.13, + null, + 4388913.53, + 4389210.75, + null, + 4388913.53, + 4388752.93, + null, + 4392320.46, + 4392338.49, + null, + 4387682.09, + 4387991.08, + null, + 4387991.08, + 4387607.05, + null, + 4387991.08, + 4388326.83, + null, + 4391578.32, + 4392058.22, + null, + 4388588.46, + 4388610.9, + null, + 4388588.46, + 4388839.46, + null, + 4388610.9, + 4388948.06, + null, + 4388610.9, + 4388571.11, + null, + 4388396.39, + 4387991.08, + null, + 4389723.41, + 4390049.94, + null, + 4389723.41, + 4389368.75, + null, + 4388948.06, + 4388546.88, + null, + 4391630.18, + 4391666.84, + null, + 4388326.83, + 4388724.71, + null, + 4388326.83, + 4388571.46, + null, + 4392420.06, + 4392457.39, + null, + 4392457.39, + 4393078.34, + null, + 4392059.53, + 4392069.58, + null, + 4390060.04, + 4389723.41, + null, + 4390060.04, + 4390366.52, + null, + 4390177.18, + 4389771.93, + null, + 4386570.43, + 4387052.76, + null, + 4390239.68, + 4390217.28, + null, + 4391820.37, + 4391939.73, + null, + 4391820.37, + 4392195.43, + null, + 4391939.73, + 4392027.85, + null, + 4390058.22, + 4389669.47, + null, + 4390058.22, + 4390352.87, + null, + 4394177.57, + 4394179.87, + null, + 4394179.87, + 4394458.46, + null, + 4394179.87, + 4394192.67, + null, + 4392341.21, + 4392322.75, + null, + 4392341.21, + 4392341.08, + null, + 4392340.15, + 4392368.99, + null, + 4392340.15, + 4392341.21, + null, + 4389771.93, + 4389792.95, + null, + 4389771.93, + 4389766.94, + null, + 4389792.95, + 4389794.23, + null, + 4387989.78, + 4388262.8, + null, + 4387989.78, + 4387949.67, + null, + 4387989.78, + 4387987.42, + null, + 4388262.8, + 4388285.29, + null, + 4386339.82, + 4386379.11, + null, + 4386339.82, + 4386388.13, + null, + 4386379.11, + 4386388.85, + null, + 4392797.78, + 4392803.37, + null, + 4392797.78, + 4392798.84, + null, + 4392803.37, + 4392959.88, + null, + 4389669.47, + 4389949.41, + null, + 4391928.24, + 4391920.01, + null, + 4391920.01, + 4391666.84, + null, + 4388180.04, + 4388276.36, + null, + 4389618.55, + 4389319.04, + null, + 4389618.55, + 4389601.48, + null, + 4389319.04, + 4389136.57, + null, + 4389319.04, + 4389723.41, + null, + 4390207.82, + 4390216.69, + null, + 4388781.07, + 4388774.31, + null, + 4388781.07, + 4388950.18, + null, + 4389197.1, + 4389340.98, + null, + 4389197.1, + 4389177.85, + null, + 4389412.09, + 4389581.17, + null, + 4389581.17, + 4389586.22, + null, + 4389079.28, + 4389124.51, + null, + 4389124.51, + 4389304.25, + null, + 4389124.51, + 4389525.07, + null, + 4389223.99, + 4389236.68, + null, + 4389223.99, + 4389033.87, + null, + 4389236.68, + 4389244.95, + null, + 4392322.82, + 4392154.02, + null, + 4392154.02, + 4392156.41, + null, + 4392222.42, + 4392202.61, + null, + 4392222.42, + 4392285.2, + null, + 4393836.83, + 4394141.11, + null, + 4390269.19, + 4390234.77, + null, + 4390269.19, + 4390406.49, + null, + 4390235.26, + 4390189.86, + null, + 4390235.26, + 4390269.19, + null, + 4390850.45, + 4390857.27, + null, + 4390850.45, + 4390589.59, + null, + 4391216.97, + 4391236.65, + null, + 4389304.25, + 4389310.74, + null, + 4390829.25, + 4390850.45, + null, + 4390829.25, + 4390906.09, + null, + 4390463.57, + 4390829.25, + null, + 4390463.57, + 4390403.31, + null, + 4389491.28, + 4388948.06, + null, + 4389244.95, + 4389252.33, + null, + 4389033.87, + 4389255.29, + null, + 4389033.87, + 4388781.07, + null, + 4389357, + 4389536.81, + null, + 4389276.71, + 4389267.11, + null, + 4389084.5, + 4389177.85, + null, + 4389386, + 4389581.57, + null, + 4389581.57, + 4389581.17, + null, + 4390003.49, + 4389935.84, + null, + 4393636.34, + 4393725.69, + null, + 4393725.69, + 4393782.45, + null, + 4389759.39, + 4389768.46, + null, + 4389768.46, + 4389769.02, + null, + 4389762.31, + 4389713.38, + null, + 4389713.38, + 4389716.62, + null, + 4389800.31, + 4389832.91, + null, + 4392195.43, + 4392212.26, + null, + 4393103.01, + 4393107.17, + null, + 4393107.17, + 4393115.54, + null, + 4387851.62, + 4387852.5, + null, + 4394168.91, + 4394177.57, + null, + 4392341.64, + 4391905.74, + null, + 4391829.7, + 4391937.33, + null, + 4391829.7, + 4391377.13, + null, + 4391937.33, + 4392055.12, + null, + 4392281.91, + 4392269.3, + null, + 4391475.9, + 4391816.59, + null, + 4392137.81, + 4391742.39, + null, + 4391742.39, + 4391679.5, + null, + 4393077.02, + 4393101.03, + null, + 4393101.03, + 4393103.01, + null, + 4393101.03, + 4393118.24, + null, + 4393101.45, + 4393110.74, + null, + 4393101.45, + 4393090.28, + null, + 4389725.21, + 4389759.39, + null, + 4392042.17, + 4392094.6, + null, + 4392042.17, + 4392063.07, + null, + 4392894.33, + 4393077.02, + null, + 4392894.33, + 4392901.21, + null, + 4394199.7, + 4394222.62, + null, + 4389623.63, + 4389725.21, + null, + 4392587.6, + 4392587.18, + null, + 4388104.01, + 4388299.8, + null, + 4388299.8, + 4388300.45, + null, + 4392716.56, + 4392894.33, + null, + 4389002.18, + 4389136.57, + null, + 4393105.91, + 4393120.06, + null, + 4393120.06, + 4393239.68, + null, + 4393120.06, + 4393107.89, + null, + 4390359.47, + 4390386.15, + null, + 4390386.15, + 4390401.47, + null, + 4394464.36, + 4394460.02, + null, + 4394460.02, + 4394552.65, + null, + 4392798.84, + 4392803.58, + null, + 4391463.57, + 4391523.68, + null, + 4391523.68, + 4391578.32, + null, + 4394087.62, + 4394084.69, + null, + 4394087.62, + 4394199.7, + null, + 4394084.69, + 4394029.68, + null, + 4388571.46, + 4388588.46, + null, + 4391420.92, + 4391422.04, + null, + 4391420.92, + 4391450.6, + null, + 4387607.05, + 4387556.05, + null, + 4389958.11, + 4389662.52, + null, + 4389662.52, + 4389648.63, + null, + 4392407.49, + 4392401.33, + null, + 4392407.49, + 4392417.21, + null, + 4392401.33, + 4392265.75, + null, + 4393876.75, + 4394009.46, + null, + 4391816.59, + 4391820.37, + null, + 4390374.38, + 4390352.87, + null, + 4390374.38, + 4390731.08, + null, + 4390352.87, + 4390017.01, + null, + 4390352.87, + 4390374.42, + null, + 4389949.41, + 4389958.11, + null, + 4393723.78, + 4394087.62, + null, + 4393723.78, + 4393740.15, + null, + 4391679.5, + 4391892.44, + null, + 4391892.44, + 4391905.74, + null, + 4393630.81, + 4393636.34, + null, + 4394483.2, + 4394464.36, + null, + 4388619.27, + 4388631.39, + null, + 4393243.7, + 4393263.42, + null, + 4390138.48, + 4390154.2, + null, + 4389648.63, + 4389618.55, + null, + 4389648.63, + 4390040.52, + null, + 4394669.92, + 4394483.2, + null, + 4389778.68, + 4389614.69, + null, + 4390731.08, + 4390857.49, + null, + 4390857.49, + 4390862.39, + null, + 4388181.32, + 4388180.04, + null, + 4392831.19, + 4393105.91, + null, + 4392831.19, + 4392819.65, + null, + 4390166.21, + 4390603.74, + null, + 4392826.17, + 4392820, + null, + 4392820, + 4392831.19, + null, + 4389101.4, + 4389084.5, + null, + 4389101.4, + 4389062.97, + null, + 4386533.22, + 4386570.43, + null, + 4392959.88, + 4392977.03, + null, + 4392959.88, + 4392964.15, + null, + 4386579.46, + 4386658.88, + null, + 4386419.96, + 4386665.3, + null, + 4386419.96, + 4386290.05, + null, + 4391822.7, + 4392167.26, + null, + 4391822.7, + 4392042.17, + null, + 4389794.23, + 4390207.82, + null, + 4387374.18, + 4387776.9, + null, + 4390973.46, + 4390996.64, + null, + 4388473.22, + 4388619.27, + null, + 4388473.22, + 4388719.1, + null, + 4389873.44, + 4390056.17, + null, + 4393484.11, + 4393758.13, + null, + 4389252.33, + 4389692.72, + null, + 4392444.75, + 4392326.66, + null, + 4391345.58, + 4391574.19, + null, + 4391574.19, + 4391829.7, + null, + 4390108.75, + 4390041.96, + null, + 4388998.97, + 4388948.06, + null, + 4392426.31, + 4392212.26, + null, + 4392426.31, + 4392027.85, + null, + 4391891.82, + 4391954.69, + null, + 4391891.82, + 4392059.53, + null, + 4391954.69, + 4391932.42, + null, + 4391954.69, + 4392820, + null, + 4389421.67, + 4389591.59, + null, + 4392055.12, + 4392211.65, + null, + 4390549.19, + 4390506.76, + null, + 4387274.2, + 4387472.71, + null, + 4388950.18, + 4389021.86, + null, + 4389021.86, + 4389087.15, + null, + 4389021.86, + 4389049.52, + null, + 4393740.15, + 4394045.58, + null, + 4394016.59, + 4394027.7, + null, + 4394016.59, + 4394221.43, + null, + 4394027.7, + 4394168.91, + null, + 4394027.7, + 4394241.37, + null, + 4389716.62, + 4389725.21, + null, + 4388285.29, + 4388601.17, + null, + 4391880.49, + 4391892.44, + null, + 4392417.21, + 4392420.06, + null, + 4392417.21, + 4392576.08, + null, + 4390996.64, + 4391047.37, + null, + 4390996.64, + 4391009.79, + null, + 4387557.66, + 4387850.31, + null, + 4387557.66, + 4387891.07, + null, + 4387850.31, + 4387851.62, + null, + 4389267.11, + 4389300.87, + null, + 4393782.45, + 4393759.76, + null, + 4387014.89, + 4387338.76, + null, + 4393648.79, + 4394043.65, + null, + 4392338.63, + 4392340.15, + null, + 4391656.14, + 4391658.68, + null, + 4392416.79, + 4392405.43, + null, + 4392416.79, + 4392587.25, + null, + 4389018.07, + 4389002.18, + null, + 4392832.28, + 4392826.17, + null, + 4392265.75, + 4392251.06, + null, + 4393239.68, + 4393234.55, + null, + 4392587.25, + 4392795.04, + null, + 4390249.73, + 4390206.59, + null, + 4390206.59, + 4390195.27, + null, + 4394009.46, + 4394016.59, + null, + 4392903.41, + 4392832.28, + null, + 4392903.41, + 4393171.34, + null, + 4393068.62, + 4393006.89, + null, + 4391054.39, + 4391656.14, + null, + 4391054.39, + 4390918.61, + null, + 4390228.12, + 4390216.3, + null, + 4389310.74, + 4389279.44, + null, + 4390017.01, + 4389958.11, + null, + 4390017.01, + 4390042.06, + null, + 4391236.65, + 4391463.57, + null, + 4391236.65, + 4391268.44, + null, + 4390327.78, + 4390228.12, + null, + 4389070.37, + 4389079.28, + null, + 4391414.71, + 4391420.92, + null, + 4386365.86, + 4386579.46, + null, + 4386299.56, + 4386419.96, + null, + 4386344.11, + 4386365.86, + null, + 4393006.89, + 4392993.58, + null, + 4391047.37, + 4391384.87, + null, + 4391384.87, + 4391393.84, + null, + 4391393.84, + 4391428.85, + null, + 4390606.4, + 4390996.64, + null, + 4389715.76, + 4389315.64, + null, + 4389715.76, + 4389724.62, + null, + 4389315.64, + 4389310.74, + null, + 4389315.64, + 4389322.09, + null, + 4391428.85, + 4391822.7, + null, + 4390603.74, + 4390606.4, + null, + 4391029.7, + 4390607.91, + null, + 4391029.7, + 4391058.54, + null, + 4391029.7, + 4390938.94, + null, + 4390745.03, + 4390948.2, + null, + 4390745.03, + 4391054.39, + null, + 4387949.67, + 4387618.47, + null, + 4389361.22, + 4389669.47, + null, + 4389361.22, + 4389638.39, + null, + 4392898.7, + 4392965.57, + null, + 4392898.7, + 4392281.15, + null, + 4392965.57, + 4393107.17, + null, + 4392965.57, + 4392988.52, + null, + 4392383.31, + 4392401.33, + null, + 4391268.44, + 4391450.6, + null, + 4389346.17, + 4389691.07, + null, + 4389691.07, + 4389892.13, + null, + 4389892.13, + 4389896.03, + null, + 4389483.25, + 4389491.5, + null, + 4393798.31, + 4393833.36, + null, + 4393833.36, + 4393849.38, + null, + 4389757.32, + 4389836.55, + null, + 4387643.77, + 4387374.18, + null, + 4390771.02, + 4391027.18, + null, + 4390771.02, + 4391143.5, + null, + 4391027.18, + 4391066.82, + null, + 4390374.42, + 4390771.02, + null, + 4391141.6, + 4391393.84, + null, + 4390725.69, + 4390741.2, + null, + 4392884.66, + 4392720.66, + null, + 4392884.66, + 4392495.7, + null, + 4392720.66, + 4392716.56, + null, + 4389638.39, + 4389648.63, + null, + 4391879.37, + 4392264.78, + null, + 4391879.37, + 4391740.66, + null, + 4392269.65, + 4392584.34, + null, + 4392269.65, + 4392063.07, + null, + 4391450.6, + 4391879.37, + null, + 4391450.6, + 4391451.84, + null, + 4390446.73, + 4390725.69, + null, + 4393295.21, + 4393100.89, + null, + 4393100.89, + 4392909.19, + null, + 4387339.42, + 4387639.14, + null, + 4387639.14, + 4387948.92, + null, + 4394241.37, + 4394253.37, + null, + 4392177.22, + 4392195.43, + null, + 4389062.97, + 4389070.37, + null, + 4389030.77, + 4389361.22, + null, + 4389030.77, + 4389319.04, + null, + 4393447.99, + 4392662.38, + null, + 4390339.89, + 4390058.22, + null, + 4390530.65, + 4390745.03, + null, + 4392909.19, + 4392884.66, + null, + 4390366.52, + 4390378.76, + null, + 4390042.06, + 4390446.73, + null, + 4393115.54, + 4393295.21, + null, + 4389911.83, + 4389909.61, + null, + 4392214.29, + 4392383.31, + null, + 4389896.41, + 4389878.22, + null, + 4392530.31, + 4392716.56, + null, + 4386388.85, + 4386533.22, + null, + 4391800.66, + 4391816.59, + null, + 4390853.92, + 4390857.49, + null, + 4390478.75, + 4390446.73, + null, + 4391009.79, + 4391202.42, + null, + 4390048.66, + 4390060.04, + null, + 4390048.66, + 4390056.26, + null, + 4390040.52, + 4390048.66, + null, + 4390040.52, + 4390262.38, + null, + 4386558.73, + 4386570.43, + null, + 4390749.46, + 4390771.02, + null, + 4390749.46, + 4390478.75, + null, + 4392388.72, + 4392354.49, + null, + 4392354.49, + 4392181.06, + null, + 4392354.49, + 4392364.35, + null, + 4392993.58, + 4392933.56, + null, + 4392894.34, + 4392898.7, + null, + 4387927.21, + 4387949.67, + null, + 4392364.35, + 4392383.89, + null, + 4392383.89, + 4392388.72, + null, + 4392383.89, + 4392411.94, + null, + 4392819.65, + 4392813.84, + null, + 4392148.77, + 4392894.34, + null, + 4390050.11, + 4390235.26, + null, + 4392901.21, + 4393094.2, + null, + 4393094.2, + 4393100.89, + null, + 4386768.44, + 4386427.4, + null, + 4386768.44, + 4386953.52, + null, + 4386427.4, + 4386365.86, + null, + 4386427.4, + 4386682.98, + null, + 4393334.34, + 4393600.87, + null, + 4393600.87, + 4393628.11, + null, + 4393005.03, + 4393559.62, + null, + 4393005.03, + 4392873.25, + null, + 4387874.81, + 4387850.31, + null, + 4387874.81, + 4388181.32, + null, + 4388570.88, + 4388546.25, + null, + 4388546.25, + 4388420.29, + null, + 4388546.25, + 4388449.62, + null, + 4393627.8, + 4393324.14, + null, + 4387649.14, + 4387692.74, + null, + 4387649.14, + 4387339.42, + null, + 4387692.74, + 4387927.21, + null, + 4388546.79, + 4388619.27, + null, + 4394072.33, + 4394402.2, + null, + 4394402.2, + 4394403.48, + null, + 4390128.78, + 4390340.23, + null, + 4391877.2, + 4392587.18, + null, + 4392587.18, + 4392614.86, + null, + 4392587.18, + 4392727.24, + null, + 4388571.11, + 4388356.46, + null, + 4392856.72, + 4393005.03, + null, + 4394444.73, + 4394669.92, + null, + 4388719.1, + 4388774.31, + null, + 4388719.1, + 4388623.67, + null, + 4387987.42, + 4387972.03, + null, + 4387972.03, + 4387692.74, + null, + 4394403.48, + 4394414.72, + null, + 4394403.48, + 4394412.95, + null, + 4390056.26, + 4390268.32, + null, + 4391121.01, + 4391127.92, + null, + 4390266.66, + 4390406.49, + null, + 4390266.66, + 4390360.69, + null, + 4390705.57, + 4390606.4, + null, + 4390374.84, + 4390399.23, + null, + 4390374.84, + 4390624.79, + null, + 4392253.1, + 4393059.31, + null, + 4391528.26, + 4391880.49, + null, + 4392601.06, + 4392587.25, + null, + 4392997.89, + 4392601.06, + null, + 4393650.26, + 4393985.63, + null, + 4393985.63, + 4394016.59, + null, + 4390360.69, + 4390374.84, + null, + 4386752.79, + 4386952.58, + null, + 4386752.79, + 4386553.81, + null, + 4390551.23, + 4390894.17, + null, + 4391877.36, + 4392110.43, + null, + 4394195.59, + 4394483.2, + null, + 4394195.59, + 4394208.3, + null, + 4388791.71, + 4388571.46, + null, + 4389763.68, + 4389565.68, + null, + 4389815.96, + 4389770.18, + null, + 4387960.53, + 4387917.42, + null, + 4390425.86, + 4390603.74, + null, + 4388120.39, + 4387863.44, + null, + 4391373.07, + 4391147.48, + null, + 4391518.06, + 4391384.87, + null, + 4391607.7, + 4391428.85, + null, + 4389428.48, + 4389623.63, + null, + 4392541.5, + 4392527.21, + null, + 4391943.85, + 4392009.97, + null, + 4391943.85, + 4391939.97, + null, + 4392009.97, + 4392011.62, + null, + 4392012.46, + 4392783.3, + null, + 4392012.46, + 4392011.62, + null, + 4392011.62, + 4392261.12, + null, + 4391960.59, + 4392009.97, + null, + 4391960.59, + 4391957.27, + null, + 4394192.67, + 4394195.59, + null, + 4393118.24, + 4393286.6, + null, + 4391877.17, + 4392092.64, + null, + 4391125.91, + 4390893.54, + null, + 4391357.31, + 4391373.07, + null, + 4386751.56, + 4386760.77, + null, + 4386760.77, + 4386768.44, + null, + 4388114.49, + 4387960.53, + null, + 4388989.69, + 4389021.86, + null, + 4393267.85, + 4393484.11, + null, + 4393407.29, + 4393267.85, + null, + 4393097.43, + 4393267.85, + null, + 4393615.88, + 4393484.11, + null, + 4389909.61, + 4389896.41, + null, + 4394549.62, + 4394546.35, + null, + 4392183.93, + 4392174.18, + null, + 4389737.79, + 4389775.6, + null + ], + "y": [ + 3834988, + 3834207, + null, + 3834988, + 3834983, + null, + 3834988, + 3835182, + null, + 3835428, + 3835089, + null, + 3836810, + 3836358, + null, + 3836810, + 3837712, + null, + 3836259, + 3835428, + null, + 3835097, + 3834988, + null, + 3835097, + 3835189, + null, + 3836347, + 3836259, + null, + 3834213, + 3834021, + null, + 3834021, + 3834157, + null, + 3839171, + 3838846, + null, + 3839171, + 3839149, + null, + 3838846, + 3838610, + null, + 3839264, + 3839168, + null, + 3839264, + 3839272, + null, + 3838610, + 3838334, + null, + 3840222, + 3840245, + null, + 3840222, + 3840445, + null, + 3840097, + 3840059, + null, + 3840097, + 3840160, + null, + 3840059, + 3840046, + null, + 3840046, + 3839705, + null, + 3840046, + 3840044, + null, + 3839705, + 3839305, + null, + 3838124, + 3838362, + null, + 3838362, + 3838385, + null, + 3840176, + 3840097, + null, + 3840176, + 3840222, + null, + 3840176, + 3840165, + null, + 3839292, + 3839264, + null, + 3839305, + 3839292, + null, + 3839305, + 3839300, + null, + 3834502, + 3834885, + null, + 3834502, + 3834511, + null, + 3834885, + 3834892, + null, + 3834233, + 3834487, + null, + 3834233, + 3834242, + null, + 3834487, + 3834502, + null, + 3830007, + 3830002, + null, + 3830007, + 3830229, + null, + 3830007, + 3830935, + null, + 3830002, + 3830001, + null, + 3830002, + 3830498, + null, + 3832133, + 3832409, + null, + 3832409, + 3832431, + null, + 3834161, + 3834233, + null, + 3830234, + 3830238, + null, + 3830238, + 3830407, + null, + 3830407, + 3830422, + null, + 3830407, + 3830918, + null, + 3836929, + 3837022, + null, + 3837022, + 3837006, + null, + 3837022, + 3837037, + null, + 3832431, + 3832448, + null, + 3832431, + 3832399, + null, + 3832448, + 3832929, + null, + 3830422, + 3830724, + null, + 3836559, + 3836334, + null, + 3836334, + 3836745, + null, + 3834892, + 3834959, + null, + 3834959, + 3834977, + null, + 3834959, + 3835203, + null, + 3836745, + 3837233, + null, + 3836745, + 3837017, + null, + 3836745, + 3836489, + null, + 3837233, + 3837348, + null, + 3837233, + 3837479, + null, + 3837348, + 3837364, + null, + 3837364, + 3837395, + null, + 3835845, + 3835850, + null, + 3835850, + 3836312, + null, + 3835850, + 3835820, + null, + 3834047, + 3834071, + null, + 3834047, + 3834041, + null, + 3834071, + 3834123, + null, + 3836572, + 3836559, + null, + 3836572, + 3836961, + null, + 3833329, + 3833348, + null, + 3833348, + 3833477, + null, + 3833348, + 3833365, + null, + 3836312, + 3836322, + null, + 3833676, + 3834047, + null, + 3833676, + 3833670, + null, + 3830194, + 3830203, + null, + 3830194, + 3830198, + null, + 3830203, + 3830234, + null, + 3830203, + 3830238, + null, + 3835152, + 3835812, + null, + 3835152, + 3835110, + null, + 3835812, + 3835845, + null, + 3836322, + 3836334, + null, + 3836322, + 3836337, + null, + 3837395, + 3837646, + null, + 3837646, + 3837679, + null, + 3831230, + 3831464, + null, + 3831230, + 3831749, + null, + 3831230, + 3831214, + null, + 3831511, + 3832034, + null, + 3832034, + 3832133, + null, + 3832034, + 3832027, + null, + 3830724, + 3830967, + null, + 3830724, + 3831227, + null, + 3830967, + 3831230, + null, + 3830967, + 3831479, + null, + 3830229, + 3830234, + null, + 3833477, + 3833661, + null, + 3833477, + 3833456, + null, + 3832929, + 3833329, + null, + 3832929, + 3833225, + null, + 3834123, + 3834161, + null, + 3840293, + 3840245, + null, + 3840293, + 3840505, + null, + 3834977, + 3835152, + null, + 3833365, + 3833676, + null, + 3834009, + 3834000, + null, + 3834000, + 3833997, + null, + 3837679, + 3838124, + null, + 3840587, + 3840597, + null, + 3840587, + 3840953, + null, + 3840597, + 3840606, + null, + 3840597, + 3840636, + null, + 3840606, + 3840655, + null, + 3836815, + 3836801, + null, + 3836815, + 3836799, + null, + 3836799, + 3836762, + null, + 3833671, + 3833997, + null, + 3833997, + 3834006, + null, + 3833661, + 3833671, + null, + 3840505, + 3840559, + null, + 3840559, + 3840572, + null, + 3837006, + 3836815, + null, + 3836762, + 3836572, + null, + 3840557, + 3840559, + null, + 3840557, + 3840490, + null, + 3840557, + 3840606, + null, + 3840559, + 3840559, + null, + 3831717, + 3831464, + null, + 3836886, + 3840586, + null, + 3840586, + 3840659, + null, + 3840445, + 3840473, + null, + 3840160, + 3840222, + null, + 3840165, + 3840160, + null, + 3836898, + 3836905, + null, + 3836905, + 3836929, + null, + 3833288, + 3833037, + null, + 3833037, + 3832769, + null, + 3833037, + 3833394, + null, + 3835201, + 3835203, + null, + 3835203, + 3835605, + null, + 3835575, + 3835375, + null, + 3835575, + 3835812, + null, + 3835375, + 3835367, + null, + 3835375, + 3835344, + null, + 3831315, + 3831511, + null, + 3831315, + 3831644, + null, + 3831927, + 3831925, + null, + 3831925, + 3831895, + null, + 3836526, + 3836534, + null, + 3836526, + 3836531, + null, + 3836534, + 3836538, + null, + 3836534, + 3836537, + null, + 3830752, + 3830950, + null, + 3830950, + 3831147, + null, + 3832769, + 3832478, + null, + 3832769, + 3833175, + null, + 3840349, + 3840348, + null, + 3840348, + 3840027, + null, + 3840348, + 3840058, + null, + 3836115, + 3836517, + null, + 3836517, + 3836518, + null, + 3834655, + 3834665, + null, + 3834655, + 3834647, + null, + 3834665, + 3834669, + null, + 3834665, + 3835082, + null, + 3831637, + 3831638, + null, + 3831637, + 3831783, + null, + 3831638, + 3832000, + null, + 3831638, + 3831285, + null, + 3834006, + 3834015, + null, + 3834015, + 3834021, + null, + 3834015, + 3834207, + null, + 3832760, + 3832809, + null, + 3832809, + 3832826, + null, + 3832809, + 3832819, + null, + 3834014, + 3834012, + null, + 3834014, + 3834242, + null, + 3834012, + 3833618, + null, + 3834012, + 3834010, + null, + 3835367, + 3834902, + null, + 3835367, + 3835359, + null, + 3831282, + 3831290, + null, + 3831290, + 3831331, + null, + 3833691, + 3833965, + null, + 3833691, + 3833664, + null, + 3833965, + 3834292, + null, + 3833965, + 3833676, + null, + 3837479, + 3837899, + null, + 3837899, + 3837927, + null, + 3837899, + 3837992, + null, + 3836545, + 3836745, + null, + 3836745, + 3836779, + null, + 3836297, + 3836299, + null, + 3836297, + 3836301, + null, + 3836299, + 3836526, + null, + 3840030, + 3840038, + null, + 3840030, + 3840035, + null, + 3840038, + 3840044, + null, + 3840038, + 3840039, + null, + 3837939, + 3838334, + null, + 3837939, + 3838040, + null, + 3840633, + 3840926, + null, + 3840633, + 3840313, + null, + 3840926, + 3840929, + null, + 3840926, + 3840773, + null, + 3837477, + 3837479, + null, + 3834963, + 3835201, + null, + 3837712, + 3837723, + null, + 3837712, + 3837477, + null, + 3837723, + 3838637, + null, + 3832121, + 3832284, + null, + 3832284, + 3832376, + null, + 3834554, + 3834558, + null, + 3834554, + 3834561, + null, + 3834558, + 3834745, + null, + 3836050, + 3835605, + null, + 3836050, + 3836113, + null, + 3836961, + 3836974, + null, + 3836974, + 3836981, + null, + 3840039, + 3840055, + null, + 3834745, + 3834850, + null, + 3834745, + 3834525, + null, + 3834850, + 3834937, + null, + 3832000, + 3832121, + null, + 3837017, + 3837030, + null, + 3837030, + 3837477, + null, + 3837030, + 3837193, + null, + 3833589, + 3833381, + null, + 3833381, + 3833372, + null, + 3840094, + 3840097, + null, + 3831526, + 3831557, + null, + 3831557, + 3831562, + null, + 3840929, + 3841470, + null, + 3840929, + 3840559, + null, + 3832215, + 3831927, + null, + 3832215, + 3832684, + null, + 3834447, + 3834463, + null, + 3834463, + 3834655, + null, + 3834463, + 3834859, + null, + 3840351, + 3840633, + null, + 3834902, + 3834750, + null, + 3834902, + 3834632, + null, + 3831147, + 3831315, + null, + 3834750, + 3834704, + null, + 3834750, + 3834571, + null, + 3834704, + 3834696, + null, + 3836518, + 3836549, + null, + 3836549, + 3836572, + null, + 3836549, + 3836559, + null, + 3834292, + 3834434, + null, + 3834292, + 3834056, + null, + 3831564, + 3831927, + null, + 3831564, + 3831494, + null, + 3830198, + 3830229, + null, + 3830198, + 3830189, + null, + 3831644, + 3832000, + null, + 3831644, + 3831658, + null, + 3831644, + 3831614, + null, + 3836981, + 3837017, + null, + 3836981, + 3837134, + null, + 3834669, + 3834892, + null, + 3834669, + 3834662, + null, + 3838637, + 3839044, + null, + 3838637, + 3838406, + null, + 3839044, + 3839084, + null, + 3830593, + 3831282, + null, + 3830593, + 3830752, + null, + 3840067, + 3840089, + null, + 3840089, + 3840094, + null, + 3840089, + 3840643, + null, + 3834454, + 3834554, + null, + 3834454, + 3834456, + null, + 3833616, + 3833589, + null, + 3832826, + 3833144, + null, + 3832376, + 3832386, + null, + 3833144, + 3833581, + null, + 3838406, + 3838385, + null, + 3837927, + 3837939, + null, + 3831331, + 3831637, + null, + 3840055, + 3840067, + null, + 3840027, + 3840030, + null, + 3840027, + 3839674, + null, + 3832386, + 3832760, + null, + 3834434, + 3834445, + null, + 3834434, + 3834448, + null, + 3834445, + 3834454, + null, + 3834445, + 3834452, + null, + 3833292, + 3833329, + null, + 3833292, + 3833288, + null, + 3833675, + 3833691, + null, + 3833675, + 3833662, + null, + 3835432, + 3835439, + null, + 3835439, + 3835201, + null, + 3836113, + 3836115, + null, + 3836113, + 3835845, + null, + 3836538, + 3836545, + null, + 3832219, + 3832215, + null, + 3836855, + 3836898, + null, + 3831562, + 3831564, + null, + 3833581, + 3833923, + null, + 3833581, + 3833883, + null, + 3834937, + 3834963, + null, + 3841470, + 3841146, + null, + 3833923, + 3833992, + null, + 3833923, + 3833952, + null, + 3833992, + 3834515, + null, + 3840473, + 3840490, + null, + 3840473, + 3840567, + null, + 3840490, + 3840491, + null, + 3840491, + 3840586, + null, + 3840490, + 3840490, + null, + 3836779, + 3836855, + null, + 3836779, + 3836762, + null, + 3836734, + 3836799, + null, + 3833618, + 3833616, + null, + 3832478, + 3832219, + null, + 3832478, + 3832916, + null, + 3834242, + 3834447, + null, + 3834242, + 3834859, + null, + 3830050, + 3830422, + null, + 3830050, + 3830207, + null, + 3834403, + 3834378, + null, + 3834378, + 3834359, + null, + 3834696, + 3834690, + null, + 3834690, + 3834565, + null, + 3834461, + 3834403, + null, + 3834461, + 3834559, + null, + 3830310, + 3830593, + null, + 3834359, + 3834079, + null, + 3830050, + 3830310, + null, + 3834565, + 3834461, + null, + 3835281, + 3835263, + null, + 3835263, + 3835214, + null, + 3840057, + 3840058, + null, + 3840057, + 3840059, + null, + 3840058, + 3840072, + null, + 3832369, + 3832176, + null, + 3832369, + 3832706, + null, + 3832176, + 3832149, + null, + 3839711, + 3839705, + null, + 3837902, + 3838483, + null, + 3837902, + 3837660, + null, + 3838483, + 3838567, + null, + 3836061, + 3835634, + null, + 3836061, + 3836068, + null, + 3834115, + 3834024, + null, + 3834115, + 3833773, + null, + 3834024, + 3834014, + null, + 3838832, + 3838850, + null, + 3838850, + 3839262, + null, + 3835713, + 3835587, + null, + 3834157, + 3834072, + null, + 3834157, + 3833997, + null, + 3834072, + 3834044, + null, + 3834044, + 3834007, + null, + 3834007, + 3833952, + null, + 3836600, + 3836326, + null, + 3836600, + 3836610, + null, + 3836326, + 3836061, + null, + 3832471, + 3832426, + null, + 3832426, + 3832369, + null, + 3832426, + 3831925, + null, + 3841871, + 3841836, + null, + 3841871, + 3841908, + null, + 3841836, + 3840938, + null, + 3841836, + 3841836, + null, + 3839557, + 3839729, + null, + 3839729, + 3839737, + null, + 3839300, + 3839286, + null, + 3831479, + 3831227, + null, + 3831479, + 3831520, + null, + 3831227, + 3830918, + null, + 3831227, + 3831258, + null, + 3833145, + 3832916, + null, + 3833145, + 3833551, + null, + 3832916, + 3832893, + null, + 3840072, + 3840089, + null, + 3841907, + 3841871, + null, + 3841907, + 3841907, + null, + 3839781, + 3839711, + null, + 3839473, + 3839375, + null, + 3839375, + 3839359, + null, + 3839742, + 3839658, + null, + 3839658, + 3839376, + null, + 3835450, + 3835445, + null, + 3835450, + 3835922, + null, + 3835445, + 3835405, + null, + 3839913, + 3839899, + null, + 3839913, + 3839912, + null, + 3839899, + 3839782, + null, + 3839737, + 3839974, + null, + 3839974, + 3840123, + null, + 3839974, + 3839964, + null, + 3839262, + 3839376, + null, + 3833670, + 3833419, + null, + 3838808, + 3838832, + null, + 3838567, + 3838808, + null, + 3838567, + 3838949, + null, + 3834079, + 3834078, + null, + 3834079, + 3834061, + null, + 3834078, + 3834078, + null, + 3834078, + 3834061, + null, + 3839286, + 3839277, + null, + 3839277, + 3839203, + null, + 3836650, + 3836714, + null, + 3836714, + 3836707, + null, + 3836714, + 3837349, + null, + 3840643, + 3840938, + null, + 3835067, + 3835060, + null, + 3835060, + 3834565, + null, + 3834118, + 3834115, + null, + 3834118, + 3834037, + null, + 3830526, + 3830936, + null, + 3836054, + 3835754, + null, + 3836054, + 3836045, + null, + 3835754, + 3835713, + null, + 3835754, + 3835105, + null, + 3831116, + 3830838, + null, + 3831116, + 3831714, + null, + 3830838, + 3830590, + null, + 3833773, + 3833759, + null, + 3830918, + 3830944, + null, + 3833419, + 3833394, + null, + 3833394, + 3833175, + null, + 3835441, + 3835450, + null, + 3835441, + 3835439, + null, + 3832149, + 3832107, + null, + 3832149, + 3831889, + null, + 3838405, + 3838124, + null, + 3839203, + 3839473, + null, + 3839203, + 3838987, + null, + 3835889, + 3836249, + null, + 3835889, + 3835904, + null, + 3839376, + 3839456, + null, + 3832893, + 3832684, + null, + 3832893, + 3832912, + null, + 3832684, + 3832624, + null, + 3840938, + 3840936, + null, + 3831983, + 3831749, + null, + 3831749, + 3831479, + null, + 3831749, + 3831788, + null, + 3831795, + 3831526, + null, + 3839456, + 3839557, + null, + 3839456, + 3839475, + null, + 3834647, + 3834261, + null, + 3834647, + 3834461, + null, + 3836994, + 3836619, + null, + 3836619, + 3836610, + null, + 3836619, + 3836646, + null, + 3835922, + 3836297, + null, + 3835091, + 3835067, + null, + 3836610, + 3836650, + null, + 3836707, + 3836249, + null, + 3839782, + 3839742, + null, + 3839782, + 3839760, + null, + 3839687, + 3839674, + null, + 3839687, + 3839737, + null, + 3839674, + 3839660, + null, + 3832624, + 3832471, + null, + 3832624, + 3833158, + null, + 3835173, + 3835158, + null, + 3835158, + 3835069, + null, + 3835158, + 3835182, + null, + 3840123, + 3840136, + null, + 3840136, + 3840064, + null, + 3839660, + 3839389, + null, + 3837565, + 3837902, + null, + 3838987, + 3838714, + null, + 3838987, + 3838961, + null, + 3833175, + 3833145, + null, + 3832027, + 3831983, + null, + 3835214, + 3835060, + null, + 3835214, + 3835206, + null, + 3836077, + 3836064, + null, + 3836077, + 3836272, + null, + 3836064, + 3836054, + null, + 3836064, + 3835759, + null, + 3834078, + 3834077, + null, + 3834077, + 3834044, + null, + 3830590, + 3830342, + null, + 3830590, + 3830967, + null, + 3835178, + 3835173, + null, + 3835178, + 3835203, + null, + 3836301, + 3836353, + null, + 3836301, + 3836306, + null, + 3835331, + 3835281, + null, + 3835584, + 3835650, + null, + 3835584, + 3835496, + null, + 3835650, + 3835652, + null, + 3838714, + 3838405, + null, + 3835069, + 3834960, + null, + 3830498, + 3830526, + null, + 3834261, + 3834067, + null, + 3834818, + 3834942, + null, + 3834515, + 3834518, + null, + 3835496, + 3835331, + null, + 3837349, + 3837352, + null, + 3835189, + 3835432, + null, + 3835189, + 3835181, + null, + 3836353, + 3836358, + null, + 3836353, + 3836115, + null, + 3834521, + 3834818, + null, + 3834521, + 3834518, + null, + 3836346, + 3836734, + null, + 3837352, + 3837565, + null, + 3837352, + 3837174, + null, + 3834942, + 3834979, + null, + 3834942, + 3834942, + null, + 3834979, + 3835089, + null, + 3834979, + 3834745, + null, + 3834960, + 3834956, + null, + 3835032, + 3835491, + null, + 3835032, + 3834403, + null, + 3835865, + 3835889, + null, + 3835225, + 3836249, + null, + 3841930, + 3841907, + null, + 3839389, + 3839375, + null, + 3830342, + 3830050, + null, + 3830342, + 3830724, + null, + 3830342, + 3830029, + null, + 3832107, + 3832134, + null, + 3831658, + 3832046, + null, + 3832046, + 3832345, + null, + 3832046, + 3832452, + null, + 3833870, + 3833618, + null, + 3832835, + 3832862, + null, + 3832835, + 3832642, + null, + 3832862, + 3833262, + null, + 3832862, + 3832848, + null, + 3831714, + 3832046, + null, + 3832640, + 3833037, + null, + 3832640, + 3832929, + null, + 3833262, + 3833581, + null, + 3834859, + 3834930, + null, + 3832452, + 3832133, + null, + 3832452, + 3832815, + null, + 3836331, + 3836312, + null, + 3836312, + 3836012, + null, + 3835759, + 3835754, + null, + 3832372, + 3832640, + null, + 3832372, + 3832754, + null, + 3836306, + 3836531, + null, + 3830290, + 3830050, + null, + 3834242, + 3834253, + null, + 3831618, + 3831773, + null, + 3831618, + 3831326, + null, + 3831773, + 3831889, + null, + 3830944, + 3831258, + null, + 3830944, + 3831307, + null, + 3840064, + 3840062, + null, + 3840062, + 3839913, + null, + 3840062, + 3840084, + null, + 3840286, + 3840288, + null, + 3840286, + 3840293, + null, + 3840263, + 3840260, + null, + 3840263, + 3840286, + null, + 3836531, + 3836571, + null, + 3836531, + 3836534, + null, + 3836571, + 3836573, + null, + 3830457, + 3830230, + null, + 3830457, + 3830488, + null, + 3830457, + 3830454, + null, + 3830230, + 3830211, + null, + 3830042, + 3830013, + null, + 3830042, + 3830115, + null, + 3830013, + 3830027, + null, + 3840035, + 3840045, + null, + 3840035, + 3840035, + null, + 3840045, + 3840350, + null, + 3831258, + 3831611, + null, + 3835359, + 3835344, + null, + 3835344, + 3834930, + null, + 3833926, + 3833968, + null, + 3831901, + 3832143, + null, + 3831901, + 3831880, + null, + 3832143, + 3832292, + null, + 3832143, + 3832640, + null, + 3836362, + 3836358, + null, + 3834759, + 3834763, + null, + 3834759, + 3835079, + null, + 3835401, + 3835325, + null, + 3835401, + 3835400, + null, + 3835283, + 3835192, + null, + 3835192, + 3835189, + null, + 3835233, + 3835316, + null, + 3835316, + 3835646, + null, + 3835316, + 3835096, + null, + 3834530, + 3834524, + null, + 3834530, + 3834624, + null, + 3834524, + 3834518, + null, + 3840948, + 3840572, + null, + 3840572, + 3840587, + null, + 3840591, + 3840567, + null, + 3840591, + 3841001, + null, + 3835206, + 3835032, + null, + 3837457, + 3837474, + null, + 3837457, + 3837742, + null, + 3837392, + 3837414, + null, + 3837392, + 3837457, + null, + 3834264, + 3834261, + null, + 3834264, + 3833812, + null, + 3834067, + 3834056, + null, + 3835646, + 3835658, + null, + 3834276, + 3834264, + null, + 3834276, + 3834417, + null, + 3834471, + 3834276, + null, + 3834471, + 3834502, + null, + 3833959, + 3833262, + null, + 3834518, + 3834516, + null, + 3834624, + 3835069, + null, + 3834624, + 3834759, + null, + 3835191, + 3835097, + null, + 3833662, + 3833650, + null, + 3835230, + 3835400, + null, + 3835301, + 3835193, + null, + 3835193, + 3835192, + null, + 3836937, + 3836855, + null, + 3841908, + 3841931, + null, + 3841931, + 3841907, + null, + 3836507, + 3836524, + null, + 3836524, + 3836526, + null, + 3836537, + 3836475, + null, + 3836475, + 3836448, + null, + 3830189, + 3830162, + null, + 3831326, + 3831312, + null, + 3837618, + 3837615, + null, + 3837615, + 3837631, + null, + 3833453, + 3833452, + null, + 3840047, + 3840064, + null, + 3839272, + 3839489, + null, + 3836073, + 3836272, + null, + 3836073, + 3836312, + null, + 3836272, + 3836489, + null, + 3834037, + 3834014, + null, + 3831895, + 3831621, + null, + 3838851, + 3839052, + null, + 3839052, + 3839084, + null, + 3837631, + 3837619, + null, + 3837619, + 3837618, + null, + 3837619, + 3837651, + null, + 3840637, + 3840633, + null, + 3840637, + 3840643, + null, + 3836443, + 3836507, + null, + 3833575, + 3833548, + null, + 3833575, + 3833616, + null, + 3837724, + 3837631, + null, + 3837724, + 3837737, + null, + 3840646, + 3841684, + null, + 3836246, + 3836443, + null, + 3836646, + 3836662, + null, + 3830603, + 3830837, + null, + 3830837, + 3830838, + null, + 3837815, + 3837724, + null, + 3832399, + 3832292, + null, + 3834784, + 3834776, + null, + 3834776, + 3834700, + null, + 3834776, + 3834750, + null, + 3834525, + 3834511, + null, + 3834511, + 3834542, + null, + 3839918, + 3839912, + null, + 3839912, + 3839970, + null, + 3840035, + 3840027, + null, + 3833933, + 3833900, + null, + 3833900, + 3833870, + null, + 3840512, + 3840514, + null, + 3840512, + 3840646, + null, + 3840514, + 3840559, + null, + 3832815, + 3832835, + null, + 3834461, + 3834463, + null, + 3834461, + 3834445, + null, + 3832345, + 3832386, + null, + 3831622, + 3831864, + null, + 3831864, + 3831875, + null, + 3836315, + 3836303, + null, + 3836315, + 3836332, + null, + 3836303, + 3836068, + null, + 3839475, + 3839751, + null, + 3831621, + 3831618, + null, + 3831290, + 3831307, + null, + 3831290, + 3831034, + null, + 3831307, + 3831574, + null, + 3831307, + 3831335, + null, + 3831611, + 3831622, + null, + 3840313, + 3840512, + null, + 3840313, + 3840305, + null, + 3839084, + 3839492, + null, + 3839492, + 3839489, + null, + 3841907, + 3841908, + null, + 3839940, + 3839918, + null, + 3834166, + 3834157, + null, + 3840936, + 3840926, + null, + 3834056, + 3834047, + null, + 3831875, + 3831901, + null, + 3831875, + 3832348, + null, + 3840166, + 3839940, + null, + 3834456, + 3834539, + null, + 3831034, + 3830939, + null, + 3830939, + 3830936, + null, + 3833883, + 3833926, + null, + 3834937, + 3834784, + null, + 3834937, + 3834914, + null, + 3834041, + 3833804, + null, + 3834956, + 3834944, + null, + 3834944, + 3834937, + null, + 3835182, + 3835230, + null, + 3835182, + 3835203, + null, + 3830240, + 3830290, + null, + 3840350, + 3840384, + null, + 3840350, + 3840348, + null, + 3831180, + 3831282, + null, + 3831488, + 3831290, + null, + 3831488, + 3831316, + null, + 3833158, + 3832975, + null, + 3833158, + 3833575, + null, + 3836573, + 3836362, + null, + 3831285, + 3830950, + null, + 3833551, + 3833594, + null, + 3834299, + 3834166, + null, + 3834299, + 3834673, + null, + 3835056, + 3834963, + null, + 3839000, + 3838850, + null, + 3834516, + 3834292, + null, + 3834309, + 3834118, + null, + 3835188, + 3835610, + null, + 3835610, + 3836073, + null, + 3834905, + 3834937, + null, + 3833230, + 3833262, + null, + 3831589, + 3831312, + null, + 3831589, + 3831889, + null, + 3835439, + 3835406, + null, + 3835439, + 3835759, + null, + 3835406, + 3835367, + null, + 3835406, + 3834944, + null, + 3830207, + 3830407, + null, + 3836489, + 3836408, + null, + 3830462, + 3830498, + null, + 3832386, + 3832284, + null, + 3835079, + 3835126, + null, + 3835126, + 3835158, + null, + 3835126, + 3835178, + null, + 3840305, + 3840136, + null, + 3839771, + 3839782, + null, + 3839771, + 3839663, + null, + 3839782, + 3840047, + null, + 3839782, + 3839664, + null, + 3836448, + 3836443, + null, + 3830211, + 3830590, + null, + 3839499, + 3839492, + null, + 3836332, + 3836331, + null, + 3836332, + 3836619, + null, + 3833594, + 3833566, + null, + 3833594, + 3833619, + null, + 3833097, + 3833454, + null, + 3833097, + 3832819, + null, + 3833454, + 3833453, + null, + 3833650, + 3833664, + null, + 3841907, + 3841866, + null, + 3832398, + 3832121, + null, + 3841134, + 3841146, + null, + 3840225, + 3840263, + null, + 3839045, + 3839044, + null, + 3839308, + 3839286, + null, + 3839308, + 3839629, + null, + 3832419, + 3832399, + null, + 3834969, + 3834956, + null, + 3836068, + 3836077, + null, + 3834700, + 3834690, + null, + 3839629, + 3840030, + null, + 3834095, + 3834117, + null, + 3834117, + 3834123, + null, + 3839751, + 3839771, + null, + 3835105, + 3834969, + null, + 3835105, + 3834961, + null, + 3839359, + 3839233, + null, + 3838397, + 3839045, + null, + 3838397, + 3838140, + null, + 3834155, + 3834161, + null, + 3835658, + 3835674, + null, + 3831574, + 3831622, + null, + 3831574, + 3831604, + null, + 3834056, + 3833933, + null, + 3834056, + 3834113, + null, + 3834103, + 3834155, + null, + 3835216, + 3835233, + null, + 3834449, + 3834461, + null, + 3830900, + 3831180, + null, + 3831586, + 3831488, + null, + 3830873, + 3830900, + null, + 3839233, + 3839210, + null, + 3833566, + 3833388, + null, + 3833388, + 3833383, + null, + 3833383, + 3833364, + null, + 3833803, + 3833594, + null, + 3835446, + 3835656, + null, + 3835446, + 3835441, + null, + 3835656, + 3835658, + null, + 3835656, + 3835667, + null, + 3833364, + 3833158, + null, + 3833804, + 3833803, + null, + 3834662, + 3834885, + null, + 3834662, + 3834647, + null, + 3834662, + 3834476, + null, + 3837829, + 3837723, + null, + 3837829, + 3838397, + null, + 3830488, + 3830752, + null, + 3831520, + 3831258, + null, + 3831520, + 3831863, + null, + 3837241, + 3837360, + null, + 3837241, + 3837214, + null, + 3837360, + 3837615, + null, + 3837360, + 3837349, + null, + 3836313, + 3836303, + null, + 3834113, + 3834445, + null, + 3836797, + 3836854, + null, + 3836854, + 3836782, + null, + 3836782, + 3836779, + null, + 3834983, + 3834979, + null, + 3835290, + 3835271, + null, + 3835271, + 3835263, + null, + 3834596, + 3834558, + null, + 3831614, + 3831285, + null, + 3831839, + 3832168, + null, + 3831839, + 3831557, + null, + 3832168, + 3832219, + null, + 3831335, + 3831839, + null, + 3832912, + 3833383, + null, + 3832456, + 3832478, + null, + 3838128, + 3837823, + null, + 3838128, + 3838405, + null, + 3837823, + 3837815, + null, + 3831863, + 3831875, + null, + 3834219, + 3834012, + null, + 3834219, + 3834122, + null, + 3834010, + 3833778, + null, + 3834010, + 3833616, + null, + 3834445, + 3834219, + null, + 3834445, + 3834447, + null, + 3832101, + 3832456, + null, + 3837999, + 3838093, + null, + 3838093, + 3838173, + null, + 3830352, + 3830730, + null, + 3830730, + 3831116, + null, + 3839664, + 3839658, + null, + 3831302, + 3831326, + null, + 3835203, + 3835216, + null, + 3831788, + 3831520, + null, + 3831788, + 3832143, + null, + 3838297, + 3838714, + null, + 3830724, + 3830944, + null, + 3837967, + 3837829, + null, + 3838173, + 3838128, + null, + 3832754, + 3832769, + null, + 3831604, + 3832101, + null, + 3837631, + 3837999, + null, + 3836727, + 3836728, + null, + 3836406, + 3836313, + null, + 3836735, + 3836745, + null, + 3837911, + 3837815, + null, + 3830027, + 3830240, + null, + 3831601, + 3831621, + null, + 3830935, + 3830939, + null, + 3832076, + 3832101, + null, + 3833619, + 3833992, + null, + 3832358, + 3832372, + null, + 3832358, + 3832352, + null, + 3832348, + 3832358, + null, + 3832348, + 3832173, + null, + 3830299, + 3830290, + null, + 3831857, + 3831839, + null, + 3831857, + 3832076, + null, + 3839145, + 3839149, + null, + 3839149, + 3838823, + null, + 3839149, + 3839146, + null, + 3839210, + 3839081, + null, + 3837243, + 3837241, + null, + 3830461, + 3830488, + null, + 3839146, + 3839135, + null, + 3839135, + 3839145, + null, + 3839135, + 3839150, + null, + 3834914, + 3834902, + null, + 3837626, + 3837243, + null, + 3837037, + 3837392, + null, + 3837737, + 3838081, + null, + 3838081, + 3838093, + null, + 3830589, + 3830852, + null, + 3830589, + 3830720, + null, + 3830852, + 3830900, + null, + 3830852, + 3830619, + null, + 3841866, + 3841870, + null, + 3841870, + 3841871, + null, + 3838880, + 3838577, + null, + 3838880, + 3838937, + null, + 3833486, + 3833454, + null, + 3833486, + 3833883, + null, + 3831214, + 3831178, + null, + 3831178, + 3831026, + null, + 3831178, + 3831067, + null, + 3841836, + 3841880, + null, + 3830106, + 3830161, + null, + 3830106, + 3830352, + null, + 3830161, + 3830461, + null, + 3834078, + 3834166, + null, + 3834235, + 3834061, + null, + 3834061, + 3834060, + null, + 3833157, + 3833419, + null, + 3837034, + 3836662, + null, + 3836662, + 3836650, + null, + 3836662, + 3836920, + null, + 3832848, + 3833019, + null, + 3838961, + 3838880, + null, + 3840284, + 3840166, + null, + 3834673, + 3834763, + null, + 3834673, + 3834756, + null, + 3830454, + 3830429, + null, + 3830429, + 3830161, + null, + 3834060, + 3834077, + null, + 3834060, + 3834078, + null, + 3832352, + 3832172, + null, + 3836965, + 3836961, + null, + 3837857, + 3837742, + null, + 3837857, + 3838078, + null, + 3833990, + 3833803, + null, + 3838111, + 3838089, + null, + 3838111, + 3838699, + null, + 3836045, + 3835608, + null, + 3839734, + 3839499, + null, + 3839622, + 3839629, + null, + 3839425, + 3839622, + null, + 3839964, + 3839787, + null, + 3839787, + 3839771, + null, + 3838078, + 3838111, + null, + 3831783, + 3832049, + null, + 3831783, + 3831935, + null, + 3836709, + 3836518, + null, + 3837821, + 3837679, + null, + 3840090, + 3839940, + null, + 3840090, + 3840115, + null, + 3832666, + 3832815, + null, + 3834452, + 3834553, + null, + 3834561, + 3834580, + null, + 3832793, + 3832826, + null, + 3833464, + 3833804, + null, + 3832573, + 3832760, + null, + 3831382, + 3831562, + null, + 3833637, + 3833388, + null, + 3833703, + 3833364, + null, + 3835869, + 3836246, + null, + 3833397, + 3833372, + null, + 3837362, + 3837345, + null, + 3837362, + 3837364, + null, + 3837345, + 3837348, + null, + 3837350, + 3836969, + null, + 3837350, + 3837348, + null, + 3837348, + 3837220, + null, + 3837393, + 3837345, + null, + 3837393, + 3837395, + null, + 3840084, + 3840090, + null, + 3837651, + 3837959, + null, + 3837765, + 3837646, + null, + 3836413, + 3836517, + null, + 3831362, + 3831382, + null, + 3830509, + 3830559, + null, + 3830559, + 3830589, + null, + 3832625, + 3832793, + null, + 3835066, + 3835126, + null, + 3839116, + 3839000, + null, + 3839369, + 3839116, + null, + 3839199, + 3839116, + null, + 3839263, + 3839000, + null, + 3836728, + 3836735, + null, + 3834017, + 3834007, + null, + 3840660.56, + 3840655, + null, + 3830153.17, + 3830194, + null + ] + }, + { + "hoverinfo": "text", + "marker": { + "color": [], + "colorbar": { + "thickness": 15, + "title": { + "side": "right", + "text": "Node Connections" + }, + "xanchor": "left" + }, + "colorscale": [ + [ + 0, + "rgb(255,255,217)" + ], + [ + 0.125, + "rgb(237,248,177)" + ], + [ + 0.25, + "rgb(199,233,180)" + ], + [ + 0.375, + "rgb(127,205,187)" + ], + [ + 0.5, + "rgb(65,182,196)" + ], + [ + 0.625, + "rgb(29,145,192)" + ], + [ + 0.75, + "rgb(34,94,168)" + ], + [ + 0.875, + "rgb(37,52,148)" + ], + [ + 1, + "rgb(8,29,88)" + ] + ], + "line": { + "width": 2 + }, + "reversescale": true, + "showscale": true, + "size": 10 + }, + "mode": "markers", + "type": "scatter", + "x": [ + 4389474.53, + 4389026.72, + 4389734.41, + 4389551.27, + 4390452.76, + 4390216.69, + 4390178.73, + 4389536.81, + 4390226.09, + 4389018.49, + 4388886.06, + 4392317.5, + 4392147.54, + 4392355.02, + 4392316.23, + 4392021.88, + 4392531.38, + 4392451.05, + 4392776.2, + 4392756.08, + 4392748.94, + 4392566.26, + 4392349.71, + 4391942.49, + 4392637.62, + 4392360.83, + 4391901, + 4392363.44, + 4390403.31, + 4390607.91, + 4390255.73, + 4390394.82, + 4390082.98, + 4390088.56, + 4388724.71, + 4388943.42, + 4390216.3, + 4389809.48, + 4389804.19, + 4389591.59, + 4389944.49, + 4390042.29, + 4388960.33, + 4388974.2, + 4389573.87, + 4390945.47, + 4391388.97, + 4390611.99, + 4390647.74, + 4391607.16, + 4391869.13, + 4391931.69, + 4391939.97, + 4391125.91, + 4391128.45, + 4390154.2, + 4390166.86, + 4390921.32, + 4389690.83, + 4389704.66, + 4391377.13, + 4389948.85, + 4389775.6, + 4389783.31, + 4390753.05, + 4391109.1, + 4391382.47, + 4391957.27, + 4392092.64, + 4388581.93, + 4388299.2, + 4388229.43, + 4388645.45, + 4389210.75, + 4388910, + 4389814.93, + 4389537.68, + 4389368.75, + 4390195.27, + 4390089.84, + 4392341.08, + 4390657.76, + 4389718.3, + 4388865.86, + 4388877.15, + 4392110.43, + 4392156.41, + 4392158.53, + 4392159.88, + 4390435, + 4390447.72, + 4390466.67, + 4389283.66, + 4388881.97, + 4389298.45, + 4392138.56, + 4392151.26, + 4390072.6, + 4390536.49, + 4392160.72, + 4392151.32, + 4388401.93, + 4389906.12, + 4391942.74, + 4391836.43, + 4392310.51, + 4392630.41, + 4392632.63, + 4389958.62, + 4389947.69, + 4389740.9, + 4390049.94, + 4390187.75, + 4390188.71, + 4391550.08, + 4391918.38, + 4388071.63, + 4391434.07, + 4391435.98, + 4389769.02, + 4389766.94, + 4387618.47, + 4387776.9, + 4390378.76, + 4392968.65, + 4392964.15, + 4390678.52, + 4390893.54, + 4391068.55, + 4391048.12, + 4386940.78, + 4386942.16, + 4388887.87, + 4388893.87, + 4387863.44, + 4387903.31, + 4392269.3, + 4392264.78, + 4390396.02, + 4391932.42, + 4386658.88, + 4386665.3, + 4389298.59, + 4389482.04, + 4391402.36, + 4391623.56, + 4389772.7, + 4389878.22, + 4390183.67, + 4390180.03, + 4392752.7, + 4392795.04, + 4392773.82, + 4391644.64, + 4391864.68, + 4393110.74, + 4393263.42, + 4391401.26, + 4390056.17, + 4390942.61, + 4390948.2, + 4387338.76, + 4387472.71, + 4389834.27, + 4389836.55, + 4390636.75, + 4391127.92, + 4391134.47, + 4392774.62, + 4389935.96, + 4389993.74, + 4387238.98, + 4391157.97, + 4391164.32, + 4392116.61, + 4392510.23, + 4392784.6, + 4391118.92, + 4391143.5, + 4393264.99, + 4391072.19, + 4391451.84, + 4391422.04, + 4392969.77, + 4392813.84, + 4387935.07, + 4393107.89, + 4393208.32, + 4390894.17, + 4390909.87, + 4389692.72, + 4391149.33, + 4389788.35, + 4387670.68, + 4391138.36, + 4391040.82, + 4391437.83, + 4391658.68, + 4387492.51, + 4392788.61, + 4392794.72, + 4389782.05, + 4392063.07, + 4387917.42, + 4387547.96, + 4388175.63, + 4391862.09, + 4391638.36, + 4386696.45, + 4392782.71, + 4392527.21, + 4392803.58, + 4387556.05, + 4389771.66, + 4389777.55, + 4389736.84, + 4389286.65, + 4389724.22, + 4389728.16, + 4390677.12, + 4389768.85, + 4391066.82, + 4389935.84, + 4391147.48, + 4388546.88, + 4390041.96, + 4393547.4, + 4388821.73, + 4388887.91, + 4392228.34, + 4392141.96, + 4392135.53, + 4392141.97, + 4391596.8, + 4389896.03, + 4388845.13, + 4392332.22, + 4390432.22, + 4392058.22, + 4390741.2, + 4391847.33, + 4389282.13, + 4393799.27, + 4393844.33, + 4393223.59, + 4393234.55, + 4393681.65, + 4387266.99, + 4393879.65, + 4387052.76, + 4393476.04, + 4393859.41, + 4393849.38, + 4392760.39, + 4392777.86, + 4391918.59, + 4392214.39, + 4392553.95, + 4393287.77, + 4393599.5, + 4392278.6, + 4393065.66, + 4392332.49, + 4392283.94, + 4393748.94, + 4393758.13, + 4392050.99, + 4391983.64, + 4388631.39, + 4388547.91, + 4394475.74, + 4394546.35, + 4392588.44, + 4392435.36, + 4391762.28, + 4391829.95, + 4393628.11, + 4393635.15, + 4393657.51, + 4393354.62, + 4392375.14, + 4389327.67, + 4389645.24, + 4390751.49, + 4391096.9, + 4392785.11, + 4393626.47, + 4392424.63, + 4392872.06, + 4393077.43, + 4394323.73, + 4394253.37, + 4389729.61, + 4389739.19, + 4394458.46, + 4394451.68, + 4393342.08, + 4393640.68, + 4393975.79, + 4389957.15, + 4393736.96, + 4393621.37, + 4394409.42, + 4394411.19, + 4392405.43, + 4392426.56, + 4392614.86, + 4392645.34, + 4393090.28, + 4393727.42, + 4393740.83, + 4392326.66, + 4390530.91, + 4390862.39, + 4392238.5, + 4392069.58, + 4387948.92, + 4388300.45, + 4392945.43, + 4390034.48, + 4390340.23, + 4390376.68, + 4389724.62, + 4392254.49, + 4392495.7, + 4392591.17, + 4394194.85, + 4393438.73, + 4394036.49, + 4391131.4, + 4391446.34, + 4393241.01, + 4388707.69, + 4388999.43, + 4390773.36, + 4393867.42, + 4391058.54, + 4391877.13, + 4392576.08, + 4394203.15, + 4389989.33, + 4393681.74, + 4392593.48, + 4392657.26, + 4394356.67, + 4393293.58, + 4393281.71, + 4391536.55, + 4389058.48, + 4389087.15, + 4394039.63, + 4394045.58, + 4393269.47, + 4393103.97, + 4392809.69, + 4390704.5, + 4388653.24, + 4393823.24, + 4392251.06, + 4392243.98, + 4394412.95, + 4394414.72, + 4388601.17, + 4389049.52, + 4390185.96, + 4388524.43, + 4393886.87, + 4394029.44, + 4394065.1, + 4392662.38, + 4389255.29, + 4390506.76, + 4390857.27, + 4389406.88, + 4389471.5, + 4389243.34, + 4393979.08, + 4389857.87, + 4392988.52, + 4389586.22, + 4390214.27, + 4389246.72, + 4389406.94, + 4390225.65, + 4392989.78, + 4389471.88, + 4389491.5, + 4389459.9, + 4389467.67, + 4394141.11, + 4394399.39, + 4394241.16, + 4393217.28, + 4394650.91, + 4393600.38, + 4393084.78, + 4388913.53, + 4392320.46, + 4387682.09, + 4387991.08, + 4391578.32, + 4388588.46, + 4388610.9, + 4394029.68, + 4388396.39, + 4389723.41, + 4388948.06, + 4391630.18, + 4388326.83, + 4392420.06, + 4392457.39, + 4392059.53, + 4390060.04, + 4390177.18, + 4392924.27, + 4386570.43, + 4390239.68, + 4390217.28, + 4391349.7, + 4391820.37, + 4391939.73, + 4390058.22, + 4394177.57, + 4394179.87, + 4392341.21, + 4392322.75, + 4392340.15, + 4392368.99, + 4389771.93, + 4389792.95, + 4387989.78, + 4388262.8, + 4386339.82, + 4386379.11, + 4392797.78, + 4392803.37, + 4389669.47, + 4391928.24, + 4391920.01, + 4388180.04, + 4388276.36, + 4389618.55, + 4389319.04, + 4390207.82, + 4388781.07, + 4388774.31, + 4389197.1, + 4389340.98, + 4389601.59, + 4389412.09, + 4389581.17, + 4389079.28, + 4389124.51, + 4389223.99, + 4389236.68, + 4392322.82, + 4392154.02, + 4392222.42, + 4392202.61, + 4392285.2, + 4391183.93, + 4393836.83, + 4390269.19, + 4390234.77, + 4390235.26, + 4390189.86, + 4390850.45, + 4391216.97, + 4389304.25, + 4390829.25, + 4390463.57, + 4389491.28, + 4389244.95, + 4389033.87, + 4389357, + 4389276.71, + 4389084.5, + 4389177.85, + 4389386, + 4389581.57, + 4390003.49, + 4393636.34, + 4393725.69, + 4389759.39, + 4389768.46, + 4389762.31, + 4389713.38, + 4389800.31, + 4392195.43, + 4393103.01, + 4393107.17, + 4387891.07, + 4387851.62, + 4387852.5, + 4394168.91, + 4392341.64, + 4391905.74, + 4391829.7, + 4391937.33, + 4392281.91, + 4393550.95, + 4391475.9, + 4392137.81, + 4391742.39, + 4393077.02, + 4393101.03, + 4394376.38, + 4393101.45, + 4389725.21, + 4392042.17, + 4392094.6, + 4392894.33, + 4394199.7, + 4394222.62, + 4389623.63, + 4392587.6, + 4388104.01, + 4388299.8, + 4392716.56, + 4389002.18, + 4393105.91, + 4393120.06, + 4390359.47, + 4390386.15, + 4394464.36, + 4394460.02, + 4392798.84, + 4391463.57, + 4391523.68, + 4394087.62, + 4394084.69, + 4389136.57, + 4388571.46, + 4391420.92, + 4394061.67, + 4387607.05, + 4389958.11, + 4389662.52, + 4392407.49, + 4392401.33, + 4393876.75, + 4391816.59, + 4390374.38, + 4390352.87, + 4389949.41, + 4393723.78, + 4391679.5, + 4391892.44, + 4393630.81, + 4394483.2, + 4388619.27, + 4394552.65, + 4393243.7, + 4390138.48, + 4389648.63, + 4394669.92, + 4389778.68, + 4389614.69, + 4390731.08, + 4390857.49, + 4388181.32, + 4392831.19, + 4390166.21, + 4392826.17, + 4392820, + 4389101.4, + 4386533.22, + 4392959.88, + 4386579.46, + 4386419.96, + 4394043.65, + 4391822.7, + 4389794.23, + 4387374.18, + 4392027.85, + 4390973.46, + 4388473.22, + 4389873.44, + 4393484.11, + 4389252.33, + 4392444.75, + 4391345.58, + 4391574.19, + 4393733.42, + 4390108.75, + 4388998.97, + 4388998.97, + 4392426.31, + 4392212.26, + 4391891.82, + 4391954.69, + 4389421.67, + 4392055.12, + 4390549.19, + 4386290.05, + 4387274.2, + 4393833.24, + 4388950.18, + 4389021.86, + 4393740.15, + 4394016.59, + 4394027.7, + 4389716.62, + 4388285.29, + 4391880.49, + 4392417.21, + 4390996.64, + 4387557.66, + 4387850.31, + 4389267.11, + 4393782.45, + 4387014.89, + 4393648.79, + 4392338.63, + 4391656.14, + 4392338.49, + 4392416.79, + 4389832.91, + 4393078.34, + 4389018.07, + 4392832.28, + 4392265.75, + 4393239.68, + 4392587.25, + 4390249.73, + 4390206.59, + 4394009.46, + 4392977.03, + 4392903.41, + 4392966.3, + 4393068.62, + 4391054.39, + 4390228.12, + 4389310.74, + 4386388.13, + 4390017.01, + 4391236.65, + 4390327.78, + 4389070.37, + 4391414.71, + 4386365.86, + 4391666.84, + 4386299.56, + 4386344.11, + 4393006.89, + 4391047.37, + 4391384.87, + 4391393.84, + 4390606.4, + 4389279.44, + 4389715.76, + 4389315.64, + 4391428.85, + 4390603.74, + 4392167.26, + 4391029.7, + 4390745.03, + 4387949.67, + 4389361.22, + 4392898.7, + 4392965.57, + 4393759.76, + 4392383.31, + 4391268.44, + 4392281.15, + 4389346.17, + 4389691.07, + 4389892.13, + 4389483.25, + 4393798.31, + 4393833.36, + 4389757.32, + 4387643.77, + 4390771.02, + 4391027.18, + 4390374.42, + 4391141.6, + 4390725.69, + 4392884.66, + 4392720.66, + 4389638.39, + 4391879.37, + 4392269.65, + 4391450.6, + 4390446.73, + 4393295.21, + 4393100.89, + 4387339.42, + 4387639.14, + 4394241.37, + 4392177.22, + 4389062.97, + 4389030.77, + 4393447.99, + 4391274.59, + 4390339.89, + 4392094.13, + 4390530.65, + 4392909.19, + 4392211.65, + 4390366.52, + 4390042.06, + 4393115.54, + 4389911.83, + 4389909.61, + 4390918.61, + 4392214.29, + 4389896.41, + 4392530.31, + 4386388.85, + 4391800.66, + 4392584.34, + 4390853.92, + 4390478.75, + 4391009.79, + 4391202.42, + 4390048.66, + 4390040.52, + 4386558.73, + 4390749.46, + 4393406.02, + 4388752.93, + 4392388.72, + 4392354.49, + 4392993.58, + 4392894.34, + 4387927.21, + 4392364.35, + 4392383.89, + 4392819.65, + 4392148.77, + 4390050.11, + 4390406.49, + 4392901.21, + 4393094.2, + 4386768.44, + 4386427.4, + 4392681.29, + 4393334.34, + 4393600.87, + 4393005.03, + 4393559.62, + 4387874.81, + 4388570.88, + 4388546.25, + 4392933.56, + 4393627.8, + 4393324.14, + 4387649.14, + 4387692.74, + 4388546.79, + 4394072.33, + 4394402.2, + 4390401.47, + 4390128.78, + 4391877.2, + 4392587.18, + 4388420.29, + 4389745.6, + 4391418.14, + 4388839.46, + 4393096.95, + 4388571.11, + 4393171.34, + 4390841.77, + 4392181.06, + 4392856.72, + 4388449.62, + 4392411.94, + 4394444.73, + 4388719.1, + 4387987.42, + 4387972.03, + 4394403.48, + 4388356.46, + 4390056.26, + 4390268.32, + 4389517.34, + 4389601.48, + 4391121.01, + 4388623.67, + 4393325.87, + 4389525.07, + 4390266.66, + 4389300.87, + 4390262.38, + 4390705.57, + 4392873.25, + 4390374.84, + 4390399.23, + 4392253.1, + 4393059.31, + 4391528.26, + 4392601.06, + 4392997.89, + 4393650.26, + 4393985.63, + 4390360.69, + 4390624.79, + 4394221.43, + 4386752.79, + 4386952.58, + 4390551.23, + 4386553.81, + 4391877.36, + 4394195.59, + 4388791.71, + 4389322.09, + 4389763.68, + 4389565.68, + 4389815.96, + 4387960.53, + 4390425.86, + 4388120.39, + 4386682.98, + 4391373.07, + 4391518.06, + 4391607.7, + 4389770.18, + 4389428.48, + 4392541.5, + 4390589.59, + 4390841.28, + 4391448.32, + 4390938.94, + 4391943.85, + 4392009.97, + 4392012.46, + 4392783.3, + 4390906.09, + 4392011.62, + 4391960.59, + 4394208.3, + 4392727.24, + 4394192.67, + 4386953.52, + 4393118.24, + 4393286.6, + 4391740.66, + 4391877.17, + 4391125.91, + 4391447.69, + 4391357.31, + 4386751.56, + 4386760.77, + 4388114.49, + 4388989.69, + 4390834.41, + 4393267.85, + 4393407.29, + 4393097.43, + 4393615.88, + 4389909.61, + 4394549.62, + 4389929.5, + 4392261.12, + 4392174.18, + 4392183.93, + 4389737.79 + ], + "y": [ + 3834988, + 3834207, + 3835428, + 3835089, + 3836810, + 3836358, + 3836259, + 3835097, + 3836347, + 3834213, + 3834021, + 3839171, + 3838846, + 3839264, + 3839168, + 3838610, + 3840222, + 3840245, + 3840097, + 3840059, + 3840046, + 3839705, + 3838124, + 3838362, + 3840176, + 3839292, + 3838385, + 3839305, + 3834502, + 3834885, + 3834233, + 3834487, + 3830007, + 3830002, + 3832133, + 3832409, + 3834161, + 3830234, + 3830238, + 3830407, + 3836929, + 3837022, + 3832431, + 3832448, + 3830422, + 3836559, + 3836334, + 3834892, + 3834959, + 3836745, + 3837233, + 3837348, + 3837364, + 3835845, + 3835850, + 3834047, + 3834071, + 3836572, + 3833329, + 3833348, + 3836312, + 3833676, + 3830194, + 3830203, + 3835152, + 3835812, + 3836322, + 3837395, + 3837646, + 3831230, + 3831464, + 3831511, + 3832034, + 3830724, + 3830967, + 3830229, + 3833477, + 3832929, + 3834123, + 3830001, + 3840293, + 3834977, + 3833365, + 3834009, + 3834000, + 3837679, + 3840587, + 3840597, + 3840606, + 3836815, + 3836801, + 3836799, + 3833671, + 3833997, + 3833661, + 3840505, + 3840559, + 3837006, + 3836762, + 3840557, + 3840559, + 3831717, + 3836886, + 3840586, + 3840659, + 3840445, + 3840160, + 3840165, + 3836898, + 3836905, + 3833288, + 3833037, + 3835201, + 3835203, + 3835575, + 3835375, + 3831315, + 3831927, + 3831925, + 3836526, + 3836534, + 3830752, + 3830950, + 3832769, + 3840349, + 3840348, + 3836115, + 3836517, + 3834655, + 3834665, + 3831637, + 3831638, + 3834006, + 3834015, + 3832760, + 3832809, + 3834014, + 3834012, + 3835605, + 3835367, + 3831282, + 3831290, + 3833691, + 3833965, + 3837479, + 3837899, + 3836545, + 3836745, + 3836297, + 3836299, + 3840044, + 3840030, + 3840038, + 3837939, + 3838334, + 3840633, + 3840926, + 3837477, + 3834963, + 3837712, + 3837723, + 3832121, + 3832284, + 3834554, + 3834558, + 3836050, + 3836961, + 3836974, + 3840039, + 3834745, + 3834850, + 3832000, + 3837017, + 3837030, + 3833589, + 3833381, + 3840094, + 3831526, + 3831557, + 3840929, + 3832215, + 3834447, + 3834463, + 3840351, + 3834902, + 3831147, + 3834750, + 3834704, + 3836518, + 3836549, + 3834292, + 3831564, + 3830198, + 3831644, + 3836981, + 3834669, + 3838637, + 3839044, + 3830593, + 3840067, + 3840089, + 3834454, + 3833616, + 3832826, + 3832376, + 3833144, + 3838406, + 3837927, + 3831331, + 3840055, + 3833372, + 3840027, + 3832386, + 3834434, + 3834445, + 3833292, + 3833675, + 3835432, + 3835439, + 3836113, + 3836538, + 3832219, + 3836855, + 3831562, + 3833581, + 3834937, + 3841470, + 3833923, + 3833992, + 3840473, + 3840490, + 3840491, + 3840490, + 3840636, + 3836779, + 3833952, + 3840953, + 3836734, + 3833618, + 3832478, + 3834242, + 3830050, + 3834403, + 3834378, + 3834696, + 3834690, + 3834461, + 3830310, + 3834359, + 3830050, + 3834565, + 3835281, + 3835263, + 3840057, + 3840058, + 3832369, + 3832176, + 3839711, + 3837902, + 3838483, + 3836061, + 3835634, + 3834115, + 3834024, + 3838832, + 3838850, + 3835713, + 3835587, + 3834157, + 3834072, + 3834044, + 3834007, + 3836600, + 3836326, + 3832471, + 3832426, + 3841871, + 3841836, + 3839557, + 3839729, + 3839300, + 3831479, + 3831227, + 3833145, + 3832916, + 3840072, + 3841907, + 3839781, + 3839473, + 3839375, + 3839742, + 3839658, + 3835450, + 3835445, + 3839913, + 3839899, + 3839737, + 3839974, + 3839262, + 3833670, + 3838808, + 3838567, + 3834079, + 3834078, + 3839286, + 3839277, + 3836650, + 3836714, + 3840643, + 3835067, + 3835060, + 3834118, + 3830526, + 3830936, + 3836054, + 3835754, + 3831116, + 3830838, + 3833773, + 3830918, + 3833419, + 3833394, + 3835441, + 3832149, + 3838405, + 3839203, + 3835889, + 3836249, + 3839376, + 3832893, + 3832684, + 3840938, + 3831983, + 3831749, + 3831795, + 3839456, + 3834647, + 3836994, + 3836619, + 3835904, + 3835922, + 3835091, + 3836610, + 3836707, + 3839782, + 3839687, + 3839674, + 3832624, + 3835173, + 3835158, + 3840123, + 3840136, + 3839660, + 3837565, + 3838987, + 3833175, + 3832027, + 3835214, + 3836077, + 3836064, + 3834078, + 3834077, + 3830590, + 3835178, + 3836301, + 3834044, + 3835331, + 3835584, + 3835650, + 3838714, + 3835069, + 3830498, + 3834261, + 3834818, + 3834942, + 3834515, + 3835496, + 3835405, + 3837349, + 3835189, + 3836353, + 3834521, + 3834818, + 3836346, + 3837352, + 3834942, + 3834979, + 3834960, + 3834956, + 3835032, + 3835491, + 3835865, + 3835225, + 3833952, + 3841930, + 3839389, + 3830342, + 3832107, + 3831658, + 3832046, + 3833870, + 3832835, + 3832862, + 3840559, + 3831714, + 3832640, + 3833262, + 3834859, + 3832452, + 3836331, + 3836312, + 3835759, + 3832372, + 3836306, + 3838949, + 3830290, + 3834242, + 3834253, + 3836337, + 3831618, + 3831773, + 3830944, + 3840064, + 3840062, + 3840286, + 3840288, + 3840263, + 3840260, + 3836531, + 3836571, + 3830457, + 3830230, + 3830042, + 3830013, + 3840035, + 3840045, + 3831258, + 3835359, + 3835344, + 3833926, + 3833968, + 3831901, + 3832143, + 3836362, + 3834759, + 3834763, + 3835401, + 3835325, + 3835181, + 3835283, + 3835192, + 3835233, + 3835316, + 3834530, + 3834524, + 3840948, + 3840572, + 3840591, + 3840567, + 3841001, + 3835820, + 3835206, + 3837457, + 3837474, + 3837392, + 3837414, + 3834264, + 3834067, + 3835646, + 3834276, + 3834471, + 3833959, + 3834518, + 3834624, + 3835191, + 3833662, + 3835230, + 3835400, + 3835301, + 3835193, + 3836937, + 3841908, + 3841931, + 3836507, + 3836524, + 3836537, + 3836475, + 3830189, + 3831326, + 3837618, + 3837615, + 3832819, + 3833453, + 3833452, + 3840047, + 3839272, + 3839489, + 3836073, + 3836272, + 3834037, + 3840773, + 3831895, + 3838851, + 3839052, + 3837631, + 3837619, + 3839760, + 3840637, + 3836443, + 3833575, + 3833548, + 3837724, + 3840646, + 3841684, + 3836246, + 3836646, + 3830603, + 3830837, + 3837815, + 3832399, + 3834784, + 3834776, + 3834525, + 3834511, + 3839918, + 3839912, + 3840035, + 3833933, + 3833900, + 3840512, + 3840514, + 3832292, + 3832815, + 3834461, + 3835652, + 3832345, + 3831622, + 3831864, + 3836315, + 3836303, + 3839475, + 3831621, + 3831290, + 3831307, + 3831611, + 3840313, + 3839084, + 3839492, + 3841907, + 3839940, + 3834166, + 3839970, + 3840936, + 3834056, + 3831875, + 3840166, + 3834456, + 3834539, + 3831034, + 3830939, + 3833883, + 3834937, + 3834041, + 3834956, + 3834944, + 3835182, + 3830240, + 3840350, + 3831180, + 3831488, + 3841146, + 3833158, + 3836573, + 3831285, + 3831889, + 3833551, + 3834299, + 3835056, + 3839000, + 3834516, + 3834309, + 3835188, + 3835610, + 3834559, + 3834905, + 3833225, + 3833230, + 3831589, + 3831312, + 3835439, + 3835406, + 3830207, + 3836489, + 3830462, + 3831316, + 3832386, + 3837660, + 3835079, + 3835126, + 3840305, + 3839771, + 3839782, + 3836448, + 3830211, + 3839499, + 3836332, + 3833594, + 3833097, + 3833454, + 3833650, + 3841907, + 3832398, + 3841134, + 3840225, + 3839045, + 3832134, + 3839308, + 3830162, + 3836012, + 3832419, + 3834969, + 3836068, + 3834700, + 3839629, + 3834095, + 3834117, + 3839751, + 3840384, + 3835105, + 3833759, + 3839359, + 3838397, + 3834155, + 3835658, + 3830115, + 3831574, + 3834056, + 3834103, + 3835216, + 3834449, + 3830900, + 3834930, + 3831586, + 3830873, + 3839233, + 3833566, + 3833388, + 3833383, + 3833803, + 3835674, + 3835446, + 3835656, + 3833364, + 3833804, + 3832975, + 3834662, + 3837829, + 3830488, + 3831520, + 3837241, + 3837360, + 3841866, + 3836313, + 3834113, + 3837214, + 3836797, + 3836854, + 3836782, + 3834983, + 3835290, + 3835271, + 3834596, + 3831614, + 3831839, + 3832168, + 3831335, + 3832912, + 3832456, + 3838128, + 3837823, + 3831863, + 3834219, + 3834010, + 3834445, + 3832101, + 3837999, + 3838093, + 3830352, + 3830730, + 3839664, + 3831302, + 3835203, + 3831788, + 3838297, + 3835082, + 3830724, + 3832706, + 3837967, + 3838173, + 3836408, + 3832754, + 3831604, + 3837631, + 3836727, + 3836728, + 3838140, + 3836406, + 3836735, + 3837911, + 3830027, + 3831601, + 3833778, + 3830935, + 3832076, + 3833619, + 3833992, + 3832358, + 3832348, + 3830299, + 3831857, + 3840058, + 3830029, + 3839145, + 3839149, + 3839210, + 3837243, + 3830461, + 3839146, + 3839135, + 3834914, + 3837626, + 3837037, + 3837742, + 3837737, + 3838081, + 3830589, + 3830852, + 3834632, + 3841866, + 3841870, + 3838880, + 3838577, + 3833486, + 3831214, + 3831178, + 3839081, + 3841836, + 3841880, + 3830106, + 3830161, + 3834078, + 3834235, + 3834061, + 3834542, + 3833157, + 3837034, + 3836662, + 3831026, + 3834448, + 3831494, + 3832642, + 3834571, + 3832848, + 3834961, + 3837193, + 3838823, + 3838961, + 3831067, + 3839150, + 3840284, + 3834673, + 3830454, + 3830429, + 3834060, + 3833019, + 3832352, + 3832172, + 3833456, + 3831880, + 3836965, + 3834756, + 3837174, + 3835096, + 3837857, + 3833664, + 3832173, + 3833990, + 3838937, + 3838111, + 3838089, + 3836045, + 3835608, + 3839734, + 3839622, + 3839425, + 3839964, + 3839787, + 3838078, + 3838699, + 3839663, + 3831783, + 3832049, + 3836709, + 3831935, + 3837821, + 3840090, + 3832666, + 3835667, + 3834452, + 3834553, + 3834561, + 3832793, + 3833464, + 3832573, + 3830619, + 3831382, + 3833637, + 3833703, + 3834580, + 3835869, + 3833397, + 3833812, + 3837134, + 3837992, + 3834476, + 3837362, + 3837345, + 3837350, + 3836969, + 3834417, + 3837348, + 3837393, + 3840115, + 3836920, + 3840084, + 3830720, + 3837651, + 3837959, + 3834122, + 3837765, + 3836413, + 3838040, + 3831362, + 3830509, + 3830559, + 3832625, + 3835066, + 3835110, + 3839116, + 3839369, + 3839199, + 3839263, + 3836728, + 3834017, + 3836762, + 3837220, + 3840655, + 3840660.56, + 3830153.17 + ] + } + ], + "layout": { + "annotations": [ + { + "showarrow": false, + "text": "Python code: https://plotly.com/ipython-notebooks/network-graphs/", + "x": 0.005, + "xref": "paper", + "y": -0.002, + "yref": "paper" + } + ], + "hovermode": "closest", + "margin": { + "b": 20, + "l": 5, + "r": 5, + "t": 40 + }, + "showlegend": false, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "font": { + "size": 16 + }, + "text": "
Network graph made with Python" + }, + "xaxis": { + "showgrid": false, + "showticklabels": false, + "zeroline": false + }, + "yaxis": { + "showgrid": false, + "showticklabels": false, + "zeroline": false + } + } + }, + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = go.Figure(data=[edge_trace, node_trace],\n", + " layout=go.Layout(\n", + " title='
Network graph made with Python',\n", + " titlefont_size=16,\n", + " showlegend=False,\n", + " hovermode='closest',\n", + " margin=dict(b=20,l=5,r=5,t=40),\n", + " annotations=[ dict(\n", + " text=\"Python code: https://plotly.com/ipython-notebooks/network-graphs/\",\n", + " showarrow=False,\n", + " xref=\"paper\", yref=\"paper\",\n", + " x=0.005, y=-0.002 ) ],\n", + " xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),\n", + " yaxis=dict(showgrid=False, zeroline=False, showticklabels=False))\n", + " )\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "id": "7f2371aa", + "metadata": {}, + "source": [ + "### Find shortest paths \n", + "###### According to the formula in the paper" + ] + }, + { + "cell_type": "code", + "execution_count": 306, + "id": "962ae1aa", + "metadata": {}, + "outputs": [], + "source": [ + "bb = nx.edge_betweenness_centrality(G, normalized=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 270, + "id": "0505b67b", + "metadata": {}, + "outputs": [], + "source": [ + "new_edges.loc[new_edges[(edges[\"node1\"]==s) & (edges[\"node2\"]==t)].index,\"bce\"] = 0.545" + ] + }, + { + "cell_type": "code", + "execution_count": 275, + "id": "0bd79821", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnode1node2lengthdiameterroughnessminorlossstatuslength_x0.5diameter_x0.5roughness_x0.5
0P-1J-1J-2274.685760914.4100.00.0OPEN137.342880457.250.0
1P-2J-3J-4117.591535914.4100.00.0OPEN58.795768457.250.0
2P-3J-5J-6155.417215914.4100.00.0OPEN77.708608457.250.0
3P-4J-7J-3286.999375914.4100.00.0OPEN143.499688457.250.0
4P-5J-8J-138.404800914.4100.00.0OPEN19.202400457.250.0
....................................
979P-3751J-3348J-33493.779215508.0100.00.0OPEN1.889608254.050.0
980P-3752J-116J-33480.030480203.2100.00.0OPEN0.015240101.650.0
981P-3753J-3349J-1034.754880508.0100.00.0OPEN2.377440254.050.0
982P-3680T-5J-4865.913120508.0100.00.0OPEN2.956560254.050.0
983P-72T-1J-7123.164800508.0100.00.0OPEN11.582400254.050.0
\n", + "

984 rows × 11 columns

\n", + "
" + ], + "text/plain": [ + " id node1 node2 length diameter roughness minorloss \\\n", + "0 P-1 J-1 J-2 274.685760 914.4 100.0 0.0 \n", + "1 P-2 J-3 J-4 117.591535 914.4 100.0 0.0 \n", + "2 P-3 J-5 J-6 155.417215 914.4 100.0 0.0 \n", + "3 P-4 J-7 J-3 286.999375 914.4 100.0 0.0 \n", + "4 P-5 J-8 J-1 38.404800 914.4 100.0 0.0 \n", + ".. ... ... ... ... ... ... ... \n", + "979 P-3751 J-3348 J-3349 3.779215 508.0 100.0 0.0 \n", + "980 P-3752 J-116 J-3348 0.030480 203.2 100.0 0.0 \n", + "981 P-3753 J-3349 J-103 4.754880 508.0 100.0 0.0 \n", + "982 P-3680 T-5 J-486 5.913120 508.0 100.0 0.0 \n", + "983 P-72 T-1 J-71 23.164800 508.0 100.0 0.0 \n", + "\n", + " status length_x0.5 diameter_x0.5 roughness_x0.5 \n", + "0 OPEN 137.342880 457.2 50.0 \n", + "1 OPEN 58.795768 457.2 50.0 \n", + "2 OPEN 77.708608 457.2 50.0 \n", + "3 OPEN 143.499688 457.2 50.0 \n", + "4 OPEN 19.202400 457.2 50.0 \n", + ".. ... ... ... ... \n", + "979 OPEN 1.889608 254.0 50.0 \n", + "980 OPEN 0.015240 101.6 50.0 \n", + "981 OPEN 2.377440 254.0 50.0 \n", + "982 OPEN 2.956560 254.0 50.0 \n", + "983 OPEN 11.582400 254.0 50.0 \n", + "\n", + "[984 rows x 11 columns]" + ] + }, + "execution_count": 275, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "edges" + ] + }, + { + "cell_type": "code", + "execution_count": 308, + "id": "6359096a", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "new_edges = edges.copy()\n", + "new_edges[\"bce\"] = 0\n", + "for s, t in bb.keys():\n", + " new_edges.loc[new_edges[(edges[\"node1\"]==s) & (edges[\"node2\"] == t)].index,\"bce\"] = bb[(s,t)]" + ] + }, + { + "cell_type": "code", + "execution_count": 310, + "id": "4cb8cec1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnode1node2lengthdiameterroughnessminorlossstatusbce
0P-1J-1J-2274.685760914.4100.00.0OPEN0.000004
1P-2J-3J-4117.591535914.4100.00.0OPEN0.000004
2P-3J-5J-6155.417215914.4100.00.0OPEN0.000001
3P-4J-7J-3286.999375914.4100.00.0OPEN0.000005
4P-5J-8J-138.404800914.4100.00.0OPEN0.000062
..............................
979P-3751J-3348J-33493.779215508.0100.00.0OPEN0.000073
980P-3752J-116J-33480.030480203.2100.00.0OPEN0.000019
981P-3753J-3349J-1034.754880508.0100.00.0OPEN0.000079
982P-3680T-5J-4865.913120508.0100.00.0OPEN0.000001
983P-72T-1J-7123.164800508.0100.00.0OPEN0.000236
\n", + "

984 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " id node1 node2 length diameter roughness minorloss \\\n", + "0 P-1 J-1 J-2 274.685760 914.4 100.0 0.0 \n", + "1 P-2 J-3 J-4 117.591535 914.4 100.0 0.0 \n", + "2 P-3 J-5 J-6 155.417215 914.4 100.0 0.0 \n", + "3 P-4 J-7 J-3 286.999375 914.4 100.0 0.0 \n", + "4 P-5 J-8 J-1 38.404800 914.4 100.0 0.0 \n", + ".. ... ... ... ... ... ... ... \n", + "979 P-3751 J-3348 J-3349 3.779215 508.0 100.0 0.0 \n", + "980 P-3752 J-116 J-3348 0.030480 203.2 100.0 0.0 \n", + "981 P-3753 J-3349 J-103 4.754880 508.0 100.0 0.0 \n", + "982 P-3680 T-5 J-486 5.913120 508.0 100.0 0.0 \n", + "983 P-72 T-1 J-71 23.164800 508.0 100.0 0.0 \n", + "\n", + " status bce \n", + "0 OPEN 0.000004 \n", + "1 OPEN 0.000004 \n", + "2 OPEN 0.000001 \n", + "3 OPEN 0.000005 \n", + "4 OPEN 0.000062 \n", + ".. ... ... \n", + "979 OPEN 0.000073 \n", + "980 OPEN 0.000019 \n", + "981 OPEN 0.000079 \n", + "982 OPEN 0.000001 \n", + "983 OPEN 0.000236 \n", + "\n", + "[984 rows x 9 columns]" + ] + }, + "execution_count": 310, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "edges = new_edges\n", + "edges" + ] + }, + { + "cell_type": "code", + "execution_count": 277, + "id": "a5c16356", + "metadata": {}, + "outputs": [], + "source": [ + "## Go through all edges in dataframe\n", + "\n", + "### For each edge 'e'\n", + "\n", + "#### Go through all other edges \n", + "\n", + "##### " + ] + }, + { + "cell_type": "code", + "execution_count": 311, + "id": "5b3f8b75", + "metadata": {}, + "outputs": [], + "source": [ + "def get_pipe_info(s,t):\n", + " return edges[(edges[\"node1\"]==s) & (edges[\"node2\"] == t)]" + ] + }, + { + "cell_type": "markdown", + "id": "0aa247a1", + "metadata": {}, + "source": [ + "#### Create weighted length and diameters" + ] + }, + { + "cell_type": "code", + "execution_count": 312, + "id": "72221d28", + "metadata": {}, + "outputs": [], + "source": [ + "A,B = 0.2, 0.6" + ] + }, + { + "cell_type": "code", + "execution_count": 313, + "id": "61f844e1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnode1node2lengthdiameterroughnessminorlossstatusbcelength_x0.5diameter_x0.5Z
0P-1J-1J-2274.685760914.4100.00.0OPEN0.000004137.342880457.2594.542880
1P-2J-3J-4117.591535914.4100.00.0OPEN0.00000458.795768457.2515.995768
2P-3J-5J-6155.417215914.4100.00.0OPEN0.00000177.708608457.2534.908608
3P-4J-7J-3286.999375914.4100.00.0OPEN0.000005143.499688457.2600.699688
4P-5J-8J-138.404800914.4100.00.0OPEN0.00006219.202400457.2476.402400
\n", + "
" + ], + "text/plain": [ + " id node1 node2 length diameter roughness minorloss status \\\n", + "0 P-1 J-1 J-2 274.685760 914.4 100.0 0.0 OPEN \n", + "1 P-2 J-3 J-4 117.591535 914.4 100.0 0.0 OPEN \n", + "2 P-3 J-5 J-6 155.417215 914.4 100.0 0.0 OPEN \n", + "3 P-4 J-7 J-3 286.999375 914.4 100.0 0.0 OPEN \n", + "4 P-5 J-8 J-1 38.404800 914.4 100.0 0.0 OPEN \n", + "\n", + " bce length_x0.5 diameter_x0.5 Z \n", + "0 0.000004 137.342880 457.2 594.542880 \n", + "1 0.000004 58.795768 457.2 515.995768 \n", + "2 0.000001 77.708608 457.2 534.908608 \n", + "3 0.000005 143.499688 457.2 600.699688 \n", + "4 0.000062 19.202400 457.2 476.402400 " + ] + }, + "execution_count": 313, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "edges['length_x0.5'] = edges['length'] / 2\n", + "edges['diameter_x0.5'] = edges['diameter'] / 2\n", + "edges['Z'] = edges['length_x0.5'] + edges['diameter_x0.5']\n", + "edges.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 314, + "id": "7a800d6f", + "metadata": {}, + "outputs": [], + "source": [ + "# A*Ci + B*Z" + ] + }, + { + "cell_type": "code", + "execution_count": 315, + "id": "51626b48", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnode1node2lengthdiameterroughnessminorlossstatusbcelength_x0.5diameter_x0.5Zweight
0P-1J-1J-2274.685760914.4100.00.0OPEN0.000004137.342880457.2594.542880356.725729
1P-2J-3J-4117.591535914.4100.00.0OPEN0.00000458.795768457.2515.995768309.597461
2P-3J-5J-6155.417215914.4100.00.0OPEN0.00000177.708608457.2534.908608320.945165
3P-4J-7J-3286.999375914.4100.00.0OPEN0.000005143.499688457.2600.699688360.419814
4P-5J-8J-138.404800914.4100.00.0OPEN0.00006219.202400457.2476.402400285.841452
..........................................
979P-3751J-3348J-33493.779215508.0100.00.0OPEN0.0000731.889608254.0255.889608153.533779
980P-3752J-116J-33480.030480203.2100.00.0OPEN0.0000190.015240101.6101.61524060.969148
981P-3753J-3349J-1034.754880508.0100.00.0OPEN0.0000792.377440254.0256.377440153.826480
982P-3680T-5J-4865.913120508.0100.00.0OPEN0.0000012.956560254.0256.956560154.173936
983P-72T-1J-7123.164800508.0100.00.0OPEN0.00023611.582400254.0265.582400159.349487
\n", + "

984 rows × 13 columns

\n", + "
" + ], + "text/plain": [ + " id node1 node2 length diameter roughness minorloss \\\n", + "0 P-1 J-1 J-2 274.685760 914.4 100.0 0.0 \n", + "1 P-2 J-3 J-4 117.591535 914.4 100.0 0.0 \n", + "2 P-3 J-5 J-6 155.417215 914.4 100.0 0.0 \n", + "3 P-4 J-7 J-3 286.999375 914.4 100.0 0.0 \n", + "4 P-5 J-8 J-1 38.404800 914.4 100.0 0.0 \n", + ".. ... ... ... ... ... ... ... \n", + "979 P-3751 J-3348 J-3349 3.779215 508.0 100.0 0.0 \n", + "980 P-3752 J-116 J-3348 0.030480 203.2 100.0 0.0 \n", + "981 P-3753 J-3349 J-103 4.754880 508.0 100.0 0.0 \n", + "982 P-3680 T-5 J-486 5.913120 508.0 100.0 0.0 \n", + "983 P-72 T-1 J-71 23.164800 508.0 100.0 0.0 \n", + "\n", + " status bce length_x0.5 diameter_x0.5 Z weight \n", + "0 OPEN 0.000004 137.342880 457.2 594.542880 356.725729 \n", + "1 OPEN 0.000004 58.795768 457.2 515.995768 309.597461 \n", + "2 OPEN 0.000001 77.708608 457.2 534.908608 320.945165 \n", + "3 OPEN 0.000005 143.499688 457.2 600.699688 360.419814 \n", + "4 OPEN 0.000062 19.202400 457.2 476.402400 285.841452 \n", + ".. ... ... ... ... ... ... \n", + "979 OPEN 0.000073 1.889608 254.0 255.889608 153.533779 \n", + "980 OPEN 0.000019 0.015240 101.6 101.615240 60.969148 \n", + "981 OPEN 0.000079 2.377440 254.0 256.377440 153.826480 \n", + "982 OPEN 0.000001 2.956560 254.0 256.956560 154.173936 \n", + "983 OPEN 0.000236 11.582400 254.0 265.582400 159.349487 \n", + "\n", + "[984 rows x 13 columns]" + ] + }, + "execution_count": 315, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "edges['weight'] = A * edges['bce'] + B * edges[\"Z\"]\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd55cfa3", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "zero_p = 0.4\n", + "edges['rnd'] = np.random.choice([0, 1], size=edges.shape[0], p=[zero_p, 1-zero_p])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a3437110", + "metadata": {}, + "outputs": [], + "source": [ + "edges" + ] + }, + { + "cell_type": "markdown", + "id": "fb632748", + "metadata": {}, + "source": [ + "#### Finding Minimum eigen value" + ] + }, + { + "cell_type": "code", + "execution_count": 316, + "id": "10ee701a", + "metadata": {}, + "outputs": [ + { + "ename": "NetworkXNotImplemented", + "evalue": "not implemented for directed type", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNetworkXNotImplemented\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[316], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m L \u001b[38;5;241m=\u001b[39m \u001b[43mnx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnormalized_laplacian_matrix\u001b[49m\u001b[43m(\u001b[49m\u001b[43mG\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 2\u001b[0m e \u001b[38;5;241m=\u001b[39m numpy\u001b[38;5;241m.\u001b[39mlinalg\u001b[38;5;241m.\u001b[39meigvals(L\u001b[38;5;241m.\u001b[39mtoarray())\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mLargest eigenvalue:\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28mmax\u001b[39m(e))\n", + "File \u001b[1;32mD:\\Miniconda\\lib\\site-packages\\networkx\\utils\\decorators.py:845\u001b[0m, in \u001b[0;36margmap.__call__..func\u001b[1;34m(_argmap__wrapper, *args, **kwargs)\u001b[0m\n\u001b[0;32m 844\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc\u001b[39m(\u001b[38;5;241m*\u001b[39margs, __wrapper\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m--> 845\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m argmap\u001b[38;5;241m.\u001b[39m_lazy_compile(__wrapper)(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", + "File \u001b[1;32m compilation 12:3\u001b[0m, in \u001b[0;36margmap_normalized_laplacian_matrix_9\u001b[1;34m(G, nodelist, weight)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mbz2\u001b[39;00m\n\u001b[0;32m 2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mcollections\u001b[39;00m\n\u001b[1;32m----> 3\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mgzip\u001b[39;00m\n\u001b[0;32m 4\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01minspect\u001b[39;00m\n\u001b[0;32m 5\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mitertools\u001b[39;00m\n", + "File \u001b[1;32mD:\\Miniconda\\lib\\site-packages\\networkx\\utils\\decorators.py:88\u001b[0m, in \u001b[0;36mnot_implemented_for.._not_implemented_for\u001b[1;34m(g)\u001b[0m\n\u001b[0;32m 84\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_not_implemented_for\u001b[39m(g):\n\u001b[0;32m 85\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (mval \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mor\u001b[39;00m mval \u001b[38;5;241m==\u001b[39m g\u001b[38;5;241m.\u001b[39mis_multigraph()) \u001b[38;5;129;01mand\u001b[39;00m (\n\u001b[0;32m 86\u001b[0m dval \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mor\u001b[39;00m dval \u001b[38;5;241m==\u001b[39m g\u001b[38;5;241m.\u001b[39mis_directed()\n\u001b[0;32m 87\u001b[0m ):\n\u001b[1;32m---> 88\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m nx\u001b[38;5;241m.\u001b[39mNetworkXNotImplemented(errmsg)\n\u001b[0;32m 90\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m g\n", + "\u001b[1;31mNetworkXNotImplemented\u001b[0m: not implemented for directed type" + ] + } + ], + "source": [ + "L = nx.normalized_laplacian_matrix(G)\n", + "e = numpy.linalg.eigvals(L.toarray())\n", + "print(\"Largest eigenvalue:\", max(e))\n", + "print(\"Smallest eigenvalue:\", min(e))\n", + "plt.hist(e, bins=100) # histogram with 100 bins\n", + "plt.xlim(0, 2) # eigenvalues between 0 and 2\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5dcb828a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/QML_rancode.ipynb b/QML_rancode.ipynb new file mode 100644 index 00000000..60f4cb98 --- /dev/null +++ b/QML_rancode.ipynb @@ -0,0 +1,498 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "dPIxaRoBBvWq", + "outputId": "ae99723a-69a9-4108-f81a-81f056c1b301" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m35.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m352.1/352.1 kB\u001b[0m \u001b[31m27.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m16.5/16.5 MB\u001b[0m \u001b[31m46.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m48.3/48.3 kB\u001b[0m \u001b[31m4.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.9/1.9 MB\u001b[0m \u001b[31m46.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h" + ] + } + ], + "source": [ + "!pip install pennylane dm-haiku --quiet" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "6taEfGwayspN", + "outputId": "f2561169-cf0b-43f9-ae53-f7c0f12de365" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.10/dist-packages/haiku/_src/base.py:515: UserWarning: Explicitly requested dtype float64 requested in zeros is not available, and will be truncated to dtype float32. To enable more dtypes, set the jax_enable_x64 configuration option or the JAX_ENABLE_X64 shell environment variable. See https://github.com/google/jax#current-gotchas for more.\n", + " param = init(shape, dtype)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1, Loss: 0.6973\n", + "Epoch 2, Loss: 0.6968\n", + "Epoch 3, Loss: 0.6962\n", + "Epoch 4, Loss: 0.6953\n", + "Epoch 5, Loss: 0.6947\n", + "Epoch 6, Loss: 0.6937\n", + "Epoch 7, Loss: 0.6929\n", + "Epoch 8, Loss: 0.6922\n", + "Epoch 9, Loss: 0.6918\n", + "Epoch 10, Loss: 0.6908\n", + "Epoch 11, Loss: 0.6899\n", + "Epoch 12, Loss: 0.6878\n", + "Epoch 13, Loss: 0.6859\n", + "Epoch 14, Loss: 0.6845\n", + "Epoch 15, Loss: 0.6834\n", + "Epoch 16, Loss: 0.6819\n", + "Epoch 17, Loss: 0.6804\n", + "Epoch 18, Loss: 0.6783\n", + "Epoch 19, Loss: 0.6768\n", + "Epoch 20, Loss: 0.6753\n", + "Epoch 21, Loss: 0.6747\n", + "Epoch 22, Loss: 0.6724\n", + "Epoch 23, Loss: 0.6711\n", + "Epoch 24, Loss: 0.6699\n", + "Epoch 25, Loss: 0.6686\n", + "Epoch 26, Loss: 0.6659\n", + "Epoch 27, Loss: 0.6636\n", + "Epoch 28, Loss: 0.6528\n", + "Epoch 29, Loss: 0.6489\n", + "Epoch 30, Loss: 0.6482\n", + "Epoch 31, Loss: 0.6420\n", + "Epoch 32, Loss: 0.6408\n", + "Epoch 33, Loss: 0.6362\n", + "Epoch 34, Loss: 0.6350\n", + "Epoch 35, Loss: 0.6314\n", + "Epoch 36, Loss: 0.6303\n", + "Epoch 37, Loss: 0.6291\n", + "Epoch 38, Loss: 0.6285\n", + "Epoch 39, Loss: 0.6259\n", + "Epoch 40, Loss: 0.6189\n", + "Epoch 41, Loss: 0.6189\n", + "Epoch 42, Loss: 0.6201\n", + "Epoch 43, Loss: 0.6115\n", + "Epoch 44, Loss: 0.6082\n", + "Epoch 45, Loss: 0.6081\n", + "Epoch 46, Loss: 0.6055\n", + "Epoch 47, Loss: 0.6000\n", + "Epoch 48, Loss: 0.5969\n", + "Epoch 49, Loss: 0.5963\n", + "Epoch 50, Loss: 0.5977\n", + "Epoch 51, Loss: 0.5964\n", + "Epoch 52, Loss: 0.5866\n", + "Epoch 53, Loss: 0.5828\n", + "Epoch 54, Loss: 0.5919\n", + "Epoch 55, Loss: 0.5939\n", + "Epoch 56, Loss: 0.5844\n", + "Epoch 57, Loss: 0.5813\n", + "Epoch 58, Loss: 0.5717\n", + "Epoch 59, Loss: 0.5730\n", + "Epoch 60, Loss: 0.5682\n", + "Epoch 61, Loss: 0.5668\n", + "Epoch 62, Loss: 0.5653\n", + "Epoch 63, Loss: 0.5648\n", + "Epoch 64, Loss: 0.5640\n", + "Epoch 65, Loss: 0.5594\n", + "Epoch 66, Loss: 0.5556\n", + "Epoch 67, Loss: 0.5579\n", + "Epoch 68, Loss: 0.5494\n", + "Epoch 69, Loss: 0.5431\n", + "Epoch 70, Loss: 0.5444\n", + "Epoch 71, Loss: 0.5365\n", + "Epoch 72, Loss: 0.5354\n", + "Epoch 73, Loss: 0.5461\n", + "Epoch 74, Loss: 0.5383\n", + "Epoch 75, Loss: 0.5366\n", + "Epoch 76, Loss: 0.5329\n", + "Epoch 77, Loss: 0.5570\n", + "Epoch 78, Loss: 0.5520\n", + "Epoch 79, Loss: 0.5422\n", + "Epoch 80, Loss: 0.5543\n", + "Epoch 81, Loss: 0.5417\n", + "Epoch 82, Loss: 0.5392\n", + "Epoch 83, Loss: 0.5344\n", + "Epoch 84, Loss: 0.5329\n", + "Epoch 85, Loss: 0.5349\n", + "Epoch 86, Loss: 0.5351\n", + "Epoch 87, Loss: 0.5242\n", + "Epoch 88, Loss: 0.5249\n", + "Epoch 89, Loss: 0.5254\n", + "Epoch 90, Loss: 0.5295\n", + "Epoch 91, Loss: 0.5276\n", + "Epoch 92, Loss: 0.4931\n", + "Epoch 93, Loss: 0.4872\n", + "Epoch 94, Loss: 0.4998\n", + "Epoch 95, Loss: 0.4957\n", + "Epoch 96, Loss: 0.4847\n", + "Epoch 97, Loss: 0.4887\n", + "Epoch 98, Loss: 0.4762\n", + "Epoch 99, Loss: 0.4708\n", + "Epoch 100, Loss: 0.4756\n", + "Epoch 101, Loss: 0.4731\n", + "Epoch 102, Loss: 0.4689\n", + "Epoch 103, Loss: 0.4656\n", + "Epoch 104, Loss: 0.4638\n", + "Epoch 105, Loss: 0.4601\n", + "Epoch 106, Loss: 0.4613\n", + "Epoch 107, Loss: 0.4599\n", + "Epoch 108, Loss: 0.4595\n", + "Epoch 109, Loss: 0.4592\n", + "Epoch 110, Loss: 0.4585\n", + "Epoch 111, Loss: 0.4495\n", + "Epoch 112, Loss: 0.4550\n", + "Epoch 113, Loss: 0.4466\n", + "Epoch 114, Loss: 0.4440\n", + "Epoch 115, Loss: 0.4409\n", + "Epoch 116, Loss: 0.4405\n", + "Epoch 117, Loss: 0.4447\n", + "Epoch 118, Loss: 0.4434\n", + "Epoch 119, Loss: 0.4368\n", + "Epoch 120, Loss: 0.4337\n", + "Epoch 121, Loss: 0.4387\n", + "Epoch 122, Loss: 0.4324\n", + "Epoch 123, Loss: 0.4351\n", + "Epoch 124, Loss: 0.4250\n", + "Epoch 125, Loss: 0.4297\n", + "Epoch 126, Loss: 0.4320\n", + "Epoch 127, Loss: 0.4266\n", + "Epoch 128, Loss: 0.4318\n", + "Epoch 129, Loss: 0.4211\n", + "Epoch 130, Loss: 0.4265\n", + "Epoch 131, Loss: 0.4192\n", + "Epoch 132, Loss: 0.4149\n", + "Epoch 133, Loss: 0.4185\n", + "Epoch 134, Loss: 0.4090\n", + "Epoch 135, Loss: 0.4210\n", + "Epoch 136, Loss: 0.4134\n", + "Epoch 137, Loss: 0.4160\n", + "Epoch 138, Loss: 0.4159\n", + "Epoch 139, Loss: 0.4265\n", + "Epoch 140, Loss: 0.4128\n", + "Epoch 141, Loss: 0.4077\n", + "Epoch 142, Loss: 0.4034\n", + "Epoch 143, Loss: 0.4170\n", + "Epoch 144, Loss: 0.4000\n", + "Epoch 145, Loss: 0.4023\n", + "Epoch 146, Loss: 0.3993\n", + "Epoch 147, Loss: 0.3987\n", + "Epoch 148, Loss: 0.3993\n", + "Epoch 149, Loss: 0.4092\n", + "Epoch 150, Loss: 0.3969\n", + "Epoch 151, Loss: 0.3918\n", + "Epoch 152, Loss: 0.3926\n", + "Epoch 153, Loss: 0.3921\n", + "Epoch 154, Loss: 0.4061\n", + "Epoch 155, Loss: 0.3945\n", + "Epoch 156, Loss: 0.3893\n", + "Epoch 157, Loss: 0.3919\n", + "Epoch 158, Loss: 0.3867\n", + "Epoch 159, Loss: 0.3869\n", + "Epoch 160, Loss: 0.3947\n", + "Epoch 161, Loss: 0.3821\n", + "Epoch 162, Loss: 0.3817\n", + "Epoch 163, Loss: 0.3832\n", + "Epoch 164, Loss: 0.3827\n", + "Epoch 165, Loss: 0.3918\n", + "Epoch 166, Loss: 0.3833\n", + "Epoch 167, Loss: 0.3740\n", + "Epoch 168, Loss: 0.3771\n", + "Epoch 169, Loss: 0.3739\n", + "Epoch 170, Loss: 0.3755\n", + "Epoch 171, Loss: 0.3813\n", + "Epoch 172, Loss: 0.3827\n", + "Epoch 173, Loss: 0.3916\n", + "Epoch 174, Loss: 0.3773\n", + "Epoch 175, Loss: 0.3772\n", + "Epoch 176, Loss: 0.3696\n", + "Epoch 177, Loss: 0.3704\n", + "Epoch 178, Loss: 0.3787\n", + "Epoch 179, Loss: 0.3839\n", + "Epoch 180, Loss: 0.3809\n", + "Epoch 181, Loss: 0.3663\n", + "Epoch 182, Loss: 0.3654\n", + "Epoch 183, Loss: 0.3645\n", + "Epoch 184, Loss: 0.3681\n", + "Epoch 185, Loss: 0.3652\n", + "Epoch 186, Loss: 0.3641\n", + "Epoch 187, Loss: 0.3833\n", + "Epoch 188, Loss: 0.3744\n", + "Epoch 189, Loss: 0.3745\n", + "Epoch 190, Loss: 0.3634\n", + "Epoch 191, Loss: 0.3626\n", + "Epoch 192, Loss: 0.3895\n", + "Epoch 193, Loss: 0.3808\n", + "Epoch 194, Loss: 0.3705\n", + "Epoch 195, Loss: 0.3921\n", + "Epoch 196, Loss: 0.4188\n", + "Epoch 197, Loss: 0.3709\n", + "Epoch 198, Loss: 0.3606\n", + "Epoch 199, Loss: 0.3568\n", + "Epoch 200, Loss: 0.3519\n", + "Epoch 201, Loss: 0.3483\n", + "Epoch 202, Loss: 0.3596\n", + "Epoch 203, Loss: 0.3624\n", + "Epoch 204, Loss: 0.3691\n", + "Epoch 205, Loss: 0.3583\n", + "Epoch 206, Loss: 0.3506\n", + "Epoch 207, Loss: 0.3544\n", + "Epoch 208, Loss: 0.3567\n", + "Epoch 209, Loss: 0.3499\n", + "Epoch 210, Loss: 0.3553\n", + "Epoch 211, Loss: 0.3533\n", + "Epoch 212, Loss: 0.3457\n", + "Epoch 213, Loss: 0.3425\n", + "Epoch 214, Loss: 0.3588\n", + "Epoch 215, Loss: 0.3553\n", + "Epoch 216, Loss: 0.3503\n", + "Epoch 217, Loss: 0.3487\n", + "Epoch 218, Loss: 0.3473\n", + "Epoch 219, Loss: 0.3387\n", + "Epoch 220, Loss: 0.3489\n", + "Epoch 221, Loss: 0.3583\n", + "Epoch 222, Loss: 0.3566\n", + "Epoch 223, Loss: 0.3432\n", + "Epoch 224, Loss: 0.3456\n", + "Epoch 225, Loss: 0.3446\n", + "Epoch 226, Loss: 0.3446\n", + "Epoch 227, Loss: 0.3353\n", + "Epoch 228, Loss: 0.3394\n", + "Epoch 229, Loss: 0.3393\n", + "Epoch 230, Loss: 0.3406\n", + "Epoch 231, Loss: 0.3435\n", + "Epoch 232, Loss: 0.3380\n", + "Epoch 233, Loss: 0.3381\n", + "Epoch 234, Loss: 0.3350\n", + "Epoch 235, Loss: 0.3337\n", + "Epoch 236, Loss: 0.3351\n", + "Epoch 237, Loss: 0.3519\n", + "Epoch 238, Loss: 0.3534\n", + "Epoch 239, Loss: 0.3434\n", + "Epoch 240, Loss: 0.3354\n", + "Epoch 241, Loss: 0.3455\n", + "Epoch 242, Loss: 0.3628\n", + "Epoch 243, Loss: 0.3321\n", + "Epoch 244, Loss: 0.3352\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import haiku as hk\n", + "import jax\n", + "import optax\n", + "from sklearn.metrics import accuracy_score\n", + "import pennylane as qml\n", + "from pennylane import numpy as np\n", + "import jax\n", + "from jax import random\n", + "import haiku as hk\n", + "\n", + "# Load data\n", + "x_train = pd.read_excel(\"x_train.xlsx\")\n", + "y_train = pd.read_excel(\"y_train.xlsx\")\n", + "x_test = pd.read_excel(\"x_test.xlsx\")\n", + "y_test = pd.read_excel(\"y_test.xlsx\")\n", + "\n", + "n_qubits = 8\n", + "epochs = 500\n", + "batch_size = 32\n", + "num_layers = 8\n", + "\n", + "num_batches = len(x_train) // batch_size\n", + "dev = qml.device(\"default.qubit\", wires=n_qubits)\n", + "\n", + "def quantum_layer(weights):\n", + " qml.templates.AngleEmbedding(weights[:, 0], rotation=\"Y\", wires=range(n_qubits))\n", + " qml.templates.AngleEmbedding(weights[:, 1], rotation=\"Z\", wires=range(n_qubits))\n", + " for i in range(8):\n", + " qml.CNOT(wires=[i, (i + 1) % 8])\n", + "\n", + "@qml.qnode(dev, interface=\"jax\")\n", + "def quantum_circuit(x, circuit_weights):\n", + " for weights in circuit_weights:\n", + " qml.templates.AngleEmbedding(x, wires=range(n_qubits))\n", + " quantum_layer(weights)\n", + " return [qml.expval(qml.PauliZ(i)) for i in range(n_qubits)]\n", + "\n", + "\n", + "@hk.without_apply_rng\n", + "@hk.transform\n", + "def forward(x):\n", + " x = jax.nn.tanh(hk.Linear(8)(x))\n", + " W = hk.get_parameter(\n", + " \"W\", (num_layers, 8, 3), init=hk.initializers.RandomNormal(stddev=0.25)\n", + " )\n", + " x = jax.vmap(quantum_circuit, in_axes=(0, None))(x, W)\n", + " s = hk.get_parameter(\"s\", (8,), init=hk.initializers.Constant(1.0))\n", + " x = hk.Linear(1)(x)\n", + " return x\n", + "\n", + "@hk.without_apply_rng\n", + "@hk.transform\n", + "def cforward(x):\n", + " nn =hk.Sequential([hk.Linear(10), \n", + " jax.nn.relu,\n", + " hk.Linear(10), \n", + " jax.nn.relu,\n", + " hk.Linear(1)])\n", + " return x\n", + "\n", + "seed = 123\n", + "rng = jax.random.PRNGKey(seed)\n", + "params = forward.init(rng, x_train.values)\n", + "opt = optax.radam(learning_rate=5e-4)\n", + "opt_state = opt.init(params)\n", + "\n", + "\n", + "# Training loop\n", + "def loss_fn(params, x, y):\n", + " pred = forward.apply(params, x)\n", + " loss = optax.sigmoid_binary_cross_entropy(pred, y).mean()\n", + " return loss\n", + "\n", + "\n", + "@jax.jit\n", + "def update(params, opt_state, x, y):\n", + " loss, grads = jax.value_and_grad(loss_fn)(params, x, y)\n", + " updates, new_opt_state = opt.update(grads, opt_state)\n", + " new_params = optax.apply_updates(params, updates)\n", + " return new_params, new_opt_state, loss\n", + "\n", + "loss_list = []\n", + "test_acc = []\n", + "for epoch in range(epochs):\n", + " # Shuffle the training data\n", + " shuffled_indices = np.random.permutation(len(x_train))\n", + " x_train_shuffled = x_train.values[shuffled_indices]\n", + " y_train_shuffled = y_train.values[shuffled_indices]\n", + "\n", + " # Training\n", + " epoch_loss = 0\n", + " for batch_idx in range(num_batches):\n", + " start = batch_idx * batch_size\n", + " end = start + batch_size\n", + "\n", + " x_batch = x_train_shuffled[start:end]\n", + " y_batch = y_train_shuffled[start:end]\n", + "\n", + " params, opt_state, batch_loss = update(params, opt_state, x_batch, y_batch)\n", + " epoch_loss += batch_loss\n", + "\n", + " epoch_loss /= num_batches\n", + " loss_list.append(epoch_loss)\n", + "\n", + " # Testing\n", + " y_pred = forward.apply(params, x_test.values)\n", + " y_pred_labels = (y_pred > 0.5).astype(int)\n", + " test_accuracy = accuracy_score(y_test, y_pred_labels)\n", + " print(\n", + " f\"Epoch {epoch + 1}, Loss: {epoch_loss:.4f}\"\n", + " ) # \", Test Accuracy: {test_accuracy:.4f}\")\n", + " test_acc.append(test_accuracy)\n", + "\n", + "# Testing\n", + "y_pred = forward.apply(params, x_test.values)\n", + "y_pred_labels = (y_pred > 0.5).astype(int)\n", + "test_accuracy = accuracy_score(y_test.values, y_pred_labels)\n", + "print(f\"Test Accuracy: {test_accuracy:.4f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "A_9lwsX70I9L" + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 449 + }, + "id": "Hqq14Pn4Nd7W", + "outputId": "9be886ae-abc2-4920-e799-4eaeaa58501e" + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(loss_list)\n", + "plt.xlabel(\"Epochs\")\n", + "plt.ylabel(\"Training Loss\")\n", + "plt.savefig('loss_curve.png')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "TAsI7SC8N3LX" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "provenance": [] + }, + "gpuClass": "standard", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.9.6 (default, Mar 10 2023, 20:16:38) \n[Clang 14.0.3 (clang-1403.0.22.14.1)]" + }, + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/README.md b/README.md index f16278cb..1761caaa 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,7 @@ -[](https://account.qbraid.com?gitHubUrl=https://github.com/qBraid/NYUAD-2023.git) - -# NYUAD Hackathon for Social Good in the Arab World: Focusing on Quantum Computing (QC) +# NYUAD Hackathon for Social Good in the Arab World: Focusing on Quantum Computing (QC) and UN Sustainable Development Goals (SDGs). https://nyuad.nyu.edu/en/events/2022/march/nyuad-hackathon-event.html -March 30 - April 1, 2022 - ## Technical challenge _Create a program that applies one or more quantum algorithms to a social good @@ -18,48 +14,29 @@ problem of your choice._ - Variational Quantum Eigensolver (VQE) - Quantum Approximate Optimization Algorithm (QAOA) -**Social good topic examples**: - -- Healthcare -- Science (e.g. AI, cryptography, biochemistry) -- Environment (climate) -- Education & Literacy -- Food Securities -- Crisis & Public Safety -- Financial Modeling -- Gaming - -**Implementation requirements**: - -- Must utilize quantum hardware available through preferably IBM. However, we - set also have AWS devices available as well. -- You are also free to use any technology which allows you to solve the - challenge. +### Qubo Fault Detection +The program is used for fault detection and diagnosis of graph based networks. The implementation is based on qubo explained in [paper](https://arxiv.org/pdf/1406.7601.pdf). -**Bonus requirements**: +**Requirements:** +- Install pyqubo using: pip install pyqubo -- Incorporate noisy simulation through IBM -- Incorporate a hybrid quantum-classical task through IBM +**Input to the program:** +- Sensor readings +- Paths from source to sensor -# qBraid Tutorials - -Here, we provide useful tutorials on how to use qBraid-Lab, along with tutorials -on quantum computing, using IBM or Amazon Braket. The ladder were provided by -the [qiskit-tutorials](https://github.com/qiskit/qiskit-tutorials) and the -[amazon-braket-examples](https://github.com/aws/amazon-braket-examples) github -repositories repsectively. +--- -The repository is structured as follows: +

+ +

-- [Setting up Qiskit environment](qbraid_qiskit_setup/accessing_ibm_hardware.ipynb) +## Replacing Classical Pressure Sensors with Optimized Quantum Sensors ---- +Compared to classical pressure sensors, quantum sensors are not invasive. They are also tolerant to the changes in the environment around it while also being more accurate. This improves the ability to detect pipe leakage. -## Setting up Qiskit environment in qBraid +## Leak Detection and Localization -- [**Install Qiskit in qBraid-Lab**](qbraid_qiskit_setup/accessing_ibm_hardware.ipynb) +### Using Quantum Machine Learning +Existing classical literature, suggests the use of machine learning to predict leakage and localise it to a particular pipe using the data from pressure sensors in the WDN at any given point of time. We attempt to solve the same using a quantum machine learning based model. -- [**Enable Qiskit QPU access through qBraid-CLI**](qbraid_qiskit_setup/accessing_ibm_hardware.ipynb) -- [**Example environent setup on qBraid Youtube video**](https://www.youtube.com/watch?v=LyavbzSkvRo) (Please use the code EHNU6626) - ---- +Specifically, we collect the pressure data from the optimally-placed sensors in a water distribution network to predict leakage in the WDN using a quantum neural network. It is implemented in the Pennylane framework using Jax. The data is fed into the model using Angle encoding. The model is composed of a parametrised quantum circuit with RY, RZ and CNOT gates which are trained over a total of 500 epochs. We use a train to test-set ratio of 4:1 and optimise the model using Rectified adam over the binary cross-entropy loss. At the end we obtain a test accuracy of 87.02% over the dataset of size 650. diff --git a/WDN_animation.gif b/WDN_animation.gif new file mode 100644 index 00000000..6c7f6271 Binary files /dev/null and b/WDN_animation.gif differ diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..d4bb2cbb --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/_includes/qml_debugging.rst b/docs/_includes/qml_debugging.rst new file mode 100644 index 00000000..6a0f6a3e --- /dev/null +++ b/docs/_includes/qml_debugging.rst @@ -0,0 +1,7 @@ +Debugging module +================ + +.. automodule:: qml_debugging + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 00000000..ecdeebf5 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,68 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = "QatraH" +copyright = "2023, QatraH Dev Eng" +author = "QatraH Dev Eng" +release = "0.0.1" + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [] + +templates_path = ["_templates"] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] + +language = "pyhton, jupyter, quantum computing, qiskit, pennylane, jax, qbraid" + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = "alabaster" +html_static_path = [] + +import os +import sys + +sys.path.insert(0, os.path.abspath("..")) + +# The full version, including alpha/beta/rc tags +release = "0.0.1" + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. + +autosummary_generate = True +extensions = ["sphinx.ext.autodoc", "sphinx.ext.napoleon"] + + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "sphinx_material" + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = [] +html_show_sourcelink = False diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 00000000..09197672 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,23 @@ +.. QatraH documentation master file, created by + sphinx-quickstart on Sun Apr 30 14:32:59 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to QatraH's documentation! +================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + _includes/qml_debugging + + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 00000000..32bb2452 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/fault_detection.py b/fault_detection.py new file mode 100644 index 00000000..27299dbe --- /dev/null +++ b/fault_detection.py @@ -0,0 +1,103 @@ +from pyqubo import Binary +import neal + + + + +def read_input(): + sensor_file = open("sensor_readings.txt", "r") + sensor_readings = [] + sensor_readings.append(1) + sensor_readings.extend([int(x) for x in next(sensor_file).split(',')]) + + paths_file = open("paths.txt", "r") + number_of_nodes = int(next(paths_file)) + paths = [[]] + for line in paths_file: + paths.append([int(x) for x in line.split(',')]) + + return sensor_readings, paths, number_of_nodes + + +def create_optimization_function(sensor_readings, paths, number_of_nodes): + H = 0 + number_of_sensors = len(sensor_readings) - 1 + lambdaPath = 1 + # Add H consistent + for y in range(1, number_of_sensors+1): + l = sensor_readings[y] + # for y in range(1, number_of_sensors+1): + if l == 1: + H+= (lambdaPath * Binary('y'+str(y)) * len(paths[y])) + for x in paths[y]: + H+= (-lambdaPath * Binary('y'+str(y)) * Binary('x'+str(x))) + else: + H+= (lambdaPath*Binary('y'+str(y))*((1-len(paths[y]))**2)) + for x in paths[y]: + H+= (lambdaPath*Binary('y'+str(y))*(Binary('x'+str(x))**2) + 2*lambdaPath*Binary('y'+str(y))*(1-len(paths[y]))*Binary('x'+str(x))) + for j in paths[y]: + if x Circuit: + r""" Construct variational Ramsey interferometer + + Args: + theta_EN: the parameters of encoding circuit, shape is [depth_En, num_qubits,3] + theta_DE: the parameters of decoding circui, shape is [depth_De, num_qubits,3] + input_phi: unknown parameter + + Returns: + Circuit + + """ + depth_EN, depth_DE = theta_EN.shape[0], theta_DE.shape[0] + num_qubits = theta_EN.shape[1] + + cir = Circuit(num_qubits) + cir.ry(param=pi/2) + + # Construct the encoding circuit to generate an entangled state + for depth in range(depth_EN): + cir.u3(param=theta_EN[depth]) + cir.cnot() + + # the gate of unknown parameter + cir.rz(param=input_phi) + + # Construct the decoding circuit to rotate the measurement basis + for depth in range(depth_DE): + cir.cnot() + cir.u3(param=theta_DE[depth]) + + cir.rx(param=pi/2) + + return cir + +# Define the function to calculate m +def calculate_m(num_qubits: int)-> List[int]: + m_list = [] + for k in range(2**num_qubits): + k_bin = list(bin(k)[2:].zfill(num_qubits)) + u = k_bin.count('1') + v = k_bin.count('0') + m = u - v + m_list.append(m) + + return m_list + + +def MSE(qnn: paddle.nn.Layer, phi: float) -> paddle.Tensor: + r""" Calculate MSE + + Args: + cir: variational Ramsey interferometer + phi: unknown parameter + a: parameter of the estimator + + Returns: + MSE + + """ + cir = RamseyCircuit(qnn.theta_EN, qnn.theta_DE, phi) + + # Measurement + output_state = cir() + prob = Measure()(output_state) + + num_qubits = cir.num_qubits + m = calculate_m(num_qubits) + return sum([((phi - qnn.a * m[i]) ** 2) * prob[i] for i in range(2 ** num_qubits)]) + + +def std_mean(numbers): + """ + This function takes a list of numbers as input and returns their mean. + """ + return sum(numbers) / len(numbers) + + +def std_dev(numbers): + """ + This function takes a list of numbers as input and returns their standard deviation. + """ + n = len(numbers) + if n <= 1: + return 0.0 + avg = std_mean(numbers) + variance = sum((x - avg) ** 2 for x in numbers) / (n - 1) + return variance ** 0.5 +# Define loss function +def loss_func(qnn: paddle.nn.Layer, magnetic_fields_list :list): #sampling_times: int, mean: float, variance: float): + r""" Calculate loss + + + Args: + qnn: a QNN + sampling_times: the number of partitions in the selected interval + mean: the mean of a normal distribution + variance: the variance of a normal distribution + + """ + + mean = std_mean(magnetic_fields_list) + variance = std_dev(magnetic_fields_list) + + sampling_times = len(magnetic_fields_list) + list_pdf = [] # The list of the probability density function of phi + for phi in magnetic_fields_list: + prob = (1 / (((2 * pi) ** 0.5) * variance)) * exp(-((phi - mean) ** 2) / (2 * (variance**2))) # The probability density of phi + list_pdf.append(prob) + + return sum([list_pdf[i] * MSE(qnn, magnetic_fields_list[i]) * (2 / sampling_times) for i in range(sampling_times)]) + +def optimization(qnn: paddle.nn.Layer, fields_list, num_itr: int, learning_rate: float) -> None: + r""" Optimize QNN + + Args: + qnn: a QNN + num_itr: the number of optimization iterations + learning_rate: learning rate + + """ + opt = paddle.optimizer.Adam(learning_rate=learning_rate, parameters=qnn.parameters()) + print("Begin:") + for itr in range(1, num_itr): + loss = qnn(fields_list) + loss.backward() + opt.minimize(loss) + opt.clear_grad() + + if itr % 10 == 0: + print(" iter:", itr, "loss:", "%.4f" % loss.numpy()) + +class RamseyInterferometer(paddle.nn.Layer): + r""" Variational Ramsey interferometer + + """ + def __init__(self) -> None: + super().__init__() + + # Add parameters + theta_EN = self.create_parameter( + shape= [depth_EN, N, 3], dtype="float64", + default_initializer=paddle.nn.initializer.Uniform(low=0, high=2 * pi), + ) + theta_DE = self.create_parameter( + shape= [depth_DE, N, 3], dtype="float64", + default_initializer=paddle.nn.initializer.Uniform(low=0, high=2 * pi), + ) + self.add_parameter('theta_EN', theta_EN) + self.add_parameter('theta_DE', theta_DE) + + # Add the parameter of the estimator + a = self.create_parameter( + shape= [1], dtype="float64", + default_initializer=paddle.nn.initializer.Uniform(low=0, high=2 * pi), + ) + self.add_parameter('a', a) + + def forward(self,fields_list) -> paddle.Tensor: + r""" Calculate loss + + """ + return loss_func(self, fields_list) + + def opt(self,fields_list) -> None: + r""" Optimize QNN + + """ + optimization(self,fields_list, num_itr=ITR, learning_rate=LR) + + + +""" +phi_list = [] +mse_list = [] +for i in range(TIMES): + phi = MEAN - 1 + (2 * i + 1) / TIMES + mse_est = MSE(QNN, phi) + phi_list.append(phi) + mse_list.append(mse_est)""" + + + +class MagnetoHydroSensor(): + def __init__(self,default_field=0, sensors_count=10): + self.default_field = default_field + + sensors_fields = [] + self.QNN = RamseyInterferometer() + + + def feedback_loop(self,sensors_fields): + + #self.QNN(sensors_fields) + #self.optimize() + self.QNN.opt(sensors_fields) + #def optimize(self): + + def plot(self): + font = {'family': 'Times New Roman', 'weight':'normal', 'size':16} + plt.figure(dpi=100) + plt.plot(phi_list,mse_list,color='darkblue', linestyle='-') + plt.scatter(phi_list,mse_list) + plt.xlabel('$\\phi$',font) + plt.ylabel('MSE',font) + + plt.grid() + #plt.show() + return plt + + +sensor = MagnetoHydroSensor(10) +magnetic_fields = [4.4,5.3,4.3,9.8,6.5,3.9,5.3,4.2,5.1,5.8] +i = 0 +iters = 14 +while i < iters: + sensor.feedback_loop(magnetic_fields) + diff --git a/new WDN animation.gif b/new WDN animation.gif new file mode 100644 index 00000000..89419754 Binary files /dev/null and b/new WDN animation.gif differ diff --git a/paths.txt b/paths.txt new file mode 100644 index 00000000..ee2e6f39 --- /dev/null +++ b/paths.txt @@ -0,0 +1,17 @@ +21 +1, 2, 6 +1, 2, 7 +1, 2, 8 +1, 2, 9 +1, 3, 10 +1, 3, 11 +1, 3, 12 +1, 3, 13 +1, 4, 14 +1, 4, 15 +1, 4, 16 +1, 4, 17 +1, 5, 18 +1, 5, 19 +1, 5, 20 +1, 5, 21 \ No newline at end of file diff --git a/qbraid_qiskit_setup/accessing_ibm_hardware.ipynb b/qbraid_qiskit_setup/accessing_ibm_hardware.ipynb deleted file mode 100644 index 2b8d79ad..00000000 --- a/qbraid_qiskit_setup/accessing_ibm_hardware.ipynb +++ /dev/null @@ -1,215 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "id": "c5cf89c4", - "metadata": {}, - "source": [ - "# Enable account to access Qiskit QPUs\n", - "\n", - "Use the qBraid-CLI to enable your account and gain access to QPUs available through Qiskit.\n", - "\n", - "Normally, Qiskit requires that you create an IBM account. However, by using Qiskit through qBaid Lab, we've taken care of this for you. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2e5b9e1f", - "metadata": {}, - "outputs": [], - "source": [ - "!qbraid jobs enable qiskit" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "bc180880", - "metadata": {}, - "source": [ - "

qBraid instructions

\n", - "\n", - "If you are not planning to submit jobs to quantum computers, this notebook should work well with `Python [Default]` kernel. If you want to submit jobs to quantum computers, make sure that you have installed the qiskit environment on qBraid ([installation instructions](https://qbraid-qbraid.readthedocs-hosted.com/en/latest/lab/environments.html#install-environment)) and have selected the `Python [Qiskit]` kernel (Menu Bar->Kernel->Change Kernel).\n", - "\n", - "If you do not have aws credentials for submitting your quantum jobs, you will need qBraid-Credits. If you have qBraid-Credits, you can run the following line of code to submit quantum jobs through qBraid" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f33b760e", - "metadata": {}, - "outputs": [], - "source": [ - "from qiskit_ibm_runtime import QiskitRuntimeService\n", - "from qiskit_ibm_provider import IBMProvider\n", - "service = QiskitRuntimeService(channel=\"ibm_quantum\")\n", - "backend = service.get_backend(\"ibmq_jakarta\")" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "619d7a9b", - "metadata": {}, - "outputs": [], - "source": [ - "from qiskit import QuantumCircuit, transpile\n", - "\n", - "bell = QuantumCircuit(2)\n", - "bell.h(0)\n", - "bell.cx(0,1)\n", - "bell.measure_all()\n", - "bell = transpile(bell, backend)" - ] - }, - { - "cell_type": "markdown", - "id": "9b13d06c", - "metadata": {}, - "source": [ - "## Set a max execution time with circuit-runner" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "f09a5910", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ch1tihol1tcq36l127u0\n", - "JobStatus.QUEUED\n" - ] - } - ], - "source": [ - "options = {\"backend_name\": 'ibmq_jakarta', \n", - " \"max_execution_time\":300,\n", - " \"instance\":'ibm-q-startup/qbraid/main'}\n", - "\n", - "runtime_inputs = {\n", - " 'circuits': bell, \n", - " 'shots': 4000, \n", - "}\n", - "\n", - "job = service.run(\n", - " program_id='circuit-runner',\n", - " options=options,\n", - " inputs=runtime_inputs,\n", - ")\n", - "\n", - "# Job id\n", - "print(job.job_id())\n", - "# See job status\n", - "print(job.status())" - ] - }, - { - "cell_type": "markdown", - "id": "69bb68c5", - "metadata": {}, - "source": [ - "## Set a max execution time with a primitive \n", - "\n", - "The example is with the Sampler, the settings of the max execution time would be the exact same for the Estimator." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "14f359a1", - "metadata": {}, - "outputs": [], - "source": [ - "from qiskit_ibm_runtime import Options\n", - "\n", - "options = Options(max_execution_time=300)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a6160b30", - "metadata": {}, - "outputs": [], - "source": [ - "from qiskit_ibm_runtime import Sampler\n", - "\n", - "sampler = Sampler(session=backend, options=options)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b1a33d40", - "metadata": {}, - "outputs": [], - "source": [ - "job = sampler.run(bell)\n", - "print(f\">>> Job ID: {job.job_id()}\")\n", - "print(f\">>> Job Status: {job.status()}\")\n" - ] - }, - { - "cell_type": "markdown", - "id": "87f3d9b7", - "metadata": {}, - "source": [ - "### Retrieve a job from IBMProvider" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3bc1bf0a", - "metadata": {}, - "outputs": [], - "source": [ - "provider = IBMProvider(instance='ibm-q/open/main')\n", - "jobs = provider.jobs()\n", - "backend = provider.get_backend(\"ibmq_lima\")\n", - "job = backend.run(bell, shots=4000,)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bcfa55bb", - "metadata": {}, - "outputs": [], - "source": [ - "# Run the circuit on a backend then cancel it\n", - "backend = provider.get_backend(\"ibmq_belem\")\n", - "job = backend.run(bell)\n", - "job.cancel()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 [Qiskit]", - "language": "python", - "name": "python3_qiskit_9y9siy" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.10" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/qml_debugging.py b/qml_debugging.py new file mode 100644 index 00000000..3cc2f56e --- /dev/null +++ b/qml_debugging.py @@ -0,0 +1,174 @@ +import numpy as np +import pandas as pd +import haiku as hk +import jax +import optax +from sklearn.metrics import accuracy_score +import pennylane as qml +from pennylane import numpy as np +import jax +from jax import random +import haiku as hk + +# Load data +x_train = pd.read_excel("x_train.xlsx") +y_train = pd.read_excel("y_train.xlsx") +x_test = pd.read_excel("x_test.xlsx") +y_test = pd.read_excel("y_test.xlsx") + +n_qubits = 8 +epochs = 500 +batch_size = 32 +num_layers = 8 + +num_batches = len(x_train) // batch_size +dev = qml.device("default.qubit", wires=n_qubits) + +def quantum_layer(weights): + """ + Generates a layer in the QNN Model + + Args: + weights (List[floats]): Parameters to be fed into the layer + """ + qml.templates.AngleEmbedding(weights[:, 0], rotation="Y", wires=range(n_qubits)) + qml.templates.AngleEmbedding(weights[:, 1], rotation="Z", wires=range(n_qubits)) + for i in range(8): + qml.CNOT(wires=[i, (i + 1) % 8]) + +@qml.qnode(dev, interface="jax") +def quantum_circuit(x, circuit_weights): + """ + Builds the entire Quantum circuit model + + Args: + x (List[float]): The pressure sensor data to be fed into the model + circuit_weights (List[float]): Parameters to be fed into the model + + Returns: + List[float]: Returns the expected value of qubit measurement in PauliZ basis + """ + for weights in circuit_weights: + qml.templates.AngleEmbedding(x, wires=range(n_qubits)) + quantum_layer(weights) + return [qml.expval(qml.PauliZ(i)) for i in range(n_qubits)] + + +@hk.without_apply_rng +@hk.transform +def qforward(x): + """ + Does a forward pass of the Quantum Model + + Args: + x (List[float]): The pressure sensor data to be fed into the model + + Returns: + List[Float]: Returns the logits from the model + """ + x = jax.nn.tanh(hk.Linear(8)(x)) + W = hk.get_parameter( + "W", (num_layers, 8, 3), init=hk.initializers.RandomNormal(stddev=0.25) + ) + x = jax.vmap(quantum_circuit, in_axes=(0, None))(x, W) + x = hk.Linear(1)(x) + return x + +@hk.without_apply_rng +@hk.transform +def cforward(x): + """ + Does a forward pass of the Classical Model + + Args: + x (List[float]): The pressure sensor data to be fed into the model + + Returns: + List[Float]: Returns the logits from the model + """ + nn = hk.Sequential([hk.Linear(10), + jax.nn.relu, + hk.Linear(10), + jax.nn.relu, + hk.Linear(1)]) + return nn(x) + +seed = 123 +rng = jax.random.PRNGKey(seed) +params = qforward.init(rng, x_train.values) +opt = optax.radam(learning_rate=5e-4) +opt_state = opt.init(params) + +# Training loop +def loss_fn(params, x, y): + """ + Calculates the loss value between predicted output after a forward pass of the model and the ground truth + + Args: + params (List[Float]): Parameters to be fed into the model + x (List[float]): The pressure sensor data to be fed into the model + y (List[int]): The ground truth class data + + Returns: + float: Loss value between predicted output and the ground truth + """ + pred = qforward.apply(params, x) + loss = optax.sigmoid_binary_cross_entropy(pred, y).mean() + return loss + +@jax.jit +def update(params, opt_state, x, y): + """ + Updates the parameters based on the gradients calculated + + Args: + params (List[float]): Parameters to be fed into the model + opt_state (List[float]): The optimizer state at the last epoch + x (List[float]): The pressure sensor data to be fed into the model + y (List[int]): The ground truth class data + + Returns: + List[float], List[float], float: Returns the list of updated parameters, new state of the optimizer and loss value + """ + loss, grads = jax.value_and_grad(loss_fn)(params, x, y) + updates, new_opt_state = opt.update(grads, opt_state) + new_params = optax.apply_updates(params, updates) + return new_params, new_opt_state, loss + +loss_list = [] +test_acc = [] +for epoch in range(epochs): + # Shuffle the training data + shuffled_indices = np.random.permutation(len(x_train)) + x_train_shuffled = x_train.values[shuffled_indices] + y_train_shuffled = y_train.values[shuffled_indices] + + # Training + epoch_loss = 0 + for batch_idx in range(num_batches): + start = batch_idx * batch_size + end = start + batch_size + + x_batch = x_train_shuffled[start:end] + y_batch = y_train_shuffled[start:end] + + params, opt_state, batch_loss = update(params, opt_state, x_batch, y_batch) + epoch_loss += batch_loss + + epoch_loss /= num_batches + loss_list.append(epoch_loss) + + # Testing + y_pred = qforward.apply(params, x_test.values) + y_pred_labels = (y_pred > 0.5).astype(int) + test_accuracy = accuracy_score(y_test, y_pred_labels) + print( + f"Epoch {epoch + 1}, Loss: {epoch_loss:.4f}" + ) + test_acc.append(test_accuracy) + +# Testing +y_pred = qforward.apply(params, x_test.values) +y_pred_labels = (y_pred > 0.5).astype(int) +test_accuracy = accuracy_score(y_test.values, y_pred_labels) +print(f"Test Accuracy: {test_accuracy:.4f}") \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..920b6d01 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +paddle-quantum diff --git a/sensor_readings.txt b/sensor_readings.txt new file mode 100644 index 00000000..cf9de8c7 --- /dev/null +++ b/sensor_readings.txt @@ -0,0 +1 @@ +1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1 \ No newline at end of file diff --git a/x_test.xlsx b/x_test.xlsx new file mode 100644 index 00000000..a7201624 Binary files /dev/null and b/x_test.xlsx differ diff --git a/x_train.xlsx b/x_train.xlsx new file mode 100644 index 00000000..133681bc Binary files /dev/null and b/x_train.xlsx differ diff --git a/y_test.xlsx b/y_test.xlsx new file mode 100644 index 00000000..8ad4374b Binary files /dev/null and b/y_test.xlsx differ diff --git a/y_train.xlsx b/y_train.xlsx new file mode 100644 index 00000000..ea37c629 Binary files /dev/null and b/y_train.xlsx differ