diff --git a/wyk/3_Metody_ewaluacji_i_optymalizacji.ipynb b/wyk/3_Metody_ewaluacji_i_optymalizacji.ipynb new file mode 100644 index 0000000..4b104e8 --- /dev/null +++ b/wyk/3_Metody_ewaluacji_i_optymalizacji.ipynb @@ -0,0 +1,1805 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Uczenie maszynowe\n", + "# 3. Metody ewaluacji i optymalizacji" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## 3.1. Metodologia testowania" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "W uczeniu maszynowym bardzo ważna jest ewaluacja budowanego modelu. Dlatego dobrze jest podzielić posiadane dane na odrębne zbiory – osobny zbiór danych do uczenia i osobny do testowania. W niektórych przypadkach potrzeba będzie dodatkowo wyodrębnić tzw. zbiór walidacyjny." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Zbiór uczący a zbiór testowy" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "* Na zbiorze uczącym (treningowym) uczymy algorytmy, a na zbiorze testowym sprawdzamy ich poprawność.\n", + "* Zbiór uczący powinien być kilkukrotnie większy od testowego (np. 4:1, 9:1 itp.).\n", + "* Zbiór testowy często jest nieznany.\n", + "* Należy unikać mieszania danych testowych i treningowych – nie wolno „zanieczyszczać” danych treningowych danymi testowymi!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Czasami potrzebujemy dobrać parametry modelu, np. $\\alpha$ – który zbiór wykorzystać do tego celu?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Zbiór walidacyjny" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "Do doboru parametrów najlepiej użyć jeszcze innego zbioru – jest to tzw. **zbiór walidacyjny**" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + " * Zbiór walidacyjny powinien mieć wielkość zbliżoną do wielkości zbioru testowego, czyli np. dane można podzielić na te trzy zbiory w proporcjach 3:1:1, 8:1:1 itp." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Walidacja krzyżowa" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "Którą część danych wydzielić jako zbiór walidacyjny tak, żeby było „najlepiej”?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + " * Niech każda partia danych pełni tę rolę naprzemiennie!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "\n", + "Żródło: https://chrisjmccormick.wordpress.com/2013/07/31/k-fold-cross-validation-with-matlab-code/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Walidacja krzyżowa\n", + "\n", + "* Podziel dane $D = \\left\\{ (x^{(1)}, y^{(1)}), \\ldots, (x^{(m)}, y^{(m)})\\right\\} $ na $N$ rozłącznych zbiorów $T_1,\\ldots,T_N$\n", + "* Dla $i=1,\\ldots,N$, wykonaj:\n", + " * Użyj $T_i$ do walidacji i zbiór $S_i$ do trenowania, gdzie $S_i = D \\smallsetminus T_i$. \n", + " * Zapisz model $\\theta_i$.\n", + "* Akumuluj wyniki dla modeli $\\theta_i$ dla zbiorów $T_i$.\n", + "* Ustalaj parametry uczenia na akumulowanych wynikach." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Walidacja krzyżowa – wskazówki\n", + "\n", + "* Zazwyczaj ustala się $N$ w przedziale od $4$ do $10$, tzw. $N$-krotna walidacja krzyżowa (*$N$-fold cross validation*). \n", + "* Zbiór $D$ warto zrandomizować przed podziałem.\n", + "* W jaki sposób akumulować wyniki dla wszystkich zbiórow $T_i$?\n", + "* Po ustaleniu parametrów dla każdego $T_i$, trenujemy model na całych danych treningowych z ustalonymi parametrami.\n", + "* Testujemy na zbiorze testowym (jeśli nim dysponujemy)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### _Leave-one-out_\n", + "\n", + "Jest to szczególny przypadek walidacji krzyżowej, w której $N = m$." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "* Jaki jest rozmiar pojedynczego zbioru $T_i$?\n", + "* Jakie są zalety i wady tej metody?\n", + "* Kiedy może być przydatna?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Zbiór walidujący a algorytmy optymalizacji\n", + "\n", + "* Gdy błąd rośnie na zbiorze uczącym, mamy źle dobrany parametr $\\alpha$. Należy go wtedy zmniejszyć.\n", + "* Gdy błąd zmniejsza się na zbiorze trenującym, ale rośnie na zbiorze walidującym, mamy do czynienia ze zjawiskiem **nadmiernego dopasowania** (*overfitting*).\n", + "* Należy wtedy przerwać optymalizację. Automatyzacja tego procesu to _early stopping_." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## 3.2. Miary jakości" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "Aby przeprowadzić ewaluację modelu, musimy wybrać **miarę** (**metrykę**), jakiej będziemy używać.\n", + "\n", + "Jakiej miary użyc najlepiej?\n", + " * To zależy od rodzaju zadania.\n", + " * Innych metryk używa się do regresji, a innych do klasyfikacji" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Metryki dla zadań regresji\n", + "\n", + "Dla zadań regresji możemy zastosować np.:\n", + " * błąd średniokwadratowy (*root-mean-square error*, RMSE):\n", + " $$ \\mathrm{RMSE} \\, = \\, \\sqrt{ \\frac{1}{m} \\sum_{i=1}^{m} \\left( \\hat{y}^{(i)} - y^{(i)} \\right)^2 } $$\n", + " * średni błąd bezwzględny (*mean absolute error*, MAE):\n", + " $$ \\mathrm{MAE} \\, = \\, \\frac{1}{m} \\sum_{i=1}^{m} \\left| \\hat{y}^{(i)} - y^{(i)} \\right| $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "W powyższych wzorach $y^{(i)}$ oznacza **oczekiwaną** wartości zmiennej $y$ w $i$-tym przykładzie, a $\\hat{y}^{(i)}$ oznacza wartość zmiennej $y$ w $i$-tym przykładzie wyliczoną (**przewidzianą**) przez nasz model." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Metryki dla zadań klasyfikacji\n", + "\n", + "Aby przedstawić kilka najpopularniejszych metryk stosowanych dla zadań klasyfikacyjnych, posłużmy się następującym przykładem:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "# Przydatne importy\n", + "\n", + "import ipywidgets as widgets\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pandas\n", + "import random\n", + "import seaborn\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "def powerme(x1,x2,n):\n", + " \"\"\"Funkcja, która generuje n potęg dla zmiennych x1 i x2 oraz ich iloczynów\"\"\"\n", + " X = []\n", + " for m in range(n+1):\n", + " for i in range(m+1):\n", + " X.append(np.multiply(np.power(x1,i),np.power(x2,(m-i))))\n", + " return np.hstack(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "def plot_data_for_classification(X, Y, xlabel=None, ylabel=None, Y_predicted=[], highlight=None):\n", + " \"\"\"Wykres danych dla zadania klasyfikacji\"\"\"\n", + " fig = plt.figure(figsize=(16*.6, 9*.6))\n", + " ax = fig.add_subplot(111)\n", + " fig.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9)\n", + " X = X.tolist()\n", + " Y = Y.tolist()\n", + " X1n = [x[1] for x, y in zip(X, Y) if y[0] == 0]\n", + " X1p = [x[1] for x, y in zip(X, Y) if y[0] == 1]\n", + " X2n = [x[2] for x, y in zip(X, Y) if y[0] == 0]\n", + " X2p = [x[2] for x, y in zip(X, Y) if y[0] == 1]\n", + " \n", + " if len(Y_predicted) > 0:\n", + " Y_predicted = Y_predicted.tolist()\n", + " X1tn = [x[1] for x, y, yp in zip(X, Y, Y_predicted) if y[0] == 0 and yp[0] == 0]\n", + " X1fn = [x[1] for x, y, yp in zip(X, Y, Y_predicted) if y[0] == 1 and yp[0] == 0]\n", + " X1tp = [x[1] for x, y, yp in zip(X, Y, Y_predicted) if y[0] == 1 and yp[0] == 1]\n", + " X1fp = [x[1] for x, y, yp in zip(X, Y, Y_predicted) if y[0] == 0 and yp[0] == 1]\n", + " X2tn = [x[2] for x, y, yp in zip(X, Y, Y_predicted) if y[0] == 0 and yp[0] == 0]\n", + " X2fn = [x[2] for x, y, yp in zip(X, Y, Y_predicted) if y[0] == 1 and yp[0] == 0]\n", + " X2tp = [x[2] for x, y, yp in zip(X, Y, Y_predicted) if y[0] == 1 and yp[0] == 1]\n", + " X2fp = [x[2] for x, y, yp in zip(X, Y, Y_predicted) if y[0] == 0 and yp[0] == 1]\n", + " \n", + " if highlight == 'tn':\n", + " ax.scatter(X1tn, X2tn, c='r', marker='x', s=100, label='Dane')\n", + " ax.scatter(X1fn, X2fn, c='k', marker='o', s=50, label='Dane')\n", + " ax.scatter(X1tp, X2tp, c='k', marker='o', s=50, label='Dane')\n", + " ax.scatter(X1fp, X2fp, c='k', marker='x', s=50, label='Dane')\n", + " elif highlight == 'fn':\n", + " ax.scatter(X1tn, X2tn, c='k', marker='x', s=50, label='Dane')\n", + " ax.scatter(X1fn, X2fn, c='g', marker='o', s=100, label='Dane')\n", + " ax.scatter(X1tp, X2tp, c='k', marker='o', s=50, label='Dane')\n", + " ax.scatter(X1fp, X2fp, c='k', marker='x', s=50, label='Dane')\n", + " elif highlight == 'tp':\n", + " ax.scatter(X1tn, X2tn, c='k', marker='x', s=50, label='Dane')\n", + " ax.scatter(X1fn, X2fn, c='k', marker='o', s=50, label='Dane')\n", + " ax.scatter(X1tp, X2tp, c='g', marker='o', s=100, label='Dane')\n", + " ax.scatter(X1fp, X2fp, c='k', marker='x', s=50, label='Dane')\n", + " elif highlight == 'fp':\n", + " ax.scatter(X1tn, X2tn, c='k', marker='x', s=50, label='Dane')\n", + " ax.scatter(X1fn, X2fn, c='k', marker='o', s=50, label='Dane')\n", + " ax.scatter(X1tp, X2tp, c='k', marker='o', s=50, label='Dane')\n", + " ax.scatter(X1fp, X2fp, c='r', marker='x', s=100, label='Dane')\n", + " else:\n", + " ax.scatter(X1tn, X2tn, c='r', marker='x', s=50, label='Dane')\n", + " ax.scatter(X1fn, X2fn, c='g', marker='o', s=50, label='Dane')\n", + " ax.scatter(X1tp, X2tp, c='g', marker='o', s=50, label='Dane')\n", + " ax.scatter(X1fp, X2fp, c='r', marker='x', s=50, label='Dane')\n", + "\n", + " else:\n", + " ax.scatter(X1n, X2n, c='r', marker='x', s=50, label='Dane')\n", + " ax.scatter(X1p, X2p, c='g', marker='o', s=50, label='Dane')\n", + " \n", + " if xlabel:\n", + " ax.set_xlabel(xlabel)\n", + " if ylabel:\n", + " ax.set_ylabel(ylabel)\n", + " \n", + " ax.margins(.05, .05)\n", + " return fig" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "# Wczytanie danych\n", + "import pandas\n", + "import numpy as np\n", + "\n", + "alldata = pandas.read_csv('data-metrics.tsv', sep='\\t')\n", + "data = np.matrix(alldata)\n", + "\n", + "m, n_plus_1 = data.shape\n", + "n = n_plus_1 - 1\n", + "\n", + "X2 = powerme(data[:, 1], data[:, 2], n)\n", + "Y2 = np.matrix(data[:, 0]).reshape(m, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plot_data_for_classification(X2, Y2, xlabel=r'$x_1$', ylabel=r'$x_2$')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "def safeSigmoid(x, eps=0):\n", + " \"\"\"Funkcja sigmoidalna zmodyfikowana w taki sposób, \n", + " żeby wartości zawsze były odległe od asymptot o co najmniej eps\n", + " \"\"\"\n", + " y = 1.0/(1.0 + np.exp(-x))\n", + " if eps > 0:\n", + " y[y < eps] = eps\n", + " y[y > 1 - eps] = 1 - eps\n", + " return y\n", + "\n", + "def h(theta, X, eps=0.0):\n", + " \"\"\"Funkcja hipotezy (regresja logistyczna)\"\"\"\n", + " return safeSigmoid(X*theta, eps)\n", + "\n", + "def J(h,theta,X,y, lamb=0):\n", + " \"\"\"Funkcja kosztu dla regresji logistycznej\"\"\"\n", + " m = len(y)\n", + " f = h(theta, X, eps=10**-7)\n", + " j = -np.sum(np.multiply(y, np.log(f)) + \n", + " np.multiply(1 - y, np.log(1 - f)), axis=0)/m\n", + " if lamb > 0:\n", + " j += lamb/(2*m) * np.sum(np.power(theta[1:],2))\n", + " return j\n", + "\n", + "def dJ(h,theta,X,y,lamb=0):\n", + " \"\"\"Gradient funkcji kosztu\"\"\"\n", + " g = 1.0/y.shape[0]*(X.T*(h(theta,X)-y))\n", + " if lamb > 0:\n", + " g[1:] += lamb/float(y.shape[0]) * theta[1:] \n", + " return g\n", + "\n", + "def classifyBi(theta, X):\n", + " \"\"\"Funkcja predykcji - klasyfikacja dwuklasowa\"\"\"\n", + " prob = h(theta, X)\n", + " return prob" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "def GD(h, fJ, fdJ, theta, X, y, alpha=0.01, eps=10**-3, maxSteps=10000):\n", + " \"\"\"Metoda gradientu prostego dla regresji logistycznej\"\"\"\n", + " errorCurr = fJ(h, theta, X, y)\n", + " errors = [[errorCurr, theta]]\n", + " while True:\n", + " # oblicz nowe theta\n", + " theta = theta - alpha * fdJ(h, theta, X, y)\n", + " # raportuj poziom błędu\n", + " errorCurr, errorPrev = fJ(h, theta, X, y), errorCurr\n", + " # kryteria stopu\n", + " if abs(errorPrev - errorCurr) <= eps:\n", + " break\n", + " if len(errors) > maxSteps:\n", + " break\n", + " errors.append([errorCurr, theta]) \n", + " return theta, errors" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "theta = [[ 1.37136167]\n", + " [ 0.90128948]\n", + " [ 0.54708112]\n", + " [-5.9929264 ]\n", + " [ 2.64435168]\n", + " [-4.27978238]]\n" + ] + } + ], + "source": [ + "# Uruchomienie metody gradientu prostego dla regresji logistycznej\n", + "theta_start = np.matrix(np.zeros(X2.shape[1])).reshape(X2.shape[1],1)\n", + "theta, errors = GD(h, J, dJ, theta_start, X2, Y2, \n", + " alpha=0.1, eps=10**-7, maxSteps=10000)\n", + "print('theta = {}'.format(theta))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "def plot_decision_boundary(fig, theta, X):\n", + " \"\"\"Wykres granicy klas\"\"\"\n", + " ax = fig.axes[0]\n", + " xx, yy = np.meshgrid(np.arange(-1.0, 1.0, 0.02),\n", + " np.arange(-1.0, 1.0, 0.02))\n", + " l = len(xx.ravel())\n", + " C = powerme(xx.reshape(l, 1), yy.reshape(l, 1), n)\n", + " z = classifyBi(theta, C).reshape(int(np.sqrt(l)), int(np.sqrt(l)))\n", + "\n", + " plt.contour(xx, yy, z, levels=[0.5], lw=3);" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "Y_expected = Y2.astype(int)\n", + "Y_predicted = (classifyBi(theta, X2) > 0.5).astype(int)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "# Przygotowanie interaktywnego wykresu\n", + "\n", + "dropdown_highlight = widgets.Dropdown(options=['all', 'tp', 'fp', 'tn', 'fn'], value='all', description='highlight')\n", + "\n", + "def interactive_classification(highlight):\n", + " fig = plot_data_for_classification(X2, Y2, xlabel=r'$x_1$', ylabel=r'$x_2$',\n", + " Y_predicted=Y_predicted, highlight=highlight)\n", + " plot_decision_boundary(fig, theta, X2)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/pawel/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:10: UserWarning: The following kwargs were not used by contour: 'lw'\n", + " # Remove the CWD from sys.path while we load stuff.\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmwAAAFmCAYAAADQ5sbeAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdd3iV5f3H8fedkARIwkgIKxBWwgYRoqCCoODCFVAMiuun1Wq1ZWgLdc+KODDaalXqaKUaqwFpBReKypCNbEjYECBAgAwg69y/P06Ch5DISvKc8Xld17nOOc/znOR7IOOTexprLSIiIiLivYKcLkBEREREfp0Cm4iIiIiXU2ATERER8XIKbCIiIiJeToFNRERExMspsImIiIh4uVpOF+CERo0a2datWztdhkjVOHAANmyAxo2hZctfjm/bBllZ0K4dNGjgXH0iInLSFi9evNdaG1P+eEAGttatW7No0SKnyxCpGtbC6NGQkgI33ggTJ/7yfORI93NjnK5SREROgjFmS0XHAzKwifgVY9yhDNwhLSXF/VhhTUTEb5hA3OkgMTHRqoVN/I61EOQxLNXlUlgTEfExxpjF1trE8sc16UDEH5R1i3oaPdp9XEREfJ4Cm4iv8xzDNnKku2Vt5Ej3c4U2ERG/oDFsIr5u6tTjJxh4jmnr3x+GDHG2RhEROSMKbCK+LikJ0tLc92Vj1spCW//+7uMiIuLTFNhEfJ0xFbegVXZcRER8jsawiYiIiHg5BTYRERERL6fAJiIiIuLlFNhEREREvJwCm4iIiIiXU2ATERER8XIKbCIiIiJeToFNRERExMspsImIiIh4Oe10ICIicpJyC3JJXZVK+r50EqITSO6STGRYpNNlSQBQYBMRETkJs7fOZvDkwbisi/yifMJDwhnz5Rimj5hO37i+Tpcnfk5doiIiIieQW5DL4MmDyS3MJb8oH4D8onxyC93H8wrzHK5Q/J0Cm4iIyAmkrkrFZV0VnnNZF6krU2u4Igk0CmwiIiInkL4v/WjLWnn5RflkZGfUcEUSaBTYRERETiAhKp5wE1bhuXATRnxUuxquSAKNApuIiMgJJG8KJ+hIQYXngo4UkLyxbg1XJIFGgU1EROQEIq+7kekF1xNZAOHWvcBCuK1FZAFML7ieiOtudLhC8Xda1kNEROREjKHvix+TOfo+Ur94g4woiM8uJvnCe4mY+DcwxukKxc8Za63TNdS4xMREu2jRIqfLEBERX2MtBHl0TrlcCmtSpYwxi621ieWPq0tURETkZFgLo0cfe2z0aPdxkWqmwCYiInIiZWEtJQVGjnS3rI0c6X6u0CY1wCvGsBljLgdSgGBgkrV2fLnzE4GLSp/WBRpbaxuUnisBVpSe22qtvaZmqhYRkYAxdeovYW3iRHc36MSJ7nMpKdC/PwwZ4myN4tccH8NmjAkG1gOXANuBhcCN1trVlVz/e+Bsa+0dpc/zrLURp/I5NYZNREROibXu0JaUdOyYtcqOi5wmbx7Ddi6QYa3daK0tBD4Crv2V628EPqyRykRERMAdxoYMOT6UVXZcpIp5Q2CLBbZ5PN9eeuw4xphWQBvgW4/DtY0xi4wxPxljkqqvTBERERFneENgq+jPksr6aYcDn1hrSzyOxZU2Hd4EvGKMqXB/EGPM3aXBbtGePXvOrGIRCVzWwpQpxw8yr+y4iEgV8IbAth1o6fG8BZBZybXDKdcdaq3NLL3fCMwCzq7ohdbat6y1idbaxJiYmDOtWUQC1dSpMHTosTMDy2YQDh3qPi8iUsW8IbAtBBKMMW2MMaG4Q9m08hcZYzoADYF5HscaGuPejdcY0wi4AKhwsoKISJVISjp+OQfP5R6SNDJDRKqe48t6WGuLjTH3A1/iXtbjHWvtKmPMU8Aia21ZeLsR+MgeO621E/CmMcaFO3yOr2x2qYhIlSi/nENKivux53IPIiJVzPFlPZygZT1E5IxpiyIRqQbevKyHiIhv0RZFIlLDFNhERE6FtigSEQc4PoZNRMSnaIsiEXGAApuIyKlISoK0tGO3IioLbf37a5aoiFQLBTYRkVNRthXRyR4XEakCGsMmIiIi4uUU2ERERES8nAKbiIiIiJdTYBMRERHxcgpsIiIiIl5OgU1ERETEyymwiYiIiHg5BTYRERERL6fAJiIiIuLlFNhEREREvJwCm4iIiIiX016iIiJCSUkJh3IOk3cgn/yDhziSd4TDeUc4kl/A4dLHhYcLKTxSROGRX+6LCoopKSmhpLiEkmIXJcUluIpLcLlshZ8nKDiIWiHBBNcqvQUHUSu0FqG1QwmtHUJo7VBCaocQVieU2uFh1I2sQ53IOtSNrE3tiNqE16tLZFQEdevVIShIbQ4SOBTYRET8jLWW3P157N99kAO7D5K96wAH9+RwcG8OB/fmkrOv9H5vLnkH8sk7kM+hnMMn/fGDgow7YNUJpVZoLY8AFkRwrWCCgoMICj4+TFlrcZW4jgl2JcUuigqKKCwoovBwIcVFJSddQ0TDCCKj3LcGMfXctyYNaNikPg0a1yeqaQMaxUYRHRtFnfDaJ/3+RLyRApuIiA8pKixi7/ZssrbuZc/2fezdkc2+Hdnszcx2P87M5sDugxQVFh/3WmMMkVER1IuOoF6jejRu1Yh2PVoT0SD86C28QV3q1qtL3cja1ImoTe3wsvswwuqGEVo7hOBawRhjquX9lZSUUFRQTOHhwqMte4dyD3Ok9D7vwCHy9ueRtz+fnOw8cvfnkbMvlz3b95G+ZCMHsnIoKT4+9EU2DKdRi2gaxUbRuGUjmrZpfPTWpHVjGsTUq7b3JFIVFNhERLxISXEJWdv2snNjFrs27mbnxt3s2pxF1ta97N6yh+ydB7D22O7GuvXq0Cg2ikaxUbS8uCtRTRoQ1bQhDZq4W5kaNqlP/Zh6REZFEBwc7NA7OznBwcEE1w2mdt0w6kVHnvLrXS4Xefvz2Z91kP27DrB3RzZ7t+87Gm73bN/H+kUbOLg395jX1Q4PIzahGS3aN6NFQnNi2zejRfvmxHVsTnj98Kp6eyKnzZT/xg8EiYmJdtGiRU6XISIBylpL9q4DbF+Xyfb1mWxbl8mO9J1sW5fJrk1Zx7QQBdcKpkmrRjRuFUPjuEY0iXPfN45rRExLd4tRnYg6Dr4b33Q47zC7Nu9h16Ysdm3KYufG3ezI2Mn29TvZtSkLV4nr6LVNWsXQpnscbbu1ok23ONp0b0WL9s28PvyKbzLGLLbWJh53XIFNRKR6WGvJ2rqXLau3s2X1drau3saWNe7HnmPGQmuH0KK9u1Untl1TmrVrSrO2jWnerimNWkQpGNSwosIidm3KYtu6TLas2s6mlVvYtHwrW9fuOBrkatcNI75nG9r3akf7xHa0T2xLbEIzTYSQM6bA5kGBTUSqWt6BfDb8vJlNK7ayecVWNq3cyuaV2ziU+0swa9ikPq06tyCuUwtadoylZYfmtOzQnEYtovWL3gcUFhSxdc12Ni3fSvqSjaxfvIGMJZsoOFwIuLumO/ZOoHOf9nQ+vwOdz2tPeL26DlctvkaBzYMCm4iciYN7c0hfsomMJRtJX7qJ9MUb2blx99HzkQ3Dad0tjjZd42jTrRWtu7hD2umMyRLvVlJcwta1O1i/aAPrFmSw+qf1bFq+BZfLEhRkaNejNd37d6HnoO50u7CTZqvKCSmweVBgE5GTdSj3MOmLN7JuYQbrSn8p796y5+j5Zm2bEN+zDQlnt6Vdj9a07R5HdPMozTgMYIdyD7N2fjorflzDih/XsHreeooKiqgVEkzn8zvQc2B3zh7UjQ7ntFN3txxHgc2DApuIVMTlcrFt7Q5Wz1vP6nnrWTs/nS2rtx+dldm0TWM6nNOODonxJPRyB7TIhhEOVy3e7sihAlbNWcuSb1awdOZyMpZuxlpLZFQE51zeg96De5J4eQ/qRakFVhTYjqHAJiLgHpO0fmEGy39Yw8o5a1kzbz15B/IBiIyKoFOfBDqem0CHc+LpcE476jeq53DF4g8O7s1h6cwVLJixlIUzlnJgTw5BwUF079+ZvkN60++63kQ1beh0meIQBTYPCmwigenIoQJWz13H8h9Ws+LHNaz5KZ2igiIAWnVuQZfzOxwdLN6ifXN1a0q1c7lcrFu4gbmfLWTO1AVsW7uDoCBD9wFdGHDD+fS7ro/GPgYYBTYPCmwigaHwSCGr561n2Xcr+XnWKtbOT6e4qISgIEN8z7Z069eJbv060bVvR7WeiVfYvGobs1LnMCt1LjvSdxJcK5ieg7oxcMSF9B16LmF1wpwuUaqZVwc2Y8zlQAoQDEyy1o4vd/524AVgR+mhv1prJ5Weuw14pPT4M9ba90/0+RTYRPyTtZbNq7ax6MufWfz1z6z4YTWFR4oICjIk9GrLWQO60uOiLnQ+v4OWWxCvZq1lw7LNR8Pb7i17iGgQzqCbL2TwXQNp062V0yVKNfHawGaMCQbWA5cA24GFwI3W2tUe19wOJFpr7y/32ihgEZAIWGAx0Mtau//XPqcCm4j/yNmXy6KvfmbRV8tY/NVysne6v/1bdW5Bz0HdOXtgN7pf2EnbC4nPcrlcrPhhDdMnfcOPn/xEUWExnc9rz+C7BnHR8AsIrR3qdIlShbw5sJ0HPGGtvaz0+Z8BrLXPeVxzOxUHthuBAdba35Y+fxOYZa398Nc+pwKbiO+y1pKxdBPzP1/Cwi+WsnZ+Oi6Xe8Zdz0HdSLy0B70uPYuYFtFOlypS5Q7uzeGbf/3A529/w7a1O6jfKJLBdw3imvsup1HzKKfLkypQWWDzhs3fY4FtHs+3A70ruO46Y8yFuFvjRltrt1Xy2tiKPokx5m7gboC4uLgqKFtEakrhkUKWzlzB3M8WMn/6EvZl7scYQ4dz2jHikes554qzaZ/YVmtaid+r36ge142+iqGjrmTZdyuZ+toMPho/lf+8OI1Bt/Tnhj9eQ8sOFf4aFB/nDYGtomlY5Zv9/gt8aK0tMMbcA7wPXHySr3UftPYt4C1wt7Cdfrki1SO3IJfUVamk70snITqB5C7JRIYF7uyw3P15zP98CXM/W8DCL5ZxJL+AOhG1Sby8B+ddlUji5T1o2Li+02WKOMIYw9kXd+Psi7uxc+NuPnn5v3zxzrd8+e539Lu+Dzc/ej1tuqpxwp/4RJdoueuDgWxrbX11iYq/mL11NoMnD8ZlXeQX5RMeEk6QCWL6iOn0jevrdHk1Zv/uA8yesoDZaT+x7LtVuEpcRDVryHlXJ3JB0jmcdVFXQsNCnC5TxCvtzzrI1FenM/W1GRzOO8KFw/pwy2PDaNW5pdOlySnw5jFstXB3cw7EPQt0IXCTtXaVxzXNrLU7Sx8PAcZaa/uUTjpYDPQsvXQJ7kkH2b/2ORXYxJvkFuQS+3IsuYW5x52LDI0k84FMIkL9dzX9/VkHmZ02nx/+M5fl36/G5bK0aN+MvkN6c37SuXQ4p502Rhc5BTnZuXz68v+Y8up0Cg4VcNn/XcytT96gMW4+wmvHsFlri40x9wNf4l7W4x1r7SpjzFPAImvtNOAPxphrgGIgG7i99LXZxpincYc8gKdOFNZEvE3qqlRc1lXhOZd1kboylTt73lnDVVWvvAP5zE6bz3epc1g2cwUul6Vlx1huevg6Lhx2Hq27tNSitSKnqV5UJP/3zI1cN/oqJj/zKdNe/4LvPpzN8HFDGPbg1ZpV6qMcb2FzglrYxJuM/XosE+ZOqPT8uAvG8dygCkcI+JSCwwX89N/FfPvhbBbOWEpRYTHN2jbhouEXMCD5fFp3jVNIE6kGOzfu5u2x/+LHT+fTtE1j7nnpNi5IOtfpsqQSXtvCJhLoEqITCA8JJ78o/7hz4SHhxEfFO1BV1bDWsnreer567ztmfTyXQzmHiWrWkKvvvYyLbryADufEK6SJVLNmbZvw2H8eZOm3K3h95Ls8MfQFLhhyLr//62+IbqY9S32FWthEHOaPY9iytu7h63/9wNf//J4d6TupXTeMfsP6cMkt/enev7OW3xBxSElxCZ+8/D/++UQqIWEh3PPy7Vx2+wD94eRFvHbSgRMU2MTb+NQsUWth6lRISgKPH/JFBUXMffhvzFiRx5JvlmOt5awBXbjk1v70u64PdSPrOFi0iHjavj6Tl+/+Oyt+WMN51yQy+q17tEyOl1Bg86DAJt4orzCP1JWpZGRnEB8VT3LXZO9sWZsyBYYOhZEjYeJEdmzYxfS3vuGrv/2PA4ddNG5Ul8t+dyWX3NafZm2aOF2tiFTC5XIx9dUZTPrzZOpFR/DIR6Pp2reT02UFPAU2DwpsImfAWkpGjmLea5/w37iLWLKtgCAD57l2cOW13en5yd8IrqUuTxFfsXH5Fp4a9hI7N+7mN+Nv5voxV6mL1EGadCAiZ2z/7gNMf3smn08tYI85n5it+7mNTVxuN9Fo5G9h4sRjuklFxPu17d6Kvy14jhfvfIO3/vhPVs1dyx/fvY/wenWdLk08qIVNRE4ofclG0lI+5/vUuRQVFtPr0rO45p5L6T2kD8Flu8G5XAprIj7MWkvaK5/z9tgPaNWlBc/NeJiopppFWtMqa2HT8uHeyFr3OKHyYbqy4yLVwOVyMXfaQh646HF+lziWOVMWcOXdl/DOmlcYP+Nhzp/171/CGsDo0fraFPFhxhiuG30VT08bS2b6Lkb1fZTMDbucLktKKbB5o6lT3YO6PX8BWut+PnSo+7xINTlyqIBpr3/JHZ1G8XjSBHZtyuK3L97Kh9v+zn2v3kHL9s3dX4spKe6JBy6X+z4lRaFNxA+cc/nZTJj5OPkHDzGq7yNkLNvkdEmCukS9U1k4K/uFOHHi8c/V9SRVLHd/HtP+9iVTXv2cg3tz6XhuPNePuZq+Q3sfO4mg3CxRjDn2azYtDYYMce6NiEiV2Lp2B+Mue5ojeUd48bsnadu9ldMlBQTNEvXg9YENjv0FWEZhTarB/t0H+HTi//jvG19xKPcwva/sSfKfkujat2PFM8UqWYet0uMi4rN2btrNmAsfo7iohJdmPUlcx1inS/J7CmwefCKwgfsXYJBHr7UGdUsVytq2l48nfMaMf8ykqKCY/jecR/LYJOJ7tHG6NBHxItvW7WBM/8epFRLMK7OfoUmrGKdL8muadOBrylrYPGl8kFSBvZnZvHb/JG5P+D2fv/U1F9/Uj3fWvMLDH45WWBOR47TsEMvzXz3K4bwjPD5kAkcOFThdUkBSYPNG5cewaVC3VIH9WQf5+wPvc1v8/Xz+1jdccmt/3k9/jQcm3UuL9s2dLk9EvFjb7q146N+j2PjzFlLufYtA7J1zmhbO9UZTpx4/wWDiRPe5lBTo31+DuuWk5R3IJ3XCZ0x9bTqFhwsZeMuF3PLoMJq11bZRInLyzr3ibG594gbefzyVDufEk3T/FU6XFFA0hs0baVC3VIHCgiL+98ZXfPDMJ+Ttz6d/8vnc+vgwWnbQoGEROT0ul4vHkyaw+KufeX3xBFp3ael0SX5HY9h8iTHuFrTyoayy4yIerLXMSp3DnZ1H8caY90jo1ZbXFz/Pw5NH0nL1Ai3ILCKnLSgoiDGT7qVuvTq8eMffKCkucbqkgKHAJuJHVs5ewx/Oe4hnb3yFOhG1+cuMh3n+y0dp0qkRk/5xH2NfH8qksZeQeyTH/QItyCxAbkEuk5ZMYuzXY5m0ZBK5BblOlyRerGHj+vz+r79h3cIN/OfFaU6XEzDUJSriB/ZmZjNp7AfMnPwj0c0bcvvTN3LJrRcSHBzM7K2zGTx5MC7rIr8on/ACCAoNYfr/zaTvxE+1IHOAO+7rIyScIBPE9BHT6RvX1+nyap6GpJwUay1PDXuJhTOW8t76V2kUG+10SX5DXaIifqiosIiPX/iMOzqO5If/zOOmh4by7rpXufz/LiI4OJjcglwGTx5MbmEu+UX5AOSHQa4pYvCbF5L3hsJaIKvw66Mon9xC9/G8wjyHK3SAtgY8KcYY7n7hFlwlLt5//GOnywkICmwiPmrJN8v57VkP8vbYDzhrQBfeXvky//fMjdQJr330mtRVqbisq8LXu4DULiisBbBf/fqwLlJXptZwRV4gKen4ZZQ8l1lKSnK6Qq/RrE0TrvztJXz1/iy2p+90uhy/p8Am4mMO7s1h/K2vMvbSpykpLuGZ/47j6WnjiI1vdty16fvSj7aclJcfBhlRaG2/AParXx9F+WRkZ9RwRV6gbBmlstAWFKRhA7/ipoeGUiskmE80lq3aKbCJ+AhrLd988AN3dBrF96lzGfHIdby94mV6X9mr0tckRCcQHhJe4bnwkHDiew7UgswB7IRfH1HxNVyRl/Bc+7KMwlqFGjZpwEXD+zLz3z+Sf7Di8C9VQ4FNxAfs3rKHhwY/y/O3vkZsQlPeWPICtz81nNDaob/6uuQuyQSZir/Ng0wQyU9P+aUlQWNzAs4Jvz66JtdwRV5CWwOekqt/dxlH8gv4+l8/OF2KX1NgE/Fi1lqmv/0Nd3Ubw6o567jv1TuY+OPTJ71YZWRYJNNHTCcyNPJoS0p4SDiRoe7jEWGR7paDtDSNzQlAJ/z6CI1wuEIHaGvAU9YhsR0JPdsw8wMFtuqkZT1EvNS+nft5+a43WDB9KT0u7sqD//gdTVrFnNbHyivMI3VlKhnZGcRHxZPcNTkwfxlLhfT14WHKFPdsUM8xa54hLi1NWwNW4N9/SePdRz7kox1vEd2sodPl+LTKlvVQYBPxQj9++hOv3PMWBYcK+M3zN3PN7y4jKEgN4iLVTuuwnZZNK7dyd/cHGPX3u7ny7kucLsenaR02CQyVbbPkI9svHTlUwMS7/85Tw16iWdvGvLFkAkn3X6GwJlJTtDXgaWndpSWN4xqxZOYKp0vxW17xW8AYc7kxZp0xJsMYM66C82OMMauNMcuNMTONMa08zpUYY5aV3jSvOND58KKXG5dv4b5zxjLjH98yfGwSr8x+Rhu1i4hPMMbQsXcC6Ys3Ol2K33I8sBljgoG/AVcAnYEbjTGdy122FEi01nYHPgEmeJw7bK3tUXq7pkaKFu/lg4telk0s+H2fP5O3P5/xXz7Cnc+NoFZILadLExE5ae17tWPnxt3kZGsv2urgDb8RzgUyrLUbAYwxHwHXAqvLLrDWfudx/U/AzTVaofgOz/WTUlLcN/DaRS8LjxTy2v3/4It3vqXnJd0Z968/0LBxfafLEhE5ZW3Pcnd+bVm1nW79Ojlcjf9xvIUNiAW2eTzfXnqsMncCMzye1zbGLDLG/GSM8b7mE6l5PrLoZdbWPYy+8DG+eOdbRjx8HX+Z/pDCmoj4rJgW7g3g9+7IdrgS/+QNLWwV/RatcGS4MeZmIBHo73E4zlqbaYxpC3xrjFlhrd1QwWvvBu4GiIuLO/OqxXtVtuilF4W2n2et4ukbXqKooJgn0v7IBUnnOl2SiMgZiW7uXs5Dga16eEML23bAcxXQFkBm+YuMMYOAh4FrrLUFZcettZml9xuBWcDZFX0Sa+1b1tpEa21iTMzprWUlPsAHFr388r3vGHvp09RrVI/X5j+nsCYifiGiQThBwUHkagxbtfCGwLYQSDDGtDHGhALDgWNmexpjzgbexB3WsjyONzTGhJU+bgRcgMfYN7/l40tXVKupU4/fqNlzI2cHZ4laa3nv0Y948Y7XOWtAZ16b9yxxHTULVET8gzGGoCCDdQXw76Bq5Hhgs9YWA/cDXwJrgI+ttauMMU8ZY8pmfb4ARAD/Kbd8RydgkTHmZ+A7YLy11v8Dmw8vXVHtkpLcK5F7dn+WhTYHt18qKizi+dteY/Kzn3L5HRfz7OcPEV6/4k23RUR8lQkKwhXoga2aGlW8YQwb1trpwPRyxx7zeDyoktfNBbpVb3VeyHPpCnCHES9fuqLGlC1uebLHa8Dh/CM8df2LLPryZ25/ejg3PTQU4yVj6UREqorL5aKkqJjgWo63BTmrrFGlirc384rAJqfIx5auCGQ52bk8evV41s5PZ8zb93DFnQOdLklEpFrk7c/H5bI0CPTZ7tXUqKLA5qvKQlvZFwQorHmZ/bsPMPbSp9m+LpNHPn6AfkN7O12SnKbcglxSV6WSvi+dhOgEkrskExkW6XRZIl5lf9ZBAAW2ampUCfB2Sx9W2dIVgTzhwIsc2HOQPw16ip0bdvPM//6ssObDZm+dTezLsYz6YhQT5k5g1BejiH05ltlbZztdmohXydqyB/hlPbaAVg3rgSqw+SIfWLoikOVk5zL20qfJ3LCLp6aNpeeg7k6XJKcptyCXwZMHk1uYS35RPgD5RfnkFrqP5xXmOVyhiPfYtGIrAK27tjzBlQGgGhpVFNh8kRcvXRHo8g/mM+7Sp9m2ZgdPTh3L2RcH3pwYf5K6KhWXdVV4zmVdpK5MreGKRLzXppVbaRQbRWTDCKdLcVY1NapoDJsvKlu6Iinp+KUr+vcP7FmiDio8UshjSRPYuHwrT075I4mXnuV0SXKG0velH21ZKy+/KJ+M7IwarkjEe635KZ34nm2cLsN5lTWqgPt4//6nNUtULWy+qGyJivJ94ZUdl2pXUlLC+FteZfn3q/nTe/fR+8peTpckVSAhOoHwkIrXywsPCSc+Kr6GKxLxTllb97AjfSdnX6RehepaD1SBTaQK/H3M+/z46Xzueek2Lr6pn9PlSBVJ7pJMkKn4x2SQCSK5a3INVyTinZbMXAnA2QO7OlyJF6imRhUFNpEzNH3STKa+NoPrRl3JdaOvcrocqUKRYZFMHzGdyNDIoy1t4SHhRIa6j0eEBvhYHZFScz9bQHTzhrTuGud0KX5LY9hEzsDqeev46/2T6HXpWdz1wi1OlyPVoG9cXzIfyCR1ZSoZ2RnER8WT3DVZYU2kVO7+PBbOWMq1912uXVyqkQKbyGnat3M/T17/Eo1aRPPQv0cSHBzsdElSTSJCI7iz551OlyHileZMWUBxUQkX3djX6VL8mgKbyGlwuVw8f+tr5B/IZ/wXD1MvSqvei0hg+vztb2jZoTntE9s5XYpf0xg2kdPw8YTPWDpzBb9LuYM23Vo5XY6IiCPWzE9n7fx0rlF3aLVTYBM5RWsXpPPuox9x4bDzuOLOi50uR0TEMVNfm07dyDpcetsAp0vxewpsIqegsKCIF+94nUBtRLQAACAASURBVOjmDRn95m/1F6WIBKxt63Yw66M5XPGbgdSNrON0OX5PgU2qhrUwZcrxW25UdtxHfTzhM7as3s7I1+8iokHFC6qKiASC9x5LJbROKMljtbtOTVBgk6oxdSoMHXrsPmll+6kNHeoX+5tuX5/Jv5/9lAHJ52snAxEJaOsXb+CH/8zjutFX0bBxfafLCQgKbFI1kpKO39zWc/NbP9jf9K0//YuQsBDunXi706WIiDjG5XLxtz+8Q4OYegx74Gqny6leXtR7pMAmVaNsn7Sy0BYUdPzmtz7s5+9XMW/aIoaPG0JU04ZOlyMi4piv3pvF6nnruWvCLYTX9/OhIV7Ue6TAJlWnLLR58oOwZq3l7T/9i5gW0QwdNdjpckREHJOzL5dJ4z6gywUdGHTLhU6XU/28qPdIgU2qTtkXsifPv0p81IIZS1m3cAO3PnEDYXXCnC5HRMQxr90/ifyDh/jD3+4iKCgAIoQX9R4FwL+21Ijyf3W4XMf/VeKjPho/hZiW0Qy8uZ/TpYiIOGZW6hxmpc7l5seG0bZ7AC0Y7iW9RwpsUjWmTj3+rw7Pv0p8dJboyjlrWTl7LcMeuIaQ0BCnyxERccTezGxevW8SHc+NZ3igLePhJb1HCmxSNZKSIC3t2L86ykJbWprPzhL939+/Irx+XS7XjgYiEqCKi4p5Jvllio4U8cf37ie4VrDTJdUcL+o90ubvUjWMgSFDTv64D8jdn8cPn/zEFXdeTJ3w2k6XIyLiiDcf/Cer5qzjoX+PIq5jrNPl1KzKeo/Afbx//xr7HafAJlKJb/89m6KCIq74zUCnSxERccTMyT8y9bUZDB15JRcNv8DpcmpeWe9RUtLxvUf9+9do75ECm0glZqf9ROsuLYnv0cbpUkREatzKOWt56c7X6XZhJ+6acLPT5TjDi3qPNIZNpAL5B/NZ8eNa+lylLahEJPBkbtjFE0Mm0LhVDE98+kdqhah9x2leEdiMMZcbY9YZYzKMMeMqOB9mjEktPT/fGNPa49yfS4+vM8ZcVpN1i/9a9NVySopL6K3AJiIB5uDeHB656jlcLssz//sz9aIjnS5J8ILAZowJBv4GXAF0Bm40xnQud9mdwH5rbTwwEXi+9LWdgeFAF+By4PXSjydyRlb+uIba4WF06p3gdCkiIjUmP+cQDw3+C7u37OHJKX+iRUIzp0uSUt7QxnkukGGt3QhgjPkIuBZY7XHNtcATpY8/Af5qjDGlxz+y1hYAm4wxGaUfb14N1S5+at2iDBJ6tQ2s6esiZyC3IJfUVamk70snITqB5C7JRIapZcaXHM4/wiNXPceGZZt5Iu2PdOvXyemSxIM3BLZYYJvH8+1A78qusdYWG2MOAtGlx38q99oAm3MsVa24qJiMpZu59r7LnS5FxCfM3jqbwZMH47Iu8ovyCQ8JZ8yXY5g+Yjp94/o6XZ6chCOHCnhiyARWz3Uv36Hxu97H8S5RoKK9HcqvRFfZNSfzWvcHMOZuY8wiY8yiPXv2nGKJEkh2bd5DUUERbbrFOV2KiNfLLchl8OTB5Bbmkl+UD0B+UT65he7jeYV5DlcoJ3I47zCPXPUcS2eu5IF//I7+N5zvdElSAW8IbNuBlh7PWwCZlV1jjKkF1AeyT/K1AFhr37LWJlprE2NiYqqodPFHWVvcgb5JK32diJxI6qpUXNZV4TmXdZG6MrWGK5JTkX8wn3GXP8uKH9cw7l+/59LbBjhdklTCGwLbQiDBGNPGGBOKexLBtHLXTANuK318PfCttdaWHh9eOou0DZAALKihusVP7S4LbK0V2EROJH1f+tGWtfLyi/LJyM6o4YrkZB3cm8PYS59m3YIMHv5wFBff1M/pkuRXOD6GrXRM2v3Al0Aw8I61dpUx5ilgkbV2GvAP4F+lkwqycYc6Sq/7GPcEhWLgPmttiSNvRPxGbra7C0dT2UVOLCE6gfCQ8ApDW3hIOPFR8Q5UJSeSuWEXDw3+C3u27eXxTx/kvKsTnS5JTsDxwAZgrZ0OTC937DGPx0eAYZW89lng2WotUAJK4ZEiAMLqhDpciYj3S+6SzJgvx1R4LsgEkdw1uYYrkhNZuyCdR68eT0mJi+e/foyuF3R0uiQ5Cd7QJSriVYoKiggKMlrSQ+QkRIZFMn3EdCJDIwkPCQfcLWuRoe7jEaERDlconmZPmc+DFz1B7YjapMx5xv/CmrUwZYr7/mSO+5CTDmzGmEuMMW8bY3qUPr+7+soScU6tkFq4XJaSEvWui5yMvnF9yXwgk5TLUxh3wThSLk8h84FMLenhRay1TH72U5687kXadIvj1bnP0rKDH66CNXUqDB0Ko0f/Es6sdT8fOtR93kedSpfo74D/Ax4xxkQBPaqnJBFnhTeoC8ChnMNENlTrgMjJiAiN4M6edzpdhlSg4HABL975BrM+msPAm/sx5q17CK3tp0M+kpJg5EhISXE/nzjRHdZSUtzHk5Kcre8MnEpg22OtPQA8aIwZD5xTTTWJOCqigbtbJ29/vgKbiPi0zA27ePqGl9mwbDN3PjeC5D9di3ujID9ljDukgTuklQW3kSPdx334vZ/KGLbPyx5Ya8cB/6z6ckSc16hFNAC7Nmc5XImIyOn7MW0+9/b6E7s3Z/H0tLEMH5vk32GtjGdoK+PjYQ1OIrAZY14xxhhr7Weex621r1VfWSLOievkHtexdc0OhysRETl1RYVFvDH6PZ66/kVadmjO64sn0PvKANpqqmzMmifPMW0+6mRa2PKAacaYugDGmEuNMXOqtywR50Q3a0jdyDpsWb3d6VLES+QW5DJpySTGfj2WSUsmkVuQ63RJIhXauXE3Y/o/TlrK5yTdfwUv//A0TVs3drqsmlMW1srGrLlcv4xp8/HQdsIxbNbaR4wxNwHfG2MKgHxgXLVXJuIQYwztE9uyet46p0sRL6CNzcUXWGv58r1ZvD7yHYKCg3gkdQz9h53ndFk1b+rUX8JaWTeo55i2/v1hyBBnazxNJ9MlOhC4C3dQiwH+YK39sboLE3FSj4u7sWHZZg7uzXG6FHGQNjYXX3Bgz0GevP5FXrrzdRJ6teXNZS8GZlgD9yzQtLRjx6yVhba0NJ+eJXoyXaIPA49aawfg3scz1RhzcbVWJeKwswd2A2DZtysdrkScpI3NxdvN/Wwhd3d/gAWfL+HuCbfwwszHadIqgPdBNsbdglZ+gkFlx33IyXSJXuzxeIUx5grgU+D86ixMxEkdEtvRsEl9Zn08l/436Es9UGljc/FWB/fm8Pqod/n237Np270V4798lLbdWzldllSjU95L1Fq7s7SbVMRvBdcK5qLhffnvG1+Ssy9XG8EHKG1sLt7GWst3H83hjVHvkrs/n1sfv4Hhf04iJDTE6dKkmp3WXqLW2sNVXYiIt7nktv4UFRbzzQc/OF2KOCS5SzJBpuIfk9rYXGrazk27efSa8Tw3IoUmrWN4fdHz3PL4MIW1AHHKLWwigSK+Rxs6n9+BT17+L1ffe6l+KAagso3Ny88SDTJB2ti8BuQW5JK6KpX0fekkRCeQ3CWZyLDAa+0uKizik5f+x+RnPsEEGX774q0MGTmY4OBgp0uTGmSsD69JcroSExPtokWLKj5prXtacFLSsYMTKzsufm3hF0t5aPBfGP3mbxl81yCnyxGH5BXmkboylYzsDOKj4knumqywVs0qWk6lLCgH0nIqy75byWv3T2Lrmh30HdqbeyfeTuOWjZwuS6qRMWaxtTbxuOMKbOVMmQJDhx67hovnQnxpaT67houcOmstv+/zZw7uyeEfq1/x3w2TRbxIbkEusS/Hklt4/ALFkaGRZD6Q6feBedfmLN4e+wE//GceTds05r6UO+hzVQDtVhDAKgtspzWGza8lJR2/KrLnqsk+vIaLnDpjDHc8exO7Nu/h4xemOV2OSEAI5OVUDuUe5p2H/80dnUYx/3+LufXxG5i08mWFNdEYtuOUXxU5JcX92LPFTQJKz0Hd6X/DeXz4XBoDR/SjWdsmTpck4tcCcTmVkpISvn7/e9595EOydx1g4M39uPMvI4hpEe10aeIl1MJWEc/QVkZhLaD99sXbCAoOIuV3b+NyVfyXv4hUjbLlVCrib8upWGuZ//li7u35J176zRs0aR1DytxnGffPPyisyTEU2CpS1g3qycc3jZUzE9Mimt+Mv5nFX/3M1FdnOF2OiF8LlOVUVs5ew5j+j/HI1eMpOFzIIx+NJmXOs3Tu097p0sQLKbCVV37Mmst1/Jg2CUjX/O4yzrsmkUnjPiBj6SanyxHxW2XLqUSGRh5taQsPCScyNNIvllPJWLaJR68Zz+gLHyNzw25GvnE3/1g1kf43nI9RT45UQrNEy9MsUfkVB/fm8NseDxJWJ5SUuc/SIKa+0yWJ+C1/W05lw8+b+eDpT5idNp+IBuEk/+lakv4wmNp1w5wuTbyIlvXwoHXYaoAf/zuunreOPw58krZnteaFmY/rh62I/KqMpZv411P/Ye5nC6lbrw5D/jCY68dcTUSDisfpSWDTsh4nyxh3C1r5MFHZcanY1KnulkrPbuSylsqhQ93nfVTn8zrw58kjWbcgg7/c9AolxSVOlyQiXmjN/HQevXY89/b6E8u/X82tj9/A5M1vcPtTwxXWqoK17l6x8g1PlR33cQpsUj38fD27vkN6c9+rdzBv2iJevvvvlJQotImIe9bnwi+W8seBT/CH8x5i1Zx13PZkMh9s+hu3PD5MQa0q+XHDQEW0DptUjwBYz+7a+y4nZ28u/3zyY1wlLh5853fa208kQBUXFfP9x/P4+IXP2Lh8C41io7j7hVu56reDqBNRx+ny/JNnwwC4f7f4UcNAeRrDJtXLWgjyaMh1ufwirHma/MynvPfYR1x04wX86b37qRWiv4NEAkXegXymv/0NU1+bwZ7t+2jdpSXDHryGi268gJDQEKfL83+evTdlfLxhQGPYpOqc7LiBAFnPbsQj13HncyP47sM5PHbt8+QfrHiFdp8RYONCRE7HtnU7+Ovv/8FNcffw9tgPiG3fjGf+O443f36RS28boLBWUwJooXtHA5sxJsoY87UxJr30vmEF1/Qwxswzxqwyxiw3xiR7nHvPGLPJGLOs9NajZt9BgDqZcQMBtp7d8LFJjH7rHpZ8s4Lf93mI7esznS7p9AXYuBCRk1VSUsK8/y7iz1c8wx2dRjH97W/oO7Q3byyZwAvfPE7vK3sRFKR2kBoVIA0DgHuApFM3YAIwrvTxOOD5Cq5pDySUPm4O7AQalD5/D7j+VD9vr169rNdwuaxNS3Pfn8xxb+ByWTtypLXgvq/oeVrasc/Lvy4tzdn3UE1+/n6VvS7m/2xSw9vswi+XOV3O6TmZ/1+RALI/64D9cPwUe3Obe+0gc71Njr3L/uup/9js3QecLi2w+enPKmCRrSgzVXSwpm7AOqBZ6eNmwLqTeM3PHgHO9wObrwYbzxrLbuXfg68F0Sqyc9Nue1f3MfbS4GH2g2c+scXFxU6XdOpO9P8r4udcLpdd9t1K+9zNKfaK2jfaQeZ6++DFj9sfPplniwqLnC5PrPXd358nUFlgc3TSgTHmgLW2gcfz/dba47pFPc6fC7wPdLHWuowx7wHnAQXATNytdQUn+rxeNenAlus6LD/LxZv74q2fTyiwp7/47+G8w0z87Zt89+EcelzUhT++ex+N42JqqPAq4u//vyIV2JuZzdfvf88X735LZsYuwuvXZdDNF3L1vZfSqnNLp8sTT2fwM9qbVTbpoCZa0b4BVlZwuxY4UO7a/b/ycZrhbpHrU+6YAcJwB7nHfuX1dwOLgEVxcXFVG4fPlC+2ZvhizafqDP96c7lcdsY739qrI2+219S/xX71/izr8pV/n0D4/xUpVVRYZOdMXWAfueY5e2mtG+wgc70dM+Ax+9U/Z9nD+UecLk8CDL7cJQrUA5YAw37lYw0A/ncyn9erukTLuFzH/nL05l+Mfjpu4DhV9D4zN+yyo/o9YgeZ6+0jVz9nd23OqubCz1Cg/P9KQHO5XHbN/PX2r7//h72+8R12kLne3tDsN3bSuA/stvWZTpcnAcxbA9sLHDvpYEIF14Ti7u4cVcG5srBngFeA8Sfzeb0usPlaa4afjhuoUBX93xQXF9v/vDTNXhU+wl4VPsJ+/OI07x0HE0j/vxJwMjfssv966j/29g6/t4PM9faK2jfaJ4e9aOd8tsAWF/ngeFPxO5UFNqfHsEUDHwNxwFbcLWjZxphE4B5r7W+MMTcD7wKrPF56u7V2mTHmWyAGd2BbVvqavBN9Xo1hO0PWP8cNVMpW3Viu3Vv28Nr9k5j/+RJad2nJva/8Hz0HdquiQqtIoP3/it/bt3M/3388l+8+msPa+ekAnDWgCwNH9KPfdX20XZR4lcrGsGmnA6dNmeJe28oznHmGuLQ096bz4gzP/4syZxikrbXM/Wwhf3/gfXZtyqLPVb2449kbadOtVRUVLSLZu/YzZ8oCfvhkHsu/X43LZWnXozUXDe/LRcPP971JQBIwFNg8eFVgU2uG96rm1s/CI4WkvfI5Hz0/lUM5hxl4cz9ufeIGmrVpUoVvQiRwZG3by+y0+cxOm8/K2Wux1tKyQ3P633A+A4ZfQKtOLZwuUeSEFNg8eFVgE+9VQ62fOdm5pD7/GVNfm05JsYvLbh/AjQ8NpWnrxlXwJkT827Z1O5gzdSGz035i3cINALTu2pJ+Q/vQ77retO4ah9EfveJDFNg8KLDJSanh1s892/fx0fgpzJg0E5fLMiD5fIY9eA3tzmpdZZ9DxNcVFxWzas465v13EfM/X8z29TsBaJ/Yjn5De9N3aG9atG/ucJU+Qj08XkmBzYMCm3izPdv38clL/2X6pG84kl9Az0u6c92oq0i87CztUygBaX/WQRZ9sYwFM5aw6MufyTuQT0hoLboP6EKfq3px/rXn0LhlI6fL9D0aQ+2VFNg8KLCJL8jdn8fnb37NlFenk73rAM3jm3Lt7y7n0tsHaFab+LWSkhLWL9rIwhlLWTBjCesXbcRaS8Mm9TnnirPpc1UivS7pTt3IOk6X6tt8cZWCAKDA5kGBTXxJUWERP346n8/+OoPV89ZTu24YF95wHlfccTFdLuio8Tni86y17EjfyZJvVrBk5nJ+/m4VeQfyCQoydOzTnnMvP5tzB59Nux6t1cpc1aphJrycGQU2Dwps4qvWL97A529+zXcfzeFw3hGatW3CwBH9GHjzhbRIaOZ0eSInLWvrHpZ9t4pls1ay7NuV7Nm2D4DGcY3oOag7PQd1p9cl3akXHelwpQGgCtealDOnwOZBgU183eG8w/zwyU/MnPwjy75dibWWjr0TGHTzhfS/4TwaxNR3ukSRY2Rt28uKH9aw7LuV/DxrFTs37gagXnQkZw3ozNkDu9NzUDeat2uqVuOapBY2r6PA5kGBTfzJ3h37+Pbfs5k5+Uc2Lt9CUJChS9+OnH/NOVyQdC7N2mpdN6lZJSUlbF65jVVz1rFyzhpWzl57tAUtokE43ft35qwBXehxUVdad22pbk6naAybV1Jg86DAJv5q4/It/PDJPOZNW8TG5VsAaNMtjvOvOYdzB59Nh3PjCQ4OdrhK8TcH9hxk7fwM1vy0njXz01m3IINDuYcBiG7ekK59O9Ll/I507duRtme10tegt9AsUa+kwOZBgU0Cwc6Nu5n72ULmTlvIyh/X4HJZIhuG0+vSs0i8rAe9Lj2LRs2jnC5TfMyRQwVkLN3EugUZrFuUwboFGWRucHdvBgUH0e6sVnTs3Z7O57Wna9+ONGkVoy5Ob6V12LySApsHBTbfkVuQS+qqVNL3pZMQnUByl2QiwzQI+VTlZOey9JsVLPxiGQu/XEb2zv0AtOwYS/cLO9OtXye6XdhJa1nJMXKyc9n48xY2/ryFjGWbSF+8ka1rtuNyuX9vNIqNosM57ejUpwOd+iTQPrEdteuGOVy1iG9TYPOgwOYbZm+dzeDJg3FZF/lF+YSHhBNkgpg+Yjp94/o6XZ7PstaycfkWFn35Mz9/v4pVc9ZyKMfdfdW0dQzdLuxMpz7t6dQ7gTbd4giupe4rf1dSXML29J1sXrGVTSu2snHFFjYs20zW1r1Hr4lq2oD4nm1o36sdCb3a0uGceKKbNXSwahH/pMDmQYHN++UW5BL7ciy5hbnHnYsMjSTzgUwiQiMcqMz/lJSUsGn5Vlb8uIYVP65mxY9rOZB1EICwOqEk9GpLx3MT6Ng7gfizW9OsbRMNEvdRxUXF7Ny4my2rt7N1zQ62rt3OphVb2bZmB0WFxQAEBRli2zcn/uzWtDurDe16tKbdWa1o2KSBw9WLBAYFNg8KbN5v0pJJjPpiFPlF+cedCw8JJ+XyFO7seacDlfk/ay27NmcdHUS+dkE6GUs3U1RQBECdiNq06RZHm26taHdWK1p3jaNlx+ZaSsRLuFwu9u7IZkf6TjIzdrEjfSc7MnaxfX0mmRm7KC4qOXptTItoWneLo02Xlu77bnHEdYwltHaog+9AJLBVFthqOVGMyImk70uvMKwB5Bflk5GdUcMVBQ5jDM3aNKFZmyZcNPwCwL3bwsblW9mwbDMbf97MxhVbmJU6h8/f+vro6+pFRxLXKZa4jrHEdWpB8/imNI9vSrM2jRUAqpC1lpx9uWRt3cuuzXvYtXE3OzdlsWtzFrs2ZbF7cxaFR4qOXh8SFkLzdk1o0b45519zDi07xtKqcwtadozV1k4iPkSBTbxSQnQC4SHhlbawxUfFO1BV4AoJDaFDYjs6JLY7esxaS9bWvaXda+4utm3rdjB7ygJyJs08ep0xhkaxUTSPb0rT1o1p0iqGmLhGNC69xbSIIqyOBqqDu3v6QFYO+zKz2Ze5v/SWzd7t+8jatpc92/aRtXUvBYcLj3ldRINwmrZpTKvOLehzZU+axzcjNqEpsfFNadQiWl3YIn5AXaLilTSGzbcd3JvDjoxd7Nywm8wNu0pvu9m9OYvsnQco/3MnokE4DZvUp2HTBkQ1bUDDJg1o0Lg+9RtFUi+67BZBZHQkkQ3DCa0d6tVLRVhrKSooIj/nMPkHD5GbnXfc7eDeHA7sOciBrBwO7snhQNZBDu7NPe7fJijI0KBJg6MBt3HLRsS0jCamZSOato6haZvGRDbU94KIv9AYNg8KbL5Bs0T9U2FBEft2ZJO1dS+7t+xhX+Z+snfuJ3v3AfbvOkD2Lvd92cKrFQmuFUzdenUIr1+XuvXqUDeyDrXDwwirG0btumGE1QmldnhtQsJqUSu0FrVCyu6DqRVSi6DgIPfyUsYQFGSOhr+SEhfWZXGVuNw3l4viwmKKCoopLCii6OitmCOHjlBwqJAj+Uc4Unp/OPcIh3IOkX/w0DFjxSoS0SCcBo3r0aBxffctph71Y+oR3awhUc0a0ig2iujmDWnYpIFm6ooEEAU2DwpsviOvMI/UlalkZGcQHxVPctdktawFiILDBeTsyyNnX27pzf04/0D+0ZarQ7mHOJRzmEM5hyk4VMCRQwUUHCp0P84vcIer0tmPZyq4VjAhYbUICa1FSFgItcPDqB1e+2hQDKsbSt3IOoTXq1saJsOPhsrIqAgioyKoV3of0SBcIUwcobUtvZ8CmwcFNpHAYa27xay4qJjiwmKKi0pwuSzW5cJa93lbuhBsUHAQQUHGfV/6uFaou3VO2ymJr1OvhW/QLFFfpy1ERE6LMYbgWsEE1wrW5AYJWLkFuQyePPiYccFlk7oGTx6sccE+QFOHfMXUqe5NekePdoc0+GWT3qFD3edFREQqkLoqFZd1VXjOZV2krkyt4YrkVKmFzVckJcHIkZCS4n4+caI7rKWkuI8nJTlbn4iIeC2tben7FNh8hTHukAbukFYW3EaOdB9Xd6iIiFRCa1v6Pk068DXWgucimC6XwpqIiPwqrW3pOyqbdKAxbL6kbMyaJ88xbSIiIhWIDItk+ojpRIZGEh4SDrhb1iJD3ccV1ryfukR9RVlYKxuz5jmGDdQtKiIiv6pvXF8yH8jU2pY+SoHNV0ydemxYKz+mrX9/GDLEmdq05IiIiE+ICI3gzp53Ol2GnAZHu0SNMVHGmK+NMeml9w0rua7EGLOs9DbN43gbY8z80tenGmNCa676GpaUBGlpx7aklYW2tDRnZ4lqyREREZFq5fQYtnHATGttAjCz9HlFDltre5TervE4/jwwsfT1+wH//bPBGHcLWvmWqsqO1yTPJUfKQpuWHBEREakyjs4SNcasAwZYa3caY5oBs6y1HSq4Ls9aG1HumAH2AE2ttcXGmPOAJ6y1l53o8/r0LFFv5RnSymjJERERkVPirbNEm1hrdwKU3jeu5LraxphFxpifjDFlzTXRwAFrbdnOztuB2Mo+kTHm7tKPsWjPnj1VVb+U8RxTV0ZhTUREpEpUe2AzxnxjjFlZwe3aU/gwcaVp8ybgFWNMO6CiJFBpc6G19i1rbaK1NjEmJuYU34WckJYcERERqTbVHtistYOstV0ruH0G7C7tCqX0PquSj5FZer8RmAWcDewFGhhjyma6tgAyq/ntSEXKj1lzuY4f0yYiIiKnzeku0WnAbaWPbwM+K3+BMaahMSas9HEj4AJgtXUPvvsOuP7XXi81oLIlR8pCm2aJioiInBGnJx1EAx8DccBWYJi1NtsYkwjcY639jTHmfOBNwIU7YL5irf1H6evbAh8BUcBS4GZrbcGJPq8mHVQxrcMmIiJSJSqbdKC9REVERETORBU2XHjrLFERqWG5BblMWjKJsV+PZdKSSeQWHL8ZtIiInIIaWEBeW1OJBJDZW2czePJgXNZFflE+4SHhjPlyDNNHTKdvXF+nyxMR8U2eC8jDsft9V9EC8uoSFQkQuQW5xL4cS27h8S1qkaGRZD6QqU2gRUROVxUtIK8uUZEAl7oqFZd1VXjOZV2krkyt4YpERPxINS8gr8AmEiDS96WTX5Rf6NkKmQAAD/9JREFU4bn8onwysjNquCIRET9SzQvIK7CJBIiE6ATCQ8IrPBceEk58VHwNVyQi4idqYAH5wA5s1sKUKcf/Q1Z2XMSHJXdJJshU/C0fZIJI7ppcwxWJiPiJGlhAPrADWw1MwxXxFpFhkUwfMZ3I0MijLW3hIeFEhrqPa8KBiMhpSkqCtLRjx6yVhba0NM0SPV1HZ4mWb8IsPw23CgcLiniLvMI8UlemkpGdQXxUPMldkxXWRES8hHY68HDMsh5VNA1XRORXaQs3ETkJWtajMtU8DVdEBNAQjECgcdFSjRTYqnkarogIcOxK6GU/Y6p4JfSA53RgUiiXahTYga0GpuGKiADHzxoLCtJ42armdGBSKJdqFNhj2KZMcX8Te/7A9PwGS0uDIUOcLldE/Im17rBWxuVSWKsq3jCRTOOi5Qxp0oGHY2aJahCwiNQU/TKvft7wb6xQLmdAkw4qYoy7Ba38N1Jlx0VETpeGYNQMpyeSaVy0VJPADmwiIjWlBlZCF5wNTArlUo0U2EREakINrIQe8JwOTArlUo0CewybiIj4D6cnkmlctFQBTTrwoMAmIuKHFJjED1QW2Go5UYyIiEiVK5swdrLHRXyIxrCJiIiIeDkFNhEREREvp8AmIiIi3svpPWK9hAKbiIiIeC+n94j1Epp0ICIiIt4rKemXtezg+D1iA2QNQwU2ERER8V6e242lpPwS3AJsH16twyYiIiLez1oI8hjJ5XL5ZVjzys3fjTFRxpivjTHppfcNK7jmImPMMo/bEWNMUum594wxmzzO9aj5dyEiIiLVysk9Yr2E05MOxgEzrbUJwMzS58ew1n5nre1hre0BXAwcAr7yuOSPZeettctqpGoRERGpGU7vEeslnB7Ddi0woPTx+8AsYOyvXH89MMNae6h6yxIRERGvMHXqL2GtbMya55i2/v0DYicLp1vYmlhrdwKU3jc+wfXDgQ/LHXvWGLPcGDPRGBNWHUWKiIiIQ5KSIC3t2AkGZaEtLS1gZolWe2AzxnxjjFlZwe3aU/w4zYBuwJceh/8MdATOAaL4ldY5Y8zdxphFxphFe/bsOY13IoIWcBSpKvpekpNVthds+QkGlR33U9Ue2Ky1g6y1XSu4fQbsLg1iZYEs61c+1A3AFGttkcfH3mndCoB3gXN/pY63rLWJ1trEmJiYqnlzEni0gKPImSkLZFOmHPu9ZK27tWTUKH0viVTA6TFs04DbgPGl95/9yrU34m5RO8oY08xau9MYY4AkYGV1FSoCaAFHkTNV9kfPH/7gvqWk/PLHz6uvuu/1vSRyHEfXYTPGRAMfA3HAVmCYtTbbGJMI/9/e3cbKcZUHHP8/SeQghEqcYFqHpMSWXCACKUhXkdp+cEgDCf0Q37imNRWSKUEV9CUfaCWCUqkRLaLpl0DVqjSlLfRFJJDYwRUgK8FOK1UEMFIoCZbjG/MBNykJhbShVV3ATz/sLIzvzt47197defv/pNXdPTuzPvP4zOyzc86c4V2Z+c5iuauAfwGuzMwzpfUPA1uAAB4r1vneev+u87DpvJSvWBob2ASO0jkr7z+33TYqGydqMCr70IfclzRY0+Zhc+Jc6VwMZAJHaS6qfvSMuS9p4Fo5ca7USU7gKJ2f8rQMq7kvSZVM2KSNcAJH6fxlji4uKCuPaXNfkiaYsEkbMW0Cx3HS5pVt0trGP3rG49bGiVr5tfuSNKHpq0SlbhlP4Li8PDmB486dXtkmrWf8o+e2286eoT5iVP7AA3Ddde5L0ipedCBJWpzMUdJW/tGzVrk0MNMuOvAMmyRpccaz09ctlwQ4hk2SJKn1TNgkSZJazoRNkiSp5UzYJEmSWs6ETZJmJRMOHJic9HVauSTVZMImSbPy4IOwe/fZM/WPJ4rdvdvJYCWdM6f1kKRZWV7+8V0vYDShcvlWZk4GK+kceYZNkmZl9a3KLrhg8lZmXWH3rtQqJmySNEvjpK2sa8ka2L0rtYwJmyTN0jipKSsnPV1R7t4d19/uXakxJmySNCurk5ozZyaTnq7oU/eu1AMmbJI0Kw8+OJnUlJOernUj9qV7V81xLOTMmLBJ0qwsL8P+/WcnNeOkZ//+7nUj9qV7V81xLOTMmLBJ0qxEwC23TJ6BmlbeZn3q3lVz5j0WckBn8EzYJEmT+ta9q2bMeyzkgM7gRfYo+6xraWkpjx492nQ1JKm9MkdfdsvLZ3+pTiuX1pI5StbGzpyZTftZfcZu9WTVHRxzGRFfycyl1eXe6UCSNGncjVu3XJpm2ljIWSRT5QtjPvzhH99lpKPJ2lrsEpWkoRjQeB+1xCLGQg7kamYTNkkaigGN91FLLGIs5ECuZjZhk6Sh8O4FWrR5T3UzoKuZvehAkoak/AU31sPxPhqIAwdGZ4fLbbjcxvfv79yYy2kXHZiwSVLTFn1F5ryu2JMWrYdXM09L2BrtEo2It0TEExFxJiImKlda7qaIOB4RKxFxe6l8W0R8MSJORMR9EbFpMTWXpBla5NiygYz30UD0abLqdTQ9hu1xYDfwz9MWiIgLgT8D3gxcDbw1Iq4u3r4LuDszdwDfBW6db3UlaQ4WNbZsQON9pL5pdB62zDwGEGtnwNcCK5l5slj2XmBXRBwDrgd+tVju48CdwJ/Pq76SNBeLmktq2hV74393587OjfeRhqLpM2x1vAL4Zun1qaLsMuD5zPzBqnJJ6p5FzCXVt5vTSwMy94QtIh6OiMcrHrvqfkRFWa5RPq0evx4RRyPi6HPPPVfzn5akBVnE2LIBjfeR+mbuCVtm3pCZr614fLrmR5wCriy9vgJ4Gvg2cElEXLSqfFo97snMpcxc2rJly7lsiiTNh2PLJK2jC12iXwZ2FFeEbgL2AgdzNB/JEWBPsdw+oG4SKEntsYjZ4CV1WtPTetwSEaeAnwU+ExGHivLLI+KzAMUYtd8CDgHHgE9m5hPFR7wXeE9ErDAa0/ZXi94GSTpvji2TtA4nzpUkSWqJVk6cK0mSpPWZsEmSJLWcCZskSVLLmbBJkiS1nAmbJElSy5mwSZIktZwJmyRJUsuZsEmSJLWcCZskSVLLmbBJkiS1nAmbJElSyw3yXqIR8QJwvOl6tMzLgG83XYkWMi7VjEs141LNuFQzLpOMCbwyM7esLryoiZq0wPGqG6sOWUQcNSaTjEs141LNuFQzLtWMyyRjMp1dopIkSS1nwiZJktRyQ03Y7mm6Ai1kTKoZl2rGpZpxqWZcqhmXScZkikFedCBJktQlQz3DJkmS1Bm9TNgi4i0R8UREnImIqVebRMRNEXE8IlYi4vZS+baI+GJEnIiI+yJi02JqPl8RcWlEPFRs10MRsblimTdExGOlx/9GxHLx3sci4hul965Z/FbMXp24FMv9sLTtB0vlQ24v10TEF4r97V8j4ldK7/WqvUw7XpTev7j4/18p2sNVpffeV5Qfj4gbF1nveaoRk/dExNeLtvH5iHhl6b3K/akPasTl7RHxXGn731l6b1+xz52IiH2Lrfl81YjL3aWYPBkRz5fe6217qS0ze/cAXgO8CngEWJqyzIXAU8B2YBPwVeDq4r1PAnuL5x8B3t30Ns0oLn8M3F48vx24a53lLwW+A7y4eP0xYE/T29FUXIDvTSkfbHsBfgbYUTy/HHgGuKRv7WWt40Vpmd8APlI83wvcVzy/ulj+YmBb8TkXNr1NC4rJG0rHj3ePY1K8rtyfuv6oGZe3A39ase6lwMni7+bi+eamt2lRcVm1/G8Df9339rKRRy/PsGXmscxcb2Lca4GVzDyZmf8H3AvsiogArgfuL5b7OLA8v9ou1C5G2wP1tmsP8LnM/J+51qp5G43Ljwy9vWTmk5l5onj+NPAsMDHhYw9UHi9WLVOO1/3ALxTtYxdwb2aezsxvACvF53XdujHJzCOl48ejwBULrmMT6rSVaW4EHsrM72Tmd4GHgJvmVM9F22hc3gp8YiE164heJmw1vQL4Zun1qaLsMuD5zPzBqvI++MnMfAag+PvydZbfy+QO84Gie+PuiLh4HpVsQN24vCgijkbEo+NuYmwvPxIR1zL65fxUqbgv7WXa8aJymaI9/Cej9lFn3S7a6HbdCnyu9Lpqf+qDunH5pWLfuD8irtzgul1Ue9uKrvNtwOFScV/bS22dvdNBRDwM/FTFW3dk5qfrfERFWa5R3glrxWWDn7MVeB1wqFT8PuDfGX0p3wO8F3j/udV0sWYUl5/OzKcjYjtwOCK+BvxXxXJDbS9/B+zLzDNFcWfbS4U6x4VeHlPWUHu7IuJtwBKws1Q8sT9l5lNV63dMnbj8I/CJzDwdEe9idGb2+prrdtVGtm0vcH9m/rBU1tf2UltnE7bMvOE8P+IUcGXp9RXA04zuYXZJRFxU/Eoel3fCWnGJiG9FxNbMfKb4gn12jY/6ZeBAZn6/9NnPFE9PR8TfAL87k0ovwCziUnT5kZknI+IR4PXAAwy8vUTETwCfAX4vMx8tfXZn20uFaceLqmVORcRFwEsZjQGts24X1dquiLiB0Q+AnZl5elw+ZX/qwxfwunHJzP8ovfxL4K7SutetWveRmdewGRvZD/YCv1ku6HF7qW3IXaJfBnbE6Aq/TYwayMHMTOAIo/FbAPuAOmfsuuAgo+2B9bdrYvxA8aU9Hre1DDw+hzo2Yd24RMTmcZdeRLwM+Hng60NvL8W+cwD428z81Kr3+tReKo8Xq5Ypx2sPcLhoHweBvcVVpNuAHcCXFlTveVo3JhHxeuAvgJsz89lSeeX+tLCaz1eduGwtvbwZOFY8PwS8qYjPZuBNnN3L0WV19iEi4lWMLrj4Qqmsz+2lvqavepjHA7iFUTZ/GvgWcKgovxz4bGm5XwSeZJSl31Eq387ogLoCfAq4uOltmlFcLgM+D5wo/l5alC8BHy0tdxXwb8AFq9Y/DHyN0Rfv3wMvaXqbFhUX4OeKbf9q8fdW20sCvA34PvBY6XFNH9tL1fGCURfvzcXzFxX//ytFe9heWveOYr3jwJub3pYFxuTh4hg8bhsHi/Kp+1MfHjXi8kHgiWL7jwCvLq37jqINrQC/1vS2LDIuxes7gT9atV6v20vdh3c6kCRJarkhd4lKkiR1ggmbJElSy5mwSZIktZwJmyRJUsuZsEmSJLWcCZskSVLLmbBJkiS1nAmbJG1ARByJiDcWz/8wIv6k6TpJ6r/O3ktUkhry+8D7I+LljO5neHPD9ZE0AN7pQJI2KCL+CXgJcF1mvhAR2xndfuqlmbln7bUlaePsEpWkDYiI1wFbgdOZ+QJAZp7MzFubrZmkPjNhk6SaImIr8A/ALuC/I+LGhqskaSBM2CSphoh4MbAf+J3MPAb8AXBno5WSNBiOYZOk8xQRlwEfAN4IfDQzP9hwlST1jAmbJElSy9klKkmS1HImbJIkSS1nwiZJktRyJmySJEktZ8ImSZLUciZskiRJLWfCJkmS1HImbJIkSS1nwiZJktRy/w8iX1JMsAtbFwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "widgets.interact(interactive_classification, highlight=dropdown_highlight)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Zadanie klasyfikacyjne z powyższego przykładu polega na przypisaniu punktów do jednej z dwóch kategorii:\n", + " 0. czerwone krzyżyki\n", + " 1. zielone kółka\n", + "\n", + "W tym celu zastosowano regresję logistyczną." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "W rezultacie otrzymano model, który dzieli płaszczyznę na dwa obszary:\n", + " 0. na zewnątrz granatowej krzywej\n", + " 1. wewnątrz granatowej krzywej\n", + " \n", + "Model przewiduje klasę 0 („czerwoną”) dla punktów znajdujący się w obszarze na zewnątrz krzywej, natomiast klasę 1 („zieloną”) dla punktów znajdujących sie w obszarze wewnąrz krzywej." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Wszysktie obserwacje możemy podzielić zatem na cztery grupy:\n", + " * **true positives (TP)** – prawidłowo sklasyfikowane pozytywne przykłady (zielone kółka w wewnętrznym obszarze)\n", + " * **true negatives (TN)** – prawidłowo sklasyfikowane negatywne przykłady (czerwone krzyżyki w zewnętrznym obszarze)\n", + " * **false positives (FP)** – negatywne przykłady sklasyfikowane jako pozytywne (czerwone krzyżyki w wewnętrznym obszarze)\n", + " * **false negatives (FN)** – pozytywne przykłady sklasyfikowane jako negatywne (zielone kółka w zewnętrznym obszarze)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Innymi słowy:\n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TP = 5\n", + "TN = 35\n", + "FP = 3\n", + "FN = 6\n" + ] + } + ], + "source": [ + "# Obliczmy TP, TN, FP i FN\n", + "\n", + "tp = 0\n", + "tn = 0\n", + "fp = 0\n", + "fn = 0\n", + "\n", + "for i in range(len(Y_expected)):\n", + " if Y_expected[i] == 1 and Y_predicted[i] == 1:\n", + " tp += 1\n", + " elif Y_expected[i] == 0 and Y_predicted[i] == 0:\n", + " tn += 1\n", + " elif Y_expected[i] == 0 and Y_predicted[i] == 1:\n", + " fp += 1\n", + " elif Y_expected[i] == 1 and Y_predicted[i] == 0:\n", + " fn += 1\n", + " \n", + "print('TP =', tp)\n", + "print('TN =', tn)\n", + "print('FP =', fp)\n", + "print('FN =', fn)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "source": [ + "Możemy teraz zdefiniować następujące metryki:" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "#### Dokładność (*accuracy*)\n", + "$$ \\mbox{accuracy} = \\frac{\\mbox{przypadki poprawnie sklasyfikowane}}{\\mbox{wszystkie przypadki}} = \\frac{TP + TN}{TP + TN + FP + FN} $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "Dokładność otrzymujemy przez podzielenie liczby przypadków poprawnie sklasyfikowanych przez liczbę wszystkich przypadków:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy: 0.8163265306122449\n" + ] + } + ], + "source": [ + "accuracy = (tp + tn) / (tp + tn + fp + fn)\n", + "print('Accuracy:', accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "**Uwaga:** Nie zawsze dokładność będzie dobrą miarą, zwłaszcza gdy klasy są bardzo asymetryczne!\n", + "\n", + "*Przykład:* Wyobraźmy sobie test na koronawirusa, który **zawsze** zwraca wynik negatywny. Jaką przydatność będzie miał taki test w praktyce? Żadną. A jaka będzie jego *dokładność*? Policzmy:\n", + "$$ \\mbox{accuracy} \\, = \\, \\frac{\\mbox{szacowana liczba osób zdrowych na świecie}}{\\mbox{populacja Ziemi}} \\, \\approx \\, \\frac{7\\,700\\,000\\,000 - 600\\,000}{7\\,700\\,000\\,000} \\, \\approx \\, 0.99992 $$\n", + "(zaokrąglone dane z 27 marca 2020)\n", + "\n", + "Powyższy wynik jest tak wysoki, ponieważ zdecydowana większość osób na świecie nie jest zakażona, więc biorąc losowego Ziemianina możemy w ciemno strzelać, że nie ma koronawirusa.\n", + "\n", + "W tym przypadku duża różnica w liczności obu zbiorów (zakażeni/niezakażeni) powoduje, że *accuracy* nie jest dobrą metryką.\n", + "\n", + "Dlatego dysponujemy również innymi metrykami:" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "#### Precyzja (*precision*)\n", + "$$ \\mbox{precision} = \\frac{TP}{TP + FP} $$" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Precision: 0.625\n" + ] + } + ], + "source": [ + "precision = tp / (tp + fp)\n", + "print('Precision:', precision)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "Precyzja określa, jaka część przykładów sklasyfikowanych jako pozytywne to faktycznie przykłady pozytywne." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "#### Pokrycie (czułość, *recall*)\n", + "$$ \\mbox{recall} = \\frac{TP}{TP + FN} $$" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Recall: 0.45454545454545453\n" + ] + } + ], + "source": [ + "recall = tp / (tp + fn)\n", + "print('Recall:', recall)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "Pokrycie mówi nam, jaka część przykładów pozytywnych została poprawnie sklasyfikowana." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "#### *$F$-measure* (*$F$-score*)\n", + "$$ F = \\frac{2 \\cdot \\mbox{precision} \\cdot \\mbox{recall}}{\\mbox{precision} + \\mbox{recall}} $$" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "F-score: 0.5263157894736842\n" + ] + } + ], + "source": [ + "fscore = (2 * precision * recall) / (precision + recall)\n", + "print('F-score:', fscore)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "$F$-_measure_ jest kompromisem między precyzją a pokryciem (a ściślej: jest średnią harmoniczną precyzji i pokrycia)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "$F$-_measure_ jest szczególnym przypadkiem ogólniejszej miary:" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "*$F_\\beta$-measure*:\n", + "$$ F_\\beta = \\frac{(1 + \\beta) \\cdot \\mbox{precision} \\cdot \\mbox{recall}}{\\beta^2 \\cdot \\mbox{precision} + \\mbox{recall}} $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "Dla $\\beta = 1$ otrzymujemy:\n", + "$$ F_1 \\, = \\, \\frac{(1 + 1) \\cdot \\mbox{precision} \\cdot \\mbox{recall}}{1^2 \\cdot \\mbox{precision} + \\mbox{recall}} \\, = \\, \\frac{2 \\cdot \\mbox{precision} \\cdot \\mbox{recall}}{\\mbox{precision} + \\mbox{recall}} \\, = \\, F $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## 3.3. Obserwacje odstające" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "**Obserwacje odstające** (*outliers*) – to wszelkie obserwacje posiadające nietypową wartość.\n", + "\n", + "Mogą być na przykład rezultatem błędnego pomiaru albo pomyłki przy wprowadzaniu danych do bazy, ale nie tylko.\n", + "\n", + "Obserwacje odstające mogą niekiedy znacząco wpłynąć na parametry modelu, dlatego ważne jest, żeby takie obserwacje odrzucić zanim przystąpi się do tworzenia modelu." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "W poniższym przykładzie można zobaczyć wpływ obserwacji odstających na wynik modelowania na przykładzie danych dotyczących cen mieszkań zebranych z ogłoszeń na portalu Gratka.pl: tutaj przykładem obserwacji odstającej może być ogłoszenie, w którym podano cenę w tys. zł zamiast ceny w zł." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "# Przydatne funkcje\n", + "\n", + "def h_linear(Theta, x):\n", + " \"\"\"Funkcja regresji liniowej\"\"\"\n", + " return x * Theta\n", + "\n", + "def linear_regression(theta):\n", + " \"\"\"Ta funkcja zwraca funkcję regresji liniowej dla danego wektora parametrów theta\"\"\"\n", + " return lambda x: h_linear(theta, x)\n", + "\n", + "def cost(theta, X, y):\n", + " \"\"\"Wersja macierzowa funkcji kosztu\"\"\"\n", + " m = len(y)\n", + " J = 1.0 / (2.0 * m) * ((X * theta - y).T * (X * theta - y))\n", + " return J.item()\n", + "\n", + "def gradient(theta, X, y):\n", + " \"\"\"Wersja macierzowa gradientu funkcji kosztu\"\"\"\n", + " return 1.0 / len(y) * (X.T * (X * theta - y)) \n", + "\n", + "def gradient_descent(fJ, fdJ, theta, X, y, alpha=0.1, eps=10**-5):\n", + " \"\"\"Algorytm gradientu prostego (wersja macierzowa)\"\"\"\n", + " current_cost = fJ(theta, X, y)\n", + " logs = [[current_cost, theta]]\n", + " while True:\n", + " theta = theta - alpha * fdJ(theta, X, y)\n", + " current_cost, prev_cost = fJ(theta, X, y), current_cost\n", + " if abs(prev_cost - current_cost) > 10**15:\n", + " print('Algorithm does not converge!')\n", + " break\n", + " if abs(prev_cost - current_cost) <= eps:\n", + " break\n", + " logs.append([current_cost, theta]) \n", + " return theta, logs\n", + "\n", + "def plot_data(X, y, xlabel, ylabel):\n", + " \"\"\"Wykres danych (wersja macierzowa)\"\"\"\n", + " fig = plt.figure(figsize=(16*.6, 9*.6))\n", + " ax = fig.add_subplot(111)\n", + " fig.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9)\n", + " ax.scatter([X[:, 1]], [y], c='r', s=50, label='Dane')\n", + " \n", + " ax.set_xlabel(xlabel)\n", + " ax.set_ylabel(ylabel)\n", + " ax.margins(.05, .05)\n", + " plt.ylim(y.min() - 1, y.max() + 1)\n", + " plt.xlim(np.min(X[:, 1]) - 1, np.max(X[:, 1]) + 1)\n", + " return fig\n", + "\n", + "def plot_regression(fig, fun, theta, X):\n", + " \"\"\"Wykres krzywej regresji (wersja macierzowa)\"\"\"\n", + " ax = fig.axes[0]\n", + " x0 = np.min(X[:, 1]) - 1.0\n", + " x1 = np.max(X[:, 1]) + 1.0\n", + " L = [x0, x1]\n", + " LX = np.matrix([1, x0, 1, x1]).reshape(2, 2)\n", + " ax.plot(L, fun(theta, LX), linewidth='2',\n", + " label=(r'$y={theta0:.2}{op}{theta1:.2}x$'.format(\n", + " theta0=float(theta[0][0]),\n", + " theta1=(float(theta[1][0]) if theta[1][0] >= 0 else float(-theta[1][0])),\n", + " op='+' if theta[1][0] >= 0 else '-')))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "# Wczytanie danych (mieszkania) przy pomocy biblioteki pandas\n", + "\n", + "alldata = pandas.read_csv('data_flats_with_outliers.tsv', sep='\\t',\n", + " names=['price', 'isNew', 'rooms', 'floor', 'location', 'sqrMetres'])\n", + "data = np.matrix(alldata[['price', 'sqrMetres']])\n", + "\n", + "m, n_plus_1 = data.shape\n", + "n = n_plus_1 - 1\n", + "Xn = data[:, 0:n]\n", + "\n", + "Xo = np.matrix(np.concatenate((np.ones((m, 1)), Xn), axis=1)).reshape(m, n + 1)\n", + "yo = np.matrix(data[:, -1]).reshape(m, 1)\n", + "\n", + "Xo /= np.amax(Xo, axis=0)\n", + "yo /= np.amax(yo, axis=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plot_data(Xo, yo, xlabel=u'metraż', ylabel=u'cena')\n", + "theta_start = np.matrix([0.0, 0.0]).reshape(2, 1)\n", + "theta, logs = gradient_descent(cost, gradient, theta_start, Xo, yo, alpha=0.01)\n", + "plot_regression(fig, h_linear, theta, Xo)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "Na powyższym przykładzie obserwacja odstająca jawi sie jako pojedynczy punkt po prawej stronie wykresu. Widzimy, że otrzymana krzywa regresji zamiast odwzorowywać ogólny trend, próbuje „dopasować się” do tej pojedynczej obserwacji.\n", + "\n", + "Dlatego taką obserwację należy usunąć ze zbioru danych (zobacz ponizej)." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "# Odrzućmy obserwacje odstające\n", + "alldata_no_outliers = [\n", + " (index, item) for index, item in alldata.iterrows() \n", + " if item.price > 100 and item.sqrMetres > 10]\n", + "\n", + "alldata_no_outliers = alldata.loc[(alldata['price'] > 100) & (alldata['sqrMetres'] > 100)]" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "data = np.matrix(alldata_no_outliers[['price', 'sqrMetres']])\n", + "\n", + "m, n_plus_1 = data.shape\n", + "n = n_plus_1 - 1\n", + "Xn = data[:, 0:n]\n", + "\n", + "Xo = np.matrix(np.concatenate((np.ones((m, 1)), Xn), axis=1)).reshape(m, n + 1)\n", + "yo = np.matrix(data[:, -1]).reshape(m, 1)\n", + "\n", + "Xo /= np.amax(Xo, axis=0)\n", + "yo /= np.amax(yo, axis=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "scrolled": true, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plot_data(Xo, yo, xlabel=u'metraż', ylabel=u'cena')\n", + "theta_start = np.matrix([0.0, 0.0]).reshape(2, 1)\n", + "theta, logs = gradient_descent(cost, gradient, theta_start, Xo, yo, alpha=0.01)\n", + "plot_regression(fig, h_linear, theta, Xo)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "Na powyższym wykresie widać, że po odrzuceniu obserwacji odstających otrzymujemy dużo bardziej „wiarygodną” krzywą regresji." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## 3.4. Warianty metody gradientu prostego\n", + "\n", + "* Batch gradient descent\n", + "* Stochastic gradient descent\n", + "* Mini-batch gradient descent" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### _Batch gradient descent_\n", + "\n", + "* Klasyczna wersja metody gradientu prostego\n", + "* Obliczamy gradient funkcji kosztu względem całego zbioru treningowego:\n", + " $$ \\theta := \\theta - \\alpha \\cdot \\nabla_\\theta J(\\theta) $$\n", + "* Dlatego może działać bardzo powoli\n", + "* Nie można dodawać nowych przykładów na bieżąco w trakcie trenowania modelu (*online learning*)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### *Stochastic gradient descent* (SGD)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "#### Algorytm\n", + "\n", + "Powtórz określoną liczbę razy (liczba epok):\n", + " 1. Randomizuj dane treningowe\n", + " 1. Powtórz dla każdego przykładu $i = 1, 2, \\ldots, m$:\n", + " $$ \\theta := \\theta - \\alpha \\cdot \\nabla_\\theta \\, J \\! \\left( \\theta, x^{(i)}, y^{(i)} \\right) $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "**Randomizacja danych** to losowe potasowanie przykładów uczących (wraz z odpowiedziami)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "#### SGD - zalety\n", + "\n", + "* Dużo szybszy niż _batch gradient descent_\n", + "* Można dodawać nowe przykłady na bieżąco w trakcie trenowania (*online learning*)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "#### SGD\n", + "\n", + "* Częsta aktualizacja parametrów z dużą wariancją:\n", + "\n", + "\n", + "\n", + "* Z jednej strony dzięki temu nie utyka w złych minimach lokalnych, ale z drugiej strony może „wyskoczyć” z dobrego minimum" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### _Mini-batch gradient descent_" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "#### Algorytm\n", + "\n", + "1. Ustal rozmiar \"paczki/wsadu\" (*batch*) $b \\leq m$.\n", + "2. Powtórz określoną liczbę razy (liczba epok):\n", + " 1. Powtórz dla każdego batcha (czyli dla $i = 1, 1 + b, 1 + 2 b, \\ldots$):\n", + " $$ \\theta := \\theta - \\alpha \\cdot \\nabla_\\theta \\, J \\left( \\theta, x^{(i : i+b)}, y^{(i : i+b)} \\right) $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "#### _Mini-batch gradient descent_\n", + "\n", + "* Kompromis między _batch gradient descent_ i SGD\n", + "* Stabilniejsza zbieżność dzięki redukcji wariancji aktualizacji parametrów\n", + "* Szybszy niż klasyczny _batch gradient descent_\n", + "* Typowa wielkość batcha: między kilka a kilkaset przykładów\n", + " * Im większy batch, tym bliżej do BGD; im mniejszy batch, tym bliżej do SGD\n", + " * BGD i SGD można traktować jako odmiany MBGD dla $b = m$ i $b = 1$" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "# Mini-batch gradient descent - przykładowa implementacja\n", + "\n", + "def MiniBatchSGD(h, fJ, fdJ, theta, X, y, \n", + " alpha=0.001, maxEpochs=1.0, batchSize=100, \n", + " logError=True):\n", + " errorsX, errorsY = [], []\n", + " \n", + " m, n = X.shape\n", + " start, end = 0, batchSize\n", + " \n", + " maxSteps = (m * float(maxEpochs)) / batchSize\n", + " for i in range(int(maxSteps)):\n", + " XBatch, yBatch = X[start:end,:], y[start:end,:]\n", + "\n", + " theta = theta - alpha * fdJ(h, theta, XBatch, yBatch)\n", + " \n", + " if logError:\n", + " errorsX.append(float(i*batchSize)/m)\n", + " errorsY.append(fJ(h, theta, XBatch, yBatch).item())\n", + " \n", + " if start + batchSize < m:\n", + " start += batchSize\n", + " else:\n", + " start = 0\n", + " end = min(start + batchSize, m)\n", + " \n", + " return theta, (errorsX, errorsY)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Porównanie uśrednionych krzywych uczenia na przykładzie klasyfikacji dwuklasowej zbioru [MNIST](https://en.wikipedia.org/wiki/MNIST_database):\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Wady klasycznej metody gradientu prostego, czyli dlaczego potrzebujemy optymalizacji\n", + "\n", + "* Trudno dobrać właściwą szybkość uczenia (*learning rate*)\n", + "* Jedna ustalona wartość stałej uczenia się dla wszystkich parametrów\n", + "* Funkcja kosztu dla sieci neuronowych nie jest wypukła, więc uczenie może utknąć w złym minimum lokalnym lub punkcie siodłowym" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## 3.5. Algorytmy optymalizacji metody gradientu\n", + "\n", + "* Momentum\n", + "* Nesterov Accelerated Gradient\n", + "* Adagrad\n", + "* Adadelta\n", + "* RMSprop\n", + "* Adam\n", + "* Nadam\n", + "* AMSGrad" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Momentum\n", + "\n", + "* SGD źle radzi sobie w „wąwozach” funkcji kosztu\n", + "* Momentum rozwiązuje ten problem przez dodanie współczynnika $\\gamma$, który można trakować jako „pęd” spadającej piłki:\n", + " $$ v_t := \\gamma \\, v_{t-1} + \\alpha \\, \\nabla_\\theta J(\\theta) $$\n", + " $$ \\theta := \\theta - v_t $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Przyspiesony gradient Nesterova (*Nesterov Accelerated Gradient*, NAG)\n", + "\n", + "* Momentum czasami powoduje niekontrolowane rozpędzanie się piłki, przez co staje się „mniej sterowna”\n", + "* Nesterov do piłki posiadającej pęd dodaje „hamulec”, który spowalnia piłkę przed wzniesieniem:\n", + " $$ v_t := \\gamma \\, v_{t-1} + \\alpha \\, \\nabla_\\theta J(\\theta - \\gamma \\, v_{t-1}) $$\n", + " $$ \\theta := \\theta - v_t $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Adagrad\n", + "\n", + "* “Adaptive gradient”\n", + "* Adagrad dostosowuje współczynnik uczenia (*learning rate*) do parametrów: zmniejsza go dla cech występujących częściej, a zwiększa dla występujących rzadziej:\n", + "* Świetny do trenowania na rzadkich (*sparse*) zbiorach danych\n", + "* Wada: współczynnik uczenia może czasami gwałtownie maleć\n", + "* Wyniki badań pokazują, że często **starannie** dobrane $\\alpha$ daje lepsze wyniki na zbiorze testowym" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Adadelta i RMSprop\n", + "* Warianty algorytmu Adagrad, które radzą sobie z problemem gwałtownych zmian współczynnika uczenia" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Adam\n", + "\n", + "* “Adaptive moment estimation”\n", + "* Łączy zalety algorytmów RMSprop i Momentum\n", + "* Można go porównać do piłki mającej ciężar i opór\n", + "* Obecnie jeden z najpopularniejszych algorytmów optymalizacji" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Nadam\n", + "* “Nesterov-accelerated adaptive moment estimation”\n", + "* Łączy zalety algorytmów Adam i Nesterov Accelerated Gradient" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### AMSGrad\n", + "* Wariant algorytmu Adam lepiej dostosowany do zadań takich jak rozpoznawanie obiektów czy tłumaczenie maszynowe" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## 3.6. Metody zbiorcze" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + " * **Metody zbiorcze** (*ensemble methods*) używają połączonych sił wielu modeli uczenia maszynowego w celu uzyskania lepszej skuteczności niż mogłaby być osiągnięta przez każdy z tych modeli z osobna." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + " * Na metodę zbiorczą składa się:\n", + " * dobór modeli\n", + " * sposób agregacji wyników" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + " * Warto zastosować randomizację, czyli przetasować zbiór uczący przed trenowaniem każdego modelu." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Uśrednianie prawdopodobieństw" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "#### Przykład\n", + "\n", + "Mamy 3 modele, które dla klas $c=1, 2, 3, 4, 5$ zwróciły prawdopodobieństwa:\n", + "\n", + "* $M_1$: [0.10, 0.40, **0.50**, 0.00, 0.00]\n", + "* $M_2$: [0.10, **0.60**, 0.20, 0.00, 0.10]\n", + "* $M_3$: [0.10, 0.30, **0.40**, 0.00, 0.20]\n", + "\n", + "Która klasa zostanie wybrana według średnich prawdopodobieństw dla każdej klasy?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Średnie prawdopodobieństwo: [0.10, **0.43**, 0.36, 0.00, 0.10]\n", + "\n", + "Została wybrana klasa $c = 2$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Głosowanie klas" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "#### Przykład\n", + "\n", + "Mamy 3 modele, które dla klas $c=1, 2, 3, 4, 5$ zwróciły prawdopodobieństwa:\n", + "\n", + "* $M_1$: [0.10, 0.40, **0.50**, 0.00, 0.00]\n", + "* $M_2$: [0.10, **0.60**, 0.20, 0.00, 0.10]\n", + "* $M_3$: [0.10, 0.30, **0.40**, 0.00, 0.20]\n", + "\n", + "Która klasa zostanie wybrana według głosowania?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Liczba głosów: [0, 1, **2**, 0, 0]\n", + "\n", + "Została wybrana klasa $c = 3$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Inne metody zbiorcze\n", + "\n", + " * Bagging\n", + " * Boostng\n", + " * Stacking\n", + " \n", + "https://towardsdatascience.com/ensemble-methods-bagging-boosting-and-stacking-c9214a10a205" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3", + "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.8.3" + }, + "livereveal": { + "start_slideshow_at": "selected", + "theme": "white" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/wyk/contours_evaluation_optimizers.gif b/wyk/contours_evaluation_optimizers.gif new file mode 100644 index 0000000..e9d54d0 Binary files /dev/null and b/wyk/contours_evaluation_optimizers.gif differ diff --git a/wyk/data-metrics.tsv b/wyk/data-metrics.tsv new file mode 100644 index 0000000..c50b5e7 --- /dev/null +++ b/wyk/data-metrics.tsv @@ -0,0 +1,50 @@ +0 -0.9410633308036449 0.46518252113944425 +1 0.4700636553691919 -0.3970321538875541 +1 -0.01609299859794966 0.23161453968628254 +0 -0.9966154155058933 0.06419313152355421 +0 0.8000009607150127 0.44133107977776875 +0 0.389227379480078 -0.8415416694237676 +0 -0.7786281038890375 0.2833716839963434 +1 -0.10150562150521569 -0.02968754639839366 +1 -0.14995353486391494 0.30921523116923866 +0 0.3150219624148183 0.4186143523577863 +0 -0.5542734031872467 0.9291684810885719 +0 -0.44750469543445215 -0.8240387195698262 +0 -0.7875312310670415 0.27475695030524894 +0 0.20470154428730747 -0.8122722630746713 +0 0.07472783793361693 0.8936381678688297 +0 -0.6016285994197443 -0.9783927694535444 +0 0.4235345463350013 -0.23977977886239832 +0 0.256790496684171 -0.5587059709121811 +0 -0.2172656054288027 0.8015306542483966 +0 0.2009238354275602 0.9376873763906164 +0 -0.8760038215191506 0.015194717659306356 +0 -0.1512141038160364 -0.9575528046526418 +0 -0.6378974241766098 0.35900665963616696 +0 -0.6219617077011876 0.04019896541474166 +0 -0.2533778634666939 -0.8576798720089458 +0 -0.9398823073223508 0.806594859009744 +0 -0.24161324930138606 -0.6982896600554984 +0 -0.967724402993285 0.15651783268628372 +0 0.9587968810951801 -0.3382309645563397 +1 0.18040441263417084 -0.026706542719935777 +0 -0.2403226372749332 -0.2694487472698215 +0 -0.49494412803453747 -0.6833825934742561 +0 -0.32266963833818574 0.6299706350061482 +0 -0.716450532167108 0.7792499086149187 +1 -0.5661825812948427 -0.3045016769669948 +0 -0.9014952263862088 0.19697267011506714 +1 0.3192734822128551 -0.3145295901019187 +1 -0.4386590899062277 0.6119229005694005 +0 -0.6306933372350818 0.4721301354446683 +0 0.3302936606411402 -0.3047093070118343 +1 -0.38049655790356285 -0.609474130471132 +1 0.32069301644263426 0.17266197471996692 +1 0.8349752241994568 0.4408717276862013 +0 -0.26741723386938343 -0.4919294757003996 +0 -0.7786699335922747 -0.47305795528791905 +0 0.723410510517891 -0.010095862311693793 +0 0.0902826080483603 -0.6805262097228113 +0 -0.9286972617786873 0.7200430642275493 +0 -0.0623197964184079 0.8187639325432745 +0 -0.20572090815735944 -0.6655000969777327 diff --git a/wyk/data_flats_with_outliers.tsv b/wyk/data_flats_with_outliers.tsv new file mode 100644 index 0000000..607342a --- /dev/null +++ b/wyk/data_flats_with_outliers.tsv @@ -0,0 +1,4186 @@ +476118.0 False 3 1 Centrum 78 +349000.0 False 5 0 4 103 +390000.0 False 4 1 Naramowice 100 +530000.0 True 4 3 Jeżyce 70 +364000.0 False 5 0 4 126 +294000.0 False 2 0 Grunwald 46 +277806.0 False 2 1 Dolna 47 +571229.15 False 2 4 Wilda 39 +346777.0 False 3 1 Grunwald 10 +279924.0 False 2 2 Dolna 2 +304000.0 False 2 1 Wilda 95 +604836.0 False 4 5 Grunwald 40 +268229.0 False 2 1 Grunwald 90 +325000.0 False 3 1 Grunwald 54 +274200.0 False 2 0 Grunwald 57 +333694.0 False 3 0 Podolany 38 +249964.0 False 3 0 Nowe 41 +833018.0 False 5 5 Dolna 31 +399406.0 False 3 2 Wilda 89 +277823.0 False 2 4 Podolany 70 +427202.0 False 3 3 Dolna 79 +242751.0 False 2 1 Wilda 40 +324387.0 False 2 9 Grunwald 49 +408707.0 False 3 1 Grunwald 13 +656936.0 False 2 4 Wilda 29 +275000.0 True 2 1 Sołacz 50 +245000.0 True 2 0 Piątkowo 40 +305000.0 True 2 0 Łazarz 60 +861000.0 True 4 1 Łazarz 23 +260000.0 True 2 0 MDM 80 +319000.0 True 2 1 Grunwald 52 +279000.0 True 2 2 Rataje 44 +369000.0 True 2 2 Centrum 51 +329000.0 True 2 3 Nowe 50 +499000.0 True 3 1 Malta 50 +439000.0 True 3 3 Piątkowo 70 +220000.0 True 2 1 Jeżyce 60 +411000.0 True 3 2 Winogrady 50 +305000.0 True 2 1 Winiary 48 +850000.0 True 10 0 Wola 400 +235000.0 True 2 1 Nowe 47 +419000.0 True 2 0 Malta 55 +265000.0 True 3 10 Nowe 48 +385000.0 True 2 2 Piątkowo 50 +714000.0 True 3 2 Malta 84 +289000.0 True 2 3 Winogrady 10 +459000.0 True 2 3 Jeżyce 32 +420000.0 True 3 1 Jeżyce 60 +375000.0 True 3 3 Wilda 30 +310000.0 True 4 1 Winogrady 90 +306000.0 True 3 4 Grunwald 20 +399000.0 True 3 0 Pokrzywno 90 +355000.0 True 2 0 Podolany 93 +415000.0 True 4 3 Jeżyce 78 +350000.0 True 2 3 Grunwald 50 +350000.0 True 3 0 Naramowickie 10 +490000.0 True 4 1 Naramowice 99 +289000.0 True 2 2 Jeżyce 54 +360000.0 True 3 1 Sołacz 65 +329000.0 True 2 3 Nowe 90 +294990.0 True 2 4 Jeżyce 6 +314990.0 True 2 4 Jeżyce 82 +330000.0 True 2 3 Chwaliszewo 56 +395000.0 True 3 3 Wilda 75 +245000.0 True 2 2 Dębiec 45 +229000.0 True 2 0 Bonin 80 +247000.0 True 3 3 Grunwald 49 +1650000.0 True 4 0 Jeżyce 158 +400000.0 False 4 0 Grunwald 81 +400000.0 False 4 0 Grunwald 60 +239000.0 True 2 0 Rataje 36 +350000.0 True 2 11 Rataje 45 +270000.0 True 3 4 Rataje 20 +265999.0 True 2 3 Grunwald 50 +303867.0 False 2 2 Wilda 7 +375000.0 True 3 3 Stare 50 +299000.0 True 3 0 Podolany 94 +385000.0 True 2 1 Rataje 48 +249000.0 True 2 2 Grunwald 46 +288000.0 True 3 4 Winogrady 30 +332000.0 True 3 8 Rataje 63 +347193.0 False 3 11 Grunwald 7 +225000.0 True 2 2 Wilda 50 +255000.0 True 3 0 Grunwald 53 +419000.0 True 3 4 Dębiec 60 +330000.0 True 3 3 Winiary 53 +249441.0 False 2 2 Winogrady 51 +304133.0 False 3 3 Winogrady 27 +250100.0 False 2 1 Winogrady 41 +238948.0 False 2 4 Winogrady 54 +345800.0 False 3 1 Jeżyce 53 +264256.0 False 2 2 Jeżyce 29 +310000.0 True 2 2 Stare 74 +295000.0 True 3 4 Grunwald 45 +399000.0 True 4 3 Stare 40 +489000.0 True 4 2 Centrum 120 +384000.0 True 4 0 Grunwald 42 +290000.0 True 3 2 Winogrady 60 +270000.0 True 2 6 Piątkowo 46 +345000.0 False 5 1 Komorniki 97 +368000.0 True 2 1 Grunwald 33 +339000.0 True 2 1 Grunwald 66 +260000.0 True 2 5 Nowe 42 +780000.0 True 5 0 Winogrady 54 +398000.0 True 3 1 Jeżyce 72 +720000.0 True 3 1 Grunwald 60 +280000.0 True 2 4 Łazarz 20 +495000.0 False 4 0 Nowe 7 +384000.0 True 3 2 Piątkowo 69 +219900.0 True 2 3 Wilda 45 +249000.0 True 2 1 Wilda 65 +325000.0 True 2 3 Stare 50 +265000.0 True 2 11 Rataje 80 +384000.0 True 3 2 Piątkowo 90 +290000.0 True 3 2 Winogrady 47 +209000.0 True 2 0 Dębiec 37 +289000.0 True 3 0 Rataje 50 +310000.0 True 3 4 Rataje 62 +699000.0 True 2 1 Grunwald 68 +195000.0 True 2 1 Grunwald 31 +339000.0 True 3 1 Nowe 88 +359000.0 True 3 4 Nowe 10 +299000.0 True 2 0 Jeżyce 60 +460000.0 True 4 2 Sołacz 68 +355647.0 False 3 3 Dolna 89 +363000.0 False 3 0 Junikowo 45 +343400.0 True 2 1 Wilda 68 +259000.0 True 2 2 Nowe 40 +525000.0 True 4 3 Nowe 88 +289000.0 True 2 7 Winiary 49 +445000.0 False 5 0 Plewiska 104 +305000.0 True 3 4 Rataje 63 +309000.0 True 3 9 Rataje 64 +355000.0 False 3 0 Junikowo 64 +429000.0 True 3 0 Jeżyce 30 +487000.0 True 3 0 Stare 83 +350000.0 True 4 1 Stare 50 +270000.0 True 2 2 Sołacz 49 +439000.0 True 2 3 Jeżyce 60 +350000.0 False 4 0 Plewiska 80 +479000.0 True 3 3 Grunwald 23 +695000.0 True 3 2 Jeżyce 71 +249000.0 True 2 1 Grunwald 56 +295000.0 True 2 0 Winogrady 36 +240000.0 True 2 5 Rataje 43 +847000.0 True 4 2 Piątkowo 113 +298000.0 True 3 1 Rataje 30 +406550.0 True 3 1 Jeżyce 23 +349000.0 True 2 4 Jeżyce 89 +299000.0 True 2 2 Grunwald 35 +529900.0 True 4 1 Podolany 103 +779000.0 True 3 2 Stary 113 +297600.0 False 2 3 Winogrady 47 +336474.0 False 3 4 Winogrady 27 +285678.0 False 2 2 Winogrady 42 +290970.0 False 2 0 Winogrady 60 +295120.0 False 2 1 Winogrady 60 +285200.0 False 2 1 Winogrady 46 +291838.0 False 2 1 Starołęka 55 +348750.0 False 2 3 Centrum 47 +349668.0 False 2 1 Garbary 44 +244071.0 False 2 2 Starołęka 52 +311515.0 False 2 4 Grunwald 49 +296810.0 False 2 2 Grunwald 30 +321656.0 False 2 1 Winogrady 88 +286445.0 False 2 2 Winogrady 49 +299513.0 False 2 1 Starołęka 85 +349785.0 False 3 1 Malta 52 +442827.0 False 4 2 Starołęka 14 +302176.0 False 2 2 Malta 45 +285383.0 False 2 4 Winogrady 37 +377200.0 False 3 3 Grunwald 66 +327584.0 False 3 3 Grunwald 21 +308039.0 False 2 0 Winogrady 21 +377917.0 False 3 2 Grunwald 44 +277039.0 False 2 1 Malta 66 +285678.0 False 2 2 Winogrady 42 +186600.0 False 2 2 Starołęka 62 +156085.0 False 2 2 Głuszyna 54 +225316.0 False 2 0 Starołęka 33 +303287.0 False 2 3 Grunwald 13 +280860.0 False 2 1 Winogrady 30 +272800.0 False 2 5 Winogrady 44 +357000.0 True 3 3 Rataje 90 +210000.0 True 2 2 Grunwald 40 +399000.0 True 3 5 Grunwald 81 +363000.0 True 3 2 Grunwald 77 +400000.0 True 3 3 Stare 70 +420000.0 True 3 1 Podolany 85 +375000.0 False 5 0 Plewiska 96 +465000.0 False 5 0 Plewiska 117 +259000.0 True 3 4 Piątkowo 60 +229000.0 True 4 3 Wilda 54 +330000.0 True 2 3 Wilda 53 +389000.0 True 3 3 Stare 49 +275000.0 True 2 9 Winogrady 10 +289000.0 True 2 2 Naramowice 50 +279000.0 True 3 4 Stare 50 +139000.0 True 3 1 Nowe 56 +275000.0 True 2 4 Jeżyce 90 +229000.0 True 2 4 Grunwald 30 +378000.0 True 2 4 Wilda 52 +299000.0 True 2 2 Grunwald 35 +299000.0 True 2 4 Centrum 50 +695000.0 True 5 0 Jeżyce 150 +323000.0 True 2 0 Jeżyce 54 +235000.0 True 2 12 Stare 38 +335000.0 True 3 1 Grunwald 70 +416000.0 True 3 3 Nowe 64 +275000.0 True 2 9 Stare 10 +315000.0 True 3 4 Winogrady 54 +275000.0 True 2 1 Sołacz 39 +249000.0 True 2 4 Grunwald 43 +268000.0 True 3 4 Jeżyce 43 +179000.0 True 3 2 Wilda 35 +429000.0 True 3 4 Świerczewo 60 +399000.0 True 3 1 Bonin 67 +290000.0 True 3 2 Stare 48 +799000.0 True 4 2 Stare 114 +375000.0 False 4 0 Plewiska 96 +354000.0 True 3 1 Piątkowo 60 +185000.0 True 2 8 Dębiec 50 +385000.0 True 4 3 Stare 80 +549000.0 True 4 5 Jeżyce 98 +326000.0 True 2 1 Winogrady 39 +263000.0 True 2 10 Śródka 48 +643000.0 True 4 0 Naramowice 60 +379000.0 True 3 1 Naramowice 20 +219000.0 True 2 1 Łazarz 35 +299000.0 True 2 0 Dębiec 52 +365000.0 True 2 5 Wilda 30 +410000.0 True 2 9 Rataje 50 +385000.0 True 2 1 Nowe 48 +310000.0 True 3 0 Grunwald 60 +375000.0 True 3 4 Wilda 40 +389000.0 True 3 0 Wilda 69 +269965.0 False 3 0 Nowe 81 +233000.0 True 2 3 Grunwald 70 +240000.0 True 2 3 Grunwald 80 +319000.0 True 3 4 Rataje 63 +315000.0 True 2 4 Jeżyce 25 +351648.0 True 3 4 Jeżyce 28 +305000.0 True 2 4 Jeżyce 55 +379000.0 True 3 0 Naramowice 64 +379000.0 True 3 0 Piątkowo 64 +250000.0 True 3 3 Rataje 53 +214000.0 True 2 3 Wilda 43 +390000.0 True 2 0 Nowe 61 +185000.0 True 2 11 Wilda 38 +435000.0 True 3 1 Junikowo 70 +395000.0 True 2 0 Grunwald 52 +390000.0 True 3 2 Podolany 68 +275000.0 True 2 5 Naramowice 45 +369000.0 True 3 0 Piątkowo 64 +295000.0 True 2 0 Stare 44 +275000.0 True 2 13 Rataje 80 +245000.0 True 2 12 Rataje 50 +429000.0 True 4 1 Rataje 70 +339000.0 True 3 1 Rataje 67 +290000.0 True 3 3 Rataje 50 +235000.0 True 2 0 Wilda 55 +449000.0 True 4 2 Grunwald 90 +695000.0 True 3 2 Jeżyce 25 +555000.0 True 4 0 Stare 20 +182000.0 True 2 2 Stare 70 +380000.0 True 4 6 Stare 90 +450000.0 True 6 4 Wilda 90 +283500.0 True 2 0 Stare 50 +350550.0 True 3 4 Stare 50 +395000.0 True 3 0 Grunwald 70 +425000.0 True 4 6 Rataje 85 +590000.0 True 4 3 Rataje 90 +349000.0 True 4 0 Rataje 84 +695000.0 True 3 2 Jeżyce 25 +329000.0 True 3 3 Piątkowo 60 +265000.0 True 3 10 Śródka 49 +229000.0 True 2 1 Stare 37 +399000.0 True 3 5 Łazarz 68 +249000.0 True 2 1 Nowe 49 +305000.0 True 2 1 Winiary 48 +326000.0 True 2 1 Sołacz 39 +415000.0 True 4 7 Piątkowo 63 +295000.0 True 2 2 Grunwald 50 +519000.0 True 4 3 Wilda 104 +105000.0 True 2 3 Nowe 50 +375000.0 True 3 0 Naramowice 68 +330000.0 True 3 4 Rataje 59 +487000.0 True 3 0 Naramowice 83 +899000.0 True 4 0 Stare 100 +218000.0 True 2 7 Winogrady 38 +395000.0 True 3 1 Grunwald 100 +345000.0 True 3 1 Winogrady 17 +489000.0 True 2 5 Centrum 53 +978000.0 True 4 5 Centrum 106 +339000.0 True 3 1 Żegrze 88 +350000.0 True 3 0 Winogrady 10 +259000.0 True 2 3 Żegrze 49 +265000.0 True 2 0 Dębiec 50 +569000.0 True 4 0 Wilda 50 +275000.0 True 2 1 Sołacz 50 +382280.0 True 3 3 Centrum 80 +259000.0 True 2 3 Łazarz 47 +425000.0 True 4 6 Rataje 85 +429000.0 True 3 4 Rataje 79 +382280.0 True 3 3 Stare 30 +325000.0 True 2 3 Stare 56 +289000.0 True 2 2 Jeżyce 42 +779000.0 True 3 2 Centrum 114 +445000.0 True 2 3 Jeżyce 60 +390000.0 True 3 3 Wilda 50 +339000.0 True 3 10 Rataje 10 +235000.0 True 2 0 Śródka 47 +655000.0 True 3 4 Stare 60 +655000.0 True 2 2 Jeżyce 10 +283340.0 True 2 0 Stare 70 +640000.0 True 3 2 Stare 47 +370000.0 True 3 4 Stare 84 +425000.0 True 2 9 Nowe 50 +282880.0 True 2 3 Stare 20 +561000.0 True 2 4 Stare 50 +360000.0 True 4 0 Grunwald 66 +429000.0 True 3 4 Wilda 47 +359400.0 True 3 1 Stare 72 +1115000.0 True 2 2 Grunwald 7 +497400.0 True 3 0 Wilda 48 +604395.0 True 5 1 Wilda 31 +1199000.0 True 8 3 Stare 282 +405000.0 True 3 1 Stare 80 +330615.0 True 2 2 Stare 79 +255000.0 True 2 3 Wilda 52 +300000.0 True 2 1 Stare 23 +850000.0 True 2 7 Stare 69 +480000.0 True 3 0 Stare 30 +350000.0 True 2 0 Stare 50 +1140000.0 True 6 0 Stare 40 +290970.0 True 2 0 Stare 60 +800000.0 True 4 3 Stare 103 +345000.0 True 2 3 Jeżyce 50 +514000.0 True 4 1 Jeżyce 120 +451000.0 True 3 2 Wilda 30 +659500.0 True 4 0 Grunwald 44 +558000.0 True 5 1 Wilda 2 +649000.0 True 4 0 Winogrady 80 +319000.0 True 2 4 Grunwald 54 +290000.0 True 2 4 Wilda 35 +325000.0 True 3 14 Rataje 80 +249000.0 True 2 5 Centrum 36 +224000.0 True 2 0 Łazarz 39 +295000.0 True 3 0 Grunwald 53 +379000.0 True 3 0 Rataje 30 +305000.0 True 2 1 Winogrady 48 +269000.0 True 2 1 Centrum 30 +240000.0 True 2 16 Rataje 36 +269000.0 True 2 2 Dolna 38 +448995.0 True 2 3 Jeżyce 66 +350000.0 True 2 3 Jeżyce 70 +469000.0 False 4 0 Plewiska 30 +369000.0 True 2 2 Jeżyce 90 +350000.0 True 2 0 Naramowice 60 +330000.0 True 3 4 Rataje 59 +315000.0 True 2 1 Grunwald 60 +349000.0 True 2 3 Piątkowo 60 +309000.0 True 2 0 Grunwald 55 +375000.0 True 3 1 Nowe 62 +280000.0 True 3 9 Jeżyce 49 +570000.0 True 3 5 Grunwald 60 +439000.0 True 4 2 Łazarz 40 +449000.0 True 4 1 Górczyn 90 +550000.0 True 4 2 Grunwald 107 +249000.0 True 2 5 Garbary 20 +519000.0 True 3 0 Nowe 99 +548000.0 True 3 1 Grunwald 84 +299000.0 True 3 2 Grunwald 48 +720000.0 True 4 7 Grunwald 91 +368000.0 True 2 2 Wilda 67 +325000.0 True 3 0 Grunwald 64 +499000.0 True 4 1 Naramowice 96 +269000.0 True 3 4 Rataje 48 +229000.0 True 2 1 Stare 40 +319000.0 True 2 2 Jeżyce 56 +200000.0 True 2 2 Dębiec 40 +240000.0 True 3 4 Dębiec 44 +235000.0 True 2 0 Nowe 47 +240000.0 True 3 4 Dębiec 44 +240000.0 True 3 4 Dębiec 44 +235000.0 True 2 0 Nowe 47 +745000.0 True 6 2 Grunwald 149 +399900.0 True 4 2 Nowe 66 +480000.0 True 3 1 Grunwald 40 +268000.0 True 3 4 Jeżyce 50 +308000.0 True 3 0 Piątkowo 63 +270000.0 True 3 4 Rataje 48 +250000.0 True 2 6 Sołacz 71 +349000.0 True 3 3 Rataje 63 +229000.0 True 2 12 Winogrady 10 +299000.0 True 3 2 Dębiec 70 +329000.0 True 3 3 Piątkowo 60 +289000.0 True 4 4 Winogrady 48 +590000.0 True 7 1 Smochowice 150 +479000.0 True 5 2 Centrum 142 +318400.0 True 3 1 Jeżyce 48 +500203.0 True 4 10 Grunwald 84 +339957.0 True 4 1 Stare 58 +329538.0 True 3 4 Jeżyce 50 +244969.0 True 2 0 Stare 42 +296277.0 True 3 0 Stare 49 +389610.0 True 4 4 Jeżyce 60 +337303.0 True 4 2 Stare 57 +245876.0 True 2 1 Jeżyce 38 +342900.0 True 3 3 Stare 57 +324608.0 True 3 2 Jeżyce 51 +277823.0 True 2 4 Jeżyce 50 +368569.0 True 3 4 Jeżyce 68 +295362.0 True 3 5 Stare 48 +286858.0 True 2 7 Winogrady 49 +292101.0 True 2 1 Grunwald 51 +279554.0 True 2 4 Jeżyce 43 +266320.0 True 2 4 Jeżyce 41 +327584.0 True 3 6 Grunwald 56 +339201.0 True 3 3 Jeżyce 53 +530000.0 True 2 5 Piątkowo 10 +269000.0 True 2 0 Grunwald 46 +237000.0 True 2 2 Dębiec 44 +275000.0 True 2 13 Rataje 49 +384000.0 True 3 2 Piątkowo 70 +339000.0 True 3 0 Rataje 47 +348000.0 True 3 9 Rataje 65 +460000.0 True 3 0 Rataje 73 +330000.0 True 3 4 Rataje 59 +350000.0 True 3 1 Rataje 63 +85000.0 True 3 4 Stare 70 +690000.0 True 4 1 Grunwald 60 +380000.0 True 3 4 Naramowice 52 +309978.0 False 2 2 Centrum 16 +1.0 False 5 0 4 126 +355000.0 True 2 0 Podolany 93 +225000.0 True 2 0 Grunwald 17 +259500.0 True 2 0 Grunwald 55 +289000.0 True 2 6 Winogrady 48 +230000.0 True 2 3 Nowe 47 +1000000.0 False 5 0 4 126 +339000.0 True 3 3 Nowe 90 +949000.0 True 3 4 Śródka 98 +520000.0 True 4 1 Wilda 129 +305000.0 True 2 1 Winiary 48 +318000.0 True 2 4 Piątkowo 20 +385000.0 True 2 0 Nowe 48 +860000.0 True 4 0 Centrum 103 +269000.0 True 2 3 Centrum 37 +445000.0 False 5 0 Luboń 104 +299000.0 True 3 10 Grunwald 10 +325000.0 True 3 7 Rataje 90 +305000.0 True 2 1 Winiary 49 +333000.0 True 3 4 Wilda 8 +275000.0 True 2 4 Rataje 63 +375570.0 False 2 4 Centrum 5 +542141.0 False 3 4 Centrum 53 +365546.0 False 2 4 Centrum 82 +698508.0 False 4 4 Centrum 59 +394787.0 False 2 4 Centrum 71 +597184.0 False 3 4 Centrum 61 +354177.0 False 2 3 Centrum 25 +353537.0 False 2 3 Centrum 17 +509468.0 False 3 3 Centrum 53 +652026.0 False 4 3 Centrum 89 +353457.0 False 2 3 Centrum 16 +356818.0 False 2 3 Centrum 58 +558745.0 False 3 3 Centrum 62 +349668.0 False 2 2 Centrum 15 +481903.0 False 3 2 Centrum 53 +389528.0 False 2 2 Centrum 87 +374216.0 False 2 2 Centrum 71 +534523.0 False 3 2 Centrum 62 +377418.0 False 2 1 Centrum 87 +372651.0 False 2 1 Centrum 5 +505032.0 False 3 1 Centrum 62 +469000.0 True 2 1 Winogrady 30 +339000.0 True 3 1 Rataje 88 +349000.0 True 3 1 Śródka 63 +466395.0 False 4 1 Dolna 65 +468406.0 False 4 2 Dolna 64 +275000.0 True 2 0 Łazarz 52 +395000.0 True 2 1 Naramowice 30 +339000.0 True 3 9 Nowe 65 +177000.0 True 2 2 Dębiec 33 +525000.0 True 4 3 Jeżyce 70 +309000.0 True 2 0 Jeżyce 28 +339000.0 True 2 2 Naramowice 49 +325000.0 True 2 3 Stare 60 +380000.0 True 4 4 Winogrady 80 +368110.44 True 3 2 Nowe 31 +324800.0 True 2 1 Nowe 56 +270000.0 True 2 2 Łazarz 100 +169000.0 True 2 1 Łazarz 44 +460000.0 True 3 4 Wilda 69 +199650.0 True 2 5 Nowe 93 +557338.0 True 3 3 Centrum 7 +290970.0 True 2 4 Górczyn 70 +412438.0 True 3 2 Winogrady 11 +360343.59 True 2 0 Centrum 60 +327127.5 True 2 0 Centrum 50 +194500.0 True 2 3 Nowe 90 +495000.0 True 4 0 Jeżyce 10 +293436.0 False 2 11 Grunwald 16 +333232.0 False 3 7 Grunwald 21 +333232.0 False 3 7 Grunwald 21 +296810.0 False 2 2 Grunwald 30 +296810.0 False 2 2 Grunwald 30 +771672.0 False 4 7 Grunwald 68 +339000.0 True 3 7 Jeżyce 50 +319000.0 True 2 4 Grunwald 20 +290000.0 True 2 4 Grunwald 36 +295000.0 True 2 3 Stare 30 +380931.0 False 3 3 Starołęka 82 +300680.0 False 2 2 Starołęka 54 +300680.0 False 2 2 Starołęka 54 +349668.0 False 2 2 Stare 15 +384000.0 True 3 2 Piątkowo 90 +339000.0 True 3 1 Rataje 88 +285678.0 False 2 1 Winogrady 42 +211190.0 False 2 0 Podolany 78 +247705.0 False 2 1 Piątkowo 74 +211190.0 False 2 0 Piątkowo 78 +247705.0 False 2 1 Podolany 74 +449000.0 False 5 0 Szczepankowo 68 +771672.0 False 4 4 Górczyn 66 +442080.0 False 3 1 Starołęka 68 +302887.0 False 2 4 Górczyn 25 +294840.0 False 2 4 Winogrady 50 +282994.0 False 2 0 Starołęka 59 +442080.0 False 3 1 Starołęka 68 +370597.0 False 2 4 Stare 4 +302887.0 False 2 4 Górczyn 25 +294840.0 False 2 4 Winogrady 50 +225228.0 False 2 5 Rataje 91 +282994.0 False 2 0 Starołęka 59 +242731.0 False 2 0 Podolany 74 +522235.0 False 3 2 Stare 62 +370597.0 False 2 4 Stare 4 +674695.0 False 3 4 Stare 59 +349000.0 False 4 0 Szczepankowo 29 +259015.0 False 2 0 Ogrody 53 +411684.0 False 3 3 Winogrady 17 +282944.0 False 2 0 Starołęka 59 +424377.0 False 4 2 Starołęka 14 +277823.0 False 2 2 Podolany 70 +277823.0 False 2 2 Podolany 70 +460499.0 False 3 1 Stare 51 +460499.0 False 3 1 Stare 51 +557338.0 False 3 3 Stare 4 +481903.0 False 3 2 Centrum 53 +361998.0 False 3 15 Grunwald 20 +310584.0 False 2 1 Nowe 26 +557338.0 False 3 3 Stare 4 +557338.0 False 3 3 Stare 4 +350506.0 False 3 11 Grunwald 20 +368110.0 False 3 2 Nowe 31 +557338.0 False 3 3 Stare 4 +342021.0 False 2 4 Nowe 93 +353379.0 False 3 12 Grunwald 20 +429699.0 False 3 15 Grunwald 62 +350506.0 False 3 11 Grunwald 20 +341682.0 False 2 10 Grunwald 7 +361998.0 False 3 15 Grunwald 20 +341682.0 False 2 10 Grunwald 7 +481903.0 False 3 2 Centrum 53 +310584.0 False 2 1 Nowe 26 +368110.0 False 3 2 Nowe 31 +162525.0 False 2 0 Głuszyna 55 +311488.0 False 3 2 Jeżyce 24 +336804.0 False 2 3 Jeżyce 4 +382074.0 False 3 2 Jeżyce 89 +195000.0 True 2 1 Łazarz 31 +385000.0 True 3 0 Grunwald 66 +495000.0 True 4 0 Jeżyce 86 +399000.0 True 2 1 Jeżyce 28 +369000.0 True 2 5 Winogrady 62 +172000.0 True 2 0 Starołęka 32 +599000.0 True 3 3 Grunwald 60 +620000.0 True 3 2 Naramowice 98 +495000.0 True 5 1 Naramowice 98 +460000.0 True 3 4 Wilda 69 +270000.0 True 2 0 Nowe 41 +263581.0 True 2 5 Stare 43 +279554.0 True 2 4 Jeżyce 43 +295000.0 True 2 1 Jeżyce 30 +779000.0 True 3 2 Stare 113 +305000.0 True 2 1 Sołacz 48 +385000.0 True 3 5 Centrum 50 +1040000.0 True 2 10 Centrum 79 +570000.0 True 4 0 Centrum 137 +468000.0 True 2 3 Grunwald 60 +1200000.0 True 4 2 Jeżyce 188 +233000.0 True 2 3 Grunwald 38 +315000.0 True 2 7 Rataje 47 +359000.0 True 3 2 Podolany 56 +269000.0 True 2 1 Centrum 34 +240000.0 True 2 3 Grunwald 38 +442150.0 True 2 3 Stare 75 +328000.0 True 3 0 Winogrady 48 +399700.0 True 3 1 Puszczykowo 74 +499000.0 True 3 3 Centrum 109 +529000.0 True 4 0 Piątkowo 115 +565000.0 True 3 1 Stary 95 +499000.0 True 3 1 Suchy 95 +517000.0 True 4 1 Centrum 138 +539000.0 True 4 2 Jeżyce 110 +330000.0 True 2 4 Wilda 50 +349000.0 True 3 3 Piątkowo 60 +359000.0 True 3 2 Podolany 10 +339000.0 True 4 5 Grunwald 74 +219000.0 True 2 2 Grunwald 38 +279000.0 True 2 2 Wilda 30 +489000.0 True 2 8 Centrum 4 +409000.0 True 3 1 Nowe 90 +245000.0 True 2 0 Piątkowo 40 +315000.0 True 2 7 Rataje 47 +395000.0 True 4 0 Grunwald 60 +239000.0 True 2 0 Rataje 48 +280250.0 True 2 0 Górczyn 50 +316355.0 True 2 4 Centrum 67 +276610.0 True 2 4 Centrum 80 +442002.0 True 2 3 Centrum 73 +316498.0 True 2 2 Centrum 77 +300160.0 True 2 3 Winogrady 90 +347090.0 True 3 1 Winogrady 90 +286091.0 True 2 3 Winogrady 49 +442150.0 True 2 2 Centrum 75 +270000.0 True 3 1 Starołęka 30 +319900.0 True 2 1 Grunwald 52 +695000.0 True 3 2 Jeżyce 71 +250000.0 True 2 6 Grunwald 31 +350000.0 True 3 7 Piątkowo 63 +475000.0 True 3 1 Naramowice 68 +535000.0 True 2 2 Stare 55 +425000.0 True 3 1 Piątkowo 74 +349000.0 True 3 3 Rataje 63 +495000.0 True 3 1 Łazarz 64 +495000.0 True 4 1 Naramowice 98 +499000.0 True 5 0 Grunwald 130 +659200.0 True 4 3 Łazarz 103 +510000.0 True 5 1 Naramowice 98 +360000.0 True 2 5 Grunwald 41 +249000.0 True 2 5 Centrum 36 +1950000.0 True 3 5 Centrum 143 +313000.0 True 2 4 Piątkowo 49 +250000.0 True 2 3 Wilda 39 +430000.0 True 2 2 Wilda 46 +239000.0 True 2 8 Winogrady 10 +312259.0 True 2 6 Winogrady 51 +329539.0 True 3 4 Jeżyce 50 +242134.0 True 2 0 Jeżyce 38 +246553.0 True 2 1 Stare 40 +345241.0 True 4 3 Stare 58 +242730.0 True 2 0 Jeżyce 50 +295000.0 True 2 1 Nowe 40 +555000.0 True 4 0 Stare 123 +350000.0 True 3 0 Stare 72 +310584.0 False 2 1 Nowe 26 +162525.0 False 2 0 Głuszyna 55 +289170.0 False 2 0 Winogrady 90 +332940.0 False 2 2 Winogrady 70 +334610.0 False 2 1 Winogrady 9 +298980.0 False 2 5 Winogrady 30 +318645.0 False 2 2 Winogrady 23 +228144.0 False 3 2 Głuszyna 56 +557338.0 False 3 3 Stare 4 +557338.0 False 3 3 Stare 4 +533745.0 False 5 2 Starołęka 4 +321285.0 False 2 4 Winogrady 30 +269000.0 True 2 3 Jeżyce 81 +279000.0 True 2 5 Jeżyce 53 +449000.0 False 5 0 Szczepankowo 68 +460499.0 False 3 1 Stare 51 +557338.0 False 3 3 Stare 4 +455348.0 False 3 0 Stare 61 +460499.0 False 3 1 Stare 51 +368712.0 False 2 5 Stare 90 +302887.0 False 2 4 Górczyn 25 +282994.0 False 2 0 Starołęka 59 +522235.0 False 3 2 Stare 62 +370597.0 False 2 4 Stare 4 +674695.0 False 3 4 Stare 59 +442080.0 False 3 1 Starołęka 68 +771672.0 False 4 4 Górczyn 66 +302887.0 False 2 4 Górczyn 25 +225228.0 False 2 5 Rataje 91 +284618.0 False 2 3 Nowe 55 +297420.0 False 2 3 Grunwald 24 +370597.0 False 2 4 Stare 4 +242731.0 False 2 0 Podolany 74 +368568.0 False 3 4 Podolany 38 +522235.0 False 3 2 Stare 62 +442080.0 False 3 1 Starołęka 68 +305676.0 False 2 5 Winogrady 52 +460499.0 False 3 1 Stare 51 +429699.0 False 3 15 Grunwald 62 +341682.0 False 2 10 Grunwald 7 +481903.0 False 3 2 Centrum 53 +368110.0 False 3 2 Nowe 31 +332940.0 False 2 2 Winogrady 70 +162525.0 False 2 0 Głuszyna 55 +318645.0 False 2 2 Winogrady 23 +228144.0 False 3 2 Głuszyna 56 +318645.0 False 2 2 Winogrady 23 +325000.0 True 3 1 Nowe 90 +319000.0 True 2 1 Jeżyce 67 +339000.0 True 3 9 Rataje 65 +310000.0 True 2 3 Nowe 38 +756000.0 True 4 2 Grunwald 100 +265000.0 True 2 10 Śródka 49 +350000.0 True 2 0 Naramowice 49 +244970.0 True 2 0 Stare 42 +238948.0 True 2 4 Stare 39 +377652.0 True 4 6 Jeżyce 57 +324609.0 True 3 2 Jeżyce 51 +339000.0 True 3 9 Nowe 65 +435000.0 True 3 1 Grunwald 10 +395000.0 True 4 0 Grunwald 60 +310000.0 True 2 2 Jeżyce 55 +235000.0 True 2 1 Starołęka 47 +210000.0 True 2 2 Grunwald 40 +299000.0 True 2 0 Dębiec 52 +305000.0 True 3 10 Piątkowo 40 +180000.0 True 2 6 Dębiec 50 +245488.0 True 2 0 Jeżyce 37 +242407.0 True 2 0 Jeżyce 36 +347095.0 True 3 1 Winogrady 57 +285383.0 True 2 4 Winogrady 48 +289172.0 True 2 0 Stare 46 +301620.0 True 2 5 Stare 46 +247706.0 True 2 1 Jeżyce 50 +278048.0 True 2 3 Jeżyce 50 +333693.0 True 3 1 Jeżyce 68 +235000.0 True 2 1 Głuszyna 47 +369000.0 True 2 3 Wilda 46 +350000.0 True 2 4 Jeżyce 56 +319000.0 True 2 4 Grunwald 47 +279000.0 True 2 1 Podolany 63 +290000.0 True 3 2 Winogrady 48 +235000.0 True 2 1 Nowe 47 +446000.0 True 2 1 Rataje 52 +225288.0 False 2 1 Rataje 91 +287882.0 False 2 1 Starołęka 85 +349000.0 False 4 0 Szczepankowo 29 +285678.0 False 2 1 Winogrady 42 +353275.0 False 2 4 Grunwald 49 +297421.0 False 2 3 Grunwald 24 +156085.0 False 2 4 Nowe 54 +286445.0 True 2 2 Winogrady 55 +285678.0 True 2 1 Winogrady 42 +302985.59 True 2 4 Grunwald 18 +302038.41 True 3 1 Grunwald 2 +495782.25 True 4 7 Grunwald 99 +405103.97 True 4 1 Grunwald 34 +426416.78 True 4 6 Grunwald 20 +319047.97 True 3 3 Grunwald 21 +380480.0 True 3 4 Grunwald 60 +244071.0 False 2 1 Nowe 93 +156085.0 False 2 4 Nowe 54 +404000.0 True 3 2 Rataje 70 +315000.0 True 3 11 Stare 50 +345000.0 True 2 3 Jeżyce 50 +321904.0 False 2 4 Winogrady 92 +270000.0 True 2 0 Zawady 41 +230000.0 True 2 6 Dębiec 45 +349000.0 True 4 3 Centrum 20 +277000.0 True 3 0 Centrum 40 +338700.0 True 3 2 Jeżyce 45 +619000.0 True 3 2 Winogrady 100 +486243.0 True 2 1 Łazarz 60 +413044.03 True 3 12 Grunwald 62 +324387.0 True 2 9 Grunwald 49 +338111.0 True 2 15 Grunwald 62 +293436.0 True 2 1 Grunwald 16 +333212.88 True 2 7 Grunwald 21 +267702.41 True 2 3 Grunwald 22 +903965.44 True 4 0 Centrum 80 +1366410.0 True 4 0 Centrum 71 +1155974.38 True 4 1 Centrum 28 +285383.0 True 2 4 Winogrady 37 +260000.0 True 2 0 Stare 79 +270000.0 True 2 2 Jeżyce 49 +1140000.0 True 6 0 Stare 40 +333232.0 False 3 7 Grunwald 21 +297421.0 False 2 3 Grunwald 24 +200460.0 False 2 0 Głuszyna 55 +377418.0 False 2 1 Stare 87 +289800.0 False 2 0 Winogrady 46 +505032.0 False 3 1 Stare 62 +374216.0 False 2 2 Stare 71 +1156054.0 False 4 0 Stare 41 +904041.0 False 3 0 Stare 2 +460849.0 False 3 2 Grunwald 13 +771672.0 False 4 7 Grunwald 68 +296810.0 False 2 2 Grunwald 30 +460499.0 False 3 1 Stare 51 +349668.0 False 2 2 Stare 15 +325206.0 False 2 10 Grunwald 62 +557338.0 False 3 3 Centrum 4 +380931.0 False 3 3 Starołęka 82 +295549.0 False 2 0 Starołęka 59 +302887.0 False 2 4 Górczyn 25 +225228.0 False 2 5 Rataje 91 +302887.0 False 2 4 Górczyn 25 +284618.0 False 2 3 Nowe 55 +297420.0 False 2 3 Grunwald 24 +370597.0 False 2 4 Stare 4 +242731.0 False 2 0 Podolany 74 +522235.0 False 3 2 Stare 62 +368568.0 False 3 4 Podolany 38 +442080.0 False 3 1 Starołęka 68 +305676.0 False 2 5 Winogrady 52 +294840.0 False 2 4 Winogrady 50 +460499.0 False 3 1 Stare 51 +299999.0 True 2 0 Wilda 51 +325000.0 True 3 7 Rataje 64 +395000.0 True 2 0 Grunwald 52 +315000.0 True 2 2 Zawady 52 +299000.0 True 3 2 Winogrady 48 +339000.0 True 3 1 Rataje 67 +290000.0 True 2 4 Grunwald 53 +369000.0 True 3 1 Piątkowo 65 +339000.0 True 3 0 Rataje 47 +265000.0 True 3 1 Winogrady 53 +315000.0 True 3 2 Winogrady 53 +345000.0 True 2 3 Jeżyce 50 +270000.0 True 3 4 Rataje 48 +375000.0 True 3 1 Nowe 62 +1050000.0 True 5 2 Centrum 161 +515000.0 True 3 0 Rataje 69 +428000.0 True 3 3 Centrum 43 +288000.0 True 3 4 Winogrady 47 +240000.0 True 2 2 Dębiec 48 +530000.0 True 2 5 Piątkowo 66 +510000.0 True 5 1 Naramowice 98 +360000.0 True 3 0 Wilda 112 +360000.0 True 4 4 Jeżyce 60 +330000.0 True 2 1 Jeżyce 53 +365000.0 True 2 2 Rataje 45 +460000.0 True 3 0 Rataje 73 +375000.0 True 3 3 Wilda 49 +380000.0 True 4 0 Piątkowo 74 +335000.0 True 3 9 Nowe 65 +379000.0 True 3 4 Rataje 63 +369000.0 True 2 3 Grunwald 64 +275000.0 True 2 2 Naramowice 45 +259000.0 True 2 2 Nowe 42 +299000.0 True 2 4 Nowe 47 +275000.0 True 2 0 Dębiec 50 +950000.0 True 3 4 Nowe 99 +315000.0 True 3 0 Piątkowo 63 +270000.0 True 2 10 Nowe 48 +430000.0 True 3 2 Rataje 64 +413500.0 True 5 4 Winogrady 64 +359000.0 True 3 2 Rataje 65 +410000.0 True 2 5 Rataje 53 +365000.0 True 4 3 Grunwald 68 +295555.0 True 2 1 Jeżyce 45 +224000.0 True 2 0 Górczyn 38 +315000.0 True 2 2 Winogrady 38 +265000.0 True 2 1 Wilda 44 +299000.0 True 2 3 Grunwald 44 +379000.0 True 3 1 Piątkowo 78 +249000.0 True 2 4 Grunwald 43 +295000.0 True 3 0 Grunwald 53 +510000.0 True 3 6 Grunwald 50 +350000.0 True 2 1 Rataje 54 +450000.0 True 4 1 Grunwald 101 +365000.0 True 2 1 Stare 50 +430000.0 True 2 1 Centrum 72 +385560.0 True 2 3 Piątkowo 57 +299000.0 True 2 1 Junikowo 33 +370000.0 True 4 4 Piątkowo 76 +336000.0 True 2 1 Naramowice 46 +369000.0 True 2 3 Jeżyce 55 +595000.0 True 3 0 Naramowice 94 +429000.0 True 3 4 Nowe 79 +489000.0 True 3 0 Jeżyce 65 +295000.0 True 3 2 Grunwald 49 +499000.0 True 4 2 Wilda 120 +305000.0 True 3 3 Winogrady 48 +325000.0 True 3 4 Jeżyce 64 +299817.0 True 2 3 Górczyn 59 +495000.0 True 4 1 Naramowice 98 +370000.0 True 2 13 Rataje 48 +487000.0 True 3 0 Naramowice 72 +299000.0 True 2 5 Grunwald 59 +269000.0 True 3 10 Grunwald 50 +380000.0 True 4 6 Piątkowo 73 +273875.0 True 2 1 Górczyn 13 +275000.0 True 2 13 Rataje 49 +1000000.0 True 5 1 Jeżyce 128 +379999.0 True 2 5 Jeżyce 61 +315000.0 True 3 4 Winogrady 53 +275000.0 True 2 9 Rataje 38 +259000.0 True 2 2 Jeżyce 48 +295000.0 True 2 0 Naramowice 36 +3200.0 True 4 0 Centrum 75 +260000.0 True 2 0 Rataje 46 +1612000.0 True 7 5 Jeżyce 166 +220000.0 True 2 3 Jeżyce 37 +549000.0 True 3 2 Jeżyce 106 +549000.0 True 3 2 Jeżyce 106 +330000.0 True 3 0 Bonin 56 +399000.0 True 2 0 Podolany 63 +220000.0 True 2 4 Grunwald 43 +290000.0 True 2 4 Winogrady 38 +270000.0 True 3 4 Rataje 48 +245000.0 True 2 3 Grunwald 30 +305000.0 True 2 1 Winiary 48 +235000.0 True 2 0 Łazarz 52 +289000.0 True 2 6 Winogrady 48 +495000.0 True 4 1 Naramowice 98 +270000.0 True 3 4 Rataje 48 +510000.0 True 5 1 Naramowice 98 +390000.0 True 3 3 Stare 48 +269000.0 True 2 0 Grunwald 46 +480000.0 True 2 2 Garbary 56 +320000.0 True 2 2 Piątkowo 48 +240000.0 True 2 16 Rataje 36 +355000.0 True 3 3 Łazarz 62 +240000.0 True 2 8 Dębiec 37 +565964.0 True 2 5 Centrum 49 +289000.0 True 2 2 Jeżyce 42 +350000.0 True 2 3 Rataje 50 +550000.0 True 3 1 Grunwald 73 +345000.0 True 3 1 Rataje 78 +259000.0 True 2 5 Grunwald 46 +491520.0 True 4 1 Górczyn 92 +305739.0 True 2 2 Górczyn 53 +269000.0 True 2 2 Dębiec 48 +295000.0 True 2 0 Centrum 44 +384000.0 True 3 2 Piątkowo 69 +375000.0 True 3 2 Rataje 79 +355000.0 True 3 2 Piątkowo 66 +420000.0 True 2 3 Naramowice 59 +237000.0 True 2 2 Dębiec 44 +330000.0 True 3 4 Rataje 59 +405000.0 True 3 1 Antoninek 68 +249900.0 True 2 9 Winogrady 38 +315000.0 True 2 7 Rataje 47 +510000.0 True 3 6 Grunwald 50 +349000.0 True 3 1 Winogrady 51 +339000.0 True 3 1 Rataje 67 +287000.0 True 2 4 Wilda 37 +585000.0 True 3 4 Jeżyce 59 +335000.0 True 3 7 Rataje 63 +289000.0 True 3 4 Winogrady 47 +263000.0 True 3 4 Grunwald 48 +279000.0 True 2 0 Naramowice 43 +292000.0 True 3 2 Winogrady 48 +399000.0 True 2 3 Centrum 60 +320000.0 True 3 0 Rataje 56 +287000.0 True 2 10 Winogrady 46 +350000.0 True 3 6 Jeżyce 64 +999000.0 True 3 4 Nowe 99 +510660.0 True 4 1 Górczyn 11 +363258.0 True 2 1 Górczyn 59 +650000.0 True 4 8 Rataje 100 +245000.0 True 3 0 Grunwald 45 +200000.0 True 3 4 Nowe 44 +237000.0 True 2 10 Górczyn 38 +259000.0 True 2 3 Rataje 49 +310000.0 True 2 2 Zawady 52 +289000.0 True 2 2 Nowe 48 +405000.0 True 4 2 Rataje 71 +747000.0 True 3 7 Rataje 84 +379000.0 True 3 2 Podolany 56 +495000.0 True 5 1 Naramowice 98 +265000.0 True 2 4 Grunwald 43 +289575.0 True 2 0 Jeżyce 43 +495000.0 True 3 0 Centrum 63 +380000.0 True 4 1 Piątkowo 76 +250000.0 True 2 4 Rataje 44 +335000.0 True 3 4 Winogrady 56 +580000.0 True 4 3 Sołacz 96 +549000.0 True 3 2 Jeżyce 106 +200000.0 True 2 0 Rataje 30 +736933.0 True 3 0 Jeżyce 67 +275000.0 True 2 0 Naramowice 50 +290000.0 True 2 2 Dębiec 40 +620000.0 True 3 2 Naramowice 98 +299000.0 True 2 0 Dębiec 48 +275000.0 True 2 1 Sołacz 38 +279000.0 True 2 1 Naramowice 52 +379999.0 True 3 2 Wilda 67 +354454.0 True 2 3 Górczyn 17 +379000.0 True 3 2 Podolany 56 +800000.0 True 3 3 Chwaliszewo 70 +350000.0 True 3 0 Naramowice 59 +420000.0 True 2 5 Rataje 63 +260000.0 True 3 4 Centrum 44 +470000.0 True 3 1 Rataje 70 +360000.0 True 2 0 Winogrady 48 +320000.0 True 2 3 Chwaliszewo 56 +260000.0 True 2 0 Rataje 46 +397000.0 True 3 2 Jeżyce 74 +439000.0 True 3 1 Junikowo 70 +430000.0 True 3 5 Grunwald 60 +349000.0 True 3 2 Górczyn 55 +450000.0 True 3 0 Winogrady 70 +290000.0 True 2 6 Jeżyce 49 +499000.0 True 3 1 Rataje 64 +319000.0 True 3 1 Piątkowo 63 +489780.0 True 4 2 Górczyn 63 +453600.0 True 2 3 Naramowice 56 +525000.0 True 4 3 Jeżyce 104 +950000.0 True 3 4 Nowe 99 +459000.0 True 3 4 Dębiec 60 +370000.0 True 4 11 Rataje 74 +830000.0 True 3 1 Grunwald 91 +385500.0 True 2 6 Dębiec 38 +409000.0 True 3 1 Malta 61 +275000.0 True 3 7 Wilda 53 +300000.0 True 2 4 Winogrady 53 +335400.0 True 2 1 Łazarz 51 +560000.0 True 2 8 Grunwald 55 +855000.0 True 4 5 Jeżyce 96 +399000.0 True 3 1 Winiary 66 +750000.0 True 4 0 Kobylepole 105 +459000.0 True 3 4 Dębiec 60 +275000.0 True 2 0 Naramowice 50 +925000.0 True 5 1 Stare 105 +350000.0 True 3 3 Jeżyce 70 +550000.0 True 2 1 Naramowice 57 +345000.0 True 2 0 Centrum 42 +576520.0 True 2 5 Centrum 50 +285000.0 True 2 4 Naramowice 42 +395000.0 True 3 10 Piątkowo 67 +516000.0 True 3 3 Naramowice 75 +620000.0 True 3 2 Naramowice 98 +240000.0 True 2 3 Grunwald 38 +350000.0 True 2 0 Naramowice 48 +390000.0 True 3 2 Podolany 68 +339000.0 True 3 9 Rataje 65 +659000.0 True 5 0 Podolany 135 +670000.0 True 4 3 Grunwald 81 +390000.0 True 3 2 Podolany 68 +420000.0 True 2 1 Naramowice 62 +288000.0 True 3 4 Winogrady 47 +326000.0 True 2 0 Jeżyce 55 +450000.0 True 3 0 Grunwald 75 +354000.0 True 3 1 Naramowice 60 +279000.0 True 2 0 Piątkowo 48 +449900.0 True 3 0 Naramowice 71 +285000.0 True 2 11 Winogrady 47 +690000.0 True 4 5 Grunwald 107 +380000.0 True 3 0 Centrum 55 +329000.0 True 2 3 Nowe 50 +510000.0 True 5 1 Naramowice 98 +325000.0 True 3 1 Głuszyna 63 +269000.0 True 2 3 Grunwald 47 +215000.0 True 2 0 Wilda 36 +285000.0 True 2 4 Wilda 35 +390000.0 True 4 4 Piątkowo 74 +295000.0 True 2 4 Stare 33 +245000.0 True 2 0 Stare 44 +490000.0 True 4 3 Sołacz 83 +200000.0 True 2 0 Głuszyna 52 +379000.0 True 2 0 Nowe 56 +290000.0 True 2 5 Winogrady 42 +235000.0 True 2 3 Winogrady 38 +750000.0 True 2 9 Centrum 54 +385000.0 True 2 0 Naramowice 50 +489000.0 True 3 3 Grunwald 104 +290000.0 True 3 2 Winogrady 60 +280000.0 True 3 2 Winogrady 47 +280000.0 True 3 2 Winogrady 47 +385000.0 True 2 1 Nowe 48 +378000.0 True 2 1 Grunwald 50 +460499.0 True 3 1 Centrum 51 +481103.0 True 3 1 Centrum 51 +455348.0 True 3 0 Centrum 61 +348750.0 True 2 3 Centrum 50 +194000.0 True 2 2 Nowe 80 +360288.0 True 2 1 Centrum 60 +368712.0 True 2 0 Centrum 90 +244071.0 True 2 2 Nowe 93 +390312.0 True 2 3 Centrum 60 +430000.0 True 2 2 Wilda 38 +225000.0 True 2 3 Grunwald 41 +720000.0 True 4 0 Centrum 163 +475000.0 True 4 1 Grunwald 90 +585000.0 True 3 1 Centrum 16 +319000.0 True 3 4 Winogrady 53 +949000.0 True 3 4 Śródka 98 +233000.0 True 2 3 Grunwald 39 +299000.0 True 2 1 Centrum 11 +211743.0 False 2 4 Starołęka 33 +208382.0 False 2 3 Starołęka 33 +311283.0 False 3 4 Starołęka 3 +413592.0 False 3 2 Starołęka 72 +345000.0 True 4 3 Grunwald 70 +317880.0 False 2 2 Grunwald 98 +317880.0 False 2 2 Grunwald 98 +317880.0 False 2 2 Grunwald 98 +495723.0 False 4 9 Grunwald 99 +317880.0 False 2 2 Grunwald 98 +495723.0 False 3 9 Grunwald 99 +429699.0 False 3 15 Grunwald 62 +470000.0 True 3 2 Sołacz 68 +302887.0 False 2 4 Górczyn 25 +284618.0 False 2 3 Nowe 55 +225228.0 False 2 5 Rataje 91 +282994.0 False 2 0 Starołęka 59 +522235.0 False 3 2 Stare 62 +294840.0 False 2 4 Winogrady 50 +460499.0 False 3 1 Stare 51 +305676.0 False 2 5 Winogrady 52 +442080.0 False 3 1 Starołęka 68 +242731.0 False 2 0 Podolany 74 +370597.0 False 2 4 Stare 4 +297420.0 False 2 3 Grunwald 24 +342021.0 False 2 4 Nowe 93 +429699.0 False 3 15 Grunwald 62 +341682.0 False 2 10 Grunwald 7 +368110.0 False 3 2 Nowe 31 +162525.0 False 2 0 Głuszyna 55 +228144.0 False 3 2 Głuszyna 56 +557338.0 False 3 3 Stare 4 +557338.0 False 3 3 Stare 4 +310584.0 False 2 1 Nowe 26 +210000.0 True 2 2 Zawady 42 +85000.0 True 2 0 Zawady 40 +145000.0 True 2 1 Zawady 61 +339000.0 True 3 9 Nowe 65 +384000.0 True 3 2 Piątkowo 70 +215000.0 True 2 2 Łazarz 34 +295000.0 True 3 0 Grunwald 20 +295000.0 True 3 0 Grunwald 20 +339000.0 True 3 1 Rataje 67 +247000.0 True 3 3 Raszyn 70 +245000.0 True 2 3 Grunwald 30 +245000.0 True 2 2 Dębiec 30 +305000.0 True 3 4 Rataje 53 +308000.0 True 3 0 Piątkowo 63 +247000.0 True 3 3 Grunwald 70 +155481.0 True 2 0 Stare 88 +350000.0 True 2 0 Stare 60 +240000.0 True 2 3 Grunwald 37 +339000.0 True 3 1 Rataje 88 +265000.0 True 2 1 Jeżyce 66 +259999.0 True 2 4 Rataje 44 +225288.0 False 2 1 Rataje 91 +247000.0 True 3 3 Grunwald 70 +315000.0 True 3 4 Winogrady 50 +239000.0 True 2 8 Winogrady 10 +255000.0 True 2 1 Centrum 48 +382000.0 True 3 3 Centrum 50 +240000.0 True 2 3 Dębiec 50 +930000.0 True 2 2 Malta 75 +239000.0 True 2 10 Grunwald 42 +235000.0 True 2 5 Winogrady 38 +399000.0 True 2 2 Stare 62 +920000.0 True 5 2 Grunwald 177 +499000.0 True 3 0 Centrum 12 +492000.0 True 3 4 Centrum 96 +349000.0 True 2 4 Centrum 11 +317880.0 True 2 2 Grunwald 98 +407208.0 True 3 2 Grunwald 44 +410665.0 True 4 2 Grunwald 7 +410780.0 True 3 3 Grunwald 44 +328476.0 True 2 4 Grunwald 98 +273951.0 True 2 0 Nowe 97 +321285.0 True 2 4 Winogrady 30 +318645.0 True 2 2 Winogrady 30 +886860.06 True 3 5 Centrum 80 +473770.0 True 2 5 Centrum 7 +798966.0 True 2 5 Centrum 33 +163563.75 True 2 0 Centrum 25 +314089.0 True 2 5 Grunwald 49 +297420.81 True 2 3 Grunwald 24 +455712.0 True 3 0 Grunwald 64 +746787.0 True 4 7 Grunwald 53 +322276.0 True 2 3 Winogrady 98 +286327.0 True 2 3 Winogrady 53 +312259.0 True 2 6 Winogrady 19 +256417.0 True 2 3 Nowe 33 +193950.0 True 2 1 Nowe 79 +226239.0 True 2 0 Nowe 93 +487000.0 True 3 0 Naramowice 83 +313028.0 True 2 4 Centrum 4 +292664.5 True 2 4 Centrum 11 +440496.0 True 3 4 Centrum 96 +358092.0 True 2 4 Centrum 84 +288216.5 True 2 4 Centrum 47 +410215.0 True 2 4 Centrum 11 +383760.0 True 3 6 Grunwald 60 +299000.0 True 2 0 Wilda 53 +299000.0 True 3 3 Jeżyce 56 +674000.0 True 5 2 Centrum 40 +270000.0 True 3 4 Nowe 48 +303287.0 True 2 3 Grunwald 13 +156986.0 True 2 1 Nowe 62 +162525.0 True 2 0 Nowe 55 +247831.0 True 3 5 Nowe 73 +222050.0 True 2 3 Nowe 41 +204450.0 True 3 1 Nowe 50 +188190.0 True 2 0 Nowe 90 +192750.0 True 2 4 Nowe 55 +247549.0 True 3 4 Nowe 67 +285678.0 False 2 1 Winogrady 42 +308237.0 False 2 1 Nowe 85 +349000.0 False 4 0 Szczepankowo 29 +297421.0 False 2 3 Grunwald 24 +297421.0 False 2 3 Grunwald 24 +244071.0 False 2 1 Nowe 93 +156085.0 False 2 4 Nowe 54 +265000.0 True 2 1 Jeżyce 66 +235000.0 True 2 0 Dębiec 43 +305000.0 True 2 8 Ogrody 44 +435000.0 True 3 1 Grunwald 70 +395000.0 True 2 0 Grunwald 11 +449000.0 False 5 0 Szczepankowo 68 +211190.0 False 2 0 Piątkowo 78 +771672.0 False 4 4 Górczyn 66 +771672.0 False 4 4 Górczyn 66 +302887.0 False 2 4 Górczyn 25 +282994.0 False 2 0 Starołęka 59 +771672.0 False 4 4 Górczyn 66 +302887.0 False 2 4 Górczyn 25 +225228.0 False 2 5 Rataje 91 +442080.0 False 3 1 Starołęka 68 +370597.0 False 2 4 Stare 4 +771672.0 False 4 4 Górczyn 66 +242731.0 False 2 0 Podolany 74 +225228.0 False 2 5 Rataje 91 +460499.0 False 3 1 Stare 51 +284618.0 False 2 3 Nowe 55 +356251.0 False 3 14 Grunwald 20 +297420.0 False 2 3 Grunwald 24 +428090.0 False 3 2 Nowe 85 +347090.0 False 3 1 Winogrady 41 +375529.0 False 2 3 Centrum 71 +429699.0 False 3 15 Grunwald 62 +332940.0 False 2 2 Winogrady 70 +162525.0 False 2 0 Głuszyna 55 +557338.0 False 3 3 Stare 4 +317880.0 False 2 11 Grunwald 98 +293436.0 False 2 11 Grunwald 16 +317880.0 False 2 2 Grunwald 98 +297421.0 False 2 3 Grunwald 16 +297421.0 False 2 3 Grunwald 16 +317880.0 False 2 2 Grunwald 98 +297421.0 False 2 3 Grunwald 16 +297421.0 False 2 3 Grunwald 16 +270000.0 True 2 2 Jeżyce 49 +470000.0 True 2 4 Centrum 42 +293436.0 False 2 11 Grunwald 16 +347193.0 False 3 11 Grunwald 7 +347193.0 False 3 11 Grunwald 7 +321904.0 False 2 4 Winogrady 92 +455348.0 False 3 0 Centrum 61 +331226.0 False 3 2 Starołęka 95 +557338.0 False 3 3 Centrum 4 +460499.0 False 3 1 Centrum 51 +245000.0 True 2 3 Grunwald 30 +597184.0 False 3 4 Stare 61 +597184.0 False 3 4 Stare 61 +557338.0 False 3 3 Centrum 4 +157039.0 False 2 4 Nowe 63 +522235.0 False 3 2 Stare 62 +294840.0 False 2 4 Winogrady 50 +442080.0 False 3 1 Starołęka 68 +370597.0 False 2 4 Stare 4 +460499.0 False 3 1 Stare 51 +242731.0 False 2 0 Podolany 74 +771672.0 False 4 4 Górczyn 66 +460499.0 False 3 1 Stare 51 +302887.0 False 2 4 Górczyn 25 +225228.0 False 2 5 Rataje 91 +284618.0 False 2 3 Nowe 55 +356251.0 False 3 14 Grunwald 20 +297420.0 False 2 3 Grunwald 24 +297421.0 False 2 3 Grunwald 16 +317880.0 False 2 2 Grunwald 98 +297421.0 False 2 3 Grunwald 16 +156085.0 False 2 3 Głuszyna 45 +362459.0 False 3 0 Starołęka 80 +285678.0 False 2 1 Winogrady 42 +308237.0 False 2 1 Nowe 85 +244071.0 False 2 1 Nowe 93 +156085.0 False 2 4 Nowe 54 +308237.0 False 2 1 Nowe 85 +244071.0 False 2 1 Nowe 93 +245000.0 True 2 5 Nowe 42 +308237.0 False 2 1 Nowe 85 +156085.0 False 2 3 Głuszyna 45 +297421.0 False 2 3 Grunwald 24 +244071.0 False 2 1 Nowe 93 +290000.0 True 3 2 Jeżyce 81 +279000.0 True 2 2 Wilda 30 +489000.0 True 2 8 Centrum 4 +395000.0 True 4 0 Grunwald 60 +239000.0 True 2 0 Rataje 48 +330000.0 True 3 4 Nowe 59 +370000.0 True 4 4 Stare 76 +380000.0 True 4 0 Stare 74 +319000.0 True 3 4 Rataje 63 +480000.0 True 4 1 Grunwald 64 +478000.0 True 3 3 Centrum 78 +304865.0 False 3 3 Zawady 43 +185000.0 True 2 8 Dębiec 50 +410000.0 True 2 9 Nowe 51 +439000.0 True 2 3 Centrum 86 +319000.0 True 3 3 Wilda 53 +399000.0 True 3 3 Stare 68 +870000.0 True 5 0 Grunwald 156 +335000.0 True 3 0 Centrum 65 +278000.0 True 3 2 Rataje 47 +249000.0 True 2 4 Grunwald 43 +379000.0 True 3 0 Wilda 96 +275000.0 True 2 9 Rataje 38 +319000.0 True 2 0 Grunwald 45 +295000.0 True 2 4 Grunwald 53 +195000.0 True 2 2 Nowe 42 +530000.0 True 2 5 Piątkowo 66 +380000.0 True 3 3 Centrum 67 +395000.0 True 2 0 Grunwald 52 +249000.0 True 2 5 Rataje 36 +379000.0 True 3 0 Rataje 30 +399000.0 True 3 1 Grunwald 65 +648263.0 True 3 2 Łazarz 84 +308220.0 True 2 5 Winogrady 70 +288000.0 True 3 4 Winogrady 30 +292020.0 True 2 1 Winogrady 10 +510000.0 True 2 5 Centrum 91 +310000.0 True 3 4 Rataje 10 +333694.0 True 3 0 Jeżyce 68 +232408.0 True 2 0 Stare 38 +392181.0 True 3 4 Winogrady 69 +285382.0 True 2 4 Winogrady 48 +245830.0 True 2 2 Grunwald 40 +410000.0 True 4 2 Nowe 71 +330000.0 True 2 0 Grunwald 68 +350000.0 True 3 4 Jeżyce 20 +245000.0 True 2 5 Rataje 42 +290000.0 True 2 4 Łazarz 36 +360000.0 True 3 0 Centrum 30 +399000.0 False 3 2 Winogrady 98 +348750.0 False 2 3 Centrum 50 +356448.0 False 2 4 Stare 5 +342021.0 False 2 4 Nowe 93 +342021.0 False 2 4 Nowe 93 +342021.0 False 2 4 Nowe 93 +342021.0 False 2 4 Nowe 93 +342021.0 False 2 4 Nowe 93 +638175.0 False 4 3 Nowe 9 +458208.0 False 3 3 Nowe 92 +428090.0 False 3 2 Nowe 85 +428090.0 False 3 1 Nowe 85 +280463.0 False 2 4 Nowe 55 +280000.0 True 3 2 Rataje 20 +347090.0 False 3 1 Winogrady 41 +347090.0 False 3 1 Winogrady 41 +285678.0 False 2 1 Winogrady 82 +347090.0 False 3 1 Winogrady 41 +321656.0 False 2 4 Winogrady 38 +312259.0 False 2 6 Winogrady 60 +317880.0 False 2 2 Grunwald 98 +225228.0 False 2 5 Rataje 91 +356251.0 False 3 14 Grunwald 20 +297420.0 False 2 3 Grunwald 24 +370597.0 False 2 4 Stare 4 +284618.0 False 2 3 Nowe 55 +544008.0 False 4 2 Starołęka 4 +302887.0 False 2 4 Górczyn 25 +156085.0 False 2 4 Nowe 54 +522235.0 False 3 2 Stare 62 +771672.0 False 4 4 Górczyn 66 +442080.0 False 3 1 Starołęka 68 +460499.0 False 3 1 Stare 51 +368712.0 False 2 0 Stare 80 +242731.0 False 2 0 Podolany 74 +560000.0 True 4 0 Naramowice 20 +359000.0 True 3 0 Grunwald 69 +287000.0 True 3 1 Wilda 73 +270000.0 True 2 2 Jeżyce 95 +285000.0 True 2 0 Grunwald 80 +350000.0 True 4 4 Stare 60 +389000.0 True 3 0 Wilda 96 +695000.0 True 3 2 Jeżyce 25 +270000.0 True 2 6 Piątkowo 47 +305000.0 True 2 1 Winogrady 49 +439000.0 True 3 1 Grunwald 10 +415000.0 True 4 7 Piątkowo 63 +268000.0 True 3 4 Jeżyce 42 +270000.0 True 3 4 Rataje 48 +269000.0 True 2 0 Grunwald 46 +360000.0 True 3 1 Rataje 69 +205000.0 True 2 1 Jeżyce 34 +405000.0 True 3 1 Antoninek 70 +295000.0 True 2 0 Winogrady 36 +295000.0 True 2 0 Naramowice 36 +339000.0 True 3 9 Rataje 65 +475000.0 True 4 4 Wilda 120 +359000.0 True 4 0 Winogrady 90 +368567.0 True 3 1 Jeżyce 68 +211189.0 True 2 0 Jeżyce 38 +391729.0 True 3 2 Winogrady 69 +285678.0 True 2 4 Winogrady 48 +469000.0 True 4 2 Jeżyce 87 +259000.0 True 3 4 Stare 60 +470092.78 True 2 3 Centrum 21 +244000.0 True 2 5 Śródka 43 +215000.0 True 2 4 Nowe 14 +488631.0 True 2 5 Centrum 22 +233000.0 True 2 4 Śródka 99 +485017.66 True 2 5 Centrum 77 +450000.0 True 2 3 Centrum 88 +410666.0 True 4 2 Grunwald 71 +327585.0 True 3 6 Grunwald 56 +263000.0 True 2 1 Rataje 45 +270000.0 True 3 4 Rataje 48 +405000.0 True 4 2 Rataje 71 +297421.0 False 2 1 Grunwald 16 +415000.0 True 3 0 Jeżyce 5 +297421.0 False 2 3 Grunwald 16 +991380.0 False 5 1 Starołęka 94 +319998.0 False 3 1 Starołęka 95 +288405.0 False 2 1 Górczyn 37 +375529.0 False 2 3 Centrum 71 +225228.0 False 2 0 Rataje 71 +357692.0 False 3 1 Nowe 31 +310584.0 False 2 1 Nowe 26 +368568.0 False 3 4 Podolany 38 +460499.0 False 3 1 Stare 51 +156085.0 False 2 4 Nowe 54 +771672.0 False 4 4 Górczyn 66 +522235.0 False 3 2 Stare 62 +302887.0 False 2 4 Górczyn 25 +242731.0 False 2 0 Podolany 74 +225228.0 False 2 5 Rataje 91 +356251.0 False 3 14 Grunwald 20 +297420.0 False 2 3 Grunwald 24 +544008.0 False 4 2 Starołęka 4 +284618.0 False 2 3 Nowe 55 +285678.0 False 2 2 Winogrady 42 +174375.0 True 2 3 Centrum 25 +350000.0 True 4 4 Piątkowo 76 +380000.0 True 4 0 Piątkowo 74 +315000.0 True 2 0 Górczyn 48 +362000.0 True 2 1 Centrum 50 +344206.0 True 4 4 Stare 58 +300987.0 True 3 1 Stare 50 +235094.0 True 2 0 Stare 39 +549000.0 True 3 2 Jeżyce 18 +239000.0 True 2 1 Grunwald 44 +379000.0 True 3 1 Naramowice 20 +320000.0 True 2 1 Naramowice 50 +269000.0 True 3 1 Wilda 80 +295000.0 True 3 0 Grunwald 20 +249999.0 True 2 9 Winogrady 38 +330000.0 True 2 3 Piątkowo 50 +360000.0 True 3 2 Rataje 20 +412438.0 True 3 2 Winogrady 71 +291721.0 True 2 5 Stare 44 +354421.0 True 2 5 Stare 54 +399952.0 True 4 1 Grunwald 71 +280000.0 True 2 2 Centrum 40 +200000.0 True 2 2 Dębiec 40 +289000.0 True 2 7 Winiary 49 +279000.0 True 3 10 Rataje 56 +333232.0 True 3 7 Grunwald 56 +489000.0 True 3 0 Jeżyce 10 +375000.0 True 2 1 Piątkowo 48 +259000.0 True 2 2 Centrum 48 +335000.0 True 2 0 Centrum 54 +288000.0 True 3 4 Winogrady 30 +289000.0 True 2 7 Winiary 49 +380000.0 True 3 3 Wilda 67 +419000.0 True 3 4 Wilda 50 +247705.0 True 2 0 Jeżyce 50 +333696.0 True 3 0 Jeżyce 68 +409000.0 True 3 1 Rataje 90 +239000.0 True 2 3 Grunwald 60 +289000.0 True 2 6 Winogrady 48 +326000.0 True 2 1 Winogrady 39 +269000.0 True 2 2 Winogrady 48 +489000.0 True 4 2 Wilda 120 +350000.0 True 4 4 Piątkowo 76 +322663.41 True 2 1 Centrum 14 +368019.41 True 2 4 Centrum 18 +674695.13 True 4 4 Centrum 59 +375000.0 True 4 2 Centrum 72 +378128.09 True 2 3 Centrum 77 +349668.0 True 2 2 Centrum 15 +344296.75 True 2 1 Centrum 5 +353456.63 True 2 3 Centrum 16 +347193.0 False 3 11 Grunwald 7 +557338.0 False 3 3 Centrum 4 +228144.0 False 3 2 Głuszyna 56 +247705.0 False 2 1 Podolany 74 +228144.0 False 3 2 Głuszyna 56 +222050.0 False 2 3 Głuszyna 41 +158682.0 False 2 2 Głuszyna 94 +194000.0 False 2 2 Głuszyna 80 +289170.0 False 2 0 Winogrady 90 +399000.0 False 3 2 Winogrady 98 +305670.0 False 2 3 Grunwald 30 +305670.0 False 2 3 Grunwald 30 +294840.0 False 2 4 Winogrady 50 +597184.0 False 3 4 Stare 61 +460499.0 False 3 1 Stare 51 +347010.0 False 2 10 Grunwald 80 +356251.0 False 3 14 Grunwald 20 +225228.0 False 2 5 Rataje 91 +297420.0 False 2 3 Grunwald 24 +284618.0 False 2 3 Nowe 55 +544008.0 False 4 2 Starołęka 4 +522235.0 False 3 2 Stare 62 +370597.0 False 2 4 Stare 4 +674695.0 False 3 4 Stare 59 +442080.0 False 3 1 Starołęka 68 +771672.0 False 4 4 Górczyn 66 +302887.0 False 2 4 Górczyn 25 +294840.0 False 2 4 Winogrady 50 +305676.0 False 2 5 Winogrady 52 +305676.0 False 2 5 Winogrady 52 +242731.0 False 2 0 Podolany 74 +460499.0 False 3 1 Stare 51 +156085.0 False 2 4 Nowe 54 +242731.0 False 2 0 Podolany 74 +368568.0 False 3 4 Podolany 38 +499000.0 True 3 1 Rataje 50 +275000.0 True 3 1 Wilda 48 +307000.0 True 3 2 Rataje 48 +485000.0 True 2 3 Nowe 50 +288000.0 True 2 4 Naramowice 44 +405000.0 True 4 7 Piątkowo 63 +299000.0 True 2 4 Grunwald 60 +235000.0 True 2 0 Nowe 47 +288000.0 True 3 4 Stare 30 +225288.0 False 2 1 Rataje 91 +287882.0 False 2 1 Starołęka 85 +225288.0 False 2 1 Rataje 91 +652026.0 True 4 3 Stare 89 +476118.0 True 3 1 Stare 78 +349668.0 True 2 2 Stare 15 +318645.0 True 2 2 Stare 30 +290970.0 True 2 0 Stare 60 +354000.0 True 3 1 Stare 60 +260000.0 True 2 0 Stare 47 +670000.0 True 5 1 Stare 152 +360380.0 True 4 4 Wilda 97 +329000.0 True 2 3 Nowe 90 +249000.0 True 2 5 Centrum 20 +319000.0 True 2 3 Jeżyce 40 +493422.0 True 3 1 Centrum 62 +236000.0 True 2 3 Nowe 43 +257697.0 True 2 3 Śródka 21 +234000.0 True 2 2 Śródka 20 +233643.0 True 2 2 Nowe 99 +296810.0 True 2 2 Grunwald 30 +335988.0 True 2 1 Grunwald 41 +453526.5 True 3 6 Grunwald 33 +637135.0 True 3 7 Grunwald 65 +771672.0 True 4 7 Grunwald 68 +329000.0 True 3 8 Piątkowo 63 +399000.0 False 5 0 Szczepankowo 68 +369000.0 True 2 4 Rataje 49 +404000.0 True 2 0 Rataje 49 +389000.0 True 3 4 Rataje 62 +507060.0 True 2 3 Grunwald 77 +390910.0 True 3 1 Grunwald 14 +690000.0 True 6 2 Centrum 170 +355000.0 True 2 0 Podolany 93 +369000.0 True 16 2 Piątkowo 90 +339000.0 True 3 9 Rataje 65 +398000.0 True 2 3 Umultowo 59 +289000.0 True 2 6 Stare 80 +389000.0 True 3 3 Stare 49 +270000.0 True 2 6 Piątkowo 46 +353000.0 True 3 2 Grunwald 73 +413484.5 True 3 4 Grunwald 83 +311046.0 True 2 6 Grunwald 12 +1020000.0 True 3 1 Grunwald 50 +292383.0 True 2 0 Grunwald 41 +307190.0 True 2 4 Grunwald 20 +311975.5 True 2 1 Grunwald 13 +335000.0 True 3 1 Naramowice 60 +289000.0 True 2 1 Winogrady 48 +449000.0 False 5 0 Szczepankowo 68 +285678.0 False 2 1 Winogrady 42 +247705.0 False 2 0 Podolany 74 +211190.0 False 2 0 Podolany 78 +278047.0 False 2 4 Podolany 74 +333694.0 False 3 0 Podolany 38 +333024.0 False 2 1 Stare 51 +319998.0 False 3 1 Starołęka 97 +354420.0 False 2 5 Winogrady 70 +348750.0 False 2 3 Centrum 50 +269000.0 True 2 8 Rataje 90 +370597.0 False 2 4 Stare 4 +242731.0 False 2 0 Podolany 74 +370597.0 False 2 4 Stare 4 +460499.0 False 3 1 Stare 51 +302887.0 False 2 4 Górczyn 25 +225228.0 False 2 5 Rataje 91 +356251.0 False 3 14 Grunwald 20 +156085.0 False 2 4 Nowe 54 +156085.0 False 2 4 Nowe 54 +156085.0 False 2 4 Nowe 54 +544008.0 False 4 2 Starołęka 4 +302887.0 False 2 4 Górczyn 25 +284618.0 False 2 3 Nowe 55 +242731.0 False 2 0 Podolany 74 +546462.0 False 4 0 Jeżyce 74 +493966.0 False 4 0 Jeżyce 79 +332691.0 False 3 0 Jeżyce 58 +335920.0 False 3 0 Jeżyce 68 +334360.0 False 3 1 Jeżyce 44 +329000.0 True 3 3 Jeżyce 54 +299000.0 True 2 3 Naramowice 49 +349000.0 True 3 3 Piątkowo 64 +297421.0 False 2 3 Grunwald 24 +244071.0 False 2 1 Nowe 93 +287882.0 False 2 1 Starołęka 85 +297421.0 False 2 3 Grunwald 24 +297421.0 False 2 3 Grunwald 24 +156085.0 False 2 3 Głuszyna 45 +244071.0 False 2 1 Nowe 93 +330000.0 True 3 1 Dębiec 88 +364000.0 True 3 2 Jeżyce 69 +365000.0 True 3 1 Wilda 46 +380000.0 True 4 0 Piątkowo 74 +270000.0 True 2 6 Piątkowo 46 +330000.0 True 3 4 Rataje 59 +260000.0 True 2 0 Naramowice 47 +425000.0 True 3 1 Rataje 70 +239000.0 True 2 3 Rataje 44 +250000.0 True 2 9 Winogrady 10 +307000.0 True 2 4 Piątkowo 49 +300000.0 True 3 2 Grunwald 49 +295361.0 True 3 2 Stare 48 +242133.0 True 2 0 Jeżyce 38 +391730.0 True 3 2 Winogrady 69 +286860.0 True 2 7 Winogrady 49 +476119.0 True 3 1 Stare 59 +652026.0 True 4 3 Stare 79 +289171.0 True 2 0 Stare 46 +293700.0 True 2 5 Stare 45 +342405.0 True 3 11 Grunwald 54 +297420.0 True 2 1 Grunwald 50 +292100.0 True 2 1 Grunwald 51 +333690.0 True 3 1 Jeżyce 68 +242731.0 True 2 0 Jeżyce 50 +211200.0 True 2 0 Jeżyce 38 +288000.0 True 3 4 Winogrady 30 +245000.0 True 2 0 Naramowice 50 +359600.0 True 2 5 Górczyn 58 +332940.0 True 2 2 Winogrady 70 +248337.0 True 2 3 Winogrady 38 +209000.0 True 2 0 Śródka 14 +341803.78 True 2 8 Winogrady 10 +285000.0 True 2 3 Łazarz 58 +217000.0 True 2 4 Wilda 30 +379000.0 True 4 3 Winogrady 65 +235000.0 True 2 0 Śródka 10 +597184.0 False 3 4 Stare 61 +460499.0 False 3 1 Stare 51 +347010.0 False 2 10 Grunwald 80 +282994.0 False 2 0 Starołęka 59 +297420.0 False 2 3 Grunwald 24 +522235.0 False 3 2 Stare 62 +368568.0 False 3 4 Podolany 38 +242731.0 False 2 0 Podolany 74 +460499.0 False 3 1 Stare 51 +771672.0 False 4 4 Górczyn 66 +302887.0 False 2 4 Górczyn 25 +350000.0 True 4 4 Piątkowo 76 +375000.0 True 3 1 Nowe 62 +260000.0 True 2 0 Naramowice 79 +315000.0 True 2 1 Grunwald 49 +375000.0 True 3 1 Rataje 62 +229000.0 True 2 11 Stare 38 +365000.0 True 3 1 Wilda 46 +299000.0 True 2 3 Górczyn 37 +259000.0 True 2 2 Jeżyce 48 +289000.0 True 2 1 Piątkowo 46 +310000.0 True 3 0 Piątkowo 63 +209000.0 True 2 4 Dębiec 6 +249000.0 True 2 0 Nowe 21 +287882.09 True 2 1 Nowe 85 +434201.0 True 4 1 Nowe 54 +482423.0 True 5 2 Nowe 4 +297789.5 True 2 2 Nowe 54 +149000.0 True 2 0 Grunwald 35 +299000.0 True 2 9 Stare 80 +365000.0 True 3 1 Wilda 46 +329000.0 True 2 3 Rataje 90 +337000.0 True 4 4 Rataje 62 +597184.0 False 3 4 Stare 61 +347010.0 False 2 10 Grunwald 80 +460499.0 False 3 1 Stare 51 +597184.0 False 3 4 Stare 61 +300680.0 False 2 2 Starołęka 54 +347010.0 False 2 10 Grunwald 80 +294840.0 False 2 4 Winogrady 50 +368568.0 False 3 4 Podolany 38 +242731.0 False 2 0 Podolany 74 +674695.0 False 3 4 Stare 59 +442080.0 False 3 1 Starołęka 68 +302887.0 False 2 4 Górczyn 25 +294840.0 False 2 4 Winogrady 50 +460499.0 False 3 1 Stare 51 +365000.0 True 3 0 Wilda 10 +195000.0 True 2 0 Winiary 35 +325000.0 True 4 1 Rataje 58 +303287.0 False 2 3 Grunwald 13 +375000.0 True 3 1 Rataje 62 +384000.0 True 3 2 Piątkowo 69 +297421.0 False 2 3 Grunwald 24 +244071.0 False 2 1 Nowe 93 +255000.0 True 2 2 Centrum 90 +285000.0 True 2 0 Grunwald 80 +300000.0 True 3 1 Grunwald 48 +330000.0 True 3 5 Grunwald 58 +330000.0 True 3 5 Grunwald 58 +330000.0 True 3 5 Grunwald 58 +315000.0 True 2 0 Centrum 60 +290000.0 True 2 4 Centrum 36 +245000.0 True 2 7 Ogrody 90 +289000.0 True 2 1 Piątkowo 46 +359000.0 True 2 4 Nowe 90 +339000.0 True 3 1 Nowe 88 +285385.0 True 2 4 Winogrady 48 +308039.0 True 2 0 Winogrady 52 +298982.0 True 2 3 Stare 45 +289170.0 True 2 0 Stare 46 +368568.0 True 3 4 Jeżyce 68 +211195.0 True 2 0 Jeżyce 38 +315000.0 True 2 2 Podolany 52 +267704.0 True 2 3 Grunwald 45 +325313.0 True 3 3 Grunwald 53 +260000.0 True 2 0 Naramowice 47 +349000.0 True 2 3 Jeżyce 56 +499000.0 True 3 1 Rataje 50 +239000.0 True 2 0 Wilda 57 +487000.0 True 3 0 Naramowice 73 +319000.0 True 2 2 Centrum 53 +344152.0 True 3 0 Nowe 80 +357692.0 True 3 2 Nowe 31 +277098.0 True 2 0 Nowe 59 +301794.13 True 2 1 Nowe 26 +533745.0 False 5 2 Starołęka 4 +333694.0 False 3 1 Podolany 32 +333694.0 False 3 1 Piątkowo 38 +380931.0 False 3 3 Starołęka 82 +597184.0 False 3 4 Stare 61 +460499.0 False 3 1 Stare 51 +300680.0 False 2 2 Starołęka 54 +305670.0 False 2 3 Grunwald 30 +390301.0 False 2 4 Stare 61 +370597.0 False 2 4 Stare 4 +192750.0 False 2 1 Głuszyna 55 +460499.0 False 3 1 Stare 51 +242731.0 False 2 0 Podolany 74 +303287.0 False 2 3 Grunwald 13 +318645.0 False 2 2 Winogrady 23 +370597.0 False 2 4 Stare 4 +674695.0 False 3 4 Stare 59 +442080.0 False 3 1 Starołęka 68 +771672.0 False 4 4 Górczyn 66 +771672.0 False 4 4 Górczyn 66 +294840.0 False 2 4 Winogrady 50 +368712.0 False 2 5 Stare 90 +480000.0 True 3 3 Stare 46 +237000.0 True 2 2 Wilda 44 +359000.0 True 4 3 Grunwald 74 +369000.0 True 3 0 Grunwald 87 +369000.0 True 3 0 Grunwald 87 +695000.0 True 3 2 Jeżyce 25 +321239.09 True 2 3 Winogrady 30 +331899.09 True 2 2 Winogrady 30 +334564.09 True 2 1 Winogrady 30 +289800.0 True 2 0 Winogrady 46 +289170.0 True 2 0 Winogrady 90 +345000.0 True 3 3 Stare 50 +499000.0 True 2 8 Centrum 39 +399000.0 True 2 1 Jeżyce 58 +1049000.0 True 3 9 Nowe 113 +729000.0 True 4 3 Stare 130 +254457.0 True 2 5 Nowe 52 +249000.0 True 2 6 Winogrady 48 +320000.0 True 3 3 Nowe 40 +333692.0 True 3 2 Jeżyce 68 +410665.0 True 4 2 Grunwald 71 +293436.0 True 2 1 Grunwald 50 +481904.0 True 3 2 Stare 62 +332940.0 True 2 2 Stare 54 +325249.0 True 3 3 Jeżyce 49 +347096.0 True 3 1 Winogrady 57 +297421.0 False 2 2 Grunwald 24 +570000.0 True 4 3 Centrum 137 +351475.0 False 3 0 Starołęka 80 +294840.0 False 2 4 Winogrady 50 +460499.0 False 3 1 Stare 51 +300680.0 False 2 2 Starołęka 54 +460499.0 False 3 1 Stare 51 +353275.0 False 2 14 Grunwald 74 +294840.0 False 2 4 Winogrady 50 +297420.0 False 2 3 Grunwald 24 +294840.0 False 2 4 Winogrady 50 +302887.0 False 2 4 Górczyn 25 +442080.0 False 3 1 Starołęka 68 +289000.0 True 2 6 Winogrady 48 +289000.0 True 2 6 Winogrady 48 +674695.0 False 3 4 Stare 59 +269000.0 True 2 6 Stare 49 +347010.0 False 2 10 Grunwald 80 +296279.0 True 3 2 Stare 49 +238947.0 True 2 6 Stare 39 +289000.0 True 2 1 Piątkowo 46 +774618.0 False 4 5 Wilda 31 +741099.0 False 4 5 Wilda 22 +460688.0 False 3 4 Wilda 25 +300723.0 False 2 4 Wilda 97 +349610.0 False 2 4 Wilda 59 +564000.0 False 5 0 Biedrusko 90 +618933.0 False 4 4 Wilda 37 +399000.0 False 4 0 Biedrusko 34 +564000.0 False 5 0 Biedrusko 90 +359000.0 False 3 0 Biedrusko 80 +524808.0 False 3 4 Wilda 92 +359000.0 False 4 1 Biedrusko 86 +360000.0 True 3 3 Jeżyce 62 +499000.0 False 2 2 Stare 45 +664443.0 False 3 3 Stare 24 +526049.0 False 2 3 Stare 45 +709116.0 False 3 4 Stare 88 +347182.0 False 4 1 Biedrusko 70 +335925.0 False 4 1 Biedrusko 70 +335925.0 False 4 1 Biedrusko 70 +335925.0 False 4 1 Biedrusko 70 +335925.0 False 4 1 Biedrusko 70 +453929.0 False 3 3 Wilda 26 +387000.0 False 4 1 Biedrusko 86 +309276.0 False 2 3 Wilda 12 +486720.0 False 3 3 Wilda 60 +325440.0 False 3 0 Biedrusko 80 +484068.0 False 3 3 Wilda 6 +306675.0 False 3 0 Biedrusko 20 +663205.0 False 4 3 Wilda 85 +447038.0 False 3 2 Wilda 25 +306675.0 False 3 0 Biedrusko 20 +306675.0 False 3 0 Biedrusko 20 +481522.0 False 3 2 Wilda 82 +306675.0 False 3 0 Biedrusko 20 +356400.0 False 2 2 Wilda 52 +325440.0 False 3 0 Biedrusko 80 +510984.0 False 3 2 Wilda 97 +272000.0 False 3 2 Biedrusko 31 +289000.0 False 3 1 Biedrusko 39 +289000.0 False 3 1 Biedrusko 39 +319000.0 False 3 0 Biedrusko 49 +329000.0 False 3 0 Biedrusko 49 +289000.0 True 2 1 Piątkowo 46 +289000.0 True 2 1 Piatkowo 46 +125000.0 True 5 3 Grunwald 22 +625000.0 True 5 3 Grunwald 105 +643000.0 True 4 0 Naramowice 60 +215000.0 True 2 2 Centrum 39 +399000.0 True 4 0 Centrum 70 +435000.0 True 3 1 Grunwald 10 +289000.0 True 3 4 Naramowice 40 +515000.0 True 3 0 Rataje 71 +310000.0 True 2 4 Jeżyce 55 +348000.0 True 3 9 Rataje 65 +340000.0 True 3 8 Rataje 65 +325248.0 True 3 1 Jeżyce 49 +262875.0 True 2 4 Jeżyce 40 +325248.0 True 3 1 Jeżyce 49 +262874.0 True 2 4 Jeżyce 40 +253498.0 True 2 4 Jeżyce 38 +253193.0 True 2 6 Jeżyce 38 +253193.0 True 2 4 Jeżyce 38 +220000.0 True 2 1 Łazarz 45 +230000.0 True 2 2 Rataje 49 +293848.0 True 3 4 Winogrady 49 +305000.0 True 3 4 Jeżyce 84 +245000.0 True 2 2 Jeżyce 62 +205000.0 True 2 0 Jeżyce 43 +269000.0 True 2 13 Piątkowo 50 +249000.0 True 2 2 Strzeszyn 34 +330000.0 True 3 6 Rataje 80 +200000.0 True 2 0 Wilda 32 +270000.0 True 3 4 Rataje 48 +617360.0 True 3 3 Grunwald 77 +279554.0 True 2 4 Jeżyce 68 +279554.0 True 2 4 Jeżyce 68 +550000.0 True 3 1 Grunwald 73 +355000.0 True 2 8 Ogrody 52 +210000.0 True 2 10 Ogrody 38 +234000.0 True 2 0 Wilda 37 +375000.0 True 3 2 Wilda 90 +345000.0 True 3 6 Winogrady 10 +320000.0 True 3 4 Piątkowo 63 +239000.0 True 2 8 Winogrady 38 +350000.0 True 4 4 Piątkowo 74 +295363.0 True 3 1 Stare 48 +285384.0 True 2 4 Winogrady 48 +392861.0 True 3 3 Winogrady 69 +399000.0 True 2 0 Podolany 63 +518000.0 True 2 4 Centrum 2 +495000.0 True 3 0 Rataje 69 +405000.0 True 3 3 Jeżyce 63 +269000.0 True 2 1 Rataje 50 +481903.0 True 3 2 Stare 62 +269000.0 True 2 4 Grunwald 38 +404000.0 True 3 2 Piątkowo 60 +549000.0 True 3 2 Dąbrowskiego 106 +489000.0 True 3 0 Stare 70 +358000.0 True 4 3 Grunwald 74 +379000.0 True 3 1 Naramowice 20 +269000.0 True 3 11 Grunwald 50 +197000.0 True 2 3 Grunwald 40 +362459.0 False 3 0 Starołęka 80 +353275.0 False 2 14 Grunwald 74 +351475.0 False 3 0 Starołęka 80 +225228.0 False 2 5 Rataje 91 +394000.0 False 4 0 Szczepankowo 77 +287882.0 False 2 1 Starołęka 85 +349000.0 True 3 4 Wilda 75 +255000.0 True 2 3 Rataje 46 +460040.0 True 3 5 Górczyn 20 +321656.0 True 2 1 Winogrady 88 +326000.0 True 2 1 Winiary 39 +285000.0 True 2 3 Naramowice 5 +399000.0 True 4 0 Stary 70 +349000.0 True 3 3 Nowe 87 +585000.0 True 4 1 Stare 100 +510000.0 True 3 2 Stare 68 +409000.0 True 4 3 Centrum 111 +310000.0 True 2 0 Grunwald 60 +308039.0 True 2 0 Winogrady 21 +286858.0 True 2 7 Winogrady 62 +279000.0 True 3 0 Piątkowo 50 +347090.0 False 3 1 Winogrady 90 +241187.0 True 2 7 Stare 39 +350875.0 True 3 1 Rataje 56 +296279.0 True 3 3 Stare 49 +293900.0 True 3 4 Stare 49 +315812.0 True 4 8 Stare 52 +374791.0 True 4 5 Jeżyce 57 +278048.0 True 2 4 Jeżyce 50 +371931.0 True 4 4 Jeżyce 57 +242000.0 True 2 1 Jeżyce 38 +308220.0 False 2 5 Stare 70 +339000.0 True 3 1 Rataje 66 +460499.0 False 3 1 Stare 51 +349668.0 False 2 2 Stare 15 +300680.0 False 2 2 Starołęka 54 +557338.0 False 3 3 Stare 4 +349332.0 True 3 0 Jeżyce 16 +271236.0 True 2 2 Jeżyce 41 +329000.0 True 3 1 Jeżyce 112 +199000.0 True 2 2 Grunwald 38 +475000.0 True 3 1 Naramowice 68 +379000.0 True 5 3 Winogrady 65 +270000.0 True 2 2 Stare 95 +210000.0 True 2 2 Dębiec 40 +379000.0 True 2 3 Winogrady 48 +440000.0 True 2 2 Stare 90 +750000.0 True 5 2 Jeżyce 136 +425000.0 True 4 6 Nowe 85 +539000.0 True 4 1 Centrum 110 +1300000.0 True 2 1 Grunwald 100 +340000.0 True 3 0 Grunwald 98 +360000.0 True 3 4 Jeżyce 50 +259000.0 True 2 0 Grunwald 52 +295000.0 True 2 1 Wilda 51 +487000.0 True 3 0 Naramowice 73 +487000.0 True 3 0 Naramowice 73 +285000.0 True 3 2 Rataje 10 +605000.0 True 3 0 Grunwald 98 +209000.0 True 3 3 Grunwald 49 +242406.0 True 2 0 Jeżyce 36 +380000.0 True 2 2 Wilda 10 +268000.0 True 3 4 Jeżyce 50 +286446.0 True 2 2 Winogrady 49 +392181.0 True 3 4 Winogrady 69 +300987.0 True 3 3 Stare 50 +240876.0 True 2 7 Stare 39 +298980.0 True 2 5 Stare 45 +293700.0 True 2 5 Stare 45 +375960.0 True 4 2 Grunwald 71 +377918.0 True 3 2 Grunwald 71 +292100.0 True 2 1 Grunwald 51 +476118.0 True 3 1 Stare 59 +396248.0 True 2 4 Stare 52 +278046.0 True 2 1 Jeżyce 50 +211191.0 True 2 0 Jeżyce 38 +362458.0 True 3 0 Nowe 68 +288523.0 True 2 0 Nowe 54 +282998.0 True 2 0 Nowe 55 +247705.0 False 2 1 Podolany 74 +637135.0 False 3 7 Grunwald 65 +349000.0 False 4 0 Szczepankowo 29 +285678.0 False 2 1 Winogrady 42 +277823.0 False 2 2 Podolany 70 +424377.0 False 4 2 Starołęka 14 +282944.0 False 2 0 Starołęka 59 +460499.0 False 3 1 Stare 51 +289170.0 False 2 0 Winogrady 90 +339000.0 True 3 9 Nowe 65 +351475.0 False 3 0 Starołęka 80 +349000.0 True 3 3 Nowe 63 +349000.0 False 4 0 Szczepankowo 29 +247831.0 False 2 5 Głuszyna 73 +353275.0 False 2 14 Grunwald 74 +353275.0 False 2 14 Grunwald 74 +349000.0 False 4 0 Szczepankowo 29 +225288.0 False 2 1 Rataje 91 +285678.0 False 2 1 Winogrady 42 +225228.0 False 2 5 Rataje 91 +297421.0 False 2 3 Grunwald 24 +294840.0 False 2 4 Winogrady 50 +300680.0 False 2 2 Starołęka 54 +349668.0 False 2 2 Stare 15 +476780.0 True 2 2 Centrum 90 +239000.0 True 2 10 Rataje 44 +359000.0 True 3 2 Jeżyce 58 +207000.0 True 2 2 Zawady 42 +282995.0 True 2 0 Starołęka 59 +626800.0 True 3 7 Stare 68 +439000.0 True 4 2 Grunwald 92 +569000.0 True 4 0 Wilda 30 +313000.0 True 2 4 Stare 20 +396565.0 True 3 2 Jeżyce 61 +405860.0 True 2 1 Jeżyce 44 +519000.0 True 3 3 Grunwald 104 +265000.0 True 3 1 Winogrady 53 +530000.0 True 4 3 Naramowice 102 +390000.0 True 3 2 Podolany 68 +305000.0 True 2 1 Winiary 48 +215000.0 True 2 2 Łazarz 39 +250000.0 True 2 3 Centrum 33 +489000.0 True 2 4 Nowe 51 +495000.0 True 3 1 Centrum 86 +499000.0 True 3 2 Rataje 64 +339000.0 True 3 9 Rataje 65 +319000.0 True 3 1 Piątkowo 64 +310000.0 True 3 0 Piątkowo 50 +270000.0 True 3 4 Rataje 48 +330000.0 True 4 0 Naramowice 68 +255000.0 True 2 0 Grunwald 48 +333000.0 True 3 7 Rataje 78 +255000.0 True 2 2 Dębiec 48 +225000.0 True 2 3 Nowe 36 +326000.0 True 2 1 Winiary 39 +480000.0 True 3 2 Grunwald 87 +399000.0 True 3 3 Centrum 50 +980000.0 True 6 0 Naramowice 193 +350000.0 True 3 5 Stare 48 +410000.0 True 5 0 Łazarz 114 +279000.0 True 2 1 Podolany 45 +357693.0 True 3 2 Nowe 64 +424379.0 True 4 2 Nowe 74 +533746.0 True 5 2 Nowe 95 +282997.0 True 2 0 Nowe 55 +232049.0 True 2 0 Stare 36 +289800.0 True 2 0 Stare 46 +289170.0 True 2 0 Stare 46 +300988.0 True 3 1 Stare 50 +223752.0 True 2 0 Stare 37 +285680.0 True 2 4 Winogrady 48 +391730.0 True 3 2 Winogrady 69 +318383.0 True 3 3 Jeżyce 48 +266320.0 True 2 5 Jeżyce 41 +242407.0 True 2 0 Jeżyce 36 +245000.0 True 2 2 Winogrady 38 +239000.0 True 2 4 Rataje 38 +258000.0 True 2 1 Wilda 49 +269000.0 True 2 9 Nowe 49 +410000.0 True 2 5 Malta 53 +349000.0 True 3 2 Górczyn 55 +210000.0 True 2 2 Zawady 42 +329000.0 True 3 3 Piątkowo 60 +539000.0 True 3 1 Nowe 70 +335000.0 True 4 4 Rataje 50 +305000.0 True 2 1 Sołacz 48 +239000.0 True 2 3 Winogrady 10 +269000.0 True 2 0 Grunwald 20 +269000.0 True 3 1 Wilda 68 +429000.0 True 3 3 Centrum 102 +219000.0 True 2 2 Rataje 38 +1200000.0 True 4 2 Jeżyce 188 +350000.0 True 3 0 Winogrady 48 +250000.0 True 2 4 Rataje 44 +410000.0 True 2 9 Rataje 51 +485000.0 False 2 4 Łazarz 80 +409240.0 False 2 3 Piątkowo 67 +454960.0 False 2 1 Łazarz 87 +384500.0 False 2 3 Piątkowo 50 +392420.0 False 2 3 Piątkowo 70 +295020.0 False 2 2 Piątkowo 70 +298320.0 False 2 2 Piątkowo 20 +295020.0 False 2 1 Piątkowo 70 +298320.0 False 2 1 Piątkowo 20 +297000.0 False 2 1 Piątkowo 45 +286080.0 False 2 0 Piątkowo 70 +293800.0 False 2 0 Piątkowo 20 +292500.0 False 2 0 Piątkowo 45 +300950.0 False 2 0 Piątkowo 30 +227500.0 False 2 3 Piątkowo 20 +427060.0 False 2 3 Piątkowo 50 +699000.0 True 4 2 Naramowice 92 +409240.0 False 2 3 Piątkowo 67 +287760.0 False 2 2 Piątkowo 60 +278720.0 False 2 2 Piątkowo 60 +287100.0 False 2 2 Piątkowo 50 +240000.0 True 2 0 Grunwald 60 +295020.0 False 2 2 Piątkowo 70 +287760.0 False 2 1 Piątkowo 60 +278720.0 False 2 1 Piątkowo 60 +287100.0 False 2 1 Piątkowo 50 +360000.0 True 2 5 Grunwald 41 +304920.0 False 2 1 Piątkowo 20 +295020.0 False 2 1 Piątkowo 70 +239000.0 True 2 4 Rataje 38 +360000.0 True 3 1 Jeżyce 20 +350000.0 True 4 4 Stare 60 +450000.0 True 2 2 Stare 40 +211190.0 False 2 0 Piątkowo 78 +294840.0 False 2 4 Winogrady 50 +399000.0 False 3 2 Winogrady 98 +299514.0 False 2 1 Starołęka 85 +299000.0 True 2 4 Grunwald 37 +287000.0 True 2 16 Rataje 49 +420000.0 True 4 3 Łazarz 104 +274900.0 True 2 13 Nowe 80 +720000.0 True 4 0 Centrum 163 +339000.0 True 3 1 Rataje 66 +480000.0 True 2 2 Grunwald 10 +283400.0 False 2 0 Piątkowo 60 +282750.0 False 2 0 Piątkowo 50 +300300.0 False 2 0 Piątkowo 20 +286080.0 False 2 0 Piątkowo 70 +210000.0 True 2 2 Zawady 42 +320000.0 True 2 4 Winogrady 57 +410000.0 True 2 5 Rataje 50 +315000.0 True 3 0 Stare 63 +365000.0 True 2 1 Jeżyce 56 +340000.0 True 3 9 Rataje 30 +339000.0 True 3 9 Rataje 65 +325000.0 True 3 7 Rataje 90 +349000.0 True 3 2 Górczyn 55 +375000.0 True 4 2 Centrum 72 +269000.0 True 3 3 Winogrady 48 +495000.0 True 4 3 Naramowice 104 +329000.0 True 3 3 Wilda 82 +385000.0 True 3 0 Łazarz 80 +395000.0 True 2 1 Stare 30 +285000.0 True 2 3 Wilda 43 +325000.0 True 2 3 Centrum 57 +305000.0 True 2 1 Sołacz 48 +339000.0 True 3 0 Rataje 20 +480000.0 True 3 1 Grunwald 40 +630000.0 True 4 0 Stare 84 +275000.0 True 2 2 Plewiska 62 +350000.0 True 2 4 Jeżyce 56 +488000.0 True 3 3 Grunwald 70 +305000.0 True 2 1 Winiary 48 +255000.0 True 2 4 Rataje 70 +285000.0 True 3 0 Wilda 61 +282995.0 True 2 0 Starołęka 59 +263000.0 True 3 4 Grunwald 48 +380931.0 False 3 3 Starołęka 82 +329000.0 True 2 3 Rataje 49 +325000.0 True 3 7 Rataje 90 +350000.0 True 3 0 Starołęka 44 +268000.0 True 2 0 Rataje 43 +253000.0 True 2 4 Grunwald 42 +269000.0 True 2 1 Rataje 50 +325000.0 True 3 7 Rataje 63 +300000.0 True 3 6 Wilda 50 +329000.0 True 3 1 Piątkowo 63 +415000.0 True 2 5 Nowe 53 +270000.0 True 3 4 Rataje 47 +300000.0 True 3 6 Wilda 50 +690000.0 True 5 1 Jeżyce 70 +250000.0 True 2 5 Wilda 12 +344000.0 True 2 2 Wilczak 50 +329000.0 True 3 3 Piątkowo 60 +978009.0 False 4 7 Grunwald 2 +864244.5 False 4 7 Grunwald 71 +329000.0 True 3 1 Piątkowo 63 +255000.0 True 2 2 Dębiec 48 +279999.0 True 2 1 Piątkowo 90 +245000.0 True 2 2 Winogrady 20 +510000.0 True 3 3 Grunwald 79 +380000.0 True 2 1 Centrum 67 +355000.0 False 3 0 Stare 61 +355000.0 False 3 0 Podolany 61 +430000.0 False 4 0 Stare 75 +430000.0 False 4 0 Podolany 75 +475000.0 False 4 0 Stare 72 +475000.0 False 4 0 Podolany 72 +455000.0 False 4 0 Stare 72 +455000.0 False 4 0 Podolany 72 +495000.0 False 4 0 Stare 7 +495000.0 False 4 0 Podolany 7 +652100.0 False 4 3 Stare 79 +476200.0 False 3 1 Stare 59 +476200.0 False 3 1 Chwaliszewo 59 +349700.0 False 2 2 Stare 15 +349700.0 False 2 2 Centrum 15 +340000.0 True 3 0 Stare 80 +555000.0 True 5 3 Piątkowo 125 +255000.0 True 2 2 Dębiec 48 +295000.0 True 3 2 Os 20 +295000.0 True 3 2 Os 20 +210000.0 True 2 0 Wilda 36 +239000.0 True 2 1 Grunwald 60 +269000.0 True 2 1 Stare 70 +460040.0 False 3 5 Grunwald 20 +399000.0 False 5 0 Szczepankowo 68 +372651.0 True 2 1 Stare 5 +349668.0 True 2 2 Stare 15 +282390.0 True 2 3 Stare 64 +597184.0 True 2 4 Stare 61 +320000.0 True 2 1 Grunwald 30 +269000.0 True 2 16 Rataje 49 +359000.0 True 2 1 Jeżyce 40 +285000.0 True 3 0 Dębiec 50 +290000.0 True 2 3 Stare 60 +320000.0 True 3 1 Grunwald 78 +344000.0 True 2 2 Wilczak 50 +395000.0 True 2 1 Stare 30 +299000.0 True 2 0 Dębiec 52 +495000.0 True 4 3 Jeżyce 107 +319000.0 True 2 1 Grunwald 52 +395000.0 True 2 1 Naramowice 30 +319000.0 True 2 1 Grunwald 52 +269000.0 True 2 0 Grunwald 46 +380000.0 True 4 6 Piątkowo 90 +297297.0 False 2 4 Podolany 82 +33760350.0 False 3 4 Podolany 71 +420000.0 True 3 1 Stare 60 +3559725.0 False 3 4 Podolany 85 +3559725.0 False 3 4 Podolany 85 +259000.0 True 2 1 Stare 60 +465000.0 True 3 3 Nowe 71 +282994.0 False 2 0 Starołęka 59 +300680.0 False 2 2 Starołęka 54 +349000.0 False 4 0 Szczepankowo 29 +277823.0 False 2 2 Podolany 70 +424377.0 False 4 2 Starołęka 14 +282944.0 False 2 0 Starołęka 59 +380000.0 True 3 3 Piątkowo 90 +270000.0 True 3 1 Starołęka 30 +365000.0 True 2 2 Grunwald 51 +550000.0 True 3 2 Stare 101 +300000.0 True 2 1 Naramowice 52 +450000.0 True 4 1 Grunwald 113 +490000.0 True 4 0 Naramowice 40 +216500.0 True 2 3 Nowe 30 +244071.0 True 2 1 Nowe 93 +192750.0 True 2 1 Nowe 55 +156562.0 True 2 1 Nowe 54 +350000.0 True 4 4 Piątkowo 76 +329000.0 True 3 3 Piątkowo 60 +298000.0 True 2 4 Wilda 45 +374000.0 True 3 4 Wilczak 30 +460000.0 True 2 2 Centrum 56 +288000.0 True 3 4 Winogrady 30 +400000.0 True 2 1 Świerczewo 60 +220000.0 True 2 4 Grunwald 43 +290000.0 True 2 4 Grunwald 53 +298000.0 True 2 4 Wilda 45 +439000.0 True 2 3 Jeżyce 60 +237000.0 True 2 2 Dębiec 44 +180000.0 True 3 2 Wilda 35 +330000.0 True 2 1 Jeżyce 50 +348000.0 True 3 9 Rataje 65 +439000.0 True 4 2 Grunwald 89 +269000.0 True 2 6 Rataje 70 +360000.0 True 3 3 Stare 63 +1000000.0 True 4 1 Centrum 103 +649400.0 False 3 4 Rataje 50 +311570.0 False 2 4 Rataje 51 +386883.0 False 3 4 Rataje 7 +383928.0 False 3 3 Rataje 46 +294906.0 False 2 3 Rataje 74 +309741.0 False 2 3 Rataje 89 +295734.0 False 2 3 Rataje 86 +384540.0 False 3 3 Rataje 55 +377947.0 False 3 2 Rataje 41 +310707.0 False 2 2 Rataje 3 +296631.0 False 2 2 Rataje 99 +380091.0 False 3 2 Rataje 73 +375672.0 False 3 1 Rataje 92 +293352.0 False 2 1 Rataje 14 +307156.0 False 2 1 Rataje 17 +293352.0 False 2 1 Rataje 14 +535000.0 True 2 3 Łazarz 59 +375606.0 False 3 1 Rataje 91 +293488.0 False 3 0 Rataje 94 +293488.0 False 2 0 Rataje 57 +260000.0 True 2 3 Rataje 38 +307428.0 False 2 0 Rataje 21 +293488.0 False 2 0 Rataje 16 +375408.0 False 3 0 Rataje 88 +325000.0 True 2 0 Rataje 47 +405000.0 True 3 2 Rataje 70 +360000.0 True 3 2 Rataje 20 +275000.0 True 2 13 Rataje 49 +410000.0 True 2 5 Rataje 30 +243828.0 False 2 4 Podolany 68 +398853.0 False 3 3 Podolany 18 +421258.0 False 4 3 Podolany 1 +348835.0 False 3 3 Podolany 63 +273546.0 False 2 3 Podolany 76 +256171.0 False 2 3 Podolany 79 +298116.0 False 2 3 Podolany 96 +306247.0 False 2 3 Podolany 35 +337602.0 False 3 3 Podolany 71 +357084.0 False 3 3 Podolany 4 +244647.0 False 2 3 Podolany 82 +641000.0 True 3 3 Łazarz 75 +277000.0 True 2 10 Nowe 80 +450000.0 True 2 2 Grunwald 70 +242000.0 True 2 1 Grunwald 52 +310000.0 True 3 4 Jeżyce 50 +475000.0 True 3 4 Wilda 66 +475000.0 True 3 4 Wilda 66 +120000.0 True 3 3 Grunwald 35 +120000.0 True 3 3 Grunwald 35 +1850000.0 True 5 1 Grunwald 196 +350000.0 True 4 4 Grunwald 50 +280000.0 True 4 4 Grunwald 40 +490000.0 True 4 4 Grunwald 70 +495000.0 True 3 1 Naramowice 70 +545000.0 True 3 0 Rataje 71 +310000.0 True 3 10 Rataje 80 +209000.0 True 2 0 Wilda 36 +295000.0 True 2 4 Garbary 33 +200000.0 True 2 8 Dębiec 50 +359900.0 True 4 4 Rataje 74 +320000.0 True 3 3 Jeżyce 70 +300000.0 True 2 1 Naramowice 23 +535000.0 True 4 2 Wilda 120 +620000.0 True 3 2 Naramowice 60 +495000.0 True 4 1 Naramowice 10 +240000.0 True 2 10 Rataje 36 +597000.0 True 3 0 Naramowice 60 +260000.0 True 2 0 Rataje 40 +399000.0 True 3 0 Winogrady 62 +275000.0 True 3 7 Wilda 20 +350000.0 True 2 2 Piątkowo 50 +429000.0 True 3 0 Grunwald 75 +380000.0 True 3 8 Rataje 80 +295000.0 True 2 1 Rataje 30 +339000.0 True 3 1 Rataje 88 +382000.0 True 3 3 Centrum 30 +299000.0 True 2 2 Sołacz 58 +499000.0 True 3 1 Grunwald 64 +549000.0 True 3 2 Jeżyce 106 +239000.0 True 2 1 Grunwald 36 +295000.0 True 3 2 Grunwald 49 +470000.0 True 4 2 Sołacz 87 +413000.0 True 3 3 Łazarz 46 +259000.0 True 2 1 Jeżyce 47 +348000.0 True 3 9 Nowe 65 +259000.0 True 2 0 Ławica 60 +269000.0 True 2 9 Rataje 49 +224000.0 True 2 0 Łazarz 50 +260000.0 True 3 4 Grunwald 49 +315000.0 True 3 0 Piątkowo 60 +379999.0 True 3 3 Wilda 67 +350000.0 True 2 1 Rataje 63 +270000.0 True 2 4 Grunwald 38 +250000.0 True 3 3 Rataje 53 +439000.0 True 4 2 Łazarz 92 +499000.0 True 3 1 Rataje 50 +290000.0 True 2 2 Dębiec 66 +320000.0 True 2 4 Łazarz 80 +379000.0 True 3 0 Wilda 67 +399000.0 True 3 2 Dębiec 91 +220000.0 True 2 4 Grunwald 43 +268000.0 True 3 4 Jeżyce 50 +399000.0 True 3 1 Bonin 68 +329000.0 True 3 4 Rataje 63 +353457.0 False 2 3 Stare 16 +347900.0 True 3 3 Nowe 10 +237000.0 True 2 2 Dębiec 44 +399000.0 True 3 1 Sołacz 66 +488000.0 True 3 3 Grunwald 70 +220000.0 True 2 4 Grunwald 43 +390000.0 True 3 2 Podolany 68 +299000.0 True 2 0 Wilda 52 +320000.0 True 3 4 Winogrady 50 +370000.0 True 4 4 Piątkowo 73 +339000.0 True 3 9 Rataje 65 +348000.0 True 3 9 Rataje 65 +420000.0 False 4 0 Grunwald 82 +495000.0 True 4 1 Stare 98 +329000.0 True 2 1 Stare 54 +699000.0 True 3 2 Stare 92 +487000.0 True 3 0 Stare 73 +375000.0 True 3 0 Naramowice 69 +270000.0 True 3 4 Rataje 48 +230000.0 True 2 1 Dębiec 38 +498000.0 True 4 4 Centrum 85 +390000.0 True 3 2 Podolany 68 +330000.0 True 4 2 Rataje 62 +299000.0 True 3 6 Jeżyce 70 +270000.0 True 3 4 Rataje 48 +390000.0 True 3 2 Podolany 68 +269000.0 True 2 2 Sołacz 49 +270000.0 True 3 4 Rataje 48 +232034.0 True 2 1 Starołęka 86 +265000.0 True 2 4 Winiary 10 +475000.0 True 2 4 Centrum 54 +585000.0 True 4 1 Piątkowo 100 +260000.0 True 2 0 Naramowice 46 +350000.0 True 4 4 Stare 76 +430000.0 True 2 5 Wilda 57 +366770.0 True 3 1 Winogrady 10 +285200.0 True 2 1 Winogrady 46 +319055.0 True 3 3 Grunwald 21 +307881.0 True 3 0 Grunwald 16 +267702.0 True 2 2 Grunwald 22 +239592.0 True 2 5 Grunwald 59 +375529.0 False 2 3 Stare 71 +247705.0 False 2 1 Podolany 74 +247705.0 False 2 1 Piątkowo 74 +411684.0 False 3 3 Winogrady 17 +349000.0 False 4 0 Szczepankowo 29 +277823.0 False 2 2 Podolany 70 +424377.0 False 4 2 Starołęka 14 +282944.0 False 2 0 Starołęka 59 +270000.0 True 3 0 Grunwald 48 +350000.0 True 4 1 Wilda 80 +340000.0 True 4 4 Winogrady 90 +599000.0 True 4 4 Centrum 109 +369000.0 True 3 0 Wilda 30 +549000.0 True 3 3 Grunwald 60 +345865.0 True 3 2 Jeżyce 21 +261000.0 True 2 2 Jeżyce 57 +410000.0 True 3 2 Jeżyce 74 +339000.0 True 2 2 Centrum 53 +399000.0 True 3 1 Grunwald 65 +410000.0 True 2 2 Jeżyce 74 +295000.0 True 2 2 Raszyn 50 +240000.0 True 2 16 Rataje 36 +250000.0 True 2 4 Rataje 23 +245000.0 True 2 4 Rataje 44 +269000.0 True 2 9 Rataje 49 +240000.0 True 2 2 Dębiec 48 +262000.0 True 2 4 Grunwald 60 +349000.0 True 3 1 Grunwald 57 +365000.0 True 3 1 Rataje 67 +409000.0 True 3 1 Malta 90 +298000.0 True 2 1 Łazarz 55 +599000.0 True 3 3 Grunwald 83 +289000.0 True 2 2 Jeżyce 42 +390000.0 True 3 3 Naramowice 48 +270000.0 True 2 2 Bonin 49 +250000.0 True 2 0 Naramowice 40 +350000.0 True 3 1 Naramowice 51 +270000.0 True 2 2 Sołacz 49 +260000.0 True 2 0 Rataje 46 +339000.0 True 3 9 Rataje 65 +348000.0 True 3 9 Rataje 65 +329000.0 True 3 2 Rataje 59 +230000.0 True 2 1 Dębiec 37 +238000.0 True 2 2 Grunwald 37 +392000.0 True 4 0 Piątkowo 74 +200000.0 True 2 0 Rataje 30 +370000.0 True 4 2 Piątkowo 74 +347000.0 True 3 1 Naramowice 47 +432000.0 True 2 5 Centrum 40 +435000.0 True 3 1 Piątkowo 84 +389000.0 True 2 1 Podolany 46 +799999.0 True 3 1 Sołacz 90 +248000.0 True 3 0 Jeżyce 74 +266000.0 True 2 2 Piątkowo 49 +316498.0 True 2 2 Stare 77 +519000.0 True 3 1 Rataje 50 +442150.0 True 2 2 Stare 75 +395000.0 True 3 2 Centrum 74 +599000.0 True 2 1 Centrum 70 +550.0 True 5 3 Naramowice 15 +499000.0 True 3 0 Grunwald 10 +499000.0 True 3 0 Grunwald 10 +459000.0 True 2 1 Centrum 48 +365000.0 True 3 2 Jeżyce 50 +375000.0 True 3 2 Jeżyce 50 +450000.0 True 3 11 Jeżyce 50 +289000.0 True 2 4 Ogrody 41 +230000.0 True 2 5 Winogrady 60 +440000.0 True 2 4 Centrum 55 +599000.0 True 3 2 Centrum 80 +343200.0 True 3 4 Winogrady 52 +435000.0 True 3 5 Wilda 70 +385000.0 True 2 1 Centrum 60 +300000.0 True 3 3 Centrum 88 +550000.0 True 3 1 Junikowo 84 +529000.0 True 4 4 Centrum 85 +460000.0 True 4 2 Bonin 87 +335000.0 True 3 3 Wilda 82 +405000.0 True 4 2 Nowe 71 +379000.0 True 3 0 Wilda 67 +379000.0 True 3 3 Winiary 55 +360000.0 True 3 4 Rataje 69 +495000.0 True 4 1 Grunwald 64 +285000.0 True 2 3 Wilda 60 +379999.0 True 3 3 Wilda 67 +370000.0 True 2 13 Rataje 67 +700000.0 True 4 1 Górczyn 160 +479000.0 True 3 3 Górczyn 70 +385000.0 True 3 0 Łazarz 80 +550000.0 True 4 1 Łazarz 50 +260000.0 True 3 4 Grunwald 47 +755000.0 True 4 2 Łazarz 90 +319000.0 True 2 0 Górczyn 54 +485000.0 True 2 2 Centrum 55 +485000.0 True 2 2 Centrum 55 +576500.0 True 2 5 Centrum 50 +576500.0 True 2 5 Chwaliszewo 50 +339000.0 True 2 5 Górczyn 41 +438503.0 True 3 2 Centrum 57 +419000.0 True 2 0 Rataje 55 +354454.0 False 2 3 Grunwald 17 +363258.0 False 2 1 Górczyn 59 +489780.0 False 4 2 Górczyn 63 +491520.0 False 4 1 Górczyn 92 +273875.5 False 2 1 Grunwald 13 +267000.0 True 2 2 Dębiec 35 +260000.0 True 2 2 Piątkowo 90 +587000.0 True 4 3 Łazarz 38 +460000.0 True 3 1 Naramowice 110 +695000.0 True 4 1 Rataje 70 +506657.0 True 4 11 Grunwald 73 +338325.0 True 2 13 Grunwald 5 +249641.0 True 2 0 Ogrody 54 +298250.0 True 2 5 Grunwald 38 +297421.0 True 2 2 Grunwald 24 +275000.0 True 2 9 Nowe 38 +249641.0 True 2 0 Jeżyce 54 +344141.0 True 2 8 Winogrady 47 +318384.0 True 3 6 Jeżyce 24 +269984.0 True 3 4 Winogrady 76 +447000.0 True 3 4 Grunwald 20 +450000.0 True 3 2 Strzeszyn 70 +690000.0 True 4 5 Górczyn 25 +334000.0 True 2 4 Sołacz 50 +289476.0 False 2 3 Jeżyce 84 +533745.0 False 5 2 Starołęka 4 +333694.0 False 3 1 Podolany 32 +333694.0 False 3 1 Piątkowo 38 +310000.0 True 2 2 Centrum 74 +310000.0 True 2 1 Grunwald 52 +250000.0 True 2 2 Łazarz 36 +265000.0 True 2 4 Jeżyce 43 +558745.0 False 3 3 Stare 62 +298000.0 True 2 5 Centrum 50 +347090.0 False 3 1 Winogrady 90 +362459.0 False 3 0 Starołęka 80 +754000.0 True 7 1 Stare 116 +247705.0 False 2 1 Podolany 74 +313000.0 True 2 4 Piątkowo 49 +339000.0 True 3 8 Nowe 78 +207000.0 True 2 2 Wilda 33 +295000.0 True 2 4 Grunwald 50 +330000.0 True 3 0 Jeżyce 78 +324500.0 True 2 5 Wilda 65 +429000.0 True 3 4 Wilda 47 +275000.0 True 2 9 Rataje 38 +365000.0 True 4 1 Nowe 54 +259000.0 True 2 6 Winogrady 38 +369000.0 True 2 3 Piątkowo 60 +414225.0 True 3 3 Centrum 23 +269000.0 True 3 3 Winogrady 48 +320000.0 True 2 3 Rataje 20 +288465.0 True 2 1 Starołęka 77 +321845.0 False 3 1 Grunwald 55 +389000.0 True 3 4 Piątkowo 16 +289000.0 True 2 7 Winiary 80 +249000.0 True 2 0 Komorniki 53 +391729.0 True 3 2 Winogrady 21 +285383.0 True 2 1 Winogrady 37 +228144.0 True 3 2 Nowe 56 +204450.0 True 2 1 Nowe 33 +496573.0 False 3 2 Stare 78 +286000.0 True 2 5 Centrum 49 +269000.0 True 2 1 Ogrody 50 +114642.0 True 2 0 Łazarz 46 +286000.0 True 2 5 Centrum 49 +390000.0 True 2 0 Świerczewo 60 +320000.0 True 4 1 Jeżyce 40 +706655.0 False 3 2 Nowe 45 +754000.0 False 5 0 Morasko 42 +259000.0 True 3 4 Winogrady 60 +289000.0 True 2 7 Winogrady 80 +350000.0 True 3 0 Rataje 63 +260000.0 True 2 1 Łazarz 54 +319990.0 True 2 3 Jeżyce 70 +228144.0 False 3 2 Głuszyna 56 +156085.0 False 2 2 Głuszyna 45 +350000.0 True 4 4 Stare 60 +394000.0 False 4 0 Szczepankowo 77 +287882.0 False 2 1 Starołęka 85 +445000.0 True 4 3 Piątkowo 65 +229000.0 True 2 1 Grunwald 16 +220000.0 True 2 3 Jeżyce 37 +285000.0 True 3 2 Antoninek 61 +550000.0 True 3 1 Jeżyce 73 +504326.0 True 4 4 Stare 26 +371930.0 True 4 2 Jeżyce 57 +255000.0 True 3 2 Grunwald 20 +279000.0 True 2 3 Piątkowo 30 +325000.0 True 2 0 Nowe 80 +604395.0 True 5 1 Wilda 31 +558000.0 True 5 1 Wilda 2 +1007500.0 False 4 1 Starołęka 94 +1203616.0 False 5 0 Starołęka 71 +298980.0 False 2 5 Winogrady 30 +263140.0 False 2 0 Naramowice 5 +281988.0 False 2 7 Naramowice 76 +349000.0 False 4 0 Szczepankowo 29 +277823.0 False 2 2 Podolany 70 +424377.0 False 4 2 Starołęka 14 +282944.0 False 2 0 Starołęka 59 +282944.0 False 2 0 Starołęka 59 +349668.0 False 2 2 Stare 15 +321904.0 False 2 4 Winogrady 92 +367000.0 True 3 1 Centrum 30 +350000.0 True 3 1 Nowe 63 +350000.0 True 2 1 Rataje 63 +399000.0 True 3 5 Grunwald 98 +429000.0 True 3 3 Centrum 102 +451000.0 True 3 2 Wilda 30 +565000.0 True 4 0 Sołacz 90 +285000.0 True 3 2 Antoninek 61 +350000.0 True 2 1 Rataje 54 +299000.0 True 2 5 Centrum 50 +269000.0 True 2 9 Rataje 49 +249000.0 True 2 2 Grunwald 46 +285000.0 True 3 2 Antoninek 10 +250000.0 True 2 4 Wilda 54 +269000.0 True 3 1 Wilda 68 +350000.0 True 4 4 Piątkowo 76 +360000.0 True 3 1 Grunwald 49 +260000.0 True 2 0 Rataje 46 +350000.0 True 2 4 Jeżyce 56 +263000.0 True 2 1 Rataje 44 +285000.0 True 2 2 Centrum 52 +285000.0 True 2 2 Łazarz 52 +429000.0 True 4 2 Grunwald 92 +211190.0 False 2 0 Podolany 78 +219000.0 True 2 3 Wilda 40 +820000.0 True 4 1 Grunwald 133 +299000.0 True 2 1 Centrum 11 +288000.0 True 2 4 Naramowice 44 +820000.0 True 4 1 Grunwald 133 +470000.0 True 4 2 Sołacz 87 +364000.0 True 3 4 Nowe 90 +706655.0 False 3 2 Nowe 45 +425000.0 True 3 1 Rataje 70 +248000.0 True 2 2 Winogrady 80 +260000.0 True 3 10 Śródka 48 +289000.0 True 2 0 Grunwald 80 +389000.0 True 3 4 Nowe 84 +253000.0 True 2 0 Łazarz 10 +449000.0 False 5 0 Szczepankowo 68 +225288.0 False 2 1 Rataje 91 +389528.0 False 2 2 Stare 87 +481903.0 False 3 2 Stare 53 +349000.0 False 4 0 Szczepankowo 29 +534523.0 False 3 2 Stare 62 +465538.0 False 3 1 Stare 78 +263000.0 True 2 0 Wilda 75 +370000.0 True 4 4 Piątkowo 76 +305000.0 True 3 3 Winogrady 60 +180000.0 True 3 2 Wilda 35 +189000.0 True 2 4 Wilda 35 +357692.0 False 3 2 Starołęka 31 +282994.0 False 2 0 Starołęka 59 +211190.0 False 2 0 Piątkowo 78 +349000.0 False 4 0 Szczepankowo 29 +277823.0 False 2 2 Podolany 70 +424377.0 False 4 2 Starołęka 14 +282944.0 False 2 0 Starołęka 59 +282944.0 False 2 0 Starołęka 59 +245000.0 True 2 7 Rataje 44 +570000.0 True 4 0 Jeżyce 90 +720000.0 True 4 7 Jeżyce 90 +237000.0 True 2 2 Dębiec 44 +329000.0 True 3 3 Piątkowo 60 +270000.0 True 3 3 Stare 47 +487000.0 True 3 0 Naramowice 83 +271000.0 True 2 3 Stare 37 +372000.0 False 4 1 Grunwald 87 +487000.0 True 3 0 Stare 11 +326000.0 True 2 1 Sołacz 39 +270000.0 True 2 10 Śródka 48 +349000.0 True 3 3 Rataje 63 +285000.0 True 2 2 Grunwald 52 +262500.0 True 4 0 Wilda 75 +350000.0 True 2 1 Rataje 80 +199000.0 True 2 3 Grunwald 35 +349000.0 False 4 0 Szczepankowo 29 +250000.0 True 2 3 Wilda 10 +234000.0 True 2 7 Wilda 46 +210000.0 True 2 1 Wilda 65 +249000.0 True 2 10 Grunwald 43 +469000.0 True 2 1 Winogrady 30 +235000.0 True 2 0 Nowe 10 +265000.0 True 2 0 Centrum 40 +329000.0 True 3 13 Rataje 65 +265000.0 True 2 2 Piątkowo 70 +350000.0 True 3 0 Stare 10 +307000.0 True 2 4 Stare 49 +315000.0 True 3 0 Stare 63 +350000.0 True 3 0 Rataje 63 +690000.0 True 2 1 Stare 20 +423000.0 True 2 2 Wilda 49 +250000.0 True 2 6 Grunwald 31 +292000.0 True 3 2 Winogrady 47 +249000.0 True 2 10 Grunwald 42 +350000.0 True 2 3 Rataje 52 +780000.0 True 3 0 Grunwald 87 +1000000.0 True 15 5 Wilda 50 +535000.0 True 2 2 Centrum 55 +285200.0 True 2 0 Stare 46 +434201.0 True 4 1 Nowe 54 +344152.0 True 3 0 Nowe 80 +396000.0 True 3 1 Wilda 50 +240000.0 True 2 16 Rataje 36 +390000.0 True 3 4 Piątkowo 74 +288000.0 True 2 4 Naramowice 22 +518000.0 True 4 0 Wilda 41 +320000.0 True 4 3 Stare 40 +449000.0 True 5 3 Wilda 97 +249000.0 True 2 10 Grunwald 42 +289000.0 True 3 4 Winogrady 48 +289000.0 True 2 7 Jeżyce 80 +330715.0 True 2 2 Wilda 13 +97000.0 True 2 4 Wilda 80 +285000.0 True 2 2 Łazarz 20 +389000.0 True 3 4 Piątkowo 69 +249000.0 True 2 4 Rataje 44 +409000.0 True 3 1 Rataje 62 +240000.0 True 2 2 Dębiec 48 +289000.0 True 3 4 Stare 47 +270000.0 True 3 10 Grunwald 52 +389000.0 True 3 4 Piątkowo 69 +179000.0 True 2 0 Grunwald 34 +364000.0 False 3 6 Grunwald 64 +410000.0 True 2 4 Jeżyce 43 +590000.0 True 3 3 Jeżyce 30 +325000.0 True 3 2 Jeżyce 64 +398000.0 True 3 3 Łazarz 96 +255000.0 True 2 2 Wilda 72 +329000.0 True 2 1 Naramowice 40 +290000.0 True 2 6 Winiary 49 +319875.0 False 2 8 Grunwald 18 +356251.9 False 3 13 Grunwald 20 +319875.0 False 2 7 Grunwald 18 +350557.33 False 2 13 Grunwald 58 +338325.0 False 2 13 Grunwald 5 +329763.26 False 2 9 Grunwald 94 +324400.97 False 2 7 Grunwald 94 +388352.0 False 3 7 Grunwald 60 +347633.0 False 3 10 Grunwald 20 +409713.0 False 3 11 Grunwald 62 +330368.0 False 2 12 Grunwald 62 +347839.75 False 2 12 Grunwald 58 +347193.22 False 3 11 Grunwald 7 +350506.16 False 3 11 Grunwald 20 +342405.13 False 2 11 Grunwald 58 +319875.0 False 2 9 Grunwald 18 +341703.96 False 3 8 Grunwald 21 +336969.98 False 2 10 Grunwald 58 +413044.0 False 3 12 Grunwald 62 +341703.96 False 3 9 Grunwald 21 +325206.0 False 2 10 Grunwald 62 +338111.0 False 2 15 Grunwald 62 +424977.14 False 4 5 Grunwald 20 +327787.0 False 2 11 Grunwald 62 +353378.74 False 3 12 Grunwald 20 +332949.0 False 2 13 Grunwald 62 +383760.0 False 3 6 Grunwald 60 +335530.0 False 2 14 Grunwald 62 +387040.0 False 3 5 Grunwald 60 +302985.6 False 2 4 Grunwald 18 +421375.5 False 4 4 Grunwald 20 +410780.0 False 3 3 Grunwald 44 +417773.83 False 4 3 Grunwald 20 +303286.5 False 2 3 Grunwald 13 +302038.4 False 2 3 Grunwald 2 +319055.27 False 3 3 Grunwald 21 +414352.0 False 3 4 Grunwald 44 +417807.03 False 4 4 Grunwald 7 +414172.54 False 4 2 Grunwald 20 +352390.0 False 2 12 Grunwald 80 +377200.0 False 3 3 Grunwald 60 +314089.0 False 2 5 Grunwald 49 +339072.0 False 2 9 Grunwald 98 +321812.5 False 2 8 Grunwald 49 +500203.02 False 4 10 Grunwald 73 +355080.0 False 2 13 Grunwald 80 +325184.0 False 2 11 Grunwald 81 +297420.8 False 2 3 Grunwald 24 +506566.5 False 4 11 Grunwald 73 +335722.5 False 2 12 Grunwald 5 +349700.0 False 2 11 Grunwald 80 +330517.5 False 2 10 Grunwald 5 +495722.51 False 4 9 Grunwald 99 +426416.8 False 4 6 Grunwald 20 +327081.85 False 2 8 Grunwald 94 +307080.0 False 2 5 Grunwald 18 +305793.0 False 2 4 Grunwald 13 +380480.0 False 3 4 Grunwald 60 +312198.0 False 2 6 Grunwald 18 +410665.2 False 4 2 Grunwald 7 +333231.99 False 3 7 Grunwald 21 +514939.5 False 4 13 Grunwald 73 +317880.0 False 2 2 Grunwald 98 +510753.0 False 4 12 Grunwald 73 +333120.0 False 2 11 Grunwald 5 +324387.0 False 2 9 Grunwald 49 +311514.5 False 2 4 Grunwald 49 +495722.51 False 4 8 Grunwald 99 +331125.0 False 2 5 Grunwald 98 +495782.26 False 4 7 Grunwald 99 +328476.0 False 2 4 Grunwald 98 +316848.0 False 2 6 Grunwald 52 +442803.77 False 4 5 Grunwald 7 +315819.0 False 2 5 Grunwald 13 +293436.18 False 2 1 Grunwald 15 +435784.0 False 3 5 Grunwald 44 +414235.76 False 4 3 Grunwald 7 +407208.0 False 3 2 Grunwald 44 +579000.0 True 4 3 Naramowice 97 +410000.0 True 2 5 Rataje 53 +199000.0 True 2 4 Grunwald 20 +375000.0 True 2 3 Grunwald 51 +350000.0 True 3 0 Naramowice 59 +289000.0 True 3 4 Winogrady 47 +240000.0 True 2 16 Rataje 36 +350000.0 True 3 1 Naramowice 51 +238000.0 True 3 2 Warszawskie 48 +277823.0 False 2 2 Podolany 70 +372000.0 True 4 1 Nadolnik 125 +410000.0 True 2 5 Rataje 53 +249000.0 True 2 4 Rataje 44 +420000.0 True 2 1 Naramowice 50 +420000.0 True 2 3 Naramowice 50 +339000.0 True 2 2 Stare 53 +298000.0 True 3 1 Nowe 30 +250000.0 True 3 0 Stare 45 +475000.0 True 4 4 Naramowice 50 +329000.0 True 3 1 Jeżyce 112 +439000.0 True 3 3 Grunwald 10 +250000.0 True 2 6 Winogrady 42 +259000.0 True 3 1 Grunwald 48 +375000.0 True 2 7 Piątkowo 90 +295000.0 True 2 7 Stare 10 +370000.0 True 4 4 Piątkowo 60 +325000.0 True 3 3 Łazarz 62 +375000.0 True 3 1 Nowe 63 +390000.0 True 4 4 Piątkowo 74 +288000.0 True 3 4 Stare 30 +468000.0 True 2 3 Grunwald 60 +250000.0 True 2 6 Winogrady 42 +350000.0 True 2 2 Jeżyce 46 +292000.0 True 3 2 Winogrady 30 +310000.0 True 2 1 Nowe 40 +289000.0 True 3 4 Winogrady 47 +405900.0 True 3 2 Stare 82 +149000.0 True 3 5 Nowe 56 +326000.0 True 2 1 Sołacz 39 +350000.0 True 2 2 Jeżyce 47 +224343.0 False 2 4 Starołęka 35 +362220.0 False 3 3 Starołęka 60 +287394.0 False 2 2 Starołęka 50 +320739.0 False 3 1 Starołęka 56 +177000.0 True 2 2 Dębiec 25 +313000.0 True 2 1 Górczyn 48 +313000.0 True 2 1 Dębiec 48 +429000.0 True 3 4 Rataje 79 +643720.0 True 4 0 Stare 60 +325000.0 True 2 3 Stare 60 +319000.0 True 2 0 Grunwald 20 +364000.0 True 3 1 Nowe 67 +285000.0 True 2 2 Łazarz 52 +339000.0 True 2 2 Centrum 53 +279000.0 True 2 0 Naramowice 43 +350000.0 True 2 4 Jeżyce 53 +419000.0 True 3 1 Piątkowo 74 +195000.0 True 2 3 Zawady 35 +390000.0 True 2 0 Centrum 60 +177000.0 True 2 2 Dębiec 70 +279000.0 True 2 1 Stare 60 +489000.0 True 4 2 Wilda 120 +299000.0 True 2 1 Jeżyce 32 +205000.0 True 2 4 Wilda 27 +362000.0 True 2 1 Centrum 50 +285000.0 True 2 2 Łazarz 52 +998000.0 True 6 2 Stare 161 +259000.0 True 3 2 Grunwald 45 +439000.0 True 2 3 Rataje 53 +550000.0 True 4 1 Górczyn 90 +310000.0 True 3 10 Nowe 40 +355000.0 True 3 2 Stare 64 +252000.0 True 2 9 Grunwald 50 +659000.0 True 3 2 Nowe 60 +307000.0 True 2 4 Piątkowo 49 +347900.0 True 3 3 Nowe 10 +229000.0 True 2 3 Stare 56 +569000.0 True 4 0 Wilda 50 +136000.0 True 2 1 Nowe 43 +102500.0 True 2 3 Nowe 80 +485000.0 True 4 2 Grunwald 89 +360000.0 True 3 3 Nowe 63 +339000.0 True 3 3 Stare 90 +285000.0 True 2 0 Łazarz 49 +299000.0 True 2 1 Centrum 52 +429999.0 True 3 3 Centrum 20 +429999.0 True 3 3 Centrum 20 +395000.0 True 3 3 Wilda 75 +307000.0 True 2 4 Piątkowo 49 +326000.0 True 2 4 Łazarz 80 +382280.0 True 3 3 Centrum 50 +233239.0 False 2 2 Podolany 87 +400608.0 False 3 2 Podolany 48 +422604.0 False 4 2 Podolany 24 +350064.0 False 3 2 Podolany 84 +349420.0 False 3 2 Podolany 73 +275008.0 False 2 2 Podolany 1 +255762.0 False 2 2 Podolany 72 +257400.0 False 2 2 Podolany 44 +307710.0 False 2 2 Podolany 60 +338188.0 False 3 2 Podolany 81 +258336.0 False 2 2 Podolany 16 +370948.0 False 4 2 Podolany 41 +358605.0 False 3 2 Podolany 30 +245934.0 False 2 2 Podolany 4 +233941.0 False 2 1 Podolany 99 +401544.0 False 3 1 Podolany 64 +424008.0 False 4 1 Podolany 48 +350181.0 False 3 1 Podolany 86 +349537.0 False 3 1 Podolany 75 +275710.0 False 2 1 Podolany 13 +256756.0 False 2 1 Podolany 89 +258102.0 False 2 1 Podolany 12 +255000.0 True 2 3 Jeżyce 38 +300222.0 False 2 1 Podolany 22 +308412.0 False 2 1 Podolany 72 +338305.0 False 3 1 Podolany 83 +259038.0 False 2 1 Podolany 28 +371884.0 False 4 1 Podolany 57 +359541.0 False 3 1 Podolany 46 +234636.0 False 2 1 Podolany 16 +234234.0 False 2 0 Podolany 4 +401719.0 False 3 0 Podolany 67 +423715.0 False 4 0 Podolany 43 +350181.0 False 3 0 Podolany 86 +249537.0 False 3 0 Podolany 75 +276061.0 False 2 0 Podolany 19 +257341.0 False 2 0 Podolany 99 +258453.0 False 2 0 Podolany 18 +220837.0 False 2 0 Podolany 75 +419000.0 True 2 7 Grunwald 20 +419000.0 True 3 4 Wilda 60 +379000.0 True 2 3 Winogrady 48 +315000.0 True 3 0 Piątkowo 60 +339000.0 True 3 1 Rataje 67 +270000.0 True 2 4 Grunwald 38 +268000.0 True 2 5 Rataje 42 +1500000.0 True 3 5 Centrum 68 +264000.0 True 3 4 Nowe 53 +432000.0 True 4 1 Grunwald 72 +449900.0 True 3 2 Stare 81 +295000.0 True 2 1 Nowe 39 +290000.0 True 2 6 Sołacz 49 +307000.0 True 2 4 Piątkowo 49 +285000.0 True 2 3 Piątkowo 49 +285000.0 True 2 3 Wilda 60 +519000.0 True 3 1 Rataje 50 +264000.0 True 3 4 Rataje 53 +318000.0 True 2 4 Piątkowo 49 +325000.0 True 3 3 Sołacz 40 +377685.0 False 2 4 Podolany 4 +377685.0 False 3 4 Podolany 67 +423715.0 False 4 0 Podolany 43 +350181.0 False 3 0 Podolany 86 +349537.0 False 3 0 Podolany 75 +276061.0 False 2 0 Podolany 19 +242990.0 False 2 0 Podolany 18 +283645.0 False 2 0 Podolany 39 +308763.0 False 2 0 Podolany 78 +338305.0 False 3 0 Podolany 83 +480000.0 True 2 2 Centrum 56 +499000.0 True 2 2 Nowe 36 +299000.0 True 2 16 Rataje 49 +355000.0 True 3 2 Stare 64 +210000.0 True 2 0 Grunwald 52 +277098.0 True 2 0 Nowe 59 +410000.0 True 3 1 Górczyn 82 +399000.0 True 3 2 Górczyn 91 +390000.0 True 3 1 Łazarz 75 +370000.0 True 2 0 Górczyn 65 +239000.0 True 2 3 Piątkowo 59 +185000.0 True 2 8 Wilda 38 +432000.0 True 3 0 Wilda 72 +360000.0 True 3 4 Rataje 69 +259330.0 False 2 0 Podolany 33 +372996.0 False 4 0 Podolany 76 +360000.0 True 3 2 Rataje 69 +370000.0 True 4 4 Piątkowo 76 +338579.0 False 3 0 Podolany 56 +231550.0 False 2 0 Podolany 10 +325000.0 True 2 1 Jeżyce 56 +355000.0 True 2 4 Jeżyce 56 +275000.0 True 2 1 Sołacz 50 +355000.0 True 3 2 Piątkowo 66 +224000.0 True 2 0 Górczyn 50 +499000.0 True 3 1 Grunwald 65 +1300000.0 True 2 3 Wilda 90 +399000.0 True 2 4 Grunwald 49 +349999.0 True 4 4 Stare 60 +390000.0 True 3 3 Stare 48 +325000.0 True 3 4 Jeżyce 30 +360000.0 True 3 2 Rataje 69 +389000.0 True 3 4 Stare 74 +450000.0 True 3 2 Naramowice 66 +660000.0 True 4 2 Winogrady 110 +313000.0 True 2 4 Jeżyce 50 +289000.0 True 2 6 Jeżyce 86 +279000.0 True 3 3 Rataje 54 +282000.0 True 2 1 Jeżyce 38 +282000.0 True 2 1 Strzeszyn 38 +225000.0 True 2 2 Grunwald 38 +339000.0 True 3 0 Jeżyce 24 +519000.0 True 3 1 Nowe 64 +189000.0 True 2 2 Grunwald 35 +275000.0 True 3 2 Grunwald 60 +1550000.0 True 6 1 Grunwald 170 +290000.0 True 2 6 Jeżyce 49 +185000.0 True 2 8 Dębiec 80 +270000.0 True 2 4 Grunwald 38 +349000.0 True 3 0 Grunwald 60 +349000.0 True 3 0 Grunwald 60 +360000.0 True 3 2 Nowe 69 +575000.0 True 4 4 Jeżyce 94 +360000.0 True 2 1 Centrum 50 +327000.0 True 4 3 Dębiec 75 +499000.0 True 2 2 Stare 43 +379000.0 True 3 0 Rataje 56 +379000.0 True 3 3 Jeżyce 55 +359000.0 True 2 3 Rataje 48 +205000.0 True 2 2 Starołęka 40 +280000.0 True 2 1 Stare 30 +359000.0 True 3 2 Piątkowo 50 +465374.0 False 3 2 Stare 62 +250000.0 True 2 6 Sołacz 42 +237000.0 True 2 10 Grunwald 38 +365000.0 True 2 1 Centrum 50 +449000.0 True 3 1 Naramowice 89 +329000.0 True 3 7 Rataje 80 +390000.0 True 3 3 Piątkowo 48 +275000.0 True 2 2 Piątkowo 58 +365000.0 True 3 1 Stare 64 +280000.0 True 3 9 Jeżyce 48 +425000.0 True 3 0 Piątkowo 50 +1500000.0 True 3 0 Grunwald 100 +310000.0 True 2 2 Centrum 73 +235000.0 True 2 3 Grunwald 38 +286000.0 True 2 4 Centrum 49 +350000.0 True 2 4 Jeżyce 56 +225000.0 True 2 0 Górczyn 50 +360000.0 True 4 0 Piątkowo 60 +409000.0 True 3 1 Malta 90 +313000.0 True 2 4 Piątkowo 49 +259000.0 True 2 5 Grunwald 45 +279000.0 True 2 5 Centrum 42 +314900.0 True 2 2 Naramowice 41 +635000.0 True 4 3 Grunwald 70 +300000.0 True 3 1 Rataje 80 +390000.0 True 4 1 Jeżyce 70 +615000.0 True 4 1 Jeżyce 130 +525000.0 True 4 3 Jeżyce 70 +199000.0 True 2 6 Grunwald 20 +299000.0 True 3 2 Grunwald 49 +300000.0 True 3 2 Grunwald 49 +259000.0 True 2 3 Rataje 49 +375000.0 True 3 1 Rataje 62 +365000.0 True 4 1 Wilda 79 +248000.0 True 2 14 Rataje 49 +340000.0 True 2 0 Junikowo 62 +280000.0 True 3 1 Jeżyce 58 +475000.0 True 4 0 Górczyn 102 +379000.0 True 3 0 Wilda 67 +399000.0 True 4 0 Nowe 69 +404000.0 True 4 0 Nowe 69 +339000.0 True 3 13 Nowe 65 +369000.0 True 2 3 Stare 49 +370000.0 True 2 4 Rataje 80 +382280.0 True 3 3 Stare 30 +259000.0 True 2 3 Żegrze 49 +329000.0 True 3 7 Rataje 66 +410000.0 True 5 0 Łazarz 111 +295000.0 True 2 4 Wilda 35 +349000.0 True 2 2 Stare 33 +239000.0 True 2 3 Rataje 53 +275000.0 True 2 13 Rataje 49 +495000.0 True 4 1 Naramowice 98 +239000.0 True 2 0 Naramowice 80 +384000.0 True 4 0 Grunwald 93 +289000.0 True 2 2 Zawady 48 +210000.0 True 2 3 Grunwald 38 +329000.0 True 2 3 Rataje 50 +439000.0 True 4 2 Grunwald 92 +235000.0 True 2 3 Grunwald 50 +398000.0 True 2 1 Grunwald 32 +150000.0 True 2 2 Nowe 50 +650000.0 True 3 2 Centrum 101 +191000.0 True 2 0 Górczyn 42 +238000.0 True 2 8 Jeżyce 37 +550000.0 True 3 1 Grunwald 73 +210000.0 True 2 0 Grunwald 65 +308000.0 True 3 0 Jeżyce 70 +620000.0 True 4 1 Smochowice 82 +565000.0 True 4 0 Sołacz 90 +259000.0 True 2 5 Górczyn 45 +259000.0 True 2 4 Grunwald 50 +395000.0 True 4 1 Wilda 80 +300000.0 True 2 1 Centrum 8 +245000.0 True 2 2 Centrum 8 +250000.0 True 2 4 Nowe 23 +399000.0 False 5 0 Szczepankowo 77 +399000.0 False 5 0 Szczepankowo 77 +399000.0 False 5 0 Szczepankowo 77 +402000.0 False 5 0 Szczepankowo 77 +402000.0 False 5 0 Szczepankowo 77 +402000.0 False 5 0 Szczepankowo 77 +402000.0 False 5 0 Szczepankowo 77 +375000.0 True 3 4 Winogrady 65 +248000.0 True 2 14 Rataje 49 +1017445.0 False 6 8 Nowe 53 +316357.0 False 2 7 Nowe 82 +316547.0 False 2 5 Nowe 85 +316674.0 False 2 1 Nowe 87 +356933.0 False 3 1 Nowe 21 +317944.0 False 2 7 Nowe 7 +318198.0 False 2 4 Nowe 11 +318452.0 False 2 3 Nowe 15 +318452.0 False 2 2 Nowe 15 +318071.0 False 2 1 Nowe 9 +350583.0 False 3 1 Nowe 21 +603948.0 False 4 5 Nowe 11 +606171.0 False 4 3 Nowe 46 +606171.0 False 4 2 Nowe 46 +324800.0 False 2 3 Nowe 56 +324800.0 False 2 1 Nowe 56 +460184.0 False 4 7 Nowe 47 +460248.0 False 4 6 Nowe 48 +484314.0 False 4 4 Nowe 27 +484505.0 False 4 3 Nowe 30 +484505.0 False 4 2 Nowe 30 +483616.0 False 4 1 Nowe 16 +424370.0 False 4 3 Nowe 83 +424370.0 False 4 2 Nowe 83 +549211.0 False 4 1 Nowe 49 +359000.0 True 2 4 Grunwald 40 +439000.0 True 4 2 Łazarz 92 +402000.0 False 5 0 Szczepankowo 77 +327000.0 True 3 3 Stare 64 +349000.0 True 4 2 Rataje 20 +380000.0 True 3 4 Nowe 100 +300000.0 True 2 2 Winogrady 58 +339000.0 True 3 3 Stare 37 +664443.3 False 2 2 Stare 57 +308000.0 True 3 4 Rataje 70 +240000.0 True 2 6 Grunwald 42 +270000.0 True 3 0 Grunwald 48 +320000.0 True 3 8 Rataje 78 +319000.0 True 2 2 Jeżyce 55 +335400.0 True 2 1 Łazarz 52 +250000.0 True 3 3 Nowe 53 +355000.0 True 4 0 Stare 88 +360000.0 True 4 0 Grunwald 66 +495000.0 True 3 0 Centrum 63 +268900.0 True 3 10 Grunwald 56 +379000.0 True 2 3 Stare 16 +287000.0 True 2 10 Winogrady 80 +250000.0 True 2 4 Rataje 44 +279000.0 True 4 3 Rataje 62 +265000.0 True 3 0 Rataje 48 +225000.0 True 2 0 Grunwald 50 +290000.0 True 3 8 Osiedle 70 +228000.0 True 4 4 Swarzędz 64 +330000.0 True 4 0 Grunwald 50 +495000.0 True 3 1 Grunwald 64 +307000.0 True 2 4 Piątkowo 50 +225000.0 True 2 7 Ogrody 53 +340000.0 True 2 2 Naramowice 16 +245000.0 True 2 9 Rataje 38 +439000.0 True 3 3 Piątkowo 77 +499000.0 True 4 4 Stare 85 +249000.0 True 3 4 Rataje 53 +410000.0 True 5 0 Łazarz 8 +379000.0 True 2 5 Grunwald 50 +300000.0 True 3 1 Grunwald 48 +1780000.0 True 4 0 Stare 86 +459000.0 True 3 1 Grunwald 81 +450000.0 True 3 2 Stare 67 +1040000.0 True 2 10 Centrum 79 +320000.0 True 2 1 Naramowice 23 +430000.0 True 3 3 Łazarz 96 +380000.0 True 2 6 Dębiec 55 +240000.0 True 2 11 Rataje 42 +275000.0 True 2 2 Naramowice 60 +265000.0 True 2 1 Wilda 60 +515000.0 True 4 2 Jeżyce 87 +420000.0 True 4 3 Grunwald 50 +349000.0 True 2 3 Jeżyce 50 +253000.0 True 2 9 Stare 38 +259500.0 True 2 0 Łazarz 90 +460000.0 True 3 1 Antoninek 8 +379000.0 True 3 0 Rataje 57 +379000.0 True 3 0 Rataje 57 +480000.0 True 4 1 Grunwald 64 +325000.0 True 3 0 Stare 78 +379000.0 True 3 0 Nowe 56 +365000.0 True 2 1 Centrum 50 +349000.0 True 2 3 Centrum 56 +399000.0 True 2 1 Rataje 54 +420000.0 True 3 1 Jeżyce 38 +569000.0 True 4 0 Wilda 118 +302000.0 True 2 3 Winogrady 49 +460000.0 True 3 0 Grunwald 65 +450000.0 True 3 1 Grunwald 84 +269000.0 True 2 4 Rataje 40 +945000.0 True 6 2 Stare 126 +900000.0 True 6 1 Stare 120 +1845000.0 True 12 1 Stare 246 +360000.0 True 3 2 Grunwald 58 +473120.0 True 2 2 Grunwald 14 +458175.0 True 3 0 Grunwald 9 +538229.0 True 3 3 Grunwald 12 +439000.0 True 3 3 Piątkowo 70 +365000.0 True 3 2 Rataje 65 +640174.0 True 3 0 Grunwald 7 +289000.0 True 3 3 Rataje 48 +442612.0 True 2 4 Grunwald 11 +321845.0 False 3 1 Grunwald 55 +349000.0 True 3 5 Rataje 78 +439000.0 True 4 2 Grunwald 92 +395000.0 True 4 4 Stare 84 +390000.0 False 2 2 Grunwald 53 +320000.0 True 3 0 Rataje 56 +480000.0 True 2 1 Stare 44 +315000.0 True 3 1 Nowe 62 +379000.0 True 3 1 Piątkowo 78 +249000.0 True 2 4 Rataje 44 +419000.0 True 3 2 Piątkowo 20 +375000.0 True 3 4 Winogrady 65 +320000.0 True 3 6 Rataje 56 +527150.0 True 4 3 Winogrady 10 +444600.0 True 3 2 Winogrady 40 +360000.0 True 2 1 Centrum 50 +210000.0 True 2 0 Dębiec 37 +747000.0 True 3 7 Nowe 83 +760000.0 True 4 1 Stare 96 +354000.0 True 4 0 Jeżyce 71 +354000.0 True 4 0 Jeżyce 71 +595000.0 True 7 1 Jeżyce 136 +369000.0 True 3 3 Centrum 63 +279000.0 True 2 1 Naramowice 51 +379000.0 True 3 0 Rataje 57 +358000.0 True 3 2 Nowe 90 +350000.0 True 3 1 Starołęka 15 +529000.0 True 4 2 Centrum 107 +840000.0 True 4 0 Centrum 100 +311500.0 True 2 1 Wilda 89 +280000.0 True 2 5 Naramowice 41 +243656.0 True 2 1 Jeżyce 64 +259000.0 True 2 0 Grunwald 40 +260127.0 True 2 1 Ogrody 41 +210000.0 True 2 0 Dębiec 37 +417231.0 True 2 2 Stare 50 +290000.0 True 20 2 Stare 80 +209000.0 True 2 10 Rataje 38 +353000.0 True 3 2 Grunwald 52 +406100.0 True 3 2 Grunwald 61 +389000.0 True 4 0 Nowe 75 +295850.0 True 3 2 Ostrów 33 +295660.0 True 2 1 Ostrów 87 +241940.0 True 2 1 Jeżyce 51 +480000.0 True 4 4 Wilda 80 +449000.0 True 3 2 Wilda 104 +1850000.0 True 7 1 Sołacz 206 +394000.0 False 4 1 Nowe 69 +469000.0 True 3 2 Grunwald 40 +280000.0 True 3 9 Jeżyce 48 +325000.0 True 2 1 Jeżyce 56 +425000.0 True 4 6 Nowe 85 +510000.0 True 3 3 Grunwald 70 +220000.0 True 2 0 Grunwald 50 +319000.0 True 2 3 Podolany 40 +315000.0 True 3 3 Rataje 56 +234400.0 True 2 0 Górczyn 50 +235000.0 True 2 4 Winogrady 68 +229000.0 True 2 8 Winogrady 62 +820000.0 True 4 0 Jeżyce 41 +239000.0 True 2 5 Winogrady 68 +450000.0 True 3 2 Naramowice 67 +310000.0 True 2 2 Centrum 73 +239900.0 True 2 4 Rataje 38 +364520.0 False 3 1 Jeżyce 8 +285285.0 False 3 3 Jeżyce 89 +439000.0 True 3 0 Szczepankowo 77 +224000.0 True 2 0 Łazarzm 50 +820000.0 True 4 3 Centrum 59 +255200.0 True 2 0 Jeżyce 13 +253000.0 True 2 2 Jeżyce 2 +246000.0 True 2 1 Jeżyce 12 +235000.0 True 2 4 Rataje 38 +365000.0 True 4 1 Nowe 54 +299000.0 True 2 2 Grunwald 35 +319000.0 True 2 4 Łazarz 46 +263000.0 True 2 2 Dębiec 48 +1555200.0 True 4 2 Jeżyce 144 +265000.0 True 2 2 Rataje 38 +279000.0 True 2 1 Stare 60 +655000.0 True 3 4 Stare 60 +307000.0 True 2 4 Piątkowo 20 +569000.0 True 4 0 Wilda 40 +310000.0 True 3 1 Piątkowo 60 +430000.0 True 2 3 Grunwald 70 +259000.0 True 2 2 Stare 49 +487000.0 True 3 0 Naramowice 83 +298500.0 True 2 1 Jeżyce 28 +420000.0 True 5 0 Łazarz 8 +680000.0 True 3 0 Stare 89 +669000.0 True 2 0 Łazarz 70 +359000.0 True 2 2 Jeżyce 50 +299900.0 True 2 2 Jeżyce 60 +760000.0 True 5 1 Centrum 73 +604836.0 True 4 6 Grunwald 40 +263400.0 True 2 0 Grunwald 90 +340166.0 True 3 0 Grunwald 10 +480000.0 True 3 0 Rataje 69 +320000.0 True 2 3 Stare 55 +420000.0 True 3 3 Łazarz 95 +690000.0 True 5 1 Stare 100 +568000.0 True 4 0 Centrum 114 +520000.0 True 4 1 Nowe 91 +299000.0 True 2 2 Jeżyce 61 +680000.0 True 3 0 Stare 89 +290000.0 True 2 5 Winogrady 80 +177000.0 True 2 2 Wilda 34 +360000.0 True 3 4 Nowe 63 +820000.0 True 5 1 Winogrady 128 +339000.0 True 3 3 Jeżyce 80 +439000.0 True 3 3 Stare 70 +335000.0 True 3 9 Rataje 66 +599000.0 True 3 3 Górczyn 60 +720000.0 True 4 2 Grunwald 144 +263000.0 True 3 3 Grunwald 48 +270000.0 True 2 0 Jeżyce 20 +339000.0 True 3 4 Winogrady 90 +250000.0 True 2 6 Rataje 23 +340000.0 True 2 2 Garbary 48 +250000.0 True 2 1 Winogrady 38 +487000.0 True 3 0 Stare 83 +268001.0 True 2 2 Sołacz 60 +729000.0 True 4 1 Sołacz 10 +533000.0 True 3 9 Rataje 72 +325000.0 True 3 0 Wola 65 +320000.0 True 3 1 Grunwald 74 +549000.0 True 3 3 Grunwald 60 +345000.0 True 3 1 Rataje 78 +239000.0 True 3 2 Wilda 40 +425000.0 True 4 6 Rataje 90 +332339.0 False 2 5 Dolna 67 +308481.0 False 2 5 Dolna 74 +315537.0 False 2 5 Dolna 45 +319927.0 False 2 5 Dolna 49 +491139.0 False 4 5 Dolna 50 +1500000.0 True 3 5 Stare 68 +292981.0 False 2 5 Dolna 2 +309465.0 False 2 5 Dolna 56 +309838.0 False 2 5 Dolna 39 +457004.0 False 4 5 Dolna 25 +498921.0 False 4 5 Dolna 65 +296180.0 False 2 5 Dolna 47 +300204.0 False 2 5 Dolna 70 +309246.0 False 2 5 Dolna 99 +484168.0 False 3 5 Dolna 8 +306666.0 False 2 4 Dolna 45 +310923.0 False 2 4 Dolna 49 +284921.0 False 2 4 Dolna 2 +300495.0 False 2 4 Dolna 56 +301128.0 False 2 4 Dolna 39 +444872.0 False 4 4 Dolna 25 +484149.0 False 4 4 Dolna 65 +288032.0 False 2 4 Dolna 47 +291765.0 False 2 4 Dolna 70 +412908.0 False 3 4 Dolna 78 +431187.0 False 3 4 Dolna 43 +304231.0 False 2 4 Dolna 99 +469840.0 False 3 4 Dolna 8 +866623.0 False 5 3 Dolna 26 +308005.0 False 2 3 Dolna 49 +472873.0 False 4 3 Dolna 50 +282503.0 False 2 3 Dolna 2 +298253.0 False 2 3 Dolna 56 +298306.0 False 2 3 Dolna 39 +439966.0 False 4 3 Dolna 25 +480336.0 False 4 3 Dolna 65 +285180.0 False 2 3 Dolna 47 +289032.0 False 2 3 Dolna 70 +405142.0 False 3 3 Dolna 78 +750062.0 False 4 6 Wilda 42 +555180.0 False 3 6 Wilda 44 +555180.0 False 3 6 Wilda 44 +855063.0 False 5 3 Dolna 59 +750013.0 False 4 6 Wilda 69 +333852.0 False 2 5 Wilda 70 +525525.0 False 3 5 Wilda 50 +241574.0 False 2 5 Wilda 56 +466175.0 False 3 3 Dolna 8 +670380.0 False 4 5 Wilda 85 +670380.0 False 4 5 Wilda 85 +350719.0 False 2 5 Wilda 11 +399772.0 False 3 5 Wilda 98 +399772.0 False 3 5 Wilda 98 +318202.0 False 2 4 Wilda 85 +316272.0 False 2 4 Wilda 92 +292691.0 False 2 4 Wilda 61 +295370.0 False 2 4 Wilda 43 +393624.0 False 3 4 Wilda 64 +393624.0 False 3 4 Wilda 64 +295370.0 False 2 4 Wilda 43 +295370.0 False 2 4 Wilda 43 +353048.0 False 2 4 Wilda 9 +247217.0 False 2 4 Wilda 99 +316866.0 False 2 3 Wilda 1 +314355.0 False 2 3 Wilda 92 +276293.0 False 2 3 Wilda 75 +278813.0 False 2 3 Wilda 14 +385453.0 False 3 3 Wilda 64 +385453.0 False 3 3 Wilda 64 +293783.0 False 2 3 Wilda 14 +293454.0 False 2 3 Wilda 14 +351450.0 False 2 3 Wilda 25 +245769.0 False 2 3 Wilda 13 +245769.0 False 2 3 Wilda 13 +310696.0 False 2 2 Wilda 17 +311019.0 False 2 2 Wilda 22 +285966.0 False 2 2 Wilda 88 +288567.0 False 2 2 Wilda 27 +399406.0 False 3 2 Wilda 89 +288567.0 False 2 2 Wilda 27 +288567.0 False 2 2 Wilda 27 +345075.0 False 2 2 Wilda 50 +217361.0 False 2 2 Wilda 91 +309586.0 False 2 1 Wilda 32 +310826.0 False 2 1 Wilda 34 +276016.0 False 2 1 Wilda 2 +278518.0 False 2 1 Wilda 41 +384128.0 False 3 1 Wilda 2 +384128.0 False 3 1 Wilda 2 +277824.0 False 2 1 Wilda 41 +277824.0 False 2 1 Wilda 41 +344376.0 False 2 1 Wilda 75 +242751.0 False 2 1 Wilda 40 +360000.0 True 3 2 Grunwald 60 +227012.0 False 2 1 Wilda 4 +456960.0 False 3 5 Jeżyce 20 +765451.0 False 5 5 Jeżyce 81 +473754.0 False 3 5 Jeżyce 66 +445900.0 False 3 5 Jeżyce 70 +310170.0 False 2 5 Jeżyce 31 +747600.0 False 5 5 Jeżyce 80 +558693.0 False 4 5 Jeżyce 97 +558486.0 False 4 5 Jeżyce 94 +497628.0 False 3 5 Jeżyce 12 +412297.0 False 2 5 Jeżyce 7 +392231.0 False 2 5 Jeżyce 26 +332253.0 False 3 5 Jeżyce 59 +310170.0 False 3 5 Jeżyce 31 +413236.0 False 3 5 Jeżyce 77 +459151.0 False 3 4 Jeżyce 53 +388600.0 False 3 4 Jeżyce 58 +357204.0 False 3 4 Jeżyce 53 +542365.0 False 4 4 Jeżyce 95 +406065.0 False 3 4 Jeżyce 85 +368628.0 False 3 4 Jeżyce 21 +362372.0 False 3 4 Jeżyce 29 +257250.0 False 2 4 Jeżyce 75 +542298.0 False 4 4 Jeżyce 94 +485013.0 False 3 4 Jeżyce 39 +413567.0 False 3 4 Jeżyce 14 +370260.0 False 3 4 Jeżyce 45 +325244.0 False 2 4 Jeżyce 83 +324921.0 False 2 4 Jeżyce 9 +454986.0 False 3 4 Jeżyce 94 +323004.0 False 2 4 Jeżyce 94 +297145.0 False 2 4 Jeżyce 35 +383977.0 False 3 4 Jeżyce 31 +382800.0 False 3 3 Jeżyce 58 +452298.0 False 3 3 Jeżyce 53 +400180.0 False 3 3 Jeżyce 85 +351951.0 False 3 3 Jeżyce 53 +363207.0 False 3 3 Jeżyce 21 +257250.0 False 2 3 Jeżyce 75 +534600.0 False 4 3 Jeżyce 81 +534270.0 False 4 3 Jeżyce 95 +357043.0 False 3 3 Jeżyce 29 +477774.0 False 3 3 Jeżyce 39 +410410.0 False 3 3 Jeżyce 14 +320461.0 False 2 3 Jeżyce 83 +364815.0 False 3 3 Jeżyce 45 +320280.0 False 2 3 Jeżyce 10 +448392.0 False 3 3 Jeżyce 94 +318110.0 False 2 3 Jeżyce 94 +292710.0 False 2 3 Jeżyce 35 +378246.0 False 2 3 Jeżyce 31 +448871.5 False 3 2 Jeżyce 53 +377000.0 False 3 2 Jeżyce 58 +394295.0 False 3 2 Jeżyce 85 +344071.5 False 3 2 Jeżyce 53 +253575.0 False 2 2 Jeżyce 75 +530222.5 False 4 2 Jeżyce 95 +357786.0 False 3 2 Jeżyce 21 +351648.0 False 3 2 Jeżyce 28 +530550.0 False 4 2 Jeżyce 81 +474154.5 False 3 2 Jeżyce 39 +407382.0 False 3 2 Jeżyce 16 +359370.0 False 3 2 Jeżyce 45 +320461.0 False 2 2 Jeżyce 83 +317925.0 False 2 2 Jeżyce 10 +211830.0 False 2 2 Jeżyce 70 +441798.0 False 3 2 Jeżyce 94 +318110.0 False 2 2 Jeżyce 94 +290427.0 False 2 2 Jeżyce 34 +377000.0 False 3 1 Jeżyce 58 +375380.5 False 3 2 Jeżyce 31 +444925.0 False 3 1 Jeżyce 45 +394295.0 False 3 1 Jeżyce 85 +346698.0 False 3 1 Jeżyce 53 +357786.0 False 3 1 Jeżyce 21 +249900.0 False 2 1 Jeżyce 75 +526500.0 False 4 1 Jeżyce 81 +526175.0 False 4 1 Jeżyce 95 +351714.0 False 3 1 Jeżyce 29 +470470.0 False 3 1 Jeżyce 38 +407253.0 False 3 1 Jeżyce 14 +320796.0 False 2 1 Jeżyce 88 +315637.0 False 2 1 Jeżyce 11 +435798.0 False 3 1 Jeżyce 3 +359238.0 False 3 1 Jeżyce 43 +288340.0 False 2 1 Jeżyce 36 +315727.5 False 2 1 Jeżyce 95 +372515.0 False 3 1 Jeżyce 31 +448413.0 False 3 0 Jeżyce 46 +418470.0 False 3 0 Jeżyce 38 +453960.0 False 3 0 Jeżyce 84 +444080.0 False 3 0 Jeżyce 32 +309487.5 False 2 0 Jeżyce 25 +423150.0 False 3 0 Jeżyce 10 +334230.0 False 2 0 Jeżyce 42 +453260.0 False 3 0 Jeżyce 20 +452121.0 False 3 2 Dolna 60 +296290.0 False 2 2 Dolna 57 +420388.0 False 3 2 Dolna 11 +321845.0 False 3 1 Grunwald 55 +286082.0 False 2 2 Dolna 20 +457458.0 False 4 2 Dolna 37 +293768.0 False 2 2 Dolna 56 +295485.0 False 2 2 Dolna 39 +436530.0 False 4 2 Dolna 25 +475052.0 False 4 2 Dolna 65 +282980.0 False 2 2 Dolna 47 +286299.0 False 2 2 Dolna 70 +840000.0 True 6 1 Winogrady 129 +442612.0 True 2 4 Grunwald 11 +324558.0 True 2 4 Grunwald 61 +620000.0 True 3 2 Grunwald 73 +265000.0 True 3 4 Łazarz 55 +393789.0 False 3 2 Dolna 78 +298381.0 False 2 2 Dolna 99 +461040.0 False 3 2 Dolna 8 +443502.0 False 3 1 Dolna 60 +485000.0 True 5 2 Łazarz 87 +215000.0 True 2 0 Wilda 36 +412342.0 False 3 1 Dolna 11 +298885.0 False 2 1 Dolna 96 +459470.0 False 4 1 Dolna 50 +289283.0 False 2 1 Dolna 56 +289842.0 False 2 1 Dolna 39 +431316.0 False 4 1 Dolna 25 +280833.0 False 2 1 Dolna 70 +381420.0 False 3 1 Dolna 78 +396421.0 False 3 1 Dolna 79 +483194.0 False 4 1 Dolna 71 +306880.0 False 2 1 Dolna 27 +374734.0 False 3 1 Dolna 43 +760000.0 True 4 1 Centrum 95 +292530.0 False 2 1 Dolna 99 +452976.0 False 3 1 Dolna 8 +446521.0 False 2 0 Dolna 60 +268373.0 False 2 0 Dolna 57 +260000.0 True 2 0 Naramowice 47 +266788.0 False 2 0 Dolna 21 +399355.0 False 3 0 Dolna 11 +290270.0 False 2 0 Dolna 96 +294964.0 False 2 0 Dolna 32 +463973.0 False 4 0 Dolna 50 +282449.0 False 2 0 Dolna 56 +283698.0 False 2 0 Dolna 39 +364073.0 False 3 0 Dolna 4 +376181.0 False 3 0 Dolna 7 +284140.0 False 2 0 Dolna 94 +290853.0 False 2 0 Dolna 80 +336456.0 False 3 0 Dolna 63 +530000.0 True 3 0 Grunwald 63 +135000.0 True 2 4 skiej 86 +799000.0 True 4 0 Grunwald 118 +329000.0 True 3 1 Jeżyce 112 +260000.0 True 2 0 Naramowice 47 +550000.0 True 3 1 Rataje 81 +443102.0 False 3 0 Dolna 80 +549000.0 True 3 2 Jeżyce 106 +499000.0 True 5 4 Jeżyce 93 +404000.0 True 3 2 Piątkowo 90 +387645.0 False 3 5 Grunwald 10 +294810.0 False 2 5 Grunwald 50 +229000.0 True 2 2 Jeżyce 34 +487000.0 True 3 0 Naramowice 83 +367211.0 False 3 4 Grunwald 10 +367211.0 False 3 4 Grunwald 10 +273497.0 False 2 4 Grunwald 90 +289695.0 False 2 4 Grunwald 50 +367211.0 False 3 3 Grunwald 10 +273497.0 False 2 3 Grunwald 90 +289695.0 False 2 3 Grunwald 50 +284711.0 False 2 3 Grunwald 70 +360600.0 False 3 3 Grunwald 10 +360600.0 False 3 2 Grunwald 10 +360000.0 True 3 4 Rataje 69 +273497.0 False 2 2 Grunwald 90 +289695.0 False 2 2 Grunwald 50 +284711.0 False 2 2 Grunwald 70 +353989.0 False 3 1 Grunwald 10 +284115.0 False 2 1 Grunwald 50 +279227.0 False 2 1 Grunwald 70 +346777.0 False 3 1 Grunwald 10 +279000.0 False 2 0 Grunwald 50 +340166.0 False 2 0 Grunwald 70 +340166.0 False 3 0 Grunwald 10 +279594.0 False 2 2 Grunwald 10 +289738.0 False 2 2 Grunwald 70 +346798.0 False 3 2 Grunwald 70 +235545.0 True 3 0 Plewiska 57 +274302.0 False 2 1 Grunwald 10 +284254.0 False 2 1 Grunwald 70 +420000.0 True 3 3 Grunwald 96 +340234.0 False 3 1 Grunwald 70 +269010.0 False 2 0 Grunwald 10 +279594.0 False 2 5 Grunwald 10 +340781.0 False 3 4 Grunwald 70 +284088.0 False 2 4 Grunwald 60 +274743.0 False 2 4 Grunwald 10 +340781.0 False 3 3 Grunwald 70 +284088.0 False 2 3 Grunwald 60 +274743.0 False 2 3 Grunwald 10 +340781.0 False 3 2 Grunwald 70 +284088.0 False 2 2 Grunwald 60 +274743.0 False 2 2 Grunwald 10 +328200.0 False 3 1 Grunwald 70 +273600.0 False 2 1 Grunwald 60 +264600.0 False 2 1 Grunwald 10 +334217.0 False 3 0 Grunwald 70 +800000.0 True 4 3 Stare 103 +317000.0 True 3 3 Naramowice 53 +392181.0 False 4 4 Stare 25 +275000.0 True 2 13 Rataje 49 +330000.0 True 3 2 Grunwald 60 +290000.0 True 4 3 Rataje 50 +215000.0 True 2 0 Wilda 36 +368520.0 True 2 2 Jeżyce 50 +275000.0 True 3 1 Grunwald 90 +439000.0 True 4 2 Łazarz 92 +370000.0 True 3 3 Wilda 78 +962376.0 False 4 5 Centrum 9 +369000.0 True 3 1 Piątkowo 90 +445000.0 True 3 1 Grunwald 69 +250000.0 True 2 10 Grunwald 42 +439000.0 True 4 2 Łazarz 92 +187000.0 True 2 3 Zawady 35 +265000.0 True 3 10 Grunwald 53 +389900.0 True 3 10 Winogrady 67 +387645.0 False 3 5 Grunwald 10 +294810.0 False 2 5 Grunwald 50 +367211.0 False 3 4 Grunwald 10 +289695.0 False 2 4 Grunwald 50 +295000.0 True 2 4 Naramowice 58 +330000.0 True 2 3 Wilda 53 +187000.0 True 2 2 Zawady 35 +273497.0 False 2 3 Grunwald 90 +289695.0 False 2 3 Grunwald 50 +284711.0 False 2 3 Grunwald 70 +367211.0 False 3 2 Grunwald 10 +273497.0 False 2 2 Grunwald 90 +289695.0 False 2 2 Grunwald 50 +284711.0 False 2 2 Grunwald 70 +360600.0 False 3 2 Grunwald 10 +263400.0 False 2 1 Grunwald 90 +279000.0 False 2 1 Grunwald 50 +274200.0 False 2 1 Grunwald 70 +263400.0 False 2 0 Grunwald 9 +279000.0 False 2 0 Grunwald 50 +1725000.0 True 3 0 Stare 136 +279594.0 False 2 2 Grunwald 10 +340234.0 False 3 2 Grunwald 70 +274302.0 False 2 1 Grunwald 10 +284254.0 False 2 1 Grunwald 70 +333670.0 False 3 1 Grunwald 70 +310000.0 True 3 1 Wilda 88 +475000.0 True 3 1 Stare 68 +335000.0 True 2 4 Centrum 45 +279594.0 False 2 2 Grunwald 10 +289738.0 False 2 2 Grunwald 70 +340234.0 False 3 2 Grunwald 70 +274302.0 False 2 1 Grunwald 10 +399000.0 True 2 2 Łazarz 51 +333670.0 False 3 1 Grunwald 70 +499000.0 True 3 1 Rataje 50 +269010.0 False 2 0 Grunwald 10 +230000.0 True 3 4 Centrum 52 +230000.0 True 2 4 Stare 52 +250000.0 True 2 4 Rataje 50 +289000.0 True 2 2 Ogrody 44 +215000.0 True 2 8 Rataje 42 +239000.0 True 2 2 Rataje 38 +293000.0 True 3 1 Wilda 79 +339000.0 True 3 1 Grunwald 54 +307000.0 True 2 4 Stare 48 +280000.0 True 3 4 Rataje 48 +595000.0 True 5 4 Wilda 54 +379000.0 True 3 1 Stare 90 +569000.0 True 2 2 Stare 20 +445000.0 True 2 1 Stare 80 +475000.0 True 3 0 Stare 66 +420000.0 True 3 1 Centrum 60 +259500.0 True 2 0 Grunwald 90 +259500.0 True 2 0 Grunwald 90 +230000.0 True 2 0 Centrum 46 +99000.0 True 2 2 Wilda 52 +329000.0 True 4 4 Rataje 72 +295000.0 True 3 2 Rataje 54 +225000.0 True 2 1 Rataje 42 +285000.0 True 2 3 Wilda 60 +1600000.0 True 3 2 Górczyn 79 +333000.0 True 3 4 Wilda 8 +1600000.0 True 3 2 Górczyn 79 +333000.0 True 3 4 Wilda 8 +2192000.0 True 4 1 Grunwald 21 +339000.0 True 3 4 Winogrady 90 +3233000.0 True 5 1 Grunwald 28 +489000.0 True 2 8 Centrum 39 +336000.0 True 2 3 Istnieje 48 +359000.0 True 3 1 Świerczewo 70 +239000.0 True 2 3 Winogrady 38 +240000.0 True 2 2 Dębiec 48 +439000.0 True 3 0 Jeżyce 75 +404000.0 True 2 2 Centrum 50 +361300.0 False 3 1 Grunwald 66 +385000.0 True 2 1 Centrum 50 +244000.0 False 2 3 Jeżyce 40 +215000.0 True 2 1 Jeżyce 70 +465000.0 True 3 0 Grunwald 60 +329000.0 True 2 0 Naramowice 51 +309000.0 True 3 1 Rataje 20 +420000.0 True 2 3 Stare 50 +480000.0 True 4 3 Centrum 94 +620000.0 True 4 3 Centrum 50 +342000.0 True 3 4 Winogrady 87 +326000.0 True 3 6 Winogrady 1 +330000.0 True 3 7 Piątkowo 40 +315000.0 True 3 0 Nowe 63 +360000.0 True 4 0 Grunwald 66 +360000.0 True 3 3 Nowe 65 +325000.0 True 2 2 Grunwald 47 +531000.0 True 2 1 Grunwald 59 +377000.0 True 3 1 Piątkowo 63 +640000.0 True 3 2 Centrum 80 +150000.0 True 2 2 Nowe 50 +640000.0 True 3 2 Stare 80 +499000.0 True 4 2 Naramowice 85 +250000.0 True 2 10 Grunwald 42 +250000.0 True 3 3 Rataje 53 +333200.0 True 3 4 Wilda 68 +385000.0 True 2 1 Jeżyce 46 +248000.0 True 2 10 Grunwald 42 +389999.0 True 3 4 Grunwald 82 +204999.0 True 2 7 Malta 30 +410000.0 True 5 0 Łazarz 114 +370000.0 True 3 4 Stare 84 +225000.0 True 2 4 Warszawskie 50 +349000.0 True 3 3 Wilda 20 +289000.0 True 3 1 Grunwald 45 +1330000.0 True 3 0 Malta 100 +235000.0 True 3 2 Starołęka 51 +549000.0 True 2 8 Centrum 39 +498000.0 True 4 4 Centrum 86 +525000.0 True 4 3 Nowe 88 +550000.0 True 3 5 Grunwald 73 +410000.0 True 5 0 Łazarz 114 +399000.0 True 3 4 Jeżyce 63 +289000.0 True 3 0 Nowe 10 +308039.0 True 2 0 Stare 52 +322497.0 True 2 6 Stare 51 +220000.0 True 2 1 Łazarz 35 +309000.0 True 3 14 Rataje 80 +293760.0 True 2 3 Winogrady 90 +392181.0 True 3 4 Stare 69 +307257.0 True 2 2 Stare 50 +263140.0 True 2 0 Stare 45 +281881.0 True 2 1 Stare 46 +399000.0 True 5 4 Centrum 10 +511000.0 True 4 1 Stare 104 +428400.0 True 3 0 Piątkowo 60 +260000.0 True 2 2 Jeżyce 10 +369000.0 True 3 1 Stare 90 +379000.0 True 3 1 Piątkowo. 78 +346320.0 True 2 3 Grunwald 40 +440700.0 True 3 3 Grunwald 50 +321285.0 False 2 4 Stare 30 +385000.0 True 3 0 Grunwald 80 +569000.0 True 4 0 Wilda 50 +296033.0 True 2 3 Stare 49 +295362.0 True 2 2 Stare 48 +295362.0 True 2 1 Stare 48 +420000.0 True 5 0 Łazarz 8 +273875.0 True 2 1 Grunwald 13 +450000.0 True 2 2 Jeżyce 41 +379000.0 True 3 1 Piątkowo 78 +270000.0 True 3 3 Rataje 48 +278460.0 True 2 0 Winogrady 10 +298980.0 True 2 5 Stare 30 +369000.0 True 3 1 Piątkowo 78 +450000.0 True 3 0 Winogrady 70 +219000.0 True 2 0 Wilda 36 +345000.0 True 3 5 Rataje 77 +371930.0 False 4 2 Jeżyce 20 +313566.0 False 3 3 Jeżyce 50 +365000.0 True 3 4 Rataje 63 +297000.0 True 2 7 Bonin 49 +350805.0 False 2 2 Rynek 97 +365000.0 True 4 3 Grunwald 68 +405000.0 True 4 2 Rataje 71 +259000.0 True 2 2 Nowe 40 +340000.0 True 3 0 Centrum 10 +275000.0 True 2 0 Dębiec 50 +435000.0 True 3 0 Stare 25 +750000.0 True 2 1 Stare 80 +570000.0 True 4 3 Grunwald 137 +290000.0 True 2 5 Winogrady 42 +360000.0 True 3 14 Rataje 80 +770000.0 True 4 1 Centrum 142 +285000.0 True 2 0 Łazarz 49 +263553.0 True 2 0 Winogrady 67 +475000.0 True 4 4 Wilda 84 +414566.0 False 3 1 Malta 1 +422000.0 False 3 1 Malta 66 +425402.0 False 3 0 Malta 75 +440224.0 False 3 4 Malta 8 +440224.0 False 3 4 Malta 8 +416214.0 False 3 2 Malta 75 +633832.0 False 4 4 Malta 73 +422670.0 False 3 3 Malta 75 +420174.0 False 3 2 Malta 75 +423922.0 False 3 1 Malta 75 +633344.0 False 4 4 Malta 65 +422372.0 False 3 2 Malta 74 +499000.0 True 3 1 Rataje 64 +410110.0 False 3 2 Malta 49 +424178.0 False 3 1 Malta 79 +229000.0 True 2 0 Rataje 38 +422322.0 False 3 1 Malta 73 +411628.0 False 3 0 Malta 68 +438016.0 False 3 4 Malta 10 +441084.0 False 3 4 Malta 10 +380931.0 True 3 3 Nowe 83 +365000.0 True 4 3 Grunwald 68 +365000.0 True 4 3 Grunwald 68 +350000.0 True 3 7 Piątkowo 63 +47475.0 True 2 11 Wilda 75 +289000.0 True 3 0 Winogrady 48 +520000.0 False 4 3 Grunwald 10 +520000.0 False 4 4 Grunwald 12 +520000.0 False 4 3 Grunwald 12 +520000.0 False 4 2 Grunwald 11 +475000.0 True 5 4 Grunwald 23 +281576.0 False 2 2 Stare 16 +380900.0 True 3 3 Nowe 67 +485000.0 True 5 2 Łazarz 88 +239000.0 True 2 4 Rataje 38 +250000.0 True 2 6 Nowe 45 +429000.0 True 4 2 Jeżyce 110 +370000.0 True 4 0 Wilda 80 +275000.0 True 3 4 Wilda 77 +850000.0 True 5 1 Grunwald 135 +265000.0 True 2 4 Rataje 38 +349000.0 True 3 2 Rataje 64 +229000.0 True 2 0 Grunwald 47 +320000.0 True 3 4 Rataje 60 +430000.0 True 3 2 Rataje 64 +389000.0 True 3 4 Rataje 80 +619000.0 True 4 0 Jeżyce 99 +329900.0 True 2 1 Naramowice 20 +430000.0 True 3 2 Rataje 64 +520000.0 True 4 1 Centrum 50 +369000.0 True 3 0 Stare 64 +505877.0 False 2 5 Centrum 22 +619000.0 True 5 1 Jeżyce 146 +389740.0 True 2 2 Łazarz 96 +434525.0 True 2 2 Łazarz 85 +552955.0 True 3 2 Łazarz 7 +350805.0 True 2 2 Łazarz 97 +279000.0 True 2 0 Piątkowo 10 +460135.0 True 3 0 Łazarz 79 +392790.0 True 3 5 Stare 30 +309000.0 True 4 4 Grunwald 70 +219000.0 True 2 2 Dębiec 30 +1345500.0 True 5 1 Grunwald 117 +690000.0 True 4 5 Grunwald 24 +886860.0 False 3 5 Centrum 80 +372000.0 False 4 0 Grunwald 49 +502136.0 False 2 5 Centrum 77 +342000.0 False 3 1 Grunwald 27 +372000.0 False 4 0 Grunwald 49 +342000.0 False 3 1 Grunwald 27 +473770.0 False 2 5 Centrum 7 +798966.0 False 2 5 Centrum 33 +561663.0 False 3 4 Centrum 69 +396248.0 False 2 4 Centrum 77 +278000.0 True 2 0 Piątkowo 45 +368019.0 False 2 4 Centrum 18 +369000.0 True 3 0 Stare 64 +380000.0 True 4 1 Piątkowo 75 +1345500.0 False 5 1 Grunwald 117 +365000.0 True 2 1 Centrum 50 +659000.0 True 4 1 Rataje 78 +344000.0 True 3 3 Nowe 65 +310000.0 True 2 4 Winogrady 45 +275000.0 True 2 0 Centrum 44 +328000.0 True 4 2 Grunwald 75 +382156.0 False 2 4 Centrum 21 +383676.0 False 2 4 Centrum 4 +387597.0 False 2 4 Centrum 49 +1555200.0 True 4 2 Jeżyce 144 +378128.0 False 2 3 Centrum 77 +649999.0 True 4 1 Stare 90 +584000.0 True 3 1 Centrum 89 +229000.0 True 2 0 Winogrady 38 +238900.0 True 2 0 Grunwald 47 +239000.0 True 2 0 Raszyn 47 +254000.0 True 2 1 Nowe 44 +469000.0 True 3 0 Naramowice 52 +215000.0 True 2 3 Centrum 38 +495000.0 True 3 1 Grunwald 37 +490000.0 True 4 2 Centrum 90 +268000.0 True 2 4 Winogrady 37 +262000.0 True 2 2 Rataje 50 +321845.0 False 3 1 Grunwald 55 +265000.0 True 2 0 Wilda 50 +329000.0 True 4 4 Nowe 20 +360000.0 True 3 3 Naramowice 63 +341776.0 False 2 2 Centrum 14 +356774.0 False 2 1 Centrum 10 +230000.0 True 2 0 Rataje 38 +270000.0 True 2 0 Dębiec 50 +330255.0 False 2 1 Centrum 14 +275000.0 True 2 0 Dębiec 50 +210000.0 True 2 0 Wilda 36 +291000.0 True 4 1 Wilda 70 +1465000.0 True 6 3 Łazarz 38 +579000.0 True 3 1 Łazarz 3 +401000.0 True 3 1 Łazarz 49 +626000.0 True 3 1 Łazarz 59 +558000.0 True 4 1 Wilda 93 +533000.0 True 2 2 Łazarz 19 +595000.0 True 2 2 Łazarz 70 +269000.0 True 2 6 Rataje 50 +520000.0 True 4 7 Nowe 98 +269000.0 True 2 6 Rataje 49 +750000.0 True 4 0 Naramowice 133 +370000.0 True 2 1 Nowe 53 +499000.0 True 3 1 Jeżyce 40 +545000.0 True 2 4 Centrum 49 +420000.0 True 3 3 Łazarz 47 +569000.0 True 4 0 Wilda 50 +370000.0 True 2 2 Naramowice 70 +345000.0 True 3 0 Nowe 60 +207000.0 True 2 1 Dębiec 45 +215000.0 True 2 1 Ogrody 38 +250000.0 True 3 3 Nowe 53 +420000.0 True 2 2 Łazarz 51 +269000.0 True 2 6 Rataje 50 +350000.0 True 2 3 Jeżyce 70 +225200.0 True 2 1 Nowe 39 +348000.0 True 3 3 Piątkowo 63 +260000.0 True 2 0 Naramowice 47 +449000.0 True 6 3 Stare 74 +260000.0 True 2 0 Stare 79 +288000.0 True 2 0 Jeżyce 50 +175000.0 True 2 4 Głuszyna 38 +289000.0 True 2 1 Wilda 47 +439000.0 True 4 2 Grunwald 92 +289000.0 True 3 3 Nowe 63 +184000.0 True 2 0 Grunwald 34 +450000.0 True 3 2 Naramowice 66 +360000.0 True 4 3 Grunwald 70 +379999.0 True 2 5 Jeżyce 61 +368712.0 False 2 5 Centrum 34 +348750.0 False 2 4 Centrum 54 +348750.0 False 2 3 Centrum 58 +393120.0 False 2 3 Centrum 52 +368712.0 False 2 2 Centrum 73 +362880.0 False 2 1 Centrum 37 +368712.0 False 2 0 Centrum 89 +362880.0 False 2 0 Centrum 72 +326430.0 False 2 0 Centrum 40 +480000.0 True 3 3 Stare 94 +360000.0 True 4 3 Grunwald 61 +525000.0 True 4 3 Jeżyce 104 +249000.0 True 2 4 Grunwald 38 +333775.0 True 2 1 Stare 35 +339822.0 True 3 3 Jeżyce 10 +360486.0 True 2 4 Jeżyce 10 +365000.0 True 2 1 Stare 10 +310000.0 True 3 1 Piątkowo 60 +339000.0 True 3 0 Rataje 63 +649000.0 True 4 1 Jeżyce 70 +356000.0 True 3 2 Naramowice 80 +345000.0 True 4 11 Grunwald 40 +499000.0 True 4 3 Stare 103 +269000.0 True 2 1 Rataje 49 +285000.0 True 2 4 Jeżyce 56 +308736.0 True 3 1 Jeżyce 24 +346689.0 True 3 2 Jeżyce 3 +241939.0 True 2 4 Jeżyce 51 +377622.0 True 4 4 Jeżyce 94 +245616.0 True 2 1 Jeżyce 8 +366208.0 True 3 6 Jeżyce 22 +195000.0 True 2 4 Grunwald 70 +262656.0 True 2 5 Stare 4 +458000.0 True 3 4 Centrum 87 +1115000.0 True 2 2 Grunwald 7 +285000.0 True 2 3 Wilda 50 +240000.0 True 2 8 Dębiec 38 +390000.0 True 3 3 Grunwald 87 +259500.0 True 2 0 Łazarz 90 +420000.0 True 2 3 Wilda 70 +560000.0 True 4 1 Naramowice 156 +429000.0 True 3 4 Nowe 79 +340000.0 True 3 0 Stare 70 +340000.0 True 3 0 Stare 70 +270000.0 True 2 2 Rataje 49 +428000.0 True 3 3 Centrum 43 +190000.0 True 2 8 Dębiec 50 +240000.0 True 2 8 Dębiec 38 +315000.0 True 2 2 Piątkowo 48 +404000.0 True 3 0 Warszawskie 52 +249000.0 True 2 0 Jeżyce 33 +350000.0 True 2 3 Grunwald 53 +239000.0 True 2 3 Rataje 49 +245000.0 True 2 9 Rataje 38 +706655.0 False 3 2 Nowe 45 +269973.0 False 3 1 Nowe 50 +249984.0 False 3 1 Nowe 64 +229990.0 False 3 1 Nowe 80 +269967.0 False 3 1 Nowe 30 +269973.0 False 3 1 Nowe 50 +189990.0 False 2 1 Nowe 12 +259993.0 False 3 1 Nowe 18 +199990.0 False 2 1 Nowe 95 +290000.0 True 2 2 Winogrady 41 +259993.0 False 3 1 Nowe 18 +279989.0 False 3 1 Nowe 58 +410000.0 True 3 1 Stare 60 +325000.0 True 2 4 Nowe 49 +285000.0 True 2 3 Wilda 60 +415000.0 True 3 2 Jeżyce 10 +245000.0 True 2 3 Naramowice 45 +260000.0 True 2 2 Rataje 38 +285000.0 True 2 3 Wilda 43 +269000.0 True 2 6 Rataje 50 +345000.0 True 3 5 Rataje 77 +259988.0 False 3 0 Nowe 73 +259980.0 False 3 0 Nowe 52 +189991.0 False 2 0 Nowe 40 +239994.0 False 3 0 Nowe 80 +259980.0 False 3 0 Nowe 52 +259988.0 False 3 0 Nowe 73 +349000.0 True 3 1 Nowe 108 +398000.0 True 3 2 Stare 20 +198789.0 False 2 0 Nowe 15 +198789.0 False 2 0 Nowe 15 +189661.0 False 2 0 Nowe 49 +255000.0 True 2 6 Rataje 49 +310576.0 True 3 3 Stare 55 +330680.0 True 2 1 Stare 59 +1214533.0 True 5 0 Grunwald 50 +550000.0 True 3 1 Grunwald 84 +230000.0 True 2 3 Rataje 36 +389000.0 True 3 2 Jeżyce 10 +300000.0 True 2 2 Winogrady 30 +435000.0 True 4 0 Dębiec 89 +1990000.0 True 3 1 Stare 150 +531000.0 True 2 1 Grunwald 59 +550000.0 True 3 1 Grunwald 84 +230000.0 True 2 3 Rataje 36 +389000.0 True 3 2 Jeżyce 10 +300000.0 True 2 2 Winogrady 30 +310576.0 True 3 3 Stare 55 +330680.0 True 2 1 Stare 59 +1214533.0 True 5 0 Grunwald 50 +550000.0 True 3 1 Grunwald 84 +259988.0 False 3 0 Nowe 73 +259980.0 False 3 0 Nowe 52 +189991.0 False 2 0 Nowe 40 +239994.0 False 3 0 Nowe 80 +259980.0 False 3 0 Nowe 52 +259988.0 False 3 0 Nowe 73 +349000.0 True 3 1 Nowe 108 +398000.0 True 3 2 Stare 20 +198789.0 False 2 0 Nowe 15 +198789.0 False 2 0 Nowe 15 +189661.0 False 2 0 Nowe 49 +255000.0 True 2 6 Rataje 49 +310576.0 True 3 3 Stare 55 +330680.0 True 2 1 Stare 59 +1214533.0 True 5 0 Grunwald 50 +550000.0 True 3 1 Grunwald 84 +230000.0 True 2 3 Rataje 36 +389000.0 True 3 2 Jeżyce 10 +300000.0 True 2 2 Winogrady 30 +435000.0 True 4 0 Dębiec 89 +1990000.0 True 3 1 Stare 150 +531000.0 True 2 1 Grunwald 59 +779000.0 True 3 2 Stare 113 +350000.0 True 2 3 Grunwald 53 +350000.0 True 2 1 Zawady 53 +260000.0 True 3 1 Grunwald 48 +350000.0 True 3 3 Nowe 67 +449000.0 True 3 1 Stare 110 +280000.0 True 3 4 Rataje 48 +280000.0 True 3 4 Rataje 48 +390000.0 True 3 3 Grunwald 87 +390000.0 True 3 3 Wilda 70 +462000.0 True 2 3 Winogrady 70 +220000.0 True 2 3 Rataje 42 +368000.0 True 3 2 Winiary 51 +368000.0 True 3 2 Winiary 51 +368000.0 True 3 2 Winiary 51 +402000.0 True 3 1 Winogrady 27 +289000.0 True 2 7 Winiary 48 +320000.0 True 2 2 Zawady 53 +233361.0 True 2 4 Jeżyce 60 +245000.0 True 2 3 Stare 50 +299500.0 False 3 0 Junikowo 59 +462000.0 True 2 3 Winogrady 57 +378000.0 False 4 0 Junikowo 35 +225000.0 True 4 3 Wilda 60 +249000.0 True 2 4 Winiary 49 +569000.0 True 4 0 Wilda 40 +308736.0 True 2 2 Jeżyce 48 +356000.0 True 3 2 Naramowice 63 +349000.0 True 3 1 Stare 83 +1650000.0 True 4 0 Sołacz 70 +330000.0 True 2 3 Wilda 53 +346689.0 True 3 4 Jeżyce 55 +363347.0 True 4 5 Jeżyce 57 diff --git a/wyk/saddle_point_evaluation_optimizers.gif b/wyk/saddle_point_evaluation_optimizers.gif new file mode 100644 index 0000000..61db246 Binary files /dev/null and b/wyk/saddle_point_evaluation_optimizers.gif differ diff --git a/wyk/sgd-comparison.png b/wyk/sgd-comparison.png new file mode 100644 index 0000000..af8bcdf Binary files /dev/null and b/wyk/sgd-comparison.png differ