Commit 3907aa57 authored by Lukas Wolf's avatar Lukas Wolf
Browse files

functionality for saccade-fixation data

parent 7c0959e8
......@@ -60,8 +60,8 @@ config['run'] = 'ensemble'
config['ensemble'] = 1 #number of models in the ensemble method
# Choosing model
#config['model'] = 'cnn'
config['model'] = 'inception'
config['model'] = 'cnn'
#config['model'] = 'inception'
#config['model'] = 'eegnet'
#config['model'] = 'deepeye'
#config['model'] = 'xception'
......@@ -110,20 +110,33 @@ config['deepeye-rnn'] = {}
if config['gaze-reg']:
#TODO: automatically set the input shapes depending on the dataset to run, i.e. fix only, sacc only, etc.
#config['cnn']['input_shape'] = (int(config['max_duration']), 129) # e.g. for max_duration 300 we have shape (150,129)
config['cnn']['input_shape'] = (100, 129)
#config['pyramidal_cnn']['input_shape'] = (int(config['max_duration']), 129)
config['pyramidal_cnn']['input_shape'] = (100, 129)
#config['inception']['input_shape'] = (int(config['max_duration']), 129)
config['inception']['input_shape'] = (100, 129)
#config['deepeye']['input_shape'] = (int(config['max_duration']), 129)
config['deepeye']['input_shape'] = (100, 129)
#config['xception']['input_shape'] = (int(config['max_duration']), 129)
config['xception']['input_shape'] = (100, 129)
if config['data_mode'] == 'fix_only':
config['cnn']['input_shape'] = (int(config['max_duration']), 129) # e.g. for max_duration 300 we have shape (150,129)
config['pyramidal_cnn']['input_shape'] = (int(config['max_duration']), 129)
config['inception']['input_shape'] = (int(config['max_duration']), 129)
config['deepeye']['input_shape'] = (int(config['max_duration']), 129)
config['xception']['input_shape'] = (int(config['max_duration']), 129)
elif config['data_mode'] == 'sacc_only':
config['cnn']['input_shape'] = (100, 129)
config['pyramidal_cnn']['input_shape'] = (100, 129)
config['inception']['input_shape'] = (100, 129)
config['deepeye']['input_shape'] = (100, 129)
config['xception']['input_shape'] = (100, 129)
elif config['data_mode'] == 'sacc_fix':
config['cnn']['input_shape'] = (100 + config['max_duration'], 129)
config['pyramidal_cnn']['input_shape'] = (100 + config['max_duration'], 129)
config['inception']['input_shape'] = (100 + config['max_duration'], 129)
config['deepeye']['input_shape'] = (100 + config['max_duration'], 129)
config['xception']['input_shape'] = (100 + config['max_duration'], 129)
else: # data mode is fix_sacc_fix
config['cnn']['input_shape'] = (100 + 2 * config['max_duration'], 129)
config['pyramidal_cnn']['input_shape'] = (100 + 2 * config['max_duration'], 129)
config['inception']['input_shape'] = (100 + 2 * config['max_duration'], 129)
config['deepeye']['input_shape'] = (100 + 2 * config['max_duration'], 129)
config['xception']['input_shape'] = (100 + 2 * config['max_duration'], 129)
#TODO: EEGnet not yet implemented for regression
......
......@@ -10,7 +10,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.13-final"
"version": "3.8.8-final"
},
"orig_nbformat": 2,
"kernelspec": {
......@@ -24,7 +24,7 @@
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
......@@ -49,7 +49,7 @@
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
......@@ -69,7 +69,7 @@
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
......@@ -99,7 +99,7 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
......@@ -109,7 +109,7 @@
},
{
"cell_type": "code",
"execution_count": 14,
"execution_count": 9,
"metadata": {},
"outputs": [
{
......@@ -120,7 +120,7 @@
]
},
"metadata": {},
"execution_count": 14
"execution_count": 9
}
],
"source": [
......@@ -129,18 +129,19 @@
},
{
"cell_type": "code",
"execution_count": 15,
"execution_count": 4,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(68229, 133)"
]
},
"metadata": {},
"execution_count": 15
"output_type": "error",
"ename": "NameError",
"evalue": "name '_data' is not defined",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-4-1a8d4e86a58a>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0m_data\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: name '_data' is not defined"
]
}
],
"source": [
......@@ -204,9 +205,7 @@
"cell_type": "code",
"execution_count": 20,
"metadata": {
"tags": [
"outputPrepend"
]
"tags": []
},
"outputs": [
{
......@@ -2147,7 +2146,117 @@
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
"source": [
" L_saccade = 'L_saccade'\n",
" L_fixation = 'L_fixation'\n",
" #L_blink = 'L_blink'\n",
" R_saccade = 'R_saccade'\n",
" R_fixation = 'R_fixation'\n",
" #R_blink = 'R_blink'\n",
"\n",
" fixations = [L_fixation, R_fixation]\n",
" saccades = [L_saccade, R_saccade]\n",
"\n",
" # Loop over all directories in /data/full_data and extract and concat the events from all people\n",
" rootdir = './data/full_data' # modify it if necessary \n",
"\n",
" x_list = []\n",
" y_list = []\n",
"\n",
" for subdir, dirs, files in os.walk(rootdir):\n",
" for file in files:\n",
" # Get the correct path to the current file\n",
" path = os.path.join(subdir, file)\n",
" events = load_sEEG_events(path) # access event i via events[i]\n",
" data = load_sEEG_data(path)\n",
" \n",
" # Extract X and y from sEEG.data and sEEG.events\n",
" for i in range(len(events)):\n",
" event = events[i]\n",
" event_name = event[0][0] # dereference the event name, e.g. 'L_saccade' \n",
" if event_name not in saccades:\n",
" continue # we first want a saccade \n",
" \n",
" # We have a saccade, check if the next one is a fixation and no blink inbetween\n",
" follow_event = events[i + 1]\n",
" follow_event_name = follow_event[0][0]\n",
" if follow_event_name not in fixations:\n",
" continue\n",
"\n",
" # Now we really have a saccade followed by a fixation \n",
" saccade = event\n",
" fixation = follow_event\n",
"\n",
" # Pad the saccade\n",
" saccade_start_time = int(saccade[1])\n",
" saccade_end_time = int(saccade[4]) \n",
"\n",
" saccade_datapoint = np.array(data[saccade_start_time:saccade_end_time])\n",
" x_len_sac, y_len_sac = saccade_datapoint.shape\n",
"\n",
" if x_len_sac < 10 or x_len_sac > 100:\n",
" continue\n",
"\n",
" saccade_padding_size = 100 - x_len_sac\n",
" if config['padding'] == 'zero':\n",
" saccade_datapoint = np.pad(saccade_datapoint, pad_width=((0,saccade_padding_size),(0,0)))\n",
" elif config['padding'] == 'repeat':\n",
" saccade_datapoint = np.pad(saccade_datapoint, pad_width=((0,saccade_padding_size),(0,0)), mode='reflect')\n",
" else:\n",
" raise Exception(\"Choose a valid padding scheme in config.py\")\n",
"\n",
" # Pad the fixation as usual \n",
" fixation_start_time = int(fixation[1])\n",
" fixation_end_time = int(fixation[4])\n",
" \n",
" fixation_datapoint = np.array(data[fixation_start_time:fixation_end_time])\n",
" x_len_fix, y_len_fix = fixation_datapoint.shape\n",
"\n",
" if x_len_fix < config['min_duration'] or x_len_fix > config['max_duration']:\n",
" continue \n",
"\n",
" # Pad the data\n",
" fixation_padding_size = config['max_duration'] - x_len_fix\n",
" if config['padding'] == 'zero':\n",
" fixation_datapoint = np.pad(fixation_datapoint, pad_width=((0,fixation_padding_size),(0,0)))\n",
" elif config['padding'] == 'repeat':\n",
" fixation_datapoint = np.pad(fixation_datapoint, pad_width=((0,fixation_padding_size),(0,0)), mode='reflect')\n",
" else:\n",
" raise Exception(\"Choose a valid padding scheme in config.py\")\n",
"\n",
" # Stack the saccade and fixation as one datapoint \n",
" x_datapoint = np.concatenate((saccade_datapoint, fixation_datapoint), axis=0)\n",
"\n",
" # Get the label as fixation average position \n",
" fix_avg_x = fixation[11]\n",
" fix_avg_y = fixation[12]\n",
" y_datapoint = np.array([fix_avg_x, fix_avg_y])\n",
"\n",
" # Append to X and y \n",
" x_list.append([x_datapoint])\n",
" y_list.append([y_datapoint])\n",
"\n",
" X = np.asarray(x_list)\n",
" y = np.asarray(y_list)\n",
"\n",
" if verbose:\n",
" logging.info(\"y training loaded.\")\n",
" logging.info(y.shape)\n",
" logging.info(\"X training loaded.\")\n",
" logging.info(X.shape)\n",
"\n",
" X_reshaped = np.transpose(X, (0,2,3,1))\n",
" # Cut off the last 4 columns (time, x, y, pupil size)\n",
" X_reshaped = X_reshaped[:,:,:129,:]\n",
" y_reshaped = np.transpose(y, (0,2,1,3,4))\n",
"\n",
" if verbose:\n",
" logging.info(\"Settings the shapes\")\n",
" logging.info(X_reshaped.shape)\n",
" logging.info(y_reshaped.shape)\n",
"\n",
" return X_reshaped, y_reshaped"
]
}
]
}
\ No newline at end of file
%% Cell type:code id: tags:
``` python
import numpy as np
import h5py
import logging
import scipy.io
from config import config
from tqdm import tqdm
from sklearn import preprocessing
import pandas as pd
import os
from tqdm import tqdm
```
%% Cell type:markdown id: tags:
## Define the functions to load the data from a single mat file of a single participant
%% Cell type:code id: tags:
``` python
def load_sEEG_events(abs_dir_path):
"""
Extracts the sEEG.event section of a participants mat file
Returns the events as a numpy array, accessible event after event (time series)
Filters out everything else, like participants pushing buttons
"""
f = scipy.io.loadmat(abs_dir_path)
sEEG = f['sEEG']
df = pd.DataFrame(sEEG[0])
events = df['event'][0][0] # dereferenced to obtain the fixation, saccade, blinks, ...
#print("Events shape: {}".format(events.shape))
return events # access the i-th event via events[i]
```
%% Cell type:code id: tags:
``` python
def load_sEEG_data(abs_dir_path):
"""
Returns the 133 channels of a participant
129 EEG channels plus 4 (time, x, y and pupil size)
Returns the data as a numpy array, accessible via time as first coefficient
"""
f = scipy.io.loadmat(abs_dir_path)
sEEG = f['sEEG']
df = pd.DataFrame(sEEG[0])
data = df['data'][0].T # transpose to access time series
#print("EEG data shape: {}".format(data.shape))
return data # access the i-th recorded sample via data[i], recordings at 2ms intervals
```
%% Cell type:markdown id: tags:
## Read out the data from the files
### We get the starttime, endtime, and other statistics from sEEG.event
### We get the EEG data from sEEG.data
### We have to synchronize via sEEG.event.latency, which is the starttime as sample number, and sEEG.data.endtime as endtime sample number
%% Cell type:code id: tags:
``` python
_events = load_sEEG_events('./data/full_data/AA7/AA7_WI1_EEG.mat') # access event i via events[i]
_data = load_sEEG_data('./data/full_data/AA7/AA7_WI1_EEG.mat')
```
%% Cell type:code id: tags:
``` python
_events.shape
```
%%%% Output: execute_result
(953,)
%% Cell type:code id: tags:
``` python
_data.shape
```
%%%% Output: execute_result
%%%% Output: error
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-4-1a8d4e86a58a> in <module>
----> 1 _data.shape
(68229, 133)
NameError: name '_data' is not defined
%% Cell type:code id: tags:
``` python
_event = _events[2]
_event[12]
```
%%%% Output: execute_result
array([[282.9]])
%% Cell type:code id: tags:
``` python
x, y = _data[4927:4937].shape
```
%% Cell type:code id: tags:
``` python
# Define the keywords for the events that we look for
L_saccade = 'L_saccade'
L_fixation = 'L_fixation'
L_blink = 'L_blink'
R_saccade = 'R_saccade'
R_fixation = 'R_fixation'
R_blink = 'R_blink'
fixations = [L_fixation, R_fixation]
saccades = [L_saccade, R_saccade]
# Define what to extract from the data
#mode = 'sacc_only'
mode = 'sacc_fix'
#mode = 'fix_sacc_fix'
```
%% Cell type:code id: tags:outputPrepend
%% Cell type:code id: tags:
``` python
# Loop over all directories in /data/full_data and extract and concat the events from all people
rootdir = './data/full_data' # modify it if necessary
x_list = []
y_list = []
for subdir, dirs, files in os.walk(rootdir):
for file in files:
# Get the correct path to the current file
path = os.path.join(subdir, file)
events = load_sEEG_events(path) # access event i via events[i]
data = load_sEEG_data(path)
# Extract X and y from sEEG.data and sEEG.events
for i in range(len(events)):
event = events[i]
event_name = event[0][0] # dereference the event name, e.g. 'L_saccade'
if event_name not in saccades:
continue # we first want a saccade
# We have a saccade, check if the next one is a fixation and no blink inbetween
follow_event = events[i + 1]
follow_event_name = follow_event[0][0]
if follow_event_name not in fixations:
continue
# Now we really have a saccade followed by a fixation
saccade = event
fixation = follow_event
# Pad the saccade
saccade_start_time = int(saccade[1])
saccade_end_time = int(saccade[4])
saccade_datapoint = np.array(data[saccade_start_time:saccade_end_time])
x_len_sac, y_len_sac = saccade_datapoint.shape
if x_len_sac < 10 or x_len_sac > 100:
continue
saccade_padding_size = 100 - x_len_sac
if config['padding'] == 'zero':
saccade_datapoint = np.pad(saccade_datapoint, pad_width=((0,saccade_padding_size),(0,0)))
elif config['padding'] == 'repeat':
saccade_datapoint = np.pad(saccade_datapoint, pad_width=((0,saccade_padding_size),(0,0)), mode='reflect')
else:
raise Exception("Choose a valid padding scheme in config.py")
# Pad the fixation as usual
fixation_start_time = int(fixation[1])
fixation_end_time = int(fixation[4])
fixation_datapoint = np.array(data[fixation_start_time:fixation_end_time])
x_len_fix, y_len_fix = fixation_datapoint.shape
if x_len_fix < config['min_duration'] or x_len_fix > config['max_duration']:
continue
# Pad the data
fixation_padding_size = config['max_duration'] - x_len_fix
if config['padding'] == 'zero':
fixation_datapoint = np.pad(fixation_datapoint, pad_width=((0,fixation_padding_size),(0,0)))
elif config['padding'] == 'repeat':
fixation_datapoint = np.pad(fixation_datapoint, pad_width=((0,fixation_padding_size),(0,0)), mode='reflect')
else:
raise Exception("Choose a valid padding scheme in config.py")
# Stack the saccade and fixation as one datapoint
x_datapoint = np.concatenate((saccade_datapoint, fixation_datapoint), axis=0)
# Get the label as fixation average position
fix_avg_x = fixation[11]
fix_avg_y = fixation[12]
y_datapoint = np.array([fix_avg_x, fix_avg_y])
# Append to X and y
x_list.append([x_datapoint])
y_list.append([y_datapoint])
X = np.asarray(x_list)
y = np.asarray(y_list)
X_reshaped = np.transpose(X, (0,2,3,1))
# Cut off the last 4 columns (time, x, y, pupil size)
X_reshaped = X_reshaped[:,:,:129,:]
y_reshaped = np.transpose(y, (0,2,1,3,4))
```
%%%% Output: stream
)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)
(100, 133)
(150, 133)