From 271e7575694026ab7557253a52f7866828b740e6 Mon Sep 17 00:00:00 2001
From: tgupta6 <tgupta6@illinois.edu>
Date: Sun, 20 Mar 2016 19:29:32 -0500
Subject: [PATCH] adding code for answer classifier and region ranker

---
 classifiers/__init__.py                       |   0
 classifiers/answer_classifier/__init__.py     |   0
 classifiers/answer_classifier/__init__.pyc    | Bin 0 -> 116 bytes
 .../answer_classifier/ans_data_io_helper.py   | 129 ++++++++++++++++
 .../answer_classifier/ans_data_io_helper.pyc  | Bin 0 -> 4181 bytes
 .../answer_classifier/train_ans_classifier.py | 141 ++++++++++++++++++
 .../#obj_data_io_helper.py#                   |  82 ++++++++++
 .../.#obj_data_io_helper.py                   |   1 +
 .../train_obj_classifier.pyc                  | Bin 3318 -> 3318 bytes
 classifiers/region_ranker/__init__.py         |   0
 classifiers/region_ranker/__init__.pyc        | Bin 0 -> 112 bytes
 classifiers/region_ranker/perfect_ranker.py   |  53 +++++++
 classifiers/region_ranker/perfect_ranker.pyc  | Bin 0 -> 1767 bytes
 classifiers/saved_models/obj_atr_classifier-1 | Bin 0 -> 56054 bytes
 classifiers/tf_graph_creation_helper.py       |  91 +++++++++--
 classifiers/tf_graph_creation_helper.pyc      | Bin 5656 -> 7351 bytes
 classifiers/train_classifiers.py              |  10 +-
 17 files changed, 491 insertions(+), 16 deletions(-)
 create mode 100644 classifiers/__init__.py
 create mode 100644 classifiers/answer_classifier/__init__.py
 create mode 100644 classifiers/answer_classifier/__init__.pyc
 create mode 100644 classifiers/answer_classifier/ans_data_io_helper.py
 create mode 100644 classifiers/answer_classifier/ans_data_io_helper.pyc
 create mode 100644 classifiers/answer_classifier/train_ans_classifier.py
 create mode 100644 classifiers/object_classifiers/#obj_data_io_helper.py#
 create mode 120000 classifiers/object_classifiers/.#obj_data_io_helper.py
 create mode 100644 classifiers/region_ranker/__init__.py
 create mode 100644 classifiers/region_ranker/__init__.pyc
 create mode 100644 classifiers/region_ranker/perfect_ranker.py
 create mode 100644 classifiers/region_ranker/perfect_ranker.pyc
 create mode 100644 classifiers/saved_models/obj_atr_classifier-1

diff --git a/classifiers/__init__.py b/classifiers/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/classifiers/answer_classifier/__init__.py b/classifiers/answer_classifier/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/classifiers/answer_classifier/__init__.pyc b/classifiers/answer_classifier/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..26ca6f25daa06ab1bd8e4f8ada822c375fc9f4e5
GIT binary patch
literal 116
zcmZSn%*(}}{x&R`0SXv_v;z<qvjB+{28Lh_kcgiKkYGR~ie-UfiFw84sYUV0If=!^
nnQ57+Mf&manR%Hd@$q^El_eZN6*jr~DWy57b|7<#ftUdRGJ+Ml

literal 0
HcmV?d00001

diff --git a/classifiers/answer_classifier/ans_data_io_helper.py b/classifiers/answer_classifier/ans_data_io_helper.py
new file mode 100644
index 0000000..71b3760
--- /dev/null
+++ b/classifiers/answer_classifier/ans_data_io_helper.py
@@ -0,0 +1,129 @@
+import json
+import sys
+import os
+import matplotlib.pyplot as plt
+import matplotlib.image as mpimg
+import numpy as np
+import tensorflow as tf
+from scipy import misc
+from collections import namedtuple
+import region_ranker.perfect_ranker as region_proposer
+
+
+qa_tuple = namedtuple('qa_tuple','image_id question answer')
+
+
+def create_ans_dict():
+    ans_dict = {
+        'yes'      : 0,
+        'no'       : 1,
+        'red'      : 2,
+        'green'    : 3,
+        'blue'     : 4,
+        'circle'   : 5,
+        'rectangle': 6,
+        'triangle' : 7,
+    }
+    
+    for i in range(0,10):
+        ans_dict[str(i)] = 8+i
+        
+    inv_ans_dict = {v: k for k, v in ans_dict.items()}
+
+    return ans_dict, inv_ans_dict
+
+
+def parse_qa_anno(json_filename):
+    with open(json_filename,'r') as json_file:
+        raw_data = json.load(json_file)
+
+    qa_dict = dict()
+    for entry in raw_data:
+        qa_dict[entry['question_id']] = qa_tuple(image_id = entry['image_id'],
+                                                 question = entry['question'],
+                                                 answer = entry['answer'])
+    return qa_dict
+                                                 
+
+def get_vocab(qa_dict):
+    vocab = dict()
+    count = 0;
+    for key, value in qa_dict.items():
+        for word in value.question[0:-1].split():
+            if word.lower() not in vocab:
+                vocab[word.lower()] = count
+                count = count + 1
+
+        if value.answer.lower() not in vocab:
+            vocab[value.answer.lower()] = count
+            count = count + 1
+
+    vocab['unk'] = count
+    inv_vocab = {v: k for k, v in vocab.items()}
+
+    return vocab, inv_vocab
+        
+def ans_mini_batch_loader(qa_dict, region_anno_dict, ans_dict, vocab, 
+                          image_dir, mean_image, start_index, batch_size, 
+                          img_height=100, img_width=100, channels = 3):
+    
+    # compute the number of proposals 
+    count = 0;
+    for i in xrange(start_index, start_index + batch_size):
+        count = count + len(region_anno_dict[qa_dict[i].image_id])
+
+    region_images = np.empty(shape=[count, img_height, 
+                                    img_width, channels])
+    
+    ans_labels = np.zeros(shape=[count, len(ans_dict)])
+    question_encodings = np.zeros(shape=[count, len(vocab)])
+
+    counter = 0
+    for i in xrange(start_index, start_index + batch_size):
+        image_id = qa_dict[i].image_id
+        question = qa_dict[i].question
+        answer = qa_dict[i].answer
+        region_coords = region_anno_dict[image_id]
+        image = mpimg.imread(os.path.join(image_dir, str(image_id) + '.jpg'))
+        regions = region_proposer.rank_regions(image, question, region_coords)
+        for _, proposal in regions.items():
+            resized_region = misc.imresize(proposal.image, \
+                                           (img_height, img_width))
+            region_images[counter,:,:,:] = (resized_region / 254.0) - mean_image
+            ans_labels[counter, ans_dict[answer]] = 1
+
+            for word in question[0:-1].split():
+                if word not in vocab:
+                    word = 'unk'
+                question_encodings[counter, vocab[word]] += 1 
+
+            counter = counter + 1
+
+    return region_images, ans_labels, question_encodings
+
+    
+if __name__=='__main__':
+    train_anno_filename = '/home/tanmay/Code/GenVQA/GenVQA/' + \
+                          'shapes_dataset/train_anno.json'
+
+    region_anno_filename = '/home/tanmay/Code/GenVQA/GenVQA/' + \
+                           'shapes_dataset/regions_anno.json'
+
+    image_dir = '/home/tanmay/Code/GenVQA/GenVQA/' + \
+                'shapes_dataset/images'
+
+
+    qa_anno_dict = parse_qa_anno(train_anno_filename)
+    region_anno_dict = region_proposer.parse_region_anno(region_anno_filename)
+    ans_dict, _ = create_ans_dict()
+    vocab, _ = get_vocab(qa_anno_dict)
+    
+    
+    region_images, ans_labels, question_encodings = \
+        ans_mini_batch_loader(qa_anno_dict, region_anno_dict, ans_dict, vocab,
+                              image_dir, None, 1, 2, 25, 25, 3)
+
+    print(ans_labels.shape)
+    print(question_encodings.shape)
+    print(region_images.shape)
+    
diff --git a/classifiers/answer_classifier/ans_data_io_helper.pyc b/classifiers/answer_classifier/ans_data_io_helper.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d03abbe8c016b6f922bcc5fb29c71faa48cdc2b8
GIT binary patch
literal 4181
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
F{{gVgVe$X~

literal 0
HcmV?d00001

diff --git a/classifiers/answer_classifier/train_ans_classifier.py b/classifiers/answer_classifier/train_ans_classifier.py
new file mode 100644
index 0000000..10d7f9a
--- /dev/null
+++ b/classifiers/answer_classifier/train_ans_classifier.py
@@ -0,0 +1,141 @@
+import sys
+import os
+import json
+import matplotlib.pyplot as plt
+import matplotlib.image as mpimg
+import numpy as np
+import tensorflow as tf
+import object_classifiers.obj_data_io_helper as obj_data_loader
+import attribute_classifiers.atr_data_io_helper as atr_data_loader
+import tf_graph_creation_helper as graph_creator
+import plot_helper as plotter
+import ans_data_io_helper as ans_io_helper
+import region_ranker.perfect_ranker as region_proposer 
+
+def train(train_params):
+    sess = tf.InteractiveSession()
+    
+    train_anno_filename = '/home/tanmay/Code/GenVQA/GenVQA/' + \
+                          'shapes_dataset/train_anno.json'
+
+    regions_anno_filename = '/home/tanmay/Code/GenVQA/GenVQA/' + \
+                           'shapes_dataset/regions_anno.json'
+    
+    image_dir = '/home/tanmay/Code/GenVQA/GenVQA/' + \
+                'shapes_dataset/images'
+
+    outdir = '/home/tanmay/Code/GenVQA/Exp_Results/Ans_Classifier'
+    if not os.path.exists(outdir):
+        os.mkdir(outdir)
+
+    qa_anno_dict = ans_io_helper.parse_qa_anno(train_anno_filename)
+    region_anno_dict = region_proposer.parse_region_anno(regions_anno_filename)
+    ans_vocab, inv_ans_vocab = ans_io_helper.create_ans_dict()
+    vocab, inv_vocab = ans_io_helper.get_vocab(qa_anno_dict)
+
+    # Create graph
+    image_regions, questions, keep_prob, y = \
+        graph_creator.placeholder_inputs_ans(len(vocab), len(ans_vocab), 
+                                             mode='gt')
+    y_pred_obj = graph_creator.obj_comp_graph(image_regions, keep_prob)
+    obj_feat = tf.get_collection('obj_feat', scope='obj/conv2')
+    y_pred_atr = graph_creator.atr_comp_graph(image_regions, keep_prob, obj_feat[0])
+    atr_feat = tf.get_collection('atr_feat', scope='atr/conv2')
+
+    # model restoration
+    obj_atr_saver = tf.train.Saver()
+    model_to_restore = '/home/tanmay/Code/GenVQA/GenVQA/classifiers/' + \
+                       'saved_models/obj_atr_classifier-1'
+    obj_atr_saver.restore(sess, model_to_restore)
+
+    y_pred = graph_creator.ans_comp_graph(image_regions, questions, keep_prob, \
+                             obj_feat[0], atr_feat[0], 
+                             vocab, inv_vocab, len(ans_vocab))
+    cross_entropy = graph_creator.loss(y, y_pred)
+    accuracy = graph_creator.evaluation(y, y_pred)
+    
+    # Collect variables
+    vars_to_opt = tf.get_collection(tf.GraphKeys.VARIABLES, scope='ans')
+    train_step = tf.train.AdamOptimizer(train_params['adam_lr']) \
+                         .minimize(cross_entropy, var_list=vars_to_opt)
+    
+    vars_to_restore = []
+    vars_to_restore.append(tf.get_collection(tf.GraphKeys.VARIABLES, 
+                                             scope='obj'))
+    vars_to_restore.append(tf.get_collection(tf.GraphKeys.VARIABLES, 
+                                             scope='atr'))
+    all_vars = tf.get_collection(tf.GraphKeys.VARIABLES)
+    vars_to_init = [var for var in all_vars if var not in vars_to_restore]
+
+    # Session saver
+    saver = tf.train.Saver()
+        
+    # Initializing all variables except those restored
+    print('Initializing variables')
+    sess.run(tf.initialize_variables(vars_to_init))
+
+    # Load mean image
+    mean_image = np.load('/home/tanmay/Code/GenVQA/Exp_Results/' + \
+                         'Obj_Classifier/mean_image.npy')
+
+    # Val data
+    val_region_images, val_ans_labels, val_questions = \
+        ans_io_helper.ans_mini_batch_loader(qa_anno_dict, region_anno_dict, 
+                                            ans_vocab, vocab, image_dir, 
+                                            mean_image, 9501, 499, 
+                                            25, 25, 3)
+    feed_dict_val = {
+        image_regions : val_region_images, 
+        questions: val_questions,
+        keep_prob: 1.0,
+        y: val_ans_labels,        
+    }
+
+    
+    # Start Training
+    batch_size = 10
+    max_epoch = 10
+    max_iter = 950
+    val_acc_array_epoch = np.zeros([max_epoch])
+    train_acc_array_epoch = np.zeros([max_epoch])
+    for epoch in range(max_epoch):
+        for i in range(max_iter):
+            if i%100==0:
+                print('Iter: ' + str(i))
+                print('Val Acc: ' + str(accuracy.eval(feed_dict_val)))
+
+            train_region_images, train_ans_labels, train_questions = \
+            ans_io_helper.ans_mini_batch_loader(qa_anno_dict, region_anno_dict, 
+                                                ans_vocab, vocab, image_dir, 
+                                                mean_image, 1+i*batch_size, 
+                                                batch_size, 25, 25, 3)
+            feed_dict_train = {
+                image_regions : train_region_images, 
+                questions: train_questions,
+                keep_prob: 1.0,
+                y: train_ans_labels,        
+            }
+            _, current_train_batch_acc = sess.run([train_step, accuracy], 
+                                                  feed_dict=feed_dict_train)
+            train_acc_array_epoch[epoch] = train_acc_array_epoch[epoch] + \
+                                           current_train_batch_acc
+
+        train_acc_array_epoch[epoch] = train_acc_array_epoch[epoch] / max_iter
+        val_acc_array_epoch[epoch] = accuracy.eval(feed_dict_val)
+        plotter.plot_accuracies(xdata=np.arange(0, epoch + 1) + 1, 
+                                ydata_train=train_acc_array_epoch[0:epoch + 1], 
+                                ydata_val=val_acc_array_epoch[0:epoch + 1], 
+                                xlim=[1, max_epoch], ylim=[0, 1.0], 
+                                savePath=os.path.join(outdir, 
+                                                      'acc_vs_epoch.pdf'))
+        save_path = saver.save(sess, os.path.join(outdir, 'ans_classifier'), 
+                               global_step=epoch)
+
+    sess.close()
+    tf.reset_default_graph()
+    
+if __name__=='__main__':
+    train_params = {
+        'adam_lr' : 0.001,
+    }
+    train(train_params)
diff --git a/classifiers/object_classifiers/#obj_data_io_helper.py# b/classifiers/object_classifiers/#obj_data_io_helper.py#
new file mode 100644
index 0000000..16280b4
--- /dev/null
+++ b/classifiers/object_classifiers/#obj_data_io_helper.py#
@@ -0,0 +1,82 @@
+import json
+import sys
+import os
+import matplotlib.pyplot as plt
+import matplotlib.image as mpimg
+import numpy as np
+import tensorflow as tf
+from scipy import misc
+
+def obj_mini_batch_loader(json_data, image_dir, mean_image, start_index, batch_size, img_height = 100, img_width = 100, channels = 3):
+
+    obj_images = np.empty(shape=[9 * batch_size, img_height / 3, img_width / 3, channels])
+    obj_labels = np.zeros(shape=[9 * batch_size, 4])
+
+    for i in range(start_index, start_index + batch_size):
+        image_name = os.path.join(image_dir, str(i) + '.jpg')
+        image = misc.imresize(mpimg.imread(image_name), (img_height, img_width), interp='nearest')
+        crop_shape = np.array([image.shape[0], image.shape[1]]) / 3
+        grid_config = json_data[i]
+
+        counter = 0
+        for grid_row in range(0, 3):
+            for grid_col in range(0, 3):
+                start_row = grid_row * crop_shape[0]
+                start_col = grid_col * crop_shape[1]
+                cropped_image = image[start_row:start_row + crop_shape[0], start_col:start_col + crop_shape[1], :]
+
+                if np.ndim(mean_image) == 0:
+                    obj_images[9 * (i - start_index) + counter, :, :, :] = cropped_image / 254.0
+                else:
+                    obj_images[9 * (i - start_index) + counter, :, :, :] = (cropped_image / 254.0) - mean_image
+
+                obj_labels[9 * (i - start_index) + counter, grid_config[6 * grid_row + 2 * grid_col]] = 1
+                counter = counter + 1
+
+    return (obj_images, obj_labels)
+
+
+def mean_image_batch(json_data, image_dir, start_index, batch_size, img_height = 100, img_width = 100, channels = 3):
+    batch = obj_mini_batch_loader(json_data, image_dir, np.empty([]), start_index, batch_size, img_height, img_width, channels)
+    mean_image = np.mean(batch[0], 0)
+    return mean_image
+
+
+def mean_image(json_data, image_dir, num_images, batch_size, img_height = 100, img_width = 100, channels = 3):
+    max_iter = np.floor(num_images / batch_size)
+    mean_image = np.zeros([img_height / 3, img_width / 3, channels])
+    for i in range(max_iter.astype(np.int16)):
+        mean_image = mean_image + mean_image_batch(json_data, image_dir, 1 + i * batch_size, batch_size, img_height, img_width, channels)
+
+    mean_image = mean_image / max_iter
+    return mean_image
+
+
+class html_obj_table_writer:
+
+    def __init__(self, filename):
+        self.filename = filename
+        self.html_file = open(self.filename, 'w')
+        self.html_file.write('<!DOCTYPE html>\n<html>\n<body>\n<table border="1" style="width:100%"> \n')
+
+    def add_element(self, col_dict):
+        self.html_file.write('    <tr>\n')
+        for key in range(len(col_dict)):
+            self.html_file.write('    <td>{}</td>\n'.format(col_dict[key]))
+
+        self.html_file.write('    </tr>\n')
+
+    def image_tag(self, image_path, height, width):
+        return '<img src="{}" alt="IMAGE NOT FOUND!" height={} width={}>'.format(image_path, height, width)
+
+    def close_file(self):
+        self.html_file.write('</table>\n</body>\n</html>')
+        self.html_file.close()
+
+
+if __name__ == '__main__':
+    html_writer = html_obj_table_writer('/home/tanmay/Code/GenVQA/Exp_Results/Shape_Classifier_v_1/trial.html')
+    col_dict = {0: 'sam',
+     1: html_writer.image_tag('something.png', 25, 25)}
+    html_writer.add_element(col_dict)
+    html_writer.close_file()
diff --git a/classifiers/object_classifiers/.#obj_data_io_helper.py b/classifiers/object_classifiers/.#obj_data_io_helper.py
new file mode 120000
index 0000000..8c52df0
--- /dev/null
+++ b/classifiers/object_classifiers/.#obj_data_io_helper.py
@@ -0,0 +1 @@
+tanmay@crunchy.15752:1450461082
\ No newline at end of file
diff --git a/classifiers/object_classifiers/train_obj_classifier.pyc b/classifiers/object_classifiers/train_obj_classifier.pyc
index ade9078d1c8faa943b94a78edd7d8a3f03589eaf..b03422c5963b73ccb531ea7d02982f1893120892 100644
GIT binary patch
delta 15
Wcmew+`Aw3I`7<w9TIfc$4?F-b=>?zw

delta 15
Wcmew+`Aw3I`7<w<vHwQ44?F-anFVJ6

diff --git a/classifiers/region_ranker/__init__.py b/classifiers/region_ranker/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/classifiers/region_ranker/__init__.pyc b/classifiers/region_ranker/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8c2e503016fdd3a445acd9aaba36ac4fed1a1924
GIT binary patch
literal 112
zcmZSn%*!R8{x&R`0SXv_v;z<qvjB+{28Lh_kcgiKkYGR~iY0+!MXBkT`FZh0iFw(n
jMf&manR%Hd@$q^El_eZNS)1Jal+v73JCGU0K+FID%u5s)

literal 0
HcmV?d00001

diff --git a/classifiers/region_ranker/perfect_ranker.py b/classifiers/region_ranker/perfect_ranker.py
new file mode 100644
index 0000000..737dfad
--- /dev/null
+++ b/classifiers/region_ranker/perfect_ranker.py
@@ -0,0 +1,53 @@
+import json
+import os
+import numpy as np
+from collections import namedtuple
+import matplotlib.pyplot as plt
+import matplotlib.image as mpimg
+from scipy import misc
+region = namedtuple('region','image score coord')
+
+def parse_region_anno(json_filename):
+    with open(json_filename,'r') as json_file:
+        raw_data = json.load(json_file)
+
+    region_anno_dict = dict()
+    for entry in raw_data:
+        region_anno_dict[entry['image_id']] = entry['regions']
+        
+    return region_anno_dict
+        
+        
+def rank_regions(image, question, region_coords):
+    regions = dict()
+    count = 1;
+    for key in region_coords:
+        x1, y1, x2, y2 = region_coords[key]
+        cropped_image = image[y1-1:y2, x1-1:x2, :]
+
+        if key in question:
+            score = 1
+        else:
+            score = 0
+
+        regions[count] = region(image=cropped_image, score=score, 
+                                coord=region_coords[key])
+        count = count + 1
+
+    return regions
+
+
+if __name__=='__main__':
+    image_dir = '/home/tanmay/Code/GenVQA/GenVQA/shapes_dataset/images/'
+
+    json_filename = os.path.join('/home/tanmay/Code/GenVQA/GenVQA/',
+                                 'shapes_dataset/regions_anno.json')
+    region_anno_dict = parse_region_anno(json_filename)
+
+    image_id = 1
+    question = 'Is there a blue triangle?'
+    region_coords = region_anno_dict[image_id]
+    image = mpimg.imread(os.path.join(image_dir, str(image_id) + '.jpg'))
+    regions = rank_regions(image, question, region_coords)
+    print(regions)
+
diff --git a/classifiers/region_ranker/perfect_ranker.pyc b/classifiers/region_ranker/perfect_ranker.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..04058d905a9d6519d32eafa0d15668d4dd4f9191
GIT binary patch
literal 1767
zcmb7EOK&4Z5dM1nh+lbc9)=)%^o3aL0WJ{_Ez-gz(#}d7Gy;ug-5qC~d1bmSV##wd
zoDoNU1;307`~aw`aW)aBWggYlJyq2;-&fU*zqflgfBpGpip|xc@hf`mfdVu=3JDOr
z(-i{su<jvfi0&b2B5fgPL2Z26m~SEIJeYPd?;+^Rw1H%RbQ{4olxaaXp<7r}upQ_&
zex}`ap|?cYgV~4f;MPOAqjVR+0gS@@5c6lyJ?OqT9>MIw9AQn_9YYTgoIukCr!dDb
zCm04pm_FtoJUSZ+^dWyEAH9PU+Mm69FtjI0avfsbKyU_ghL_)F0>$g`E@2b@L)Yb)
z0D|k0$fDF}w<r=*uQh2cjqTL6Nh!@N&NI7DYMe$hGqTgXG^1&rmwL(}7;!dyL9e|c
z;eeIwMmha@j7q`LFMC)iPO<WEMHs*O-ZiiWss`>ySb6y7$5T{ItO!jH!&O7H28I`R
zpW}+Aug9F$C557#+!o6^GuI(qQVU}(Mvg7>!epY%ZC)!$9%)(8@zjkuZMRK=zlYax
zVi*S3eYzr{%jl<2M=o-E^r_x6jIt~bIgH~lv{AVnlL8U;<440X%5F_LDNK27rY@|f
z=f%=7o<&qz6Fv#aWY_@-r~`H6b=9^y_NEP*^CG7vApb!Mfn1|U1x~Qt|6XJG8>$v-
zs}_boG*PutZK3L*>M|#*E$)ZYRTsaINxPnOctVWOL&`NlUiH|Y=(=qa)NEDtk&(H_
z3NfIG9V%X8i#p=nerq&p+Af$xg%ir_?s!8USIA||<i+$ta1+u*lbRAu>T2wfiO>J*
zvo_|x_Zfa6<ZfZCqnZ@<Ht30)^_lohm__EO!hl<|bR6XVQyG@^aR0oXJ(nQUGA|0F
zLrKVIYW^pioFH?%A=4hw+@6wv>Z&%=s6O!qs_V7A1GTSqJo%9@OrtmpL;D#SPHytl
zOk9+u(Q@)4*Jkq4WN%)5{V>>@s4!M4(Hb|ARPDr$-p7@V{^P%C9;xJWZUN!O4$1O6
zJ90OMdORAvO%`V4$~ekqiTTnpyyx>`HvWhdpL<YH%&lOaEmA6M#yTrppN46kBvkc$
zeE2kl6nz@GBFSA6zoj-{O-`AO%7hh(lU93TSo0zU!2OmMaXQ=7O<XK}t|}=MpHDac
zjKl_CZs{<Trj{7gv!xsXMdWVk(;<&DpZm_|v%u%@{vnHJBqX&sEe#zUoSJo|l-Of+
vynn-Y$p0eE^&&A}aKe^d2a4}KwM#ciuiNh)4pf^<MGd?*l}=BM=`8pc&0}$`

literal 0
HcmV?d00001

diff --git a/classifiers/saved_models/obj_atr_classifier-1 b/classifiers/saved_models/obj_atr_classifier-1
new file mode 100644
index 0000000000000000000000000000000000000000..42cdbdeee4258628b462858e974530aa66833168
GIT binary patch
literal 56054
zcma&N2UHcyvOg?2=O{^XQnJXNneIVQ3?PaTL_h&W#f*rGi6}WJK|nw<DoT>Hdryyw
z2nYhA7)U0}0WpiBew=&HdH3A=-M8L<&Dv}4JzdpR)!kFwzp9!kQwl}J^F_s{i%a+h
z2U+;<*dAhK;Vv&L&o3(U=SN`jTTqoxS5$n;pO>Y$?B9qj9M=18`#(6W#pVB#W3AQy
z!87&mD*4F^{;3B4q!L<xSHSO|3jDoY`|slZ**+=m?-YNt*ZNO;|FH8PwoZPF{%`h9
z693EI|DEG+_Ws53r@j9>&)@8|w)m&Lf2i>v_D(ka%ih1*|7P!B?SI<)7lp34)E^TN
z;6FLLYbSrni^&U!#{R?HNg0Cwm{_BKj@tjw{8P?<Av6(J{I|~jK{zS!zmWc$+#P;_
z|BdF~<WAE3zsdcJ@W0Dd5f}SQ#eZKq8sgIb)9|l>{9}FpZJ_@cg8#Z~6vQR`HU#@x
zt=+j}?}i}xDU)nd#Q(f${ckrX7uX*f{=Yp?lT-gM;(yooZ~gq=3-xdP{QsAb*dHSP
zF}eS35+(=iul9daVDe$$o1%I{Y|0;__NO&d`1l0Fj{NhI?-Kj_bLuYtKW;+pf|zNw
zSck|nEc_xC*N5jp!+JH=ab!O2(5nRZl(tZrUd7n(j36$3zXyNZ5rgMSB+<{Bo8a|#
za_|`ifQot?OGWOW3)gqRmUKH@)UXP4>W?yt^A@w|d)Kqc-C=NZS`uTXQi`3mr_e38
z6krs;7gWgfhXSc3_|ZNkdUwNmR**b~^Cd^|nw<gk<#Z$LP$!T5o#W^xqbm5IdkjXz
z1Ntaen6-^oriD*MGo{+&IKJ1IWo@jW;oC?!D{&!yGtmdvo=(6c3MTL{{R^H6wq;$E
zC0Vr?WmfTZ7?xkR4!^QpK=;eNq#TpCLz+HHXC6yu46r8sFzPcr@~a4>ybuDtA^_&x
zD#7B`Pq2-}XPEOvfW7y6E-SHPA1yj_1{-LR2aC5iKpB2VS}w2;3#$skU!NDU7hcQ-
zhK?nW*O7_WN@Bc9N{s&OsLVPcRa)GC3GHz{1<Eet!xsE+;O^zlxba&pHksi>ciE)F
z!V*txB#}X%2;ajtCOOhCZI{BBL>1O2N}Yak?JJ&7g}~%mL-uNfBAvDYLBot=xOHV5
zeM{&bwoi=%ZbQ=a*zKpd`_3D@Z*MGFY9ogG?3RF^N5tvlcV*ea2Y&3!l0EcHC6Zmv
z*@9mv{)SUpbZHNrZ2Ycr6#EbPVBOz7?D1*ya6s7%d~E4qR_Nnl-ilS-*lAi2ND^rW
zZ5lMaD943$YnP+nd_9YwP1VOQc=|N|SuXTBK7%fy^y#`Aj@Y>~8XEPrGgmGhgj08m
zvG)Wdz^#5UI8QkjZ*Z}tpWa`O{leOLr=IZ92i?Nhl=Z@NSKv`v-FP-kM8~m%s2N?-
z2-xdE`uLQ03!IRs#f(D{v}x&s@l6jg-?V$c$V-Hlm;&%|M-s&E;DN?N2=AL56Sdm8
zuukqW-e)GjnwNcoy|MmyU-%Q|?#(0g=3`&s=4^A&|FnhbH>k!ZgSFV9<&Us;;%9h4
zUx2;&IE=2Z`;K=wOVGRH9zx!YB5K_34sKiZ6F-@EhDo`v!y56gr#~ddgN5hL;f~0Y
zaF#j5hk7(=UH|3qbfE}qp$*vb?iQGEI3M$w?7}9l>U7MiP8^vr4<augcw$-!UW{#M
z=Wh=5hiMD&^@Jwa{Obe`p&4u&3fN3?F8$GY5dS=GgY&iR=|`=z*byHSde;3y$k`bP
zdS~szZ;359H82jYDL}ZUP!i|K9A;+Rt%3csI$-$yB$yI&oX%UE2sf&hVbu*?IDF+X
zxMj%?oPW!Z%@)+8ZQT{w<;tP#kLFRJyfl}`cc>EI*pf(>996}tGKQ>2`7CzJZ$CIw
zJ`*17lc&XNKY`pCEAYr}iXQr|&Gs=K^oo^AV4spF^Cb5?zHs{)zHOX<M{mTlk<#n&
z&vQAva;(gLmEH$?t8d`t117X9k3$Q!4PpKRYw&TaTCDfbj9nhwfV)Z)VX06&F6Nuc
zp8k3V-V!~Ij9bNlncHjdqc;<mKfS;NcdM~VM=oI54c4sWyUS2g?zY%J_Jx0QayP~P
ze&YD^2=E`CE<jooz1nBOaoK$nwQin9ByF@n4<mGt`K%0X=)z`B?sRW%;(kHy^h|5=
z0xQiM{-KQm!|jNr*UutlJ&UIC<qpV%)I`m#Gn<ZGn8o!uQOym@t8P4&xrZ$Fo5l+u
zEfMM3Pvl)qLtDp^xjwh&p{nO1D78?SICo`;Yd7;5_kA2o%ooTYH)_o05eKFr*V37!
z$K4XtFCm0F6(EvKV7Z!JR)j&I8j@S~jC;3q4LQg=PQF>YnAa(wfP~w3kp=fLQl32%
z8Tv0ooytkvAHbC$Gf1>}Pd`_EdK`&-lSs{w)jZ0bLWQG4O-H|6Lx6uHkz2ABJ+PU9
zJ}<50&VFP@D2eN%kNwNIQL;10BjfMT&m-<=>l_pA$)O6gCQ-C0+%FV$_gkY`y0Tmw
zHxX{R5J1NyW4JrSf=P*KN<4?-%aN9GCgFSGI68Ue6jy!p5L)1*h~}*v=0r-~<ZeE{
z5M_ShCvH?^lbT_+ybIBeNXgoU%t<(gq_H>>k=TMfel~JfK3hgyT(5?LUoSvFfFz&o
zEF`N|IPqfrOwppkJtX&48j>ic(D}pL(B^gr?&TY?#GFz)WM@tw2cHD8J-d`VpSGB1
zk2WLWwiK>NUJug08%C^Kk%VkbT#<mvQ*P(&6~wx}L&%_t!&TYzo7j1RLCYp0(UFDa
zTt}UH^oy0`eyGny*KRICjXTzJ*LSIK=Xb}V?HZxnjB88CyJGT_-f%aHIOk8CU73#@
zx;nTYWltcbAXTKnmEkNp%5Zy4k0QNC3`ajWmejB{<!SK+A_XHG@~B@j`e;54iN+?O
zJ$Ea)G42mIZFSOUhI=G>SfEDkR!kvxej<5i^Ig%)`a@*(+Bno`>Wb8#MIcR8bM9UZ
zQzEgz61BVTLb1Ll$X9Dp$zQf}dEF^7Xoj#5_qo~yWc%X~=hBfPRP=B@`gpIOYv|g*
znKzV<-16m!o!g%i^EX^U)X!t+!`eV@Rogi<6X$T7I;+sm3vQ_U`!?=LD_8D~Yp2kb
z$~&BzmD9<D6Y{(T4pFFZLW2<Q%R^fOl+pCZWoR_o09pO|(Rez)n>#?IqYJ}HMETw|
zq~doI-sgzjNc@yNdA}tP*=a0COX@O_bJAI^Q-~z7f0H_DXp2GRm9xnQ0pVobOvszx
z?t}!mY2+%2wdjyy5K2#qL90P~(~cB1;{H)f^hI?WYAs~R0h#?|ujpLfl-u!0!t5uf
zz341j<z&m<bF~RI&zg<q7Y=fF4{e$i+LeJMZ66cLJFgPvMMG%qqDZtnkG0$RpdQI2
zzu_v9b!eyR9AvaMh3nK4%U#=X0-ck2Pw;&eC6|1V;w=n_L{5VNL~23>N}1t|hK;L{
zJ5LwQ+yAYJ-ZsuPDnEvXM+C^Pj1Jj#*p$~XYb843xrpRbOh9KJM<Cg~*{FUak6RZt
zh4Wf{IuhNw3l%;IAiaa_$nao$p299&lowb`uHC;Cxjsliv&~{q<(lhFx-zdhVX_dF
zlsTf8L!IQqHb9!0y71(r?~1Lp`ZqV%C-!&X^iMZ8dA|M+N7s8ggi?A*g3d4JsjC9v
zAll;zsd8gCNWQKGYIa3{k?J*I*ybtqMj-`E+j|G<-rYdmvz`rNO<z%4M7dz^yKkh8
zMlw(!<v=>WBKT6Y7jO<P08TI+fDi5PbE*!t&NK$dIhlj1_E$hk+lJb?ARAO(9j0`G
zH9@*ZGuY<Y3tXZKz<tY~(6GpdsuP!irD+9Vz<U~OZJS3O4NC^8bPJW+Fc0iX;fGpH
zbKxNxfe-wG^y&IK%J=Xzczs(B&~WC12CD%j;I{+FJ#D3KeRxK_iRFW$&LdEIrwo+u
zm!@CO;83o@8lduE9>{{bz)WHe)n&U8$oa&8qtCLyW_?NU%-tUJEZYE9`K80R9#g3t
zVLh<S5QAx3azV$bbJSDA7|?q^34j-J;OsInkaubxICnG^Sc3Dg+}?>Q6psgo-d+Qm
zwW;8ewga`9P6n61IfHe*d_ZX%0hTpf0I7~8;KP(*NVv?W_{h7UPW~~dEr<pyw>wgg
zlh=WQAr)}&hYau@(FRJHw(w^)7tHYKgBANuQpjBqCP^8=Y!L+V+O(+pReIoo%LKI<
zUZL_c^uTO~LD&aXq3ry2D0nZE;t#k<HUBOLf;UbAldoH-{AI!5WXxHRyzV8KaZML+
zpT&Ut8~lL6fku#%Hj7$f{(?Fm-wF;eG2oX(8f83u3~aTi1V;lDKt`@2NSnDHggwaw
zg9jquO(73T?$mm)@_HMHuQ&|6YV0WLMhW;T7yvAKWWcc<ZeYp&Y_QCr0rVSWK*v;H
zDj_`=NOfHSGOyPG-4I<W!D%PBx|;()yac%9Ed^Q@PKACp%|LK^B%C|2hY~ND1)V$;
z;Hs2Z@HRk`S~F}3LKUWhI_Y6*FJBKe-QgT;J}3;|miWRd?P}_Y{R@h2ivur~MorqA
zPWd#4fR+B$pv_hRa;4UTZm$ObMVo@{*StW{y8vpct^!y=odaWD9w0pG3`Ld~gJ82t
zpuW``Opm01lGz~Gkg*YbHm2a=TWhE=d3mt5D+iQKxB|xqk(BPCPGG6H4UAX%f)yVU
z!IP13@VO-yXmvY4-96saK-^*A(ta99l*|Ug=ND5al+S~(2lK(fs2!kz)CYGWJmJFS
zr$KxM3Ex*2QTMgE;79i;upe3sn))oLZ-)DTn=c7A?jXRA&krc4^xN=NZVz}ipa|vk
zwo$KD1;C3dKH$6aHZUV0lL{R#0acz!Ao$`;Xm61V)FisV>nsWIzIH7rd*n<tn@fT_
zK{>!&X&xX4<0#Xp&%m{>0yxAJf@P1^0ZRTpXjx+nZtQ;yn9EzJ#i!+fbXF#~Vc`h8
z^EOk{<y7E2i6D?FUk0=V)4^Nkhd^fOPVnCD2iP*Tld{S41X1!8Ap1B4)_rlHY@<ct
z=KC(7b6y1)nB@XeFPlN;d@49P?HgG2`w6uo$`{C0wt&ECOMu6NxzxFR6@V@=0}@ud
zf#X9#AovEsomKT9I7JRhh#2`zx;ehEBk~4+$EtqvlaOCc-c<I|v*&P;*%aEWLW&Nj
zX3&xnGyXaP{=sDW_p{%h(U(6tz4>48KF6Nnxk;Gv0`yIIa-!z{aH)T=&G@@7{hw&U
zpNwl4xY6%Y66`$-!s(O>2YWG@0<lSa|8L$n?{CQZ5A6RhHykNu8YZ?uEC70l7Q@;p
z@0qJEsdNW_47E~O1<D^tfv{Z!0<q87_PYaqFtZ8|2rAMW#al4tn}c79pMuK<hj4yT
zDYi%%gCdcx%(|L-YG>hfe7|=VTz}1wMry{qCrLhZm1;9S+x(SLT0pSB+s;Du>N9Y}
z!Wjw$cQO6zi{Yh9z2LB}9zzv{^XT<+;piA(!j4~q4olYKAMs7V&sB_-DsRCB(IT|g
z!&z{iwILIHBpoXaH)2h<RQR2zfkWgrGOY@e=sfTOL?)ta!L#?EIduy=?al#u`)(t6
z;NmN|IJ*OQuF8O;C0C)V-CVp@Rv2QA2>q=*4ZGdHhD!`Rq0zpXZ0CAidS+}lQ{ZDn
zpUI!e`j)-Gx={wOg}DWt^8{Jb!_inwdJH=l4Z`>H?_sFIq1C<5<5#Vf@X+}z=)QLi
zles00wtF=T|Kz=de1dgY>ya8Qt#=<A*nfqu83S1JSeq44kA|n(bm2IE8|>Vm%-Z)v
z!!C*KPzNl8!h!=(-DfM<*>MCrpOR+|dP}m;s^`-JbxLe$K805Yu7h4_((FQ^W{l@#
z!KK6e^g-eP9Lp^Sl|d0$@~%3p^3{f_4Uvpp$W6vcL!Pbk{f6s?9>GOv@vz^x7vI%i
zL!X;O=i<XswAN>5s;qYd9dY>ueoVi?$2WK~`N0zK`kqL@+rE&u=lcpw_<n~kbpr5|
z<XP<HT{N2^)CG4AEQDzt6HxnNJS`BojycqBgtraL(NN0>7%+R8W4C1KFR#|(!M(qs
z8g~_IpwERyMV)X%OFsU#uNdl@_F}~+k6=i*37E|hq-B$8q55qjw%sup583m<G@UzG
z!&j39C!YY><2PVNbrbGTO<*?uFow^+Ove#?zU-<>QTC*&5R^M52Q#eKupy=vxI){7
z*8HvuU-mV^^Zv%P$;L!j&}_+mHF2ji?CofgfQ8Vg^EY)f(iLCH7z5X%#j*P>eo%j8
z0?#(JWFP%fWv?2Kf{3G5@I+DoeP3rK!)p|zU92B~{LV^vP)nZ9_dN-H`K92?=R)+p
zSq}8mSZ8qHN;tSwx&Yrf`WvR?J_Evr26)=}2q0Y6gS+;c;3EcZkSmx-CzeH0``*gY
zp}J`}(m;i^y4L_c*lnhDgw3GdWc0y2x)-+|RH4&yN}<g0n>eB?7mG9}LKR6BTETD?
z9u1RYZ>tNjD$*TziFPiO{3-`up6P~ido|e@=S*B7#!r|3w#3a2pP>6oKirnz0nYr~
zfVWg!hrJv6puTS^yrn&x_WV@OjJMvyUsm5?sLL7HL+vC}x}X@_c5Vjo?mw7v5C;0x
zZCTOyeemTaP1<o`BlKa-S#Pd4`^#)KP3PFLpMV2v^e7n5D3QnI-N9Jmpddq(Os99B
z+JLdw0=n-y7m8d9z%6hV`;NH?HiV0V#%*fsj{d$$q+I%6kaE%Akn&%l@Bj2%{=MtD
z-jgTTug<B&PX8>F5Gq9mJM=e+jxI+wy>FUqq8Z}tgC=roXdSVc(n2j&5v0pIM3kG-
zO<-h<^iuaiYWjk_*?nQWDQy`jqQH^tkGMh1dAOe!_0E$#G^obw(t}*@pnC4eY@en>
zj`1kY#eg@`=F6R%P>cM&0n}A+j~nGB-87YqL;)W@5?#OVa}$#^(SA}1t@V@RbS=yz
z7hE!K+Ll$vtu8rBhWli2u9=MyYJvvT%d?s2`|&aKMs*u+cl|k3W4)Bzwk?i0Y97Z^
zsI?=dXW8&H-6hf53xUYrRgQZ~ssWw8X3ewWE8}KQWTSV*BV5_|T;c>?!Y$eni;jMi
zAipaNG)3_rY~Y<RL^-Kl#JG|UwLi`R-FHwyfw!-bWoF{!ow7=DzP35_q{j=%txZJj
zge5P8N<r+6B(la_n|wR(ATR7r4{6yX!|OaUy=i&zaa6Bs!wEZCflBv@@n#eI2u<Nt
zh^oBAZQ#V9qm99hdYAi=H<BS&1+@^<NPSe;bE`=LTy3-;`9!|mIG+gDNaf!5t0J3R
zt;mW8u7tsxZ)BTa0V<VhM|;#0cn1O+Q9?LLawhSQ#H{^1Sm;RN3Td7(Er2#~d5veE
zn{n^FOGofgH!1>}9In$<G>Yb;``h%;ZL3u7*~)ITROvNQ>YYf0c$9K=C^K}`zNS(B
z!8P*gVOef`(Jt<<oG!AlqmHoc5hmB~m!n=iKZmgE8DyIp!^?ZzkIdo>$d_|e$P%5y
zJRt*f(tWBGZ=K~4v~b@z*Q(izTehqot$uqO1)Vi&>YQjm2iruE)xotyk!UVgZ$E<~
z&dQM{da~pJQ#0b2&}<}{C_vsa(xL*#MUhvX7$R#&Nv++E<jUA{WM-%-HLWEGHHE!w
zDqFIGSM)U%O>c1}PxpkAH41BZ-Z9t7bKXk4xEx`$YM~9%wh!kF^4B2gYdNUllqA_5
zxg33&9nE!kV~5WF*wS=dO@gQFy_@K6wk4yVWpjt@)46Il6w%OaeacLyi0FN)jodF?
zCi$ZB$l#QZ9EExORPx0HR84xLnMs>?(Iw}RiEA2Rvu+#Na@U_17@<Obbia*!60bEq
zsoh6dIDh0$dw3G{%0;4;M`XFlx}~U>lte2N7B>~8#dA63Q+S+p-|ciN7LfbFaFe{6
z7pe{RZhU!RD)sTem!`%ev(dcEb!6x8W-@={Z=&?JD5ZWp3*9>z#$6t~foHv=3tgOR
zLfFW~lNz)yZ>gIm>8h#1GYyqSn}mY6*XTD~h1K;)?!hiZEdtzD=~AQ;+so|@qDT?r
zP_D!5ezYk&mN+1@g*+p6iAb8i26cWgB<G#AqjsG<%2glSg<1x0lX7}lq=N1_GJlyd
zbwt`5MSm|Oi92?@K^0%5eXyAbHt!_exiqitN)ai0Sc<oQ)S7!~-6w8IL<mQy@;q{q
zB~epr4DtE>G$bco{-4OV<ZsCLFSqq?$oC&dF6|#d;A=_|@S2`X5ow7)Oe+?E6lpLm
zRUfARjsO~U(ePSA2`~)#MokEM!8vR%_<l_e81$Zo2D<7n<o!~3$1Vy!StAJdq$I&N
zt5`67bvZEB-a?<h?oW4o)}^=Q%>X?WK0vv>l`7nj1w(c%gDqzsz^eu&bj>OnxLtVz
zj!vneT2))X!c_@i>vwtZQTR0|-xLQv-2*UtJPLRvzoZ_kWWyw%3m{nL0;RDq1+FPl
zhS#=<LmP*3n6*Y4sveDpdJRS}HYpQKoT#N&_Aa3xZ&#*YwtImQRb!YwtOOQTD$_5%
zxkK~*C(vY1B%K<p40J3V!OP28)X6zZVJtTkC@L6&Eqq@=s@ytoKyM-3chwqPaQj4U
z68#GCo^K$=XA*tPyaU&kOoIV?V?dSRAj}=U4<ts1q1VM0_{?M+Tn10*$`{+{VE=c}
zp&=A}G>d}|Lpni_(^0zBOdJ+os)d6;ApL@y3`{K(LHPDr;NZ1lFg|-Nu=8>P2hB#o
z%%9_+U3)9+aJc}g!xTVu?k*VAQ2^9M4ua?AKG1hq8!Er&g4TIXaOu*OP_s4$nhsO~
zu6`q!W4DZU(l(~YqDx^+&R38QjsdOR$0&zK4X{}2Bpd~0aD)>;3y}6en`FSSZzzy>
zmH~#toxl+nEuf$F9{9yx0(p7vaFKr!crZ;6%%4{Pg+MlV`k4=0QmTSAjndFGG#7MF
znGb!9^x#4ND(Fx=2&PomgRc$Ebl%sQ^rpGZFx--WvYod<ztcC$*iN0EQ6CHiJUe0B
z{pqy9MI-P+A_myjP+%xh3dYl`!3lF;P$4c4Rn4yf1>0z-nYtXr1UQ45jiPjDT{*aW
zas}AnKb5x0`vJrpa>4Y1KsbKtE$BY^3hoBZaOh?lu+IEO51v^>hp)|pU*!U!?OO%-
zYxp>@eUe0%mfAvV|1+??=OfH2nG0@us(^^35HPS31JUsxl*@)WV3%ei*m{2|9DHaF
z`%-QK(+5!?>S79fT^9s;Q}RGTbtF_c=nWq{-4DAmXn5Rx9vr%y4E^c^;hJ~ZKq5St
zR-ZZqEnA<1lmJ`!XyHtlI8sl&)-Qv`s$5uoJpz7Q)&te71waHe0V*IF+_+Z{B3p%k
zRe=g1Rtv)O=>l*`zYBb_Za?tY5Dj#qxKRJfQlM?V0!RhEfhnT=Fd*<f&^c`c-*xfB
z^w({$wxkuH_$8pXqlLEHEKjFJyTQ%vi4e)!K&Ka)Kwzp6y(Y~YreDv8xgMo(`z~ql
zj(tU)nd=K~OLhaZt}g0UYyfb4I|E))D*>4oGvRTyrQq1di{QxzF?#bFbMRqd5Wvq?
z(B;jl(0P9<2-J0g!!w$|%2kiyQ}i3G58MW--%YWfW*|eqmJNjode@<>(oYanR0RC8
zme3_xS`acJaOA+wNhE9c7m~I87n1!W)%ypm)HT&^sgk89)(yh@u7j}r3=f9+euW*A
zxZz6wWvH-lGP@xG{*G+Pe<9ny>IVMmiKivZAXlR4v}6%4wQUzKHvTF3yk!>|YI7YG
zO_3($MCt!Qy5L_(_pfdyednJlnOGFjoewznUqc_z$s4BHOKezXPc55j|8aDf{%x0I
zFC>?5^*<#CllYhakG!({Nvr=XSolYcf?A}NX_(a;A1TK8eL5@%X@;`RKcGm0ExuzT
zNv~7OhKr2nU`po<rPv|^oz7o{zfxM@f*}hi%p}5X8QFMsvKVl$Er$}l51H=~2CQ#;
zF$fGV!&8=B!;9Z((Z5$H;)vg$0WOZBc4<k_8r`DMdQhJByVC<bl)|9?fGB<H`Zwmn
zb}jt+oiP0}P8RcPII?rz%w>}scEgg;99(-uon5)$IkT4SgI~M#u<g^!@W=0S@Mw_`
z>&80qhBr5WS9551(sL@iQIw*Kvx=~5M=BKDX-xZfI5H&;Q)p_h5PN>20JObB`2C?=
zY_L{?O}MLq&(rI0gW?B9ceOhhe4$0F%v=clFP)>#`i$duH|lU-YaH)$(i_~@e+U(=
z=wg2Uip8oyHCQgOgm*CR3~$#N3!JuW1TPA|L2*{d((6)s@X!GUW=CCs;KXU{<N6ru
zTsEW!4l1#Hx2oY&xoK?oL?WKC`4T*juiyu-#_>y~YfP)GHT|V(7u2$_rK_@5;Iik6
zEbm+%aJ+PzXE6wINa0DiCgL}|Hg!EFo>=0vvzvL+(xPl=)+TIwnZ%X*eCYh^9x!4t
zKh9|l!OONxhdII)@Xb$A)^o85y{Hc3C?pD38j7%*IeVbR0byEeo*$llRf{QTbYU6}
z9e~lQNAY^SF`meiJlN-U53*${G<^3Ce5zi>jD1K#Gd1Vp0rPRNe!Dokwd6fh#Cd{c
zLTX{&a1wLu^$SKuUIO0SKN}A3sK#Eyea!rK+VqWn2eK~zG4n{{B7QkX886D8K`WJ?
zVk|<%Sik$FFlB2Y_IZ&E+W1#Nr8tt^f6<WEJX*wPnz+z&ri^1_X=ThwI{>OppTG%m
z88-f=DRWpi47}{Lq1EDza4Z~#@Wef^Dt$T5&yfLR4Vvuk{7;}wH4%rGJJM5sC%}gr
zk1=b@^TGG`#W?)nE?!ON4A%9)IZ&K_9SevT;{#G0y5xrtn-ds<@jxFuS6%_HOo^p-
z?h9x7tMaHjkAK2@53@i{`vJW9DF)q9M`5QRg>!0)pkl8G9k{mxx`fKn0ry4NsYxDi
z!^1v^6e~c_t#4qz_YH8gLWBM2w}357t-*ROBD8z-FCgV8idE;x;dU%aFHy8${j!JP
zRnMbL)h<K0T~L_SR_EdIAVb>P_(9VxK}8HK(!e75P+UcMK~14p=GDwGEHL&ASNO4T
z_pMB3pW_;QN~8-0eL4;|OI2aT#T`IkjUatLu@AnyV+s#VZ^u{n68Qb5NcgEyfepEB
z$#{pjLek2Bo_jbQKYh<)i<&GP7Z8s>&AyF$&-3HiJ7Pe?nI+Ke`z#o`C<ay}A*g#5
z(yx@G@VfJ9FzgVA-4GPXEdA7t)9t>1rc)>3hC8#cZ`(P1BY8P%Uw4IPGjl7eEU=uO
z@V<|?f1ifw91(V&vnLdJ-48tGF9BafYDvjGy+BZ739I$<4HUaNfh|9NWKLMCfgkQ0
z==>MftlCWuy^1`_3ja1`wK~t>OI7B;%%v6Te05_?!c_6=(=E8%FbtnjzXIDYC6FBh
zN>IUk6We8e5if?56Q(9fpNkP<EyjO<cJVBHe0V!Ma=j3SFEGM$!-kmKJ9!}LnG9QZ
zM~x0zUr*hAdJnhvSh1%qmSV9Nvg~)8F!-xXhz(h}oK=3E$Hp%frry1=qL(Y(!=mpZ
zVU5@>w&1q~8zPj2bvC}idQ0c9<<GuiyGS8=hgS&m=HNDZ!0;Y+mOYA1R>{MqQ&~v&
zdXRE_GIV2nD%I(pgg<=HViRQ6z`j*;!Oub-79WdXUPkNyR|izsb$;&jH98%SzdwN=
zzjJ0U7aPJ|gI{3xv38v8#>Ih55caQefHN$gLv7d1_}I4?7&YF2Q=aP5Vp4~oYUxy3
zJ**F3x_SUFU0H~8?iNAUh-X-m%!Yw?ilOt21$gGZEx0jzGJ4@{1qB4uU}4#Ncz2!{
z+f-SOr-a(m3dI%J$#f&@b1#%NjGF+i;<w<_dOlWnlREozTRhB|HGv;}-c3to*Dz;R
z3bU)ZTFm!z`{=EXwHU5er@c1w(bFFZFim$b@6;ZBFz16V8?@a8jF^RD^{^&<`t(QU
zq)R=X=NW<>&u!%CwYjhtTI2Dt;5l$L&SpkCd_iFaz~1NP;SeeqUe%R`mm1{Z?Xp}@
zqI@0xdg}(KL~x*$Ry(xvdIKw;OR+hr32<)AW<2{z88%t2%!W(I;U^yA^aT|HTl)_|
zvE_^KgE`5}!tizYK;K*5yt5Z^UibrOIOq%W`Td}BUkkWa5RLV8#c+|%N!-VnvbTRe
zf<4t=K%zB2UAbI??a054ckJzDPVF&Z%{S}9-`NL2(vq*Z_;eR8r~ToBJ@2r*90!ir
zZ(#kl^<eJ%$vrZzkl7Sr3^P~g(nD#rFmBZqUVMow>!<kvdKQe~j#2}*B|Z>n%X`q(
z!9Khk#WI{ymIbNzmh?B3aU7cE0i~;}0Q&93>=zG$wJ#J{-pc*3;-UyWa9WSmJ>$%#
z$0p*TC8bc>{W$AgK+p|i-dG<R@|4W)@x%^0vA1i2V7RzFy(nr1{ZWy{p1Kz)#rq`v
zd_a<w92$hnC-SjZE{W~qZCH-gQW$q-1lLc|rstln#cFbsNaSb~HRogy`*D6Bfs4i1
zwWrKsfj}2D+M&T(>PfRzqkgRN1P3mDaD-Q<2<gK%iR_}|JMhCdkbT&80p~o<WfBAy
z(#zyu;#wJNe4?WijB4(IxtrZt(U|q%-Jk~Eu33r6F<o|f3`vJCy@ga23gD2&26pka
zmpm!)ukec3C2YGUjd`nB%q+3#0*Cblp#MA@c6MVcZiCKP<>U^)p0s0q$_i;iw^(d;
zdmU4DsTH3cHe+|F2SBaHyUYUP4(74zIq20|3x|!>;QXHJNZmD*_80$wH(Uv4yuDIb
z3zc4`$vy@f@N%(jc@+-JQU+$%UcoI}HbVcWS-AT1UiN$408XE`9%ea;vYp26tZQ%+
z-g{7lR+M&R4dkt8zcqH?$6GD-^owVt=k;5-tbYgFby}V7K0vW=UYRkS>eW=&WUW?p
zZxN=Z<TB~Te)P<|2^?$W#U9=wMsFOW@U7Z!n4VF@2K8QNRF`$ZzS3gw>U#@JpSc46
zZj*x_=3RpG6*qzV)J?oWQVaS{n@KO3^8l;(m@qPzE1{Tp4D@{X5)N$2fZO?$v4G=R
zx+lm3-WjlE(vPTO*Rn$pt2x8Py9L;z>DjouuLO>!a_BgYIILOP%)P2(#SDGgf{TWZ
zG9&@n*k~KptS|<+Ha5YV_p)L5h#cN+-wgNMJjYaPoy0SjyuzR}4X)O>3|&5HkeR+}
zEZ6xf4tBZ&-aZw;BAND-<l3iDSbIK<vUq||A4B+<l><I8Bm#GSR>ynKi$j;h3rx(F
zk5F#bHxOqD*`DWuEN>(YCf9GE*ZMbNJ!Aj}Z13~l?mY^Z^7Zk`XJq1*yb)LsSI=N=
zVRpCEVxS*=2P$6z(D$4%yX})W`(zU0AH6bJvzH-(GbvfT^0q2A*PIJW+sA>*?{UmT
z?S(cd5{oL3JnQMo>^Gy^44F2}TYGm0ZSp7zxD4dt?xk(q$}=SU_NV~OH>(<R@`dr<
z!2`5FVkeB|@5U3`w!u#=&tXKhICi{p3hGQavbX)@@r^4}*(%Fb?1Iadbbq@e{WiFj
z3DcK{JwwU(idzn&ov@63A+-=o-+zI53#4H9z!>J0($Kc8n4R7<m*)GP3-dRb;T5GC
zv}6Fuz7Bj1<^4MFx>b6VGVvVt?-OEg46@+&%jZn!Zhl(7X%6dv<!JjI;_M8MO}NPA
z4tCsW!M2wT0K4U)bZ)Z~>u#|FN4<Z|%p!&$*w=uIwmQ(^JQ?=xHz~Z&c$kuUn~Xd>
zrQoK5aIE%pFMFg`f?49LK^tv1#W^GU;WvFVHvPy4IQ!>2Xg6aA+W_p@kmgf3<huma
zy6J)Iw|i0@3r_<2tpn?{#gv_Y0Wn%tN${!l7RY(^7~ju|n#}A}Vb#iwv_?Z6q*Als
zwr%6sU$qf?Xy>yP%f#SDhqu`O$uul!pu?=}>tf!uuY-0g)L6UCvhc_O159nqhw{17
zOisgloVhU*3hv=&w_UcN2PfoMA>*~YO(%31H<*r{x>n(-qa3WrPvC?%E8rud3fr8!
z3O6=Nu!maj0+AaOt-nYfTgRP*PkfbFaOfu9=IKHUNIk`ZVjJ0ChLhQ_*E>PxsSl8p
zNyF~jJVBL79WH+!4B8Jhf^XO4;Jv*!aocu)f8P4d+sfaBt#_$_*dQBPn()C_r=`N6
z8yS=1CWWK6@!*0Y89aX89PhSH!r{vx7BW<&jar4-*vUVMlqnlOJ{4+Ei<n0V-Hi12
z<9PV9Bi*|sjJdFLCNrIm0g6_UaAcYsHoM=9UF2RcSvhUsxP=z5d2<+-A8NvGi#~%@
zqjt<eon%;6p~a4$Go`m~LU0D<0KKQz5*ts>qUY=u<+)z4VG_1o!9zheu|la6GrGeb
zYY(1+i&TRk@1;Kb#7>aivmhDf?|li8d?dCkHK%<uIc&}LV)#Z{mQGz%i`UgUF<0lk
z1K&^A-~~#@ndVp>+CEc=j@&p7#TWUodb6FWcd-wkrcxc1(Cz`FsomIAp&h*5*~;|z
z7sHL7{IpY!8?#(Z0A?+y!M*RL=sj&|47{0zfoml0g2K=(ZDcZ}k^;9_z2ez3QA~mR
zWsvjW8B@_S6`Z&cKu2_}#vTg~Ggcz}?1#7y5N6jiHV64>=GJ2%@Xi1pUZ;Sk)mgED
zUv%i$h-hBxtr4v2{|P6n9wArw7DL;(-8`Kd1U&~uV1IKGzIv>ZEv>i3UQ15k+vz(%
z!umO&Cr}3;Zd0TmAM9c7cz5ERm95MkX%p7V%z&1gIfdP4rOFP3&tQeuU0|LDHL{u6
z^XYX3Ik?Yb4I8v{7uJ3+hHFeI^6iI7ciZcRHC;tv*XJ=j<@r1KidJLYLq%cWvn*y>
z**C0nNRC}Rtp%vt`?DHTMZk`%2)5mJ9G1*D38#G+gcBOY;Kr_4COJ$U->_T>FXbt~
znWOPIp+64GN-krjc-_Nooi6mq)mA(%q{&7+#>}yPc~<+oAl`k*5j-E3!;2<y&%s^7
zEGOnG404#x+6?-`<;8hGIN~Xz5bMT@avbQ2+HjV+IE|T6$p<gqyNkCcmBD#cjgXW!
zfahIU_}f}_a^I4oGd{ax?_;~!zD83xUSdZ_`x~=f39j_#OaYp1%cK-?O2Mt0lI+vf
zll9(@Wax`4Eg{!nC$q)FhGmL&;4$(b{BG3<Q%(Ayq3&In(|QG4xm%O%W0Q5IqD^r1
z?L0VW#$k_pgu$vw{M<E}HNRf56e^D{W3LWehHL#<Mnq*3d-t^`yC7!;ogvl=f0&%b
zQV#sI_th#87<nFYo-Sm^N+js=spptkH-%`Lmj;>TtHJgN2{!SBBwlpm4n9Ar%ZI)9
zLA_TZe7iLdM*nDqn?fh|e`9`Tbl*4}Blz%&3@_$|Z8aS0{sImtUIsI6jA3TQWw?I&
z1Bj}}aNF~0M*Ay*!^{+Re%A~9B*2)pUDJtAe9mC3o&@3{5nUKWFQ+F_13djh5`RmG
z2L%Q;bep#f?I!JveG@I&=9n~4;S<I5X(VFN8XYED_$X6)<ubHR76;qZ({SD46%gK;
zV3HkA!-KqT_}1bS^#860Pics;H-68Dect}yxyMW(cE}uhaChR$QGVJ-PXR8Md<j=p
zO0X05bLpP;?O<X8gPErkSiYUP%*KP#v`OYV+>-SKj$Bd(h38}NcfAadH#`q3_gK<T
z%8Qw=FKzMQxnuC%S~(cDtQn7btFluf=hMm}J7GYu61%H^FI>{1&xB=^Fdwhgz>`Kx
zSk_@a>(;ywZ>DphvA-5>2|N!UbPQ2nN^axVhiveG>rZ$+LXgfrm`e%Ho?H(r`QVXT
z;ULas4qGu)j}sOp!z1Mj=~AU`xc}Ejcqm7n^$vkhX6H;CR5^rC8cpz8>Si-x@;?Eu
zO%mp<G^aEBH?W?}7I?;|j_KJ{2`qLFff{xQ&O0}SHLDHBn?9|8SM_<=L9YT*-vAij
z?#NcT%mzCbY-cl<SApN$aJbj#9`1M;$?7Dez|Upk>}>Z0Tyo|U40Le7DwFbOoi&Dw
zj-F@W@Cekr-wb@GX|g44VyxMvBak!d!%i8{z}%(AxKx^ALvGz6*R_}8oJvo$+D@1b
zj1I#^t|lzeSI%s{H30`i9)hqdNw_20fSo^~0mJ2bL1Fo9`o?k#w)WX)Jh3B*`Kmb;
zk6#GIi>JI}ZWY8qUhr2CIx>T)5_JPE{j2e%7l*NO7Xzc~c7fA5ngASYWg45jfaQ=7
zyI(>Vn;)CS9uya)4NnF^1L7xCKlB1-MHsW5?}YJ>r*H85BYZU1If<G`nv5OU&Zn=b
zJi-@)o$wJiKFm2?hWGnh;;*thfc~#pP$r}t{<N7!AC}dIC#XRXwRH&I*t7}0JCcgK
z6>^w6ftieuc0N|iT#Vm#nXoZ}kFZE2$&RJY!7^UYA(_4p1L6d;XtWdh^u@#T@C|5x
zF$!1h7h_i`6=S0$EjlWC5&e5(D!jYb8;9I&!PDz%VW&HRUF_N!L18IypuY}^EYASC
zdp%&GmjY8F_Y)XTsL<ooB-W^(fTMR_Fi)8jI6iip`7#Fa@5w3vn`PS2UeOEqc;@q_
zs=ozl<$ibuM*}{oR{#xVt$4RjC6?C~qStmUrmcro!&9SzP%xwcE|8)@ik~=ZGiN%j
zTBZkk%=g0^2BvHe;$z~%OL1-eDBi58M*mi~W}~g;n5ngsaS1m8?B;xcIX4-0o*8Ax
z+p~8MuSd!ZKly$YG7@~WI8NX#{xO|R{FaNGm8auP^Dh8{r*drWSqXY@a{$f8E~HQS
z3gTJY(qZ6(&-nEwS-4~Q0E|lDu;q3P{<7%?7MX7Zhi9e1`#YZD>1jD|kzNK*tXhhF
zExCqHE1JqQ*QbI;yFn&m{s~wyaujY3Fr@R15EU;r2JfvN#{F*d@ZE?E>T30C82U<`
ze!s{JHjka>xs`5&bHf|(Hewvyw3>WQQyl3%pQEY0VGF?F_Ahv*k}W<xp-aE-)WS>C
zMd3xkJnmc4j_&4+!A;sv!SgSr@YC89*zhYCTKWsn*CaOZI=9NvYx^ESA5sEZY??~z
zsxQUPIx=`^<ZpN*F`w7_dKR5}TpesyyFq<eUI09|XMu{yRd`l%ChU8oN;|I-V4c!y
znZ`m@wy`4}9^LU2tO)^lP3;qKgm^{u%$!1B+noZH3(T-%L<LkVI0MHDsu}(HO^n&z
z1U&0`6BhVojFTsn={4T|jGku=E}m}%t{=YyPVi^rtw&cuy|gv>V7V*2rL_qj?6wC{
z#eA$tdIhupqze?5%Yrg%=E0I_;|yz*ft~6ap;5pDGbUa{Wg6SEbC+y_KP5l&3J{4~
zY>n7kc`3}-mQvt*zXO!+JPWHrPJkolB7xkGX3S+G@h)2nwln4i_IW%Gmmbf+7dY?m
zW;K0$x_={1%D1NNx^-dW%*F83gYUTeA;5Y{$6!w(#k%g6VmDnK0fP34*p7cSJ5qg`
z^wUhj4@NxTIW2c=^G28!b2Oo^O}+=Eoj4gg%GU%pU6ioOS!H<MdOm&|`3wrxnz5hl
z)p5y<C?@r`KT|Bx4#Px7@n`b_eCpRTY<y3Ik~CF^%@Hqg%5MrETgzjb4xYj?%XZ<i
zm#<-=Vn1(SOAh2#eq_3PIuV?0Ne07HaO~zhcEqj@UtAv!?}{t~NyV7CFBuNq`n=%P
ze42i%^NdRCP{PIw-vMc<VynN>DE~}X6j=S&cPIarv$(w}oXA@_L98i@B<`#XLj%17
zoX}!J0^Iw;@vUj&HhiIpr(4>I<CbwmeU!&!em|QCovT15slO%^>dvC~q2<JPzYfCj
zn-{UkU?+O7dXQtyokeg2O$aad9<DTQ<u+W%Cin);$)F{ws4*v#Shrk}JpE9Oyia1}
z@-c<z`Lu=D`eJLN*0x_<lYP(a4xg1FqV+cu>uz>%=la<aUO6`j_FffXkgy$@#Hx~(
zh9}9qv7O}ew-&sRpxeZitP4c%_c~7A)HO&gQH_&{$~e<g2OGcNW||(}j6jjW%Lzg%
zi~Mk$<<9j|B^~6{$^QK}i8;>QsBy+MqH<wAk#@(|&cV(OZFr_boSj`o%qq?29Dk;O
zidBy^wR5fz!aFfhv&s^g20N04!Xo5#o4cgpXUGd&JV024^b?x89)#Uk3>varOuUGD
z$%%T}%AK#0$=N+K0ll%=N%-~UktT<mxwE){JZj}cdR0Fs-t~P)Lq(T~u_Y6P{?-?q
z!LJ9<<GxjdZDKLuT6Tu>tU?3L=-Js=arQeAM_nacjl7U!GavaS@;VW8^%803qsAMn
z93*~yxl3#b^d%O{#vzqZDWcKjBS)&ujXQmgM^pXrV(ud<j4)byg4kQLky`<r$*w~d
zr0JWRghlduRQ!lbjEjvC;A1xDx#1=h{Zf~(bGS;}_0J-TqTG=uUzFYH#Se()g-t}~
zgC$6)(u;f^HkE{5v&oSNQ{K{RHN<+^B4T79mmuBtA;<aB1m2-fe9&uY+P2+|>yeqn
z9gr#@BJWfY*R7hlD+oDqiIF}T<84M-u6U1>3a%3~Z8``kg=%7M{V{ZP*@mXQWy<7%
zg?gkwdj>kZ+MVM${RweoGbU!+`5^m?XNifBV`N!E3~6**hnFb#fFpAMEn%^%f%x%z
z8=CKwK#W*!A&z7}=1k#gAlbvwO<y!+$bILG$fqJ{h+pa|v0%WQ92~eztk>b9dkabk
zcl?bgl)OfmhG(N=N)++ROOQ-c8zu7PGf=@+5ke#U2r+wc1+mH74mDi}AVR*1lO^kf
z$%BU{YeqaYiKW9g3AqEq#EL^lkm65GV)#itvB=4l@Mmn1txzmc(NsX}YDgqh>O7J6
z<-Nq}MqN_cQ-EALQG*y66N0z$3$cF7DI!E^5Be5))lR|YtzBYSN@JI$T+=J3MB<`B
z1>u?8KxBOmLCXZ^61QY)iEC&dxnT8Wlw)y+V{TYMeEgC|OkF^tH`CRLy#~I->6k2z
z1o?z}CtROX7X6rrs=ZA3czGe2@m0j@$9)9XLYn+(bOP<udO?KqA0tkzHAK$s)lK3y
zC+vPdKEj!`D2F@asV|YD)X&XZ-$RIe*hoGT@<++jW63uiCx{f2PbAb>%FB#zCLHq|
zh=p4Mn$BAapxa4jIIj*la!zax;$A5p;Eb*1pqJ*)h$kB#5XPHLxP4U|a)$l|j^}x6
z0u~%VYxcDgE0iaQMWPvYZZ|d{N1Yg?t<7@G6ZFWh0%b(W;7zpYR1OhiSw!|#6>v&d
zP1YHy_L0dOv?vpwtGux}wq#7kd7`vR2OU4q#|^BHB(C2`<zy}PL7yVT$s2Qp(ZkO&
z#Agp5;-=hm!u(-6`P7d`@LpCo&CX~-D+1KWo70rYQg=P1$}fpx&&MN^NM)ks(Nr>|
zxq^7%Ylhxt6cVNDZ*a0LqlqxJ52Qd|JlT6#hN^sC#&dz9q*V?-`L<;**RFLDnlj``
zlxSvhimp1K^0vvkJiS$D!ZVM!xZj+JzS~HAl{-PcpIuJ`#=YfiGPs2%+DeFaP)*?6
z-lnD2vPk%2DEjzmF9)oOBDK9<HaTC*=BjSdAw)LjaN@G!Ie{xpseb=@@=l~FC2{F4
zZ&y?Y@kRO<VR<sXG2`A^G?bc6+^w(Uh)eB3X}9Fa6AP}QYH3MQX|k5^RDmG5QFt3!
zY%WjM4!3Y+U6WB?cnN_cZxPlXjuKg0jv&DSe~v@T5yDIVE3u+!A=<O%d6PbhCrY>M
zAgrU?xp`g;iN%{pO$|OOwIq)xG+857{h^7-HHvMT91B!FpiXRAx`4PTzM|<_=m~Ct
zCc`~`LWQgeUqmYWia_^kB8c~`Ux*ne%!#}6H=&z#PK36hAt`lAfxMAkk8}^j6Kf@&
z5&@%kiHrA+p=)mHgyZ&XqThZQ(W7FFRII)d(@Sm=C5`;#&FdG?$`dC!%Qlt~$My1w
zq-tA4CWjH%!g7fY1$W}B(_A!^kj|k}&l2f1T?Bb%F$yAr2zLBDG3Qbo5$f-O`a9=w
z)Y^NAP5M<t$n8bQWklUBqfnRF)7!xLc{h?<=y{yjFUJz0VF!s?myKxLPMmbk`$A0o
zo<*)F?<0A0XCkw<n)vd&fKYZ{gY>0jIM2645n=XzL~^A7syV!vu>H&-13JDCk>4&L
zVWT^Qx?~rz$XuPAx~2gcD<=_42G4N1JS9=ilsSZC@Fni+dVXSB#&Ww-+g*fQfdFx0
zi5|Ic{}$rA&=J&E`H(!na08hgB1YB3XY+h_9v~)a8aS;;3AxM*Bla{p5;+QyoEJa_
zT|b^n<j&^fU7y@53ws2qF{L9Y|FAjfbz&Nd&yOX%r<ZY~*A)@Dw=@VN@jxV)IYOLy
zu7+%CZ3t@K<0ijl;$+6F2sGofC>d%$l~9|1o>=wfH+ks6DXunSMJ>9W%p2Z$j4<o@
z!5IzMj;wuz$+E0g;^4_!95Ih{bWLtLxj;u4ofW4z$Hfm58|}6d&q@}N`$rwPhgV-G
zwB*8((e!-cqNND&Nx~25Ry-z_emjG<d_PH~P8B88zxb2Klpb-#<iiLVpV&sBJ<ExP
zWkQtj)Fo6e=|s)jAk2&(a3+GZZ*%<Ho^$y|)d)G0bYf0=KW9H_I$13fPl&{1b9oO_
zIBT9L5l(w5IH7L-q=d2nS1CFGnQV|H?&Q5DqH`7y^J?pmd!hpwb|C?2Mank){I#AK
zBQ}zzvpbMdM>~;w`z9y$O+2}Ds~mMS-hgUPa-$}O`ItBLdpUGNJm=%6CpUg?H78o1
z;e0kd#ThH<=0@A^By8_xqC7c1GFm5(q++Dd&~sVx)D>wv;l9`0_NEt2U->Q&4Q(|<
za(M(d`o|-#pZ79uP4Q-;wCxsQ?Dl{g!YksAY#Szsu2n>rOc{4|R}smtXhCZGG?UNW
ze0a_~Y>8y*G?5oDm3v38fxC2<9^s%8MQj|Fwkt9i;7;Fvh%4YCLdtv<BsC}B^3=cQ
zK^SgNC(_JY>{<>9qi=eJguk2+DSV-dV7QrR`FIN_dq*vC@a_n)fai~}#7j<NVFoeI
znNGaK^62xMPel9+Me@z2QR3CyD`><?i;&$mS%8*NOPK0JptUl5L?%&BJo*0!JJV>Y
z-tg~JnWYGYOi{^@ChU9KNurdLkS1wBqZATN=6TE*B10rn%5?TQ_m<|;ti(^!q`3^K
zG|+R_|9SI&^Q`CfS?jF5_TKltrtkIn4p)Gg?M~btjqN~9&;Ta;b%73_a4zWNW{}-p
z3}&qe1S>b$bBB-51-e_Gf)nU0kTBiD@fkCi%d;`KvGyJl*ij}(IW`vDu$O?zOCEvR
zt<hZ2sx@HJS7~@z+YDA4)p36LW+1+}4czY(f(Hcw+^Sn|7>ff@z(B5^89(K-z}Ba{
zA@a!<7^}M&ep=JYCEq*?jJV&-UFTQ8&c%nDQrOCTOgh2T+&n9&@-+Z%Z?y%So+;S2
zSQnISF%z)wE5MgvL#U#$53C!=<=pPLL(zz`(CYm=D7t$|5L$JgndmzjNCd1Gcx8Dv
zY?ynB(T$!C`VN>kF8bvtNZfIUo1zyD)pOd#-~D5p@b^amzGpQ`U-=1Qd^|W5Jr8c#
z6%1S!KIPJ%A{f&g&b=`*1RuNKg1%Xg!1UnVjjiLYp>pvPVEreFyQXy=j(DGfM%Kzm
z?_i10%~G8EN$CUVp3LPA$-)g$nPAt&Pt4-UQ#c9rZ9sl(u&^aX7fw+cf-){=U=hC_
zj($5`kT{_V3_C}13d%}wZro%Lq<@#o5`R|~H|KDpf3+|n^C0{q6oOq(t_W<_nt*|h
zYmI-d7lMpIStPHbg_3*?(5(xvg)_A>z-~1aFuPrYds$`%j_LY>IdiWt;k(l~XGJII
z++idf8Yb}0(N@^176KlaErWig#sYbBfj~VrPEgo74va)nMq%v?&at8sl#j#;sugps
zcI`<3;WAAPlbfG%!mS@cugY&ww~|1c9z7&+mjnA#U&0dyGK3S4&jUJvR!qeT4eo70
zGq`bI2&SFvWZFkOIcvZBfE<_O9D5eRJ)&dqQO7y%$yuTJ`ko1NW-RBH#CgE%8&kpW
zI|86{+z{N@ZO)Y(jAL%MO%iODzY0d)9~bN!87~-&mVi>lejsS~ByR1VNXRZt<?8-c
z!*ePn+}^rG#>VjpczWe7v*CjpcSrst^X*Xr80$4`^*jBF;9sVqpy{JMJa|tIzOv2c
zqJtIyiQ50b*lp`TbC?VF!sj-4f8ZhTt;ho=-AUZ%sY+JwK8b)~$Y=2Dl^gf!>Nuu`
zjRbsSA@CX0<eblH0<xnPtXMS#revgXk!yc5vZ3$5DBCQsW|{|AVrmP%BsK!?N4~&W
zVhQK;cNI_zsR38_J^*9B1ag(4KyY?$CwMH82X00l;9ly~F;xW};Mu5lkhpyh*Ya^I
zGpxM^3>my<wwYZKoOr$#99B97PFW^{NS75{$D}a8&1OJUyB>6`j^XY(ZwHqzia@TH
z8@M-rIrn?8hSBMt1f+%DVA|5p0_Xd$z=N+dV3*wqK!4S8nzuOc`i%w1wd)4Q0z<fh
zgE>}Oa@tny8q*p}gO*!Gcxnsw???k{GonD!qMHJft@hy3)QNDG)EaPR-chbmb0;)e
z*2c+gybu5CZ{Q41sWP^yUzrS<2&<M%Q^C#tbgPrQO_%|2$MVqZn8sY2H;o%RYT;yi
zefV_FPwuuk3j&t<3C0Rif#QTc0;TG`VBn-A0H#vh#y)+ZIZJ~pGExCD78xLKu`&4Z
z_B?amH42`Q6o9q)JXf<MN}R{^L*Zf-^scu|*m`w8sA<V(9)Fz9<s3Q-F1#BJI^IoZ
zD%)-eWQ@H*de}3;tj1t?^xkNgb0UVDKB5Q*45te;wFHeZpR)zOB?^Jn*ZYio**5OX
zu@P{ip;NHrb_D3!S;MTVt7fil3Fq*{T5z*-HQ?(%fQ=i5q57^OZioFI)Ss6u-1|2U
zq%_nrj<O56CA#;;wc~lP&h8<zOTn4T326dtF)tebL+`-thGB4HgBv&c$RFV2zeTY7
zU$G$j*;2;vz<y>{Q!sNnI!y3ulML9fYNg<MR=L#{g;=05wY+h{9A`n1oE&tyPzuPs
zY22c7k0CQHmHXZ|1+6ezB=mI5W;~hsO#SQ}!H;<sAm!vM#%s3)6SXg1utxd|qwqFa
zux4Ky@W_jXg8exhcVHEeSJ4!hrWXhpg>YcBBNDJnE`xXWksxEA7svc60Az&=80T{w
ztbr@Ji?O5XyGCAtpf7L01m7*(g3FfB>Gw<^%r}SJFY&HNX&mF=6ah3Vf<Ooz&#BJ{
zWs-KWVA>;XAe?+pkhAD8_}!JzprbDf*Gn(tA{^=&vls7xoNFy8Zr{q~4f%q~N6Ih^
zodZkLk8w*LZUq~xUVztIZi09k&AIAsVygHQpzR$AZt6|qgpajB^qgxT^uY)ysEy?O
z(wBo5v1Op}*-qftv4E3oi~`4>27twFJHdQO#9gs01P=n5!6w%V;C(2ZbBKD$I9uEV
zYEMpsOEoUs?1dRXBKQmFnR)}{TO8xy0W<K&qXL|=UkM(ro5wAA6aiX1CE!oH98fYh
zh9gDyft{`qyc>88L^}z%lWSNYv#Sf7Z>a?;l?OQW#*IKTGZ}z8%farRIb5*R5cA`?
zI-IHV7rYoa&dJ}u23}Rvfa@=t!ORuO+=EF=z%z?T@N1_ecvhpz>25esE2yR5bXg5(
z%CX`qWdoUKZbiU@_W`}HH8_oXUqHjEv&=0$7Z|+kJohla$f`ss0gOC}02lWwa%Teu
z8QVST;Qk25sE=t73@(s>Cr539YRd+|#o1rDOT$UP`@*vNk*Gm%z{i@44n582JyvK`
zHJ>TC<Nup!o+8Htp6&&z20MWEN61}pGXO!Zk}xUp6*I-(j_W$T0e<&C4pLrtKySNI
z!XU1sUX-&0L}*=M`aT>JWM6V&s$6)>1G*Ir#&BX|$zv-)t(gOS@nIaaADhKp+J6Pq
z4cLK6*%4sQJXg-6{1J0jQN=3AHd4R_se>Wkga*;^bRe=e2G&2j1xNeaEq6%>fU4t9
zt9MN;f~jYsL6*gN;IO&~PL%59Tz$p>(>LPy8Q9o(;eo9{ep)ayZ`x2pzi)pdVJ<SZ
zVOtv=hxB0igm%E5JHmNPX$M=s90!d{=7XA>+qk1?#f)22tCh#4HI2;+T^cv^$66Wh
zNd_5bs)6={DO}IB@k~$w2M)hK0xl>`<9?*Zz{dVTL7{0bOxyd0Te<cW)1P1hMoYe7
zeoHk9fZ0k023}xNhfSCx&WvD7!6~3rHy<9hSA@kL_c`&L3aGU-fxq*kfv=1UcUGo>
zIk-CkEFN6}zADb<^qVGvE^~Vj$ejl2DyCfIfuGEipVgqKBNi-p1UXIi2DrOW60X|j
z2c_~qa%1urg3>544dc8y=uR-;{`_`g0(a*ELH+^o)nyWw9AF3jURH)aOgS(QPT<;4
z<N%wSV_-+gJ+OCHJ~!015!Ac)09VsNkhS_4*Zz4SIH>R+@crHkuKtea+TM==GOa$~
z7)bzTxAi#7_kQ5kB`J91f&^4@F5*78g@EmsTEVi2AW*l$o4YxhGA9(G!PaGGK-6_}
z?pgU;=H9+bVCc?muw~C?u54>K_>Wuzk$K0#m>fTD={6nUzo-o~PPzj2+5~X*@~gmG
z?`%+R6bR-}!u={$1&cg}!M1U2Kz3IQ=NNL1iCtJI?(NhA#}C$=*{-R~^RE<`UK4?)
z)Arm(&jip_CeEKz9Kg1cm0V!>DIobo1Xct@fW{a5IN@RoresYv`1QCHtn`_|HU8EH
zKjX@Ql=?%^e{Bo*?X&|Z8<!4dpCW+IGU2Yysb=;)3<UQTvcXJ|4mVTVALLt(g11U@
z#XYuY?#jeiX4CjgaLGFlh^%ICFI64E{w2xaeSQ$oTgq^Uo5k<i*AWoa90Hs|qc}IW
zMWFQPa?m=w6|A1A!=3pz4j8Mg2je|r!15{`PRni#2w(XY+_`cVxNGj@?31@MvC_Wa
z{OCAPo~6XOj2i^~Wr<*6U>iuhp2-~;Xki*G<3Zu0>ELXfEH_hB#uThc1WVQ(0CK7t
z+}NcPK-|-*uq8|p=44cI|K?5wqvo-|M{xyM_f(N9bqEK;`nq5yTn+~OCUfZ#0_KeI
zHK3q;8Za%6+>iE?%<`Wx;QfRxVExna+_tgev)~gAoD%N?V=>9*=0GJgIc_r$o^=KC
z(WAMX#7ZW=%>)?TIt025{s}gz3PHub4<Nno46yhwoznsfz)Wjf@YZuVNa|M=6Hmnb
z0Oxp6A^uN?7q;Bv2~&ZIZvi-Y))<_hV!#P1SAlm4C1AJJ5|BH@a7O+oz+^NUCilGn
zaBdNI(XW8%Da->ehkSrbwidUea1+CcdoZKsMT1#Cw7CG~2#}dH4n9rz4-6X@a;@Io
zOv9=IFe-C3nDIl8Yka#52*pzL%~k2(r)V9wHeezMx?KWxDkp;**I90hmO4nQISL|$
ziC}t*33qYXYT)_#C6Fi{0xEH7Tz^CpvsJ1Pe5wusn>D6!gR^28bK7t*UiCcqV{FX5
znH2$yrgC6z^hr?l)|X?>bTJ>o^FV-d4lqAt!Rh`?1Jy*F-~N?^Q?pKS#rsBqkXzM2
zV{IvzIKzQ68UKY@s=gigW={bzaT479+ebmw*Eq1rd>i=K%W@r;l7L)y6j+$(4W8{@
z$fdRif{5=iKxjQ1+!va0)Jhe|hMWLT8lAxX+UcCcpb`)(+knb1BcNojz)g@pHT!=S
zHvaFxqImZIgW>qUMizw;nJD~E9tul}Lz*$>XkyGq&|Y5v_Beh89v#=1xPW8m=ZFWg
zml=nGu5>|Iri-o8x>0vk0g?*}LoJI$XpiO+^kK6t8d_|DYV~#Ci=;Z>hR=cNt@<E5
zx){y7fzStQDYSBu05bV%xc^)$O4}8U^sgR4PO+Kj>_b^JZh04KDrtnb?<|JPW0u1?
zO%7;hU<_c7M#0u?5m3;c3isD&!SWd~IOq9(%(a^0zyBHI)nQXnoUID_rE?1IeiQ-!
z#ms;SOTU4FT@T>E4GnNGBNlCT3P$qglac1!S~$is4f~X<Vwujbs7)gmHTEAw5BxRI
z@Lqy05B~?PMcd$n?ZI$mqXoLzlL00f9E7X6sc^H!4%oA#76kC;a9rARd^0-?bL&>&
zdP`$u_d^?fLJ{!y*ljRvW-N?1iiI$7HnK_E1Zux2;JgE+Xx$G*)Zd*0ca+9pvoprn
z>z6t{P{yOUau4)lwJAC&mZ3PRDk61708RbP;mwDJXwHqzV6AQutW%l~6*DrSyU!KS
zVIWIPr%fbY8&}~S{SNp;sR0`6AdTjpYl8F2y<vcL5tLo!2#2rz5RXV4L5sUQ4!fL=
zTz3kf|LO!Nx}A<6wHRRK^J0ua(`A%+H44ct_d@~S;*c;d1ns&T2BXE&7S9L@ncMMT
z$;~d<daw{49y|<Jx#+_Eqss8_w$r#U?;svYUWHX^Cn7=AV^|{WhMV|MX!$!0e(AS`
ze}47B_K>YWwJZ{OR_;X?-+X}?J|d`lHW5EFoq!*N-bB|mub{AbuaO&*iiED|XlX_y
z8pCzLla&>4`uTFGIkFe3yFZ40IkE6f4S=l&X2415Cvba%JH98DP)=H8ic_EJAl>=W
zsB!gQxNJ%{>^rZBT($h*>s3b3>#Ya`-+G3AX{VxT-{zoZG7F`g2*$k{s^WR&aip`a
z2F(%UW#s1nK#lkWdhq2u(kQJ!Qzz|120?Ss{GCSVaX3POYc4?z?-powHv=x-wH#L|
zJVUiwJ;?WB3@Y(Dh*X1Z(TDx2=%<Dz`l%m>;vE;EbGP2Xpx*=Vab_(VT`?E!X_$?6
zq)$cjtO52~KL+pnDnwGt3dNnl9Q1Qb8rt0O0-e6F8L6jgLBmfx6Ll&dvhshet{z;2
zYC48s@il35e{3!6t<J-fcN*hHhlyC{bRR02U5!3ZK8RAr8=|jDTFByYIk5I6px{Ut
zcyP&**=FZ}-^I6}=DBOp8<%NF)9wNaNpwbuI`dJ+ma#}PWg5A#;T$UJK0)3taz(1<
zK4{GR6qsLZj_1#L2&#^&!n+Y)!Ps+#P=3K`;QH+?F}_hk+77-X<Zw4`UhRZ;OHDv;
zpC@9)@5#`nPYM0%?*kVD&LN2m2_W^i5wAAdg0~)%z&@jlQAx5X#%>j8Uy_(Dv_}VJ
zoi`vqLVeJ=-~L4F!UkmWtOEX%Nrl#qUtsH@IAGkp8)avdLX%^yAZv#c5G1c-g~99D
z@h5k)D<{t*iw4Egw?J*wu<1O0?QjuhXS-tiDi`E6QI>4oUJJJ`Gb9C1u4A1w=J>C9
zBGNW!z}E`*<5K+`GHoy)%}MITtJ2btX_P7H6+h26?>0cCibvo}qYbRvF9p0<C0y8R
zfF!Fcp}%}ONYyoF_bxMFm)uyv3SC`^r{-oH`DZqAIr9bQ%*cV&A?kSkSQ}*U>K5)@
zode4vrV_W3i@0{97LH#RjeKn@@q{V{H`yH_zRNeFU2%!H#DyYmRT(x(t3YSeB4Kc9
zFwB~o0`{Gq0&?>#aoXx=WPfQB%&~6=c!3(5vQLw(&zQxwIyw-Yfywx$=Nu$yT8JgT
zRKaI&Kcl=)$#Cl0V>oUsfcsGae&c%(uQI!iM&9_MT}P_%rpvzAy&{y%I2VCBO%Yaj
zC5h{di;%2GK8lpb$b4uQI(K&+DotDk*X&J0cTWl6qesQy?tkf^%waF-o8w1zChj3U
z^OQ(o`vDZ@yBKZXE{(=Fq(Ntmhj4ZX2V9sfDEPSrXp)b`hG%Es+oSKHp_nMN$=?Eh
z`1lYt2HwYp;hHFA<yyQeWd^>#Q5nyy=|F9vndtg!h^Bme4h?q5pc&IlpiEUg*m>j$
zQ!ix#j$Vzx3R9Hv@4Itw*jZV8W~>{k{HBWhnZNMB=ikt&cmXQw`v~P(0lZqD2s>pz
zprY1l#Qe%a1uFpBIPMUN*s=zRR}#?ibzk7j6N%_rSt7dEQI5P0VPs_(3km}lf>a9)
zAbV7j89UnvDP$X?brTFwUg8P3UGF6RTYe0maGixK&3e#|mHUzLpt#^oTZSfIkVX-w
z{{ZEbW+1TcWI${>vl70>{&x`$wE2wI3s#})<G-PK?{koZ?PPSqOd9Qaag0cB8-=TH
z=(Ce{XQ9sBp-}U2F7RoIgE4=$F#e_r=-c6O&_}8q{ocufG0*0*8gwe_X=cdEKW)XQ
zhQhE-fgL(CS(p57OM=zcn&Bk*25@$XE3$C&W>kVx$kSzSuxVxn_9*v6Qok>tg<8|Z
zdg2Z=@4|EFfBptp{~yHmhdtN<)yK$5`765K-2?sP&cY9>&Y&~N6TbL67S?Z(Lwlr`
zf=8<x*l%VDY$Vsh9{n$yjMo=nVP+aqJP=HlX?4M)6yxToB=ip`5QkwAeBhi#oI@nZ
z((+vF5fP8Z^)%v)7qjr_x8Wo@W)?DAS4{S)YhdHCMy#!M4Eo*m7p;oQhXz*isBqgP
zpc2l((M7e;zbX~(ycYqMPL5{_yqsB|AfC++tt3}V8pIpfxkwB^BW=a^VPUE(PM#Zv
zDr?7*FO8SrjkCu{`Zg(&nO1}qErU=a;_&6cP;AL2lM7+K$gFTP@#!3c$N7FFdq^l6
zKl}}?vh9MkR;tKSX%n!&avDj^vPPDAs_@{3G4P`8PIhpaHT!4fDOSy-giLC8z)N5w
zdMhv@$CvfN#nM;N?c+^w<$`d$_AP=D6K9Z=QSb2)MSr|GB?_6#i|}_Xcf8?76ggSE
z9(~!Riyu#%fm@sku*}#vv?w(ajXgdety31lPc=2b!XO+S@*jodpXkD48^18Zv$dq_
zSUCBbmrRxfc3^L;kGM7mG!*g)b#|G<vDZytooyX>b@T~*9pA~^UB3qp$c5pHdLPiw
zWie>k%r>;C`xHu?-+(pr9z*Fx<M61PGFY#>0rAtz(6PZB^v(yNn{Oo1qOG-1dKQE`
zA|zng_%bFO>4K(?CwQrX_@HdXc>CFR=;&C2SPez=>Xj6_HtIhJ=PyI<*{7k@jRbf}
zXB#{+V*q)#r6Ji@t5DurGbC-qqR-a`Al&&HMtq$Qhlf&7pLzirwkt*|nvSUYQ3m)_
zHyTXd$un)4Nmg0aOHjxJdDQBC4|?9A(6_G%+eRniICn|><-Gvyf4&awxwsZp__?BL
zV1$aZFN1-{>j3&<z-(wb&TRUA6(@X$c;4mz(CYBb$a+T@%FkPfj!TTdr&S-|;Nwr&
z);<Z%Gg&}<U^^W2sDvGouNb3|b>gw?N~>Rcgs{p}5^k{#M*Pt!;C`eo>*ub_URwX2
zJo9>rU;Mg@rplP2?v@k`ri_Q36*|ySfWh-s+3?hkc&qodA!MJ+7d(&k#LKeG&~NQ3
zq|YrytM#f7h<*r7ODl+qH;YdOxv(cE-azii8`)Qy!%HKX@a5buj6>6GIN?kY7~cF7
z8rgI*4~;X~!rZy63tz(?)lDLmFHYkde=^a3mv)h`;s@~J>Mh7|pbk!)poYWMlE9Vc
z^~7&ji#RSkhUL>TkgfY%F;6fb-FAM1&8K_96VlN{s!IW9j@4wJb0?5N`wt{_=o(xc
z&B26MxnOx%I6Utf4SRRi!w)~#1GJ%x4JdYHR}Xixm#y>3%(zB8Jh~2Lya*?5xC>_K
zDPtK$D-`#v1xJ^bLHoB?$zaqb;+c2>Gdt^0g26}Z{5cyNT{uG&?4yyJO%}c|iAP0s
z8_CipM?|NmqA#Asa9w8=lv{Wdd=FcT9=hCx+T~5aKPU@Sw{2(l7H(x<XdGh8<^&QF
z)Qs!~Ly`Q727D?$2yVYU2wh#KK$-n#(4q7Q;P{)6)KA8wZqgP!rm6@v3C`oUF)Q(=
zt}voG-w}P>c@Z`Je1KNG-+~i_t5I^nb|k&l5{0_uz}XFX!2AAqv~fxj9Fyn@*LBTh
z4%J*C$<EniR45|t`VBbZ+k2>UV+`86(He<w8T>OSE-kmu2U_10;ni)NmD=NI+%qc_
z+sK?m1LMvh!%zEBr5J$YnD-5>LCfHxue<P{kK^&8(j#a>^$nC2k&XN$9ntYCP0)VZ
z1*oZ=1UEMVsCvAIG0V3BtLG+TFKt^q{-P=FmmEUQ-_+3KBndQm+JErSo9nPZV1%MR
z)Wbth(qUWQ9@zL?fb1iZ5mnfUjO;B?^ODVI+Rk36>G%q|J1v1q%g!Q|>>RX4vj(*n
zIwQb0f$}IT(AK=4nbMwTrQNX<Js2=VcjgX4iC^d8(4818VYMFj*!Llgkw-}Mq8JH^
zLs9OgS%|c%quF+yK=qavSa`vLnZ!mi@9rkyt$G9KMOh9qw$?{FDH-VCd|i|>tcAvM
zBG|W99aqlxMc-pw@Y!3=5IIhV1>X8#&v!SFP`}UW%j?b1Te$_~p7;t!Y9BFnh3AR6
zYX*6#YA=@KC*a!siYV^LAdIw2K~GGSVe!=wFwbr!sHmL)egEcLeS2j=wtuI%p@ZOS
ztvk_yy<w<&<`h&M9*@=zT!lf4#Vak9Cb&63ku~EoP~nPoNM^hWWVe^YEyt!X>5`#P
zX#5-`{KY8is1Dfo)Q2tmH<MNQw~Y-fU`X}E-T1bA04k~0Cx4nkVEb1GI2aob4kSH<
zwCIo3Reyi7_vd~5FQEY2zOhA<O9Ii(@!9ao4mlh&S_p>!xseOn^RW6eRkr$YE?SdX
ziaw3cgt3cK;JPsez`B1qe0Fj^%z3SZ9(CJ*@zYD$rsId%>hQB{#I9Y$Gs7KEJd=Tb
z`Wlg!ToWvoH%E1MV&Sd?8649imi%a8lJxlt))vS3qM{7ci>mRNX?l3GToBo)YmY7%
zF2$FBTteq&P9$9ozu?*58A$5K9XM;tb(neKD|6^>C+wZO0p6`F0M`b_F`9KV*%<|D
ztgD|aTirL2{J9^ETIV~V<USj0en<fhogW8}7y5yLgqyIeG?*a=NAR}~(&WK7MI2my
z3T;=Ki~lStLK1n8aIcvJ%0JzPy6vmb+Q*lX=+_REw`~dfS6>TbmsUfUfSn*kzX+oK
z)o}E>P~g`Z!Ssy_B{CUSB=Xy6vT^oCJhfi}EnZUryAp+P`3eho?_2@!TJfE6S=|P{
z>qS|~ifJzWrBkuL<9Rgg-zwC)HWtm>-UPp#X+(Nn(;)}7@ZvvX@SVRGP_%zK8p#sZ
z8<)nQ#tjeQjpY?kJ3t>+i{*+R7F}Vk*@@+9!5J7<O~GBa4e{j04)kuPJsO%d32n)H
z2>Xnhpx?+ZI9cZ;e0|9gT1zj2AEKJXWSlVMpl*xWC2i2x_xn(fRxfn9^%CxR90jjG
z8$#DI!;y8xLu4M}jyBXyg3@+R!JcIrjCXJy<8w3yUAZ$0{j<3X<t!h<qzpH_SwaD;
zIFzArhL;fY#2YyeuSVB>R8hiQL!^!xfbyIeFrpL1jG#6~FHauJsy856&uOS%V<NKu
z>5Z1O&q7Umq>(szM$;BuMblf-kgKC7&Z)Qqk321aW2PCvhH@408RnP+M@xV~?<lb8
z&13L);x=Yth4?-57qh^})Z=h2S)7MUp$YG9!!LdkNUF#a3Y5-+M{V(7ipUNGbR1@4
zEp71l+y_X~;~RQ7Cj^}t&O+)%v(Zqy75e+;3``l)##Js^$bU-}*3Bx0|A7)z7@7kY
zk$y<3QyI^t3Xsn`51NR0RAySpJdC_SR-HRc+Ek~J(MNfFY@7|+@<<ldc3ej7i+jMf
zvm(&az8c7tJ_SHM*6QnKUD7@)7sqedj(1w>p#ZoK=_TqTd!s^hZzLU7B|pGhrH7IJ
z5qGl4*98USm!UILHb4na1JqG2&8W?yz)L?2JnM;v%NtiRYSCla%J-|t=v$>kx$GLQ
z3z>snP92TV`U^<Aya#v~je>o>1n57}gZI|%u}TSfibXl4xJu;@lHIust=+l`^}ij3
z_6JGfi@^)vp)H$n)U9-MM_GXFX5ECYDF$fF*m&rdupY|&vtX9D$ANcVu>cQ0XWAGg
zMt+8fj5^~)7Ei@woOA$QXR#U~E)%9(S0H1@9+1<{fW;mXpsBeYOmDWb`guzXsf4cB
ztg!(tpSBHc_@;mki{AsE;YbvxycpX13eoh<b*NN){x0`Qp_f4kF#3!ZY&_xz%1;h3
z$;XZZ&u6=U_oms*7`I|ZZ+9zJNiM{6rait?dK6#!-UN?n=R&=@5;(<cJM^7QL1xr!
zFxzJlNciE)_!m4uDXlH&8OTC9xtb_=p177;Cf+&eIgCE=kx*W3JpL)pq2BL}M>}?x
zptJ~2RHLJcbk}Wx-7~}CbCUqrck~IcDO?Z2Digr@yWV*AS9PqX+=Pf#DGJw)N89F@
zpeskdLGAD2KG=~@@R&*koa??7UW5)X-mVhe68WO7i_FmZT2<8CXNfii$|J*wx3F|a
z5_EndK&QV)qTv1=$hE{B9jkFf1rroe`ly5O-i8?H?Z~58?-bN}^)EDGb<nviS**A4
zJ^DT)5+!D2Ajj%F^k}mu`f0QR+0`ha`^tJq?N%#{u{;X*E@Gjn;2wH0kcxK586e+M
zXH-|*2Wt*x!V;}OxXsuEj{bQb)hs`VXnX^*2{S|&+oI7aRu=g>9D?T$B*B6=`S8W>
z)llK-Vpv#T4;FUr#4>Bg;V)tyuoo4gqL*7y!;mFnd`!@q1#h9x#9NTdv4a=5XW-He
zX*eZy2;DrCgR*B9i-pVE(226UP@S@Hqv~kLEftTzZ>OQqi0f#weK*Ql)B(@G$wyLW
zN1?kJ1+YZF4rYI6p=72Bl)I+`?@SH@AN&*Wt9*T||M)$c@JxW3I~SsJs>VnaN+T=X
za@fsYhA`U``X*li!?Rw4j)oO@y6GKc=JOOiZrqN%l#8L+#f7kE@@1gu7YRNMJVJ#p
zE}@l6Yml^SH+(xI8hv9Yps}*s;b8qXSU5=&uJNA$htvS{4KD+2N~ySBXA(B*??>UP
z^7s;*gVw%~Kuz-B;ff>2q3hgY_&ml9Zk*8zmi?;)9~H*oQvcH^c3uoRbI<}A7e~M<
zuXS*);ZtD0Yy%k3e~PBBID=fHP4M?rIW(;{1;v|wfCt@L;H0B_q2E0RxOA#1OfnLH
zu$Tv+zdHj9%5`u{bQiihsRbS1I2rlnj7IB&pTY_Hd2mO32uvo{aBTWM5aw_Xyy2cA
z!Qzw1esc-BA{~tArAD~;VGh*TX9fBSPJ-hm*(h1+0vhAgigwsaBaaS*W`zo2wYxuj
zB9#oSrscqcfA+zY)yKihRZ8&b4Ldyit`DsUszr`JAEWEL9FaouZ^-T#jZ_a@fkiqk
z@YjZe@aHHss1>OUkySmiy_tprK2Y>8&J^iqzkwc;_QTKlli|?hN}wE~iNB6*MFCU0
z(0_NIpwSTw($xJ7E%}=;`0hy<QF$BcdC!Ma$zPzPyHwoY9gE9LucM)=vuI*-Jn~$z
z7Cm03gI=`Uf@_bwf`N-iq3xq1AWBGu0s6LZjkw2OJj)VY>xF1@mI9h}yA<xOQ-Uwr
z?|}ASGEhRjVD|sm4*g#|l-Qo=|AB`R|Dy80<`%2M4vA@Z<M^iT9+KU83qSvrgB{)@
z8dxIFPm`9TKWtCY6TP=ZH-fLwja8p%J0C@Nx=$vp_a$IgM<zY8v6;C0+w*6X(vY8_
z9D8$-EPpe~ik^yNsY;g;@#yQN6XGZG^6TZ<Tid7M)U|qKK}9;cdHNG~p%;?aG2d~`
zHF>OIc9ASFzeCJAX3>^}%Oqa83rX*jV}o5g>4)=oII+bVe~iSC{q+^%HO#X_@?0f(
z`1>*)J->lo`(?zBbal~);3@RiWkqt~Kn?yL5lzRZW|5KAwK&qILzKU&jFQ3mywqWR
z^04|hog+qJ*tCyj3siQ}<u#@FQf?>tQM#3MEUv_yZVA=@XMr~@`5~6F8WKTv9@*V)
zNu~Y5$mvoMcJ}=vdad$IRGcR!czP_r%@b_Nde0(~lK6#6Y&t<*B_-M5-b+|3T9bWo
zUWwK%&m!CPw25r=Fj}^<gN{kLL6nkba+dq|k(h~5)W6Ju+TD&L5p~Z*_Unu3oT~=J
zEom5U`LKx`IxERv0}OGT_>ye>noOpytESp&?}&{_26=e;3vn@=L(*)g(^iocUn}Rp
z+sLlw_iS53du4`5{&91j)0gBG54VUMmkuGh_|<%fOF9*~N77$&&!WCT6~1|B0$mdv
zM_<m;;yHDBnlFkcX|txXe^(tNXH*eke#!BwQ<mbSAMw;p?ty4z)ML`OGm@N-loRC_
zf56fEc(SdmpZ=buO@qBT(Y-+#{;5V7xqbQ|eSIsKTCR|y;Fmgebj!utM%L5R+tsvT
zsUf}RIF1#qSK_Dat|1?m_0TkX5si&#ptBC&C05BxN#A=-x^7Rr@ZazI1imUIHAbJv
zg4oYw^Vo&_b9V*aI)AT7^{=7GM?!<hTWj)fk}c^L!#rww&xqU(TfjCwFBMHy8^;%Z
zb|&Bbo4DG9o1}H!crurLMC>Jo$jTHbT7Kn+5M{^EPs%dvL(W?iuxpKQsa_22dXk8T
zihhXuVCy+&pJ9>H_I`9JWq?eLod!R8%d&<C(@6Wh`=Zy`pGe83F1plEk^L^%M8@3w
zN`h=kg@rxeNQ%Blq@0n1H_fRN{nuP0+;GmCeVTQWB%11>*Ebr3RpIw&n(I%IRPP<3
z?MzjE-O+I@Ffu})Dz}N|KDWS81GlNq`1NE!jCgYWIfm3lT*R+e?LwmCr8LLRfSx@(
znmy6~NHlirXckSoKy5AoTA6l?{P0SmZhu@@hl6T7w3g>P)t8dWh>t|t+mJNFaB{*v
z2<P6OhyN@{qDC`fg>^Djw0OG#QR}Lp6&_++Ak{AHHp7h%iTOj({B|O#a)g9Dxh!h2
z{3x0qJD#=Esuu=4x=HqX?jycuZqVrK_sF+GN%k8~qDe-ZamX;>bFP+>WUmIg`<ekd
z9QB@-p3J7d;;vC7a>i!GW7xK|M#_XZ(P`_pi)vq)ieASoz^`9x@e?9rXwY~GHX+m)
z|6{5|bG=^E#Z!uDfYAsow>~4PEiMrXBPFPMlr8-^!;f5bz;xB3Zrro101xMx@b`*h
zL{lb>(8jE1L|1wR9o(nI`wmu;z~{SpSF;q-X1<hkyq-$d>;EA!^Y_wjQ!(}`aVgt3
z_X$2FMsj`FXv*h5nap-1f5DYYYUtcHQ@-EOQ8dla7B8y*Len1XqF%jzbZLnpRgpMN
z_Jpva4UP-gz*~3lKFN*z-jYNrb^R-SxG#g~emzBB8GRw&trXddieE*2-)>+Rw?`tC
zcL6k1{Uh?w{Xu<7X0T3+^;p4dLlU@Og2atWCrQUfv0qkc@f+IBsN41JJo+0;tkq<R
zclATEcjUK-U8Ya}7GdEwQwerzVhuI1c4Ef|CzIBg$>fxVFTcN2nHL%w@gW7ZSku9h
zm9e`=3*^`Ez6Q=jUe1O7T0MpOQ42oDy^_32vgbEu+p@1r_4zNG?+d?*Yt_z)r^&#6
zMVco4j2J1t6}~(>oBB<eOoz0k*fX348?g1gaP^&OtQv7+AC$SG+RZV<w0IWI-MWfM
zJD8F04=xaAjRb1=&RG=aE+PS5V<=Pcn>Kr0z~gVr@~`t`VNHAmir(~|G~zbVvK=xs
z(Cq=eH=GVPYZ4M0aEvNem5?mK52D+5jdlk`63_qo=|2Mv(ahu#vbP5CEIdz*s@lkp
zQ9@Du?b~$zH;VsIeY)X}G0A0j3%+~Ai=4JjAdK#J@~+&Bk6C4pkH&2xj;T7tV4e;+
zulIyLX&y%+L8Y+0X9L+~?kWni5K~j<O`#SiUenJy#(afb6rEPCE;yuo1&z(frFxZ3
zv_fA+Y*Tjw*FFp<l6Tek*#6T(ZzElSU$`=LNv|Zi)-gEuS3X@^6h<nqy~N)2&+(i@
zOY(E(3EHw>iemrqbYk#vk&lcTf7bm6jjh$iPlkU8Wo>U#EhBgOQV`5vc^yG+W;^qv
zq~+M2t~cZXrzUd0@)`b8{7cLGdvH%kHNE9gOH@Ah(?7EXG$A%e^n7$ZbwBM$y@ENi
z^y+VnQ!}Yz%Rix7uaMsDK8^bWLrBqq1N4Nag6PplL)OVfgO}S?DJH-!Cez}di<F1I
z5ic=Wb)Uu#erawIp^0I%(@c_2_CJ9gzm4Ye<vVHbdLCc=oGA)hsK(3MXwnbnam2S+
znbkk`g+_ZT3E!i7+7337&09_Ru<Mig=L_r!O%JCpHZQ~T@697hikC^`)^Iv`VXNqH
z+;h>Gf`|BP-gf@iwO+jFoD5xbKc86Di_d?fn61*COY_s@u;k`0TA4SKp6DD9c}%~C
z-=EWG3u78Zr}A0)aYhQwuiZpmw%AgkrwOlJVoJVw)e&yxI6hEag+<?{u`dTEu>~K-
zPzMz$GE=;|{wLrey;m`v{&*|Pis*kNWztsu{$2@^IesC2*Ha*xSF)RLjWD6y-!c5g
zQR{i?a)pw{UVKZTk=8%cqW_*bBfX7_sdHGDFqW61BNuj1%THD`*g}DxJF3k8*O^Ms
zEqCWTuEdh#LPhqrR2f!tsiaC{wE3AiLVU<51TWinov8Ly;KgpESqpz#Qe$zQUi~_W
z{q38IK5P=AqfR+Q$y$bgCUpaEvHL~sQoo8?ua}aIbN|v%aqOPFwFjThsUcs)v2x9m
zar_BMS;~61Qu_<7^kZN(t^0D3YImI>SAL%$+sH#wki3RU7{ya#g^5(&JDaROu!h#X
z&B7UPXVK@u2dR;9mgsxzFe;M_5C#@4pv<$aG@@rBd$^?w-$}uI>WV4+KdnvV)W9LK
z-&%<G|I;Hc=ANcD52ulf|7o$KJ}sw?Vr#y0$p&oQg;o5O+$2=l6eW^4$<R5&OK8oP
zdqnf)AgNz_gUCHEr+8-u2@W_*`qTGQ*ec7r|B5E_uqqF)JJYGHh4^D)2-$Rzk|1$>
zoLBk?UvYU(U!EIB794Y;H9ahy@wu5I$*<JlOf3zO<j85(l2$2)(qq@w;@tYlY;@Il
z{z;V#U*$Q24^DNW-L-1;h8XYier~^TM_&^?IbNN2F03F{>B%IFT&7&%3*pPyL-_Gm
zV|s7-1-iPdk}MehMNbLd(NI2}?tE^}FV4)Ra^17UL%3oh-#Lb#nW(^qYfJM#ADi$7
z3vN^MjM4Ogsw6*Q+dOu0T`9g@JwTc!{t)Sfx$$03mi(yfLC#pZSEOue%>Qd$D>9aK
zq}rhq*x!dEM3cjx)0PdV$*u#J=*EB5c<}N?nmGJQ<a8p4L^!{t6Hf<FyQ7WNW7<!=
zW0eLwujMo~+;fs{T(ONBCzjF^&sOqk-ABo<k16ztXcE%@>qfP{jpGyU8S?edjo4{o
z1CEKZ2dMgwYH~h&K7Zp&mnc+DnhFe*2{T`wzAj0i$#+(;TULytX&y89v-7)%Vc8({
z8X6M*4b7mP|CaH0{{En5hZXsFA)$Qr8S3ODzUFPxyv@*Cvciy~iCQ!GG+RX$N37>x
zb@TLPRSoqhBchq(XNV%|5Z{vTB5LwqM6!1{@@3yVh>F;XaB}i<QP)oeevRY=_Uq;K
z6iCUjf3)Oy$>VcamGu&A{asHI;#`L8<~=0wx5DX8xtF2`x!J<$(ffJvDlR>s(MY|H
zTtK(iY#|dK93_ISP~=<umf9`4NJbx;O-~xhv+YH3#DJ@(6EZu=-rzIzO_~<FbI)j!
zl&i{~6s;mUg$?wP{7iP7jU65Dp8_+Fq=~*B(&9fxi@kNW5&re6LwtZjFVVX4kxXCr
zk{s&DASX_bh%Wzu?6!wZ=*OdVB-X53^eaY<U2xY4t4n;OZ)9c@LH`5t)<=iEFyDeW
zri6=5w0$Cu=9cUdy>mpmqm)En5Mvm`IjvJ<4F7`3rLj#3WJA#l@!7gf{{bof&Yq`a
z(XAnRN<o`{u2Dyu{d>^q4XerXY$I~_Q#h`8-a|K8bdsGUmsC7($IhYGiN9j3P<iwz
zGJDHrirZe(4})7NXO&1dt<dEk#D5|=3GFnfG6qS`smFDm$LPu`8$SQ_W3uJYdx{L5
z*lUu~C@;vA{BeCkUdOwWOLxUcN^eh+JN+H~`Z|ji?q5MqJbX@rH^<TZL(_OBTu9BW
zU(wjxpXdSqdvwNIPofoJ%Vw?|P0IBVsZgWB*di_d*?$sr&?K5T!u#a#;v~Ae)RwCJ
zJWd1q4~hM^R<hf6mr;%P3B;nviYSgtr6Q9o+8AuWF6~lhS43vO^h|%zWu}D)&c)Hy
zp9aZba+qlHuJ!cfO-sCEV<h<=G9a2$`4!11nb324Drm#MUV3qXH@UlZ3#n6T!R?Z-
zXw%3TcFX4r^hM}Ces#ADdvn4Lk@;CQe!FKWoxNf=h20}mcijW(w&Xur(-=#Xy`$*g
z;#yp@B94DM9}2&@9Uwh3P5H}eZy+=ODLJ*ITsYJ>o4&qlCUo+(Av2wHiJL?!xw%(P
zOhHp(AL{|uYpQ_2jmLzYGrZ{?^Bgih&63@iVoT1?w&J^+hDEiO9wf-Ph%QvI66YdI
z=<NfsWJ=5tJXdg&cpsV0W5*Jb((OPTEMAKaKP#nmP3hD|SSqx)%cC>I@kyo2f_hyv
zB7;*z#OF>r2BJo6qL(L{qMnC3UA6g~7%lqHv77#(cBD770t-nFv5a~{pKazu=W?~#
zqePB>7_LMYs=DAqpE#NqR7ZQ_{!l+L4#~)VBiZU4gKbZaq31%Dll>+EWW%D5<l<#d
zQ8pb%4pzP)-)z#+qE3#^EsG~D?MbAYxRU<z1$0`L24%;_6SL-@lr<=#ThBT0?-p$q
zMYOw<flI~oO}YXpD~+PPVUNh^DJ%FVqb^a`qAF_dJB511I}rEi(^y?whkd5mjIS+p
z=bb)Y5Y>K=BYU2|A(|$m_y#dncZ1F;;oQ#(qUkrU3OimrAp82fsGC<F?g+{wJKZoD
zZo4dkp6&FS-EC59ahYzI`j~jTGVFJ010u4$im&Q*lEan`JY$hZ&A$zabQDB%*>*3w
zxYV4)(`=ENS}q<8lVR6s-ldyNqsgDjBogL-k(?Z;AtnRwh@_S*d-+8m<rT_k?9R>f
zZHFH%%RNA)qsHTyO9Mn9yNpWD9!GM$<fwNi;mNLMa%J5uQR$x(u<)4-EzuDXJD(al
zE!3JEz7t1wjJ`)pU&V-2oNYvde<HE<^hu(sgQ0lO{Uj>8u}CCYc9~j^*-k9a?W0Ri
z)KlFX<FJwQ8<AbP3e{MaLS;}ZwW~2DuC@xi#HmTVeVjC(Yj%S?ODiK^2Pe?G7w+M6
z-c$J*`k`b_ow;ali3tBxsv=p=y$DXh^rIvtbKd6Afy3_scr=<F7UWXz-H9Z{xq%#c
zJ(u<N=%HY&JMvqtP3p^6@^41>VVg5cXvPY68d&R3(NT^r>dz9kmmk8z^FwLLq<11u
zv1N1BzX2*;I!I22>?P-KYO-wi49dA<UUQBi|M<fsDt9cOO8jdl8Bsmd^jZnI)xCgz
zy|aa+dc~7-hpqUbiUK-Q-1ocuIUM^OT1N_waO9V<82P#R6jolL#p=dPCtQ{*nfW@G
zq&7{bcXDgUoR{&U4WhdwI9QjAEf1xCOx}xB`UdIt40#%|ARdoCXi6_57drR+8oK}H
z4FV&k@}HX(NNi`1XtTmNmaO@TZ%&vc+IY*D7xk&~x_b&ayKS@hup3`+l%EGqc?!|c
zT{AZ5as~d9x`GBio+Sd(33Q)q6)CSP6=fZF5v{%E0TtyIvkHeaiN}-@N^=_F)4)6u
zTEB_NmfaM3^@ozFKU+z+ajO^|q(&x-=dTLqXA)`6UqauFsnomj648@Np$-<-{FsAA
z=zjiGeuv2c>NTxR%vzP_!8&(QPu4%Gtl>+H#F%Y1Fb3~>5sB;9M-c<1eyo#eOy1j+
z(P(gswyI2K4>ybZ6K`(P!=bnEM1c(U(bo_S2yCd!?hsMRUceT}`|#Ouqwp+`iF{<D
zh{RXq(*^nAWWZlnwDyS_f8y0n{`~gs_~Acy)~|OdZOpDBk~0CT9NtWmzxz;5KbF1^
zK1W_m|4v`;x=2;00e-y117bMOflZpZgE)!}&|WWigPq<3+`R9xaQQJAR_=@@wQich
zJB;k41=c0>>PtwZ0$<b3vwUgba41n;XhW?YeIPFGVZz&wJ^A&K4Ey57DC+g#C3j$j
zA93mJA$2DusN!V@vf9d=e;53kbSGRQWw$@j9RrUs+LcL6bY$4aIkWloS+eYGw2M6b
zxRq4Pifc{xdt@+8i&ptsum-nY)AP0E#9dpREgK(2*Y~y4bl-*Sq3d^%R+ucm=g1N2
zF)2~Bu<;u06Yw;^^fZ0z`b?POFiGgr^oGuUagp*N_VmmfWxjaILZTEiMDG0=qM@%i
zYW^3~JU49;VEc}q_UNX0nQzEJD;@ftN5U;y4BzlXn<j6aKuf~^&}PLKq8oi8lIK%P
zGh_AWx)s4BB=sZ;pYfZ>nmLiPX?gT>bSIWgm13p;l+!WG{mHULr^v3z&on%;gLsTy
zOIyw~lj_wPG~UXbRGeB*x2Ec`4{evS4@1x3?v;n>&<8XA;QRY@rL8GBP^ZV&Ywe_>
z_CAu?`w(lM^d+CmjmZ_M4r(uZg6z29A&PujNUk&%(J?En_~#c3$UI{UR<~1;Uu3bE
zqGwH_-EYnb?X~(v^Hz=$$vFR_Ru3Jhd$<HYwq*?KGJYR7D(@@}(!WKdatlNW7O`Zd
ztRa?36r*I#rFf~=lX=CZgXDws8IeA>8&5d59d}Mf6i+-(o_>&}@3)50mTFZtaC@qd
z*v`PQU1s!3!(~Cp$X5Eu*OqnNBF`pXk>Z=*J}2n@IBNG?g3bOb$De7R$UhjF&Cl<R
zA(9<i*~iWIMY9Jdk`GlKbjEfk(W0FfanM;nV1g=t>|6?cd~-k~8Cyi!LyO6It8{Wn
zubC_y_7m01-=Pz1?dhy%dqqY)vqTZ%e(|@cyF%Lqd34n6d{R-XNo!Iac^S@&=&boj
z9c7D&nW#jxYhwXjC45UfTb_{vF~{hs?=djo;3*=p<qvtcPl-Kl_n#P}_LHiM427Hb
z|0ZaR1ZCwl`MFP%$g+t6<h#9!$gWV97eRSG!6$*lq-4_dzOBUL-BhyXMkBR8K7pDY
zln@=YJ0e10EZP6~3SF;k1dj$LV3{&?w!Xa?Mz5e$^dMAty)u#r_LR~I1|{V03UNMH
zEXKc!{U;Tq){(hi6T~>!lVo_R44eH*fw#TcB1Y==ks~Xu2v@$8-~I9x+N~c%?~Le^
z<%eeANmsS$oLxw4{^mm)vKLX?A2}rXL9D1~??tMY$k1DPllUh~r(!p;g~Hz*cW{*S
zdwQi<gZi|a^E;pT)1mtpaZHmdYyWgITi|Dd@7uf<?HAvt{~sPoJg)d3der}(StyOn
z<T_au;PlTKz8sS#SaH${mK{%nADmXgC(<UuWD7eWIr|jw+8hSvx7l*>>EnR6{UF$|
z;x}+lPvWj-{I*&>JObMD^u@Z|46(WKbk5|^S4-@t3s(c7m8iQw09AzGz<F!9L$I8y
z|7HUN8gik2!e+QrU@3Gm%Hm2Vc{Yq|ON2j0YM6}1d*J1rB6#OoCJaAeA$<5a6K0;5
zM;h^u;j-RBVR*oFfssN9a48uNs{zApT&lxym;P(e9<K(M8HX{4J~5o~g0jXf(-}CT
zcb0iLkRUj)It9$1WdNVwGvs=V!(is9Hu$tH1N#396gr(g!aXgWCs61Mg$ouKf%jek
zz;Q_dJh3Pdu8KDlI*4lE+t~nBR>+`_op*%jT$o_ePj!JtPznh4`N_;mmElU)9}pbr
zQik>Woq$`ODmP%&Ea?7W2~T(igFz)EXrCVsihZ?VZ~a_Oqv0sD_xlJ9Qo`Yj?fZrQ
z7Wi`P#F>I7^WD&{Z4M|O)5;XRN`SRpnXo-zqENc>BD6VYiqtMEqFu$egtL7-1--TQ
zf=i{b;H<_((6{@YV3*`Y!QZ3GF#P}U_2zLoL}CAbsc6x@Z%PSm+H20tIcJg<dz*+N
zv{*|h5!%zDR9cZD*%HyB?z!)oh!jbolqDf+5t1yC-~IhQ&-48~zvugU{qFhi%$z^w
zHFIBQ&UIa%_s3)#aOqHE4E&Dp29{crtcnZR<m}CRC(;DMe00dLZS$EEjeE(k=x3zN
zvYq6yiA{W;1bwDna(_eqUm5ZtrwFW%ZQyBs_9Q3IE+lnk3^3ouE|BPr6cws8Mt<FS
zk?$Lx!Slj74Y^Hw0R5+fXum4WtefC9JdG76Pc8dMC}xQ=hd#V(7;zZ~AAg8}`wB;h
zO9roimBC{$wI-a=*scd+O$y1J${cdXnrZy3b<-LSCpa~f$SkjmE2t*I6sjB~b3cR7
z_fq8ELy3&ZR6dB7kSE7CNs>i-7$&;wJ#ljUFbGY}1|RRuVPgK+HAMgWbJeIKo=~*1
zt-s$DNjU#=2d83B0y#w$M#?1_JkuQq`<q%ptn*=Jk)8+9B|QW>68gb3Y6r9YpcvRG
z8v|}m_XTYm)fi%fJV>9H1ENazfm_E-8Ik|-dnRcCzExI(?{39lg}pZ;Ci0SaSh5!M
zPp5&3j5t%M|Aw&2+X4*T{lGh4Ip*}exuDyn8FcSD4LsX|nTTu0L9zNYvS+P0>2{`p
z`6Z*tY|n|WpBf@ZmiBHXF3ed+Uim$VS}NX59(#3&za`d#v~O=E_49U-K_<)jv7SFb
z>PJU1@U=9leRY5to?1jYOzj~LRq@D&7U_JhV~BU@QbmJN!g~-~+dw$>?d5%c>Cx~e
zAOH;Mlo3y^tR*E}u919&-6Zy0&i9|<&n*02#%pz0Pd@!z00Qp+bm+DCNOqhUA`>5k
z@(p{7s3m8oK<QYPn!4$T;K-vA!nbyJgX@wP4TC2+!nW-xxxrh3Qnpc~;;UQu-xDVq
z-fdsRJe__M*!W11X)mYpV#LcEgx;P!bACIxvn-ip2x;nKb}bo|o6B#WZq96Z@`(4L
zfgnA9H-aGNCCo>|S3-PGB<Z?UDAixvPf4e^Kwhf?EdBRNVE8p0Y(4hKeq+H@W<%O>
zpnA@c=WDo$x621N3_th?bOuKnhD{=w#CaybSAG*IdSPY#&j&~9)m?=agU8LtJS#7<
zZq75(?PV%?QEmhO&Js<=c5x(6_0xA?Q&JBiC!Jv0;(j)ySFIyw$&3R#@+I{#%@syf
zs6w}mZv{K2XMuQ4^@f2IZANs00f9D24N;*Bnd<$>VMNZCJSO&<C$Q__{d655mM=o&
z+|*Rt**644=_<?+-7`tO&spHl&Ky!QV>{`hs?OIkOL8bRG2wY_?rpehlL&syIL*vG
z8%Er#G9l}_709!1?o*fbEnp0z0M~_d2}-nrz^XT9L{`5f6X%o;a(fhbYIW)iDsljm
zb>+xI>2c)w>n-HQ+fPZ+NooArmn#|us+;QXm9+69CBA{>+%w+#$4cbgSCdIUXv*}%
zB;we(D=#YeQav8k5+WN8@P5SFH!Pje=CGzU8+;HLQ5*T`l!ZnD^{dB1P^3%|zDG<N
zcG)yGTnnxzYTMfDia#7|2=6{^`?2E?;jviQy*4I81=^@m$f%J&Pq=P;uy_WZeImiv
zh}F!Tz70IZNb!aMx#)W7<P1>qMvUljqV3O`9Cp}s!?&TD{X*0Zx&tSrwIEwwn#mvd
z?$E#d05N-85Ft59oA-R;B5~b95`1j^N}Lm|<o&E!=<qP-_0=r>ef1ZEXE>DWc!H@~
zO#oJ~;PQ+JrX|AwxVs+_N<JfjQHeEk`omseS@j0IJ@6EKx{<|vHf|<_I($a=zzp!-
zP>a;7UqMbz*QVZ?wUYmC9_2?rb0?$aM5u-rY2@&?-TaLgM!=Ea6=cFoK;9^y#FzO|
zPO4T(P%THFk*C2azF+ZMqBzc%nG>Z4vOfrsSI_SgM}2279$Q9<Xxsw^>xV%|Qze;t
z%$Zd3H{x%ZnglNQ++xN`FM{TO5hUSn3AA^=AWM`6NYR^H`Pz@pQ*(aJhTdPAskqR~
zg6ldD2&aK|-jf;wqSHJXFe%2AM_vd;%yFUad#DN)E$4wf3;7H|`-2NV*ORVAYGCOA
z&7|DNSD(sglN(OkkWa6@B3DMbk{brx`TPe_ymhM`nV-uGz^Jng`Aqf%Bl6mur&I1p
zCQj8N*N>>e;fOeR_q7R}6t2K-yXgUT92Vhi8a>I|ryKz;U2Y_?Qx_T2_nQ1-Rl@f%
zf@H071&EmtCA|*bW>mdOiOZY6)$jT~!kZNP1pHvmG^|_L-JoYyPOP=)CB#yb8eVEy
zFg*kAyyGo9$%}tJFmCOspoS+#X8uhkSMoGq_wppzdy<CAP8w{l(thwT__IUuCv`?X
zsSL~*(qvqHgrxPQQ%On5MWmHS4cUP|ke-*mk)LGB`O}L}ftOqRd0suT%%jJqr2H3Y
zX35EZBHw4PL!D3-zW*2o;crVBrLFG3dz(Lb`(PZiuk;x2ty@n+)kH1HczvbPEjPi;
zP8+DWS%PIs)_@i(M_!cLA>MD@81Qv$EzjhI5c`3B0Dof|Iazxa^)WPs+AW(-MI=}Y
z25N5r^=0QkR=zB`_r^&kYG4MF`$LcS`)mZSNiCV2u6B*spv3YVLf#SEkIe*G!)Xm`
z{HHP}=RYU%K8TVT-z}+qfmf-6BL&p)w_XCHo;1S#wJz^ieU!u0mAS-<RdNmoOwD=J
zt?k74q)x)$^dD(@eG_$fx(}6IEH4;1HHB=<QzW~JRmd~19x+EAo+6N?8>5=GnOHb;
z206CNmRPxLHE}UNkyzm{lee*Y4k(GY2anEW0d4K+4E8B=@H()P*pjJ0^d0GI*yX&H
z&|RPc4juVGtd%X}J+a?kw_SU3eW;<ET{A1?5TWY|{2ZTwBQI(}f>Jaym^cf(6`cnZ
zk41r)SPdp;<6-b7D;cyb?E}+_qM3fR8^q2Sni*K90j_9^lKv46<j1JVRI0-j(qY#D
z{^RSq<miJR<kyoqWYw&#e6qU%=t}M&zkSpv?JoRa*6#2n1JyMt`Nh}C(7{6fL&J|m
z_xy#-uz>+^SuRd)+5M8(<}rndu5KefhMxkmUeARHle45)iYK}7mm&W}T^9K8<`U!N
zo(`UV_8^_crO1@Eh2(=jnWVR|9pBG7lA2Pd2@@|@QkO0i2>9<m5+i#iGxh&Y6JaaP
zfwk?*R0e-9)fizztzs1feGYL#lwASycIJK{LYb2nL{)+1Vo9cdw1pt7^MI3fHE^ek
zNSVFL<S#sh|1`-7d}|M57Mfw8(IiLeE-h!0tDo}{KV^~C)*7U0g9P+6N`#YpwIIGK
z#TJFlC)OYQ$?G1H2F<odf&T_&>d0IhN<7Do3e=k5*F#lOqUi^aS(OF`x+|EGO*aVn
zv0V-8zQpn#Tl#}@*N*XGNLyZ;LNPG9Y6HZV6@#JF(~Q(^Um*I;m0Y*}BXer%2V!>n
zTM%GbPTonL0&P4}p{wp(nCPL#X6^9=sY&k~<h%dy{<b88-`XCG&a`}Rr%08Q`xDdP
zG&+ltIy9TwrA|@muO|s)#REWbkRD@xMzrBVaX;WM%Vz>Vg@Au8tHF)}KssDJ0pyg<
zG0*gKK+JjvQr9Md_wVQjh8OGrbUeP14OgyFdt<|)l&T@r`~FK1tr8E4DO)DreWSzL
zr7ytSEC-%XcOCDx(h=T<Xdlvdrw+C9b_&(-X&V*%d#0e&wg`xymmqJ@FF^R<3FhW2
zg9drWOH7DiHm@$chy3hb=<uRZo9AzlKny&}B0SC}fKPvunBt(F;O=V~GWE|_^3lqA
zitO4%tqiagZ0fl{cyP;je#bnBjkod%O{>-QsYMn%rQ6xWx}ZU#>UI?w(YKG<zTAK^
zN*m|%!WzII3lao6$dDzY>CDc^dtkmq6SKQ96SPfPPTsV0CkhEskUEV|n7gL&J}%S(
zVzX_*%jNq(OQjOiS0PHwY~vFscMp+r1@cA{^N1&&8i21Z0oaZj-VdXX_8E&$)Mt7=
zus7GdVUOMgg1ZXBUN-y?sCpGK%f7pTr9M2OsAWG8%aLRPyM$}*$O_PD(h2If2Qkj+
z#&!-V{=6S@d4&2LC9rg+CTZK-N`7!TM4s>R<iFG!0~*&F$&*Jmlag+LpO8=vZja3;
zw<s%;8PgvzUw17eqrzmUP8%K>>5<8Qp;KuG!Zz|`JTi&rxAcLx|4)ZsPum+(Z{`u}
zZ>e1M0k?q2#yw<Bm=&27Eyf>Ht|6{_&0!|>&jk7WXW(e*C19MPN=5*h)DU^Z{0cFn
ztW~~J&$Wdt0E>-+9~OxYeJWWEzm2yz%#JW10@f6gbCvz6yrwCX6xYL_zLQ66`SXc4
z-AEL8AC3W8QW-?%?&Z8kBHDyp<3r-uUj|6;4=1-<%_7IMelw|B*5JUvIwtzVBA}Q&
zi8S@b%<(_Vm=M?9<fxH0Y2)5RiK?!FU2DZ)=#rNLle-!YcX1_eZl(m7cX0tIw*E+3
zehH+?CkQI*nz*3&+hWor{UUk!`8M+5XBWO;Vvvwoa)Y;9r1@&cO(D8gJc{?^@*pos
zTL5y+E5OAIxj<ngmzk5B3hoVSl3%{)GEGL8nWUrr;KJe-a=u$H^=)$$oM&VNJ<TSu
z8ZD_r=a2Y?oU4@$CEL#sVw^qincYn?Xi^R7Im?p&I@FNT;_ajKuCAhLYo`h1_0E8q
z2Hg#TwM$8vltkvTs}u8CYZWtHO`S}sNg%1RAtG$&R3_x8IZ)e^0^Htp0vo8uzt;H;
zq^@ZvC)cJ>zU34gN&QV#25^EK9cn<$<~vXAZw4_|bpSltWW=++{;NU6z>qil^((M`
zN(Wibrc*Ai1hsjotYCHICa~a|26^YiH=w=k4D)$zG+533W}+iXK*nGV`MdJ1gWdUW
z#IhTrKyF3`&(AIsc&c3I71&$@f%+M|?vZk`$taG>aGOqTn)I9hbb}%hv}Y3U#TF^z
zdeb&SGU!(Q_}jb&_Y(@lXxBbM;dUyiSF@0Mqb^EqQfcMaS=<Fv;E+Rsy$WgD7RQLX
zRsm(TBIZ&{IvA&wNwwr^;+T^+IIL(0LYv?5^olfq+4&-{uOtUto<}jVZn_SY!`~bj
z&od5EVG#`=^dcdXA_;naO#uUWHN4v2n#AO&1%&9by@YXvI!{4-J}4ae3d~9xfbWS!
z#=M>e`~6fvmQo5BO44A!kWjBJ+?#o>6eYEqN*OO(EpX9Yh$1sM03>-rGo_llU}H!S
zIW|s^$A?7tRt2Akm+z}V(fieaDVf9MZ7%^9$1TX@5oyxu#Z88}ZA3P=w2=FQbA`B~
z75vWJJlmIzb`9MJd>wYGPdGfgv>Ln|d=BC+HG=*XiA-VFQm|{`Q;@l=2Dtr;X6$Tk
zfMkP3<o<Kk<lZx%8C8Ylz+;pLwgkNes`nC@<MU6Db<;OdUx#I>4TS^z6)j5Oyu%Gp
zoR9|2OD<w;a3uN8#+1@=eM+8CxWHfRUI{{r7042G6>@tp%b1+`4nCS>k}Fc(NpWLM
z{-T{z!28Pe;FbACppdG<d~Kgc*8KiVmd&UjE&uH2U$|CC9PN6=OB#I)JpP0<{H`&j
zQgxnDP5Xo~z209ideMj=j4*FCUyi7n_loFWd4-%GyqapL(xi0y-|_Ve_LAFrbg9p`
zualqJOZeR08Kl>zHge1=fn0Cm!9SsvOk6$qj8_ufP7I2tg2ByB<oD<?@=Mlva{uBu
ze*a)Ap>DX3sp=>I*{nL*AL~RtY#pVX*OXB^t@a7_1`iXj7QN;j%P%0@^b!Gm@;mT8
z`H%GTxlT?tiRIfbd_%s;PouUb*i$~r@`4}-4f62R2jrmxHRR0)8~Kg;twgn~9W!gA
zH`tkW54cYL4t#7ck}E?3$$a@a{L=F|Anda~BY&X>n06O8EKL|CMR#4Ku83}+5~M5y
z-DNXCY_B*Y7S~BI-ibifw~|=7?xnr_etU53MjG#JdpXH7+DLur)S#R%eBeLp7zgHa
zmXno%(d4Bg%KX14!$B!p$LLLs0OG4UL5|)o@WN4xJpKL^5I<JV?7X%gSQftl1AY=@
z`Hf?Y$Z8GJ*13c195_T?o8`lQEhZpV&&zShu#f;%Fp{VK<A`0!i8uA}o8=w+EAkvZ
znqjh2NtBAYTunaznZzHS`VM6N&II3X8IkXGE;Bc5DDZyoIb!W#1vrm28J+oWiL}ka
zeMH*=u*iEVV^U!XuEbXY#d}5INyZXpd)$i}-rGJK#fL?fPgIP|19sgbdik!vyNLom
z-J`q<3%?SFUT*`Zh5DK@6$M65^gZFVHV!;p><)ZI6q(+~exT~yH6WGV2+}7<F=5j$
zf%s-)(&32?Y4qS8qt7aU5r-mhOlXL3R@IVu;F%2Gh)a`>L7#xbg_HkR{wJ${8(0c{
z1Lf~s;M<KH=G%#AFuzTVlsfwyeCRJ?7J+QywJ?vi{oX&q^l2qe?t~k-XW0S7=T?EW
z+S?iB^?@K#aR_W#eH&~|N@L{X62a~dGUS%o1Hk)ODdYBK1JLyD10U3$fX)Z$Oci^R
zc=aU`JTkBX$5u^ZP?96KcjY#C{HPo}S+jwO($57c3dW>~jtKdC6^~g^C%hk%4B)RE
z2{IFBF>ZOeAn&&UsWv1++IL-LuJ(I@%cr}*qxV;VepED*P<;nnIJ=3IZ8Rry{3aN_
z5OY7Z?J_`N17KVxjybh99hCo^PM&@;2=30m#OOFlfNx5Y;OU@0c%t;37qYY#G&*{a
zYWuZG-ta3%{Ov*TCD@3}X!`~Xi>sOP4?=y&TrYBbp)R?4-y3G+t_JvB5f5sQ<bcKP
z7L1W&E7-d~jQlD;hqN~q;Xj|`4Nmg~U{%p;5Pm6vSuezRUDzPh9y20jLL|rB9;$Gd
zZeqp@THsDBGQUOqrV~J=juNTrISkt7oMx8qxB#*}=ab?ylt?+1UdF287HDl=Njm&9
zCfB5XW9C#Sf)laP;Nt8;AXhMlDbPs;?Oij--I?FOanCD^dRQ!IxhNr|On(C2dL>K?
zHwC0vSAerFyTJl=J7#)KF42ABw7qEMBoJQU$+KK455nH(17r6T;aX_Tc!q8UT7~kY
z!TtxJq3#G%eXamZiyi?$ZW0-~@D$^{(iynjxdtlkHGu1nLz(7w9pJ5b3A~z<0bIPD
znL7{C!K${Y<jR5{V9xj%hH8InRYI#(qvr=LO6|T|A}b3p2u_0ydyaxvC5xE2_KU>n
z6~eJDEx;vo@|<@6Bhbk#@Jcoq-2JD|!2O%S>_@_G!oUuozcPgh^V|uh1%3m?3wyvy
z#T-WJ`gJ0)XbE_I#}v%c`NRvEBMTND$^-d3qroy$Ge(+yWZ1g9d8W7Sn-sOeK7A(@
zBt-At0N3C-@b+a8vt&RMtS3vsOF=5wzl~(}4|~okcr@Qk`geBu&x6NjSO~GY!+S=7
zwR|tIS(n4~KBxq%-`bE3$2CdUulN7|@lgL&un?Mh|2LV%hr5%JZon~U<yDPxIAfTZ
z5RE2G$KmHG+GtGF8hv{mPE~8ClM6!bQPqDFDN-g7E;03o6A@u>g@PjN-dG3M59Yy@
zX$kOJrzvb+u>iFvoraZ#&(Mn&1lP-bgZdR8VP9Go`X{{;GLDB)qRbzdbSVhEzq1q#
zBq-p^4f!Z1y9Y1*8H0QmtV3~YmZ8I&p24rt5cND)#TH+upxe<2xORpfULo3p;x>-L
z_NDRIsq+%tTsRAT4WEXB=QSY1S8t)5_76nOO+cB|A=u@P9g10!fPA`lp<;G9mel?Z
z?FKTDo1rTz^I45fU8zGC6+Liuys#DeM?M}I$VYv-Vd!m8EpiMPhy4!9Xom^H$8zSO
zDZ^E`>uoeHdA$j5?WEABb9}tpX9DWo$VbbA52N&k#YnvGEj$omjOA+Vu*BOFsB5P&
zDvi32R_UZ8!?0LvGwl;>@vuYiOdWC!IfIgCpG6;+dgCpYQ}6@tA{^eHk6zfeAnOlh
z=;7v0_$PZ38bugS{Ys;mSFhn!RWX=$^~d>9tI(IkBRCekf*UP`<@$XO(aZs3p*`v~
zSSq53!~G3#<Jkf<YC98cyZ9c>&lI{4$z8$szR9A+w;j;07u9I~p#qe7u?S5w4Z@ow
zj-auNnsiC90M*VqkM8r1BaO9xVNt^+XjzQ#9(o^&Kmt7Pz<eCgMqsB80%&=Y!Sh~-
zAl*aBDB?DORCCJES$|bDx9JrcVark6${BdJTR3Wb*M-*Dc%X#hi@3{H8htm`M7u*<
z(BO>YNUu)~UH3P^V%{QXm2(YNT4adYFF%9<*~%!*cMB?B6$XcY<w4ft7iD)q6HSfT
z2DkSfMB??uuwwokoI0xvip-gSbEQh*UN!?oX6D0(hnu1M9!<nw^c6mCOn|KA3D~u6
zAIxwwKrtIk;ma5DNFZs3%Dm*UeY_tWxFw)2v=&jiM|`2<dOu1gsFHGtJW2I_zD}i`
z-a`G4iiHTT>m!xP-lrzrs-hl+6;s02dum`yDD^DmF4ezhI`#c_2PO8Fpk@c>P+spP
zsK3)BVdF(PIR0K8s#MfclaC4DZhjN|GfM;!Tr8ZNbpcJ1Ye#`s_$YU{9xBUdVx@yO
zkg4BZw4itZ`G_f?TV-eAU+Oc|-;{zr`u&7>Zwut*9fos7OW?W306!jkfHVW$u<eQw
zwEgZ|<R3bLg3o_K9fO&0#yeYtmYSl8>kHAgJ!!CFc_`X?+YD7d>4NWbge^or>T&3W
zLpWbK85g~;Ku0wTaCqJkyl3YKs_8z7R-XNWQ~3lowmnXJ9+Y$Z=azsM-nT;bhEr)B
zmm1hCm5Lu6i^HeHH0awZ+j0HOXuMVY0dAM~!KajGAwTyS_+73vUa;{Q+Bf8fJcgT*
zy6$TvZ|aA=oZlgorb_=BO~77oC-(W=gytQbLBIB>#Yti{XqS2+IxVe2i`o0&el17G
zGe3(R=ckC#lRH|_#itkOC*68TzET3yrmIl4Q6W<A&4dLXR?#0?dhq3wezabv5;AMo
z6S{b(;mA|IH1AVAQdd2XPuuBYVZSteVqr33?u}!7b}jy6GYhX!8$urjeCZa6lX%yb
zQdFLmjcjwK(&Z~Kb_TAF!?RC0E`L3OzlU}s4b3u|JFks$FFwJr+XPo#DaQH1aqwlE
z8NIhL5bqNerAznhL>stx?6W)xpWk?i{z5-RJN3(O%Uorwa?yw0;G>EzKRt&3)h1#8
zLz%e0-V(bmSVx<=cHwMZH9D`SfPYNdPWPNC#kMy+9pRH~N531AwB`6kq4VGsdLWTP
zk?v1%kElO3G)=_4_isTp)0g;y`Ca@#1k=7RzM-HU+j00Tp`+L92>SQuhbS<m8`-by
z#0eH2bkW0u=#pU@lG>|+W0rqHi{F@`OK;}mBl=?~?wb_u)A)(bj=jVQW3zB!X%Ib~
zT}o$f3C0hv=EE4T=Q#6R9UPeKhYIg#q9A(%RC+QP78Hxor&I&+HgW~svN8Zav%7|L
z4Zgvo+>Lm^DHgWx{EL2uG$W(l&scSLKT`EcqPCW^WXbgBl;X}_unbIxx32raG7BS^
zFLr`D_qK@`%iBg=k!>Y@H>d-3A;RqR`xTTR>K8R@`C)S1$)%L(^RwiN69#ar?G`fh
z$V2G0R1Bu%Uxxjsu2Pac0nnZOP7Rofpts5AsV|#uK|SIZ6r9mQlBN4$!;ZQ5b!jJ#
zv`oe-A8%6fO%d22#UBr|e#mXpcT~H1I?_8-h&ImGMnC&bAj51K^djatG;>LZcX*wU
z7jKHA%AcX7znajnl_3@t@xW1{146lB7%sfgO0E1-f~J0%jvFR@L#rtRO4rT_>EC8i
zI%R@>nya9GYeV|^%{;oSJ)d4bJr!#D9i(HvufyG6`mnz9Nwjo^EG?L8Lm!`JPmlPU
zI0khe#PxI1QM%_IyzNT^^~H<BI}^|0(VH*utL&-tOt%rN>$aCZ=`x4TU8M)F-;lut
z!D9Hj>`fH>S_<|~1fag%Quy21aLl{21=Y66(@G{Mu)e`$TK>2=x;0|rxM<QzJg;{P
z{rp%IN_IU>Uz(AR*I50d>uN?FgA;z?^)YkNi27byI;tP4RzE?z_c-A+UM4mZx&z-R
zEWoEj_Td)+t~kq55!G$>z<ZzlL|4XK={1f&VCM!ubRg{p)D=pAG(0k?ub*Y<TWy6{
zD&`peDwJ%VyXx=wL@kESpVowrWk_H`Y%LvyW?;$6<&LKwOV3TzdyVbq{XrYF&e8Tw
zswn5=XY?lg5wbY859OVTfg|!)a7NoTtfZ(&XVlHYY@Y_*6?7ThU6)S><j^RvOa{qr
zT86Ee*ElNW8cc67r?-4frA1pK>2v8@QP~zp$Jj~*nsZX3Bc3GV;w6jd>|AI1!6IG9
z^w(XEYc$m8zoFjflH*SL-62&p?4UwBR-MB43lHIEU25px-BCPkvIjk#-$=*o2DFt=
z8n&-UK>s4ju<2M1%wIo<{qywbb4O}$OQAk)+iWOo%}>Djln<`5FrZ574C&u#KZPBt
z&h)z_*+{MF12&lP2QOyc<DvXydP?gI?6O#Ze&7LAdt)0lYHNdoR_I`R+bDeVa}HH`
z?<E#-UXLxCAL3B<2bNdvM3yHlQN&3pJoJ+f-LHD%{jmaUH`x*Yn~{WEKh~2+ijR;_
zi6OGYa~}9+cNMDSzl5_NKZR)zTq#e!FW4M$4D7nD0M2i%B(je4$R?G=)U>uV%3Ijh
z@+<8JIdI#XJkugZE$cc$lq#NuImI*-Oe>|TlR0W{=T3-^XG59b1Q=tVL#>pWhC0Y>
zbl6M_Mf=LYpL2Zh;&X5DVB$8sfBqFJwtYXIz#cgKj3sip!y&23RjAxY8%Hz)bY3|V
zec}IvE7BCuxa3M$Wp@fL-710SYeL+5=O}tM@dXJ=cj2S~5!$&Y0*ig<pmg*zkgkIk
zZhu;WbeH}lzi-`+%;M_NbNvpeep?oqH!0HUcN^&aee3BTjS=ulj6ePQQXg8Pp-rdU
zTZ-nMvZoEdeWIBqfpo;z*Yu113D{uPJw$t(;|>!SY7Kn?znW%)P44F5VYRP#zgG|D
zly}onEAL^696R_j=@42y?J8RNlScby#!>fOry!5=FR0w<4(cx%fVJ~3;4Ndb>8so1
z=>E2YuyWd5$0E-q*bTp<E6c}W6_HLGyB?#}{JZHIy2CMQ(?cu^%TQ9w9egQL8~%(*
z#oJsvalqgt+Tcz*R(o(1Z)4?g$CWBv<%yBa@!9zFtIbIM=45)_)}8R*Ni~=j`J2Lq
zt#JC$)8wGGE-fCvhrSN1X@$OBC~<STW8u{XI@tag-etQ1?;2T5Z@l&hb6<5Gr4EVB
zJzU;~Uncb-Kj$O#Aze8%e7FiZWrtyAZxrr6_898Uw4-Mq-$75=PSd$#w{dwJi?=H6
zL-G7KShpe<evy8IrQJ2@tYd*Vtm^`jd1OZS3p(h?rRj9c%L8!wS5L<f;}AL|?HiqV
zbv@=i%B1u6XgkUUbkWY@=Nygf#_(VOz*7A;u$=Z8DD}DqFKKtcHxdw*_;w0Si+heK
zdlh<B*9zL}uK}&T{5k4we+Bs=Yw$z{gl9X#XlC#qzU(@JETd-P%g@_Tn28J?>Fz>v
zHx7`CJap(2^Ul+=F4fUT^XjNxT|;{K@F99s=_sC~Y(zg)Qp2BrD`B008q_rF0coc+
zgfiag<9S`HaIV#7a<Q8Wu6;U;H#S({WnW6M&Dlhxc{LmTQ3*zdB}buK>?rmOJVQS=
zA!+A9ZMeJa2r2da9jW7)MG?!tf;itiXca7g)*1!ydx{~oepdmx-A<njU$Y0?3t9{$
zgh;c7>H5@1?N(|w8$iC_Glg2I?N652%1}?o#fj2Ol|tM`F}&(?j4HR3gpLC>@b@=k
zbWA${+SFQ6z5)vr9DNo|*y^BRAsV5{w+`Q_D8V}e=Hue0Wt7W&A6)lx40ZL+Mh+{Z
z(88MI==-OaC_(8Vv^{Tu_I8ZJK>jFf-C+PP<Rrj1eKWAqfhE}BYZAIP|1nbfd>seP
zEWr_;Az0*CJvF)c6$+nn7M-6+K}Rk;BLinTp+`-==*M&y_+05atnhK5pTcZ9Z0&0t
zx_tvIn8U+UJr-a=;S_r1=3c0l5k%+Q7^T}TThh}Pr_i@fEx}(?hv3b|rP%+3Ce@ar
ziFq5c@lDZx_@eSoY<5MNzPwVIu6HlQ>A$t$jf6_{w<a4cRa}m?*1RJ3rM19~M~o2N
zG7AlSZiW*jkA&ZPJL$}|<5=pKH>?K#=z=U3pI1|M?6W!#M_WB<WGL!*c*#ZjMRua2
zseT6TxEq6V*eINLFOfR2w*ap`H4FPe8WRidV26U!IKJB$KbQN5@5!7(Lpqk&%S0cs
zb7Qc%S_sVKc_1r41w1s#4%hnFQ2}y*9&}=8+beVF{V(dEpYBn|r}2h#rN4$_jF~g`
zm~Th_{KV1=7vH8MrZA4jdlK;czS-#AT?2ZbeF6N#i^GWz+VHi|4Y>JpJSs_9Lw}9Y
zqABC|*f~v#=AX&K#`R0^yX>#%i#veLephI(;~98yJ|C~?Dn~mmIM8pFAEpzLG`*rn
zh>8-3I(ptWcU1Wv;ut-?8Cg3u)BZO0j$YEK^u@2hal^_wyhi8{TN@OLC1fk9>%={j
zRCN>i${xi|&ijz_<Vw7K><F$ppi7t29e8ww2ePh(=<_E6_dY9u=Sx%R%Zdeb>ek(K
zvR57&ubGTvduF3;L&80<o;0<hw*x<%RYTj)ji65sKcTAEOr^cG{b|Q{i!d*-9M9z}
zv4v(OitQUjl?B(xnPnJVb4y1)yXT?Ezvbkh?^YbCDoMA_T8jOGym9K^W9SX_09Bq4
zL#egtaPloNdUnDy+F+^+9b$Ho8a;BCyoACjNt+C+qWCn~Gw%a6^@}}xdqM-gkK0b!
zJuU+Q?-?Th!Vt0k-f0Ir;s1^HvKOK;mQ#nD*OB8zzsVN|mXN)*OQ<D>oIyxT2=vNb
z1I1z@s6(0U)Ewhe@UoTzniF~$YDqX#d&PU8m-KR^eo-3rq&UEyj0Y%qC=4m(36QxE
zVI}@;KWeF#Mio|~Xh^9OR>l@nSFG+(e~(`xO=EPZz$9g~<Zc%{JbMznI4=k~ebB>u
z3MXSE_y<R?Bp?efS^S|a4ORQpp)w(2xh!=S%(;i)x;I;(?&3k}LcSlgJ82EK^R`jR
z%Nr?)H^$iG;APYuya0!@eNb*|720yW5Gzc~!4jjM@WK9C4DYDZsws1@(eGq@rpF4t
zdVh<0f2jlB$w;IYYs|+s+$9`KzeG%;Hny9kk34JjP=H7rx}2N@l@gTDb*YWWeD4&r
zTSgk?2;aFc#SQ2QOhERRvM9qKX>5PI1*u^>T==vGJ-OD6zf2aR6}1CsGbI@qEx3x~
z@2;X}N<78m3-{60ZkynS>MS^S=6?9KQ;uv?OhAubh~XLUZXkR<2S+u$M~_#P;imXp
z><}rAYyVjyMza&eL`=hG%fnGpLKWiYR$wjDshCN1pjPl~@rvvhsQ+myHU>Ntq?b&i
z`_}Zn%0hZfLL6QAR*$DudeC=r-r`b+N_zGMSya)eC(P6Agh!LIsZCBFvE!<{c*dht
z)cNQVT134;)0k+yM(;FscJ9R?CVmLSwxNG{rAY2cDe4<PiVLNx@sfLw@zZ@0a4_cq
zn(`|Xtx<@>XP(<2qy9g*`)LDhbaE|y<DD4f`I2<(lQjCs!$UaljvgJLnU4zp=wQ9u
zdMNy#2N`<mJj(B<QP#6&Smo>ke|b1!d!97y@jMMr+|0zT8&q)sPYjz5nxKGRrYJG;
zH1@9FM*n`(hj)u{RLW~F*o9uhn#NdY>7x%Hm@4A=PB-z8sy5!6v>C!5vRGMi78Wy>
zM2Ru`P*u4&lDM`O6|ZHXLQw)4{$(o6nqdwn+V~XTLJZ75;)fGb;&4or7cyJXjFJM*
zp!+U8D7!`I&iye1I=6XZYL+N{b7DF^BmRN%UsO&>3E!h!$5QfU(ihVDRxfo&>k?I&
zltHyvrc%?2qimM^FtGWWkz$>!HqUgI5JhTXZ%DZ<)1rcAw~~IJe5luY=G19fDQZvL
zWGcC?io%s?)JdbGWKH-4`DU$f+dRD%{$-=!zp!q~YiTodb?JbXziXg1oe3BGJVP~X
z&Y?C86Vx<GXR3QoHXORQ8RpG&gFB`h!~dE8F>*Zt9Y$QC>B(kF(MudE!e+=`jD<&^
zU#CE|JY2ir40-nU74rGb@8p$P9%O5DG>rXh08i%&k;_6fx3*zC6gb(zJkv%h;KU~?
z@e~h6niRobI`x!wy9O-NErcUlQfOpr4b<yXfE#~UQyYI<Q?gDA$%em;<QnyQDr=Dl
z+~he-q3Vm&W7BKU%eop~aQZ<>J$8fPAqp_-G>`I0{X;fgHKTIlzr)a|8koQvrv9FB
zg@KmhQ1+h=y#3AynxDB(Wu%Fsld>}CgzsXQ`GW`NS4N_2^##bM+5>INlY}mM%JB5u
zX>hLGDe7sj8B`!8p>|FQTw7)hci$c(pSKpnRU%bzTJCf>PbL?V4rigbOF1-3c|w({
z5b)R8lkn6dKHP*{;ffhWFx}l23gJd@@4O$>l=4W*Lx}c~xFdzE?ghcrO?;@aEC)%M
zIU&y05zXDB4pTmvz|DLc_^<F0^-IeOUf-JtBX{0}SIYLlAe(s7=es1*DyoAQ;8&`r
za|SFk4Tm4@6~k0Jd1&mK41L|?P<}}d%+1{b=dY`T1M_acv+@aWe=7xD=O<9^ac7}!
zVFe^iA5bH!?4geG75KjJ6KtxlfVS(+;9Qj!N`6%X)ne2|E}J4G6=sFOO)^So>oN~0
z{oIpuZCwDhri@aOGOMYn)jm|j?`T-}J_-ijI8GI+OF{!f5A>WAM!VDLFn5kMH1OC0
zeVXH8nFoLq=nlo}(}n75hp5sZWoo|3Mr!7G1|;eN;EOsMYG~U+=~iRwDq9OHHPc&G
zs}p~l#vFV=J&^*iYrYgDj^|M268)s>=hx&dk*B2it6cJ4OfPkD;5a4t!jWgAwWy3+
zad6nO0FIikhD)CQp+J`#6kh^h&pS=H#6=p8#;m52I`pU*m3Z=K<3+O3pr5K(ag5r!
zM~RBNKu~XN=bDGdcbS}ia>9Hv5nvMPqz%jT`-C{ZJW4zB4CNc~fFd%AsL>2eh2{8D
zrY9||Yi*pY_GR^2SGhKuXXVU?Ki*hCeQQnl;Jg$xPLxB<Put;v1skB;t8^$e#b~_{
z2qhX9t7IrGwJu_Z#sA_&tyh{PEuy7lqF{351G@0K7@eAT1`)Z#NLt3^zdXDD*Ob}P
za{p(_f2cA3bDpVa0cmnan<@>Fpn8?B^5rGX{<m+&|C(eXt?>VyB&>-1=d^){yVwBa
zVe2EdIQyI@7M0Un9~`mHDj<AYRPYWFQ4u9|X_@~vq9md<*+g7i7$hX5HLd@ztNwH3
zKdw^f)4-zYol^g+4imU7Y?qbA3gL~5$Ho4~q0}xVE%V>bDM?C;{KuhHBV}?~YT1=5
z?1dsHe70u@eG-dgk6QOq;u{WQ*_V6Jjm}QiJ3N5%?@D7EoZh0pGmF@8rzQAR`v|Ii
zVZk*X)fY&Vwz0&qb2!#CmHQ-QGOSya%wD>z$%>t4xi6O~_T<eeDE4m#PHwj4qAJ|E
z_%GgQYI_3yqg>5h^)Te7mb-J!Z_-%Lb%C7cpZ9D7=ZCx909N-6;(m%Xz|?gi=(|wU
zJANmZyZ6H!pM9RiF5;<j9w*bd)-!LRQ{OXOylXM4aaZB?={Vwo&nbB3c4@(sQyVzh
z2wA-0nG(L~vyeSmoX9;lH^kRBPsMVhm(Yu>$(T3P%T7tWhP<q=;X4bju&HAQxE+e#
z%(i(&Xtsze`!SzJkEFG+{F!dFTwj-~bMIoWt~JKdS0AIEbAQ?JPgevxcLlPa;SdU)
zQO2#$9b=6eOt93{dBSAOO0MxkuRwOd1RtT7W6h$++`Cy@x!a=u*k2m!5ixlmC$&<A
zofhSco1ODe;0|-HW!eGO-O&-RRdDBqQ+eF}Fd4L9vJqC(ehkZA`>{oX9F^625*<kj
z!RY-_?ma&dZO`W;^^`r_{kiF^*qjS2vT(y<on5e}Gm&dJbRK29)v=m>c3j&!f2=Zm
z8LiuP1s(mtN6G2OQANm7&R9nmRSf5${him?_fcASLuL%_8ItAfABJ%Wwb9UXW;Ytl
zO2%FNgKSi{qaen%26dZivSU-Ha=!j%SWI;nR$O4j_3MUms&`d!O}ZI!)j!K+>BMqc
zwiKsabAqMZ%Aiz$CRe!B9?iR&g$K`B2u7Y+ad#RM1mkBHp<AvOIFZsaPEx2-Oqr>{
z&M(eI$NPd=Mf;1mqA3d#+rqgkYh_t^awYy9+=X^D?B`Tm`2q<~GyK$M3RaX`%Z-;2
zT+^e2`00wjNN&)E6Q7Xgg6gta^Cc(HqtHp1xAhxJNj{H;z8~b4t+IiWG`+c;PXc)S
zzCDiI)rf-cOyf=z&twDC@}cLaNOoz|Za6Z{0I!~Xk?WY)fg_JCL$i$iu%C-Ix@MEg
z7Dfkfjb>+2!Seg4J|dB8=jn0{cP8N#!sObC=Q3Pw(`;_x%gspRMh&XiDTd{=;<?6F
zd%TH~L|0Zja$*+~S&!dAxaaRf6f*t?`TmyTZuOkPAGA*3cIB<y&2x^NRX`wa%<*IY
znH=FFSEzHXDe2hiWi+N|^N`f_bdIUGhRe3+pwMl>+|jEq(P<@lLFO6_<WAmYpBy`f
zy3b2t@oBrcxs%u6$yqx%jqeJWvyXyz3%{ZVLj8K_-#Z9LY2c<ah1|BEir97DW}Ic!
z&Z$eeP)X+NxrJ(4_{-cdgv#Hts@Co}K<zMU+)8nSllr;e$2Xvs!DPJp<7c+lycrJL
zGJ=V#&WLvy;9jMD+@#Ax?7%)leEEhv+aR@(YYH_Jd{w-GFYcU$(pA^7db{;GvHhC(
z;maPhM=_imD$7PQ*<hUAmn!6N6>-Jc%Q%t9QrvMV5T~1uqvO(Y+@6p<SZ2zs{|f9z
z|2?q%pU{5ULmYc_JL2wXZrHxh5KGCQkh1<CG4c3+i;2Q>|1BmaN}0q-Wp_*n{IN9d
z@|eu^Tw>6WR=mKZRflU@lg2%9ZimOy>^Xn@i4DQi+0n&na9#2MG)Vr-o(;c?f4M(k
z9m+M}O~1pa|41^X>hG~W6PTNOPX+sV%3yGMGPgR+0zDs_j%&W|<+@CN3%;u_ffmDx
z>_Sr!ZiP=QUM7+QogY^t<B3v^Ti?va>~h4;Nn6>9;%Qt~-E~yBHIA#lGn0SFYA%X-
zGZ`1TN3d`8b+~~n8r95Rf+ad`Ael;WuD7WRxs=CqFn%VsC++Z>GD+N3ErT5;rn2hA
zrD)U77PjC`2K%=(4?TKr%hfOG5WGk$6ZoBxWzWBiLg`hlta!6KcR>FRm*}?+-E!9B
z3U<YD28%;Dlax}N*LH<PZ`1JjdL2QN%XChi73U^xb4K6)Y{!Ay3sG^lE?#8*8pX~{
z!{4Q>1S5ksl+`vP&UWh_{A8?;WhM3sz8*{9z6Pdpxfzkzj~~J2#~l?s&?$lY)HdR=
z2O*r~l0<f7+h_Et)0|t}|CEi}u8LFU*b7!_oaCR8G2ymos$kv8il}3KEmx_ejobZ0
zF&66V_slovX8+E>30B+K?}xiMu{DmkH7SF&staU^@h#Zga2{S;u!B9P?toi+^3Wm^
z2|S}m$R|5~8nqi@tiGfM#oxWcO}7z8+cvHjY&vrbRSX!gJ2T`lfy=ngDdR}<=WS~5
zl_YBUt46`QD~GtmqqXdo@>%#t?KGsl+@JGxi^I<@ZRM<OW@FLy>tV&A$@tW#8Q6xR
zux>^x|ENwPm!Fu5$&d!LuObdV_wzs*GP4EJ&UPsJe3`&8A(_oR*vKB#^X7cI<ng%P
z8gzT%4_31#g*)7aF@44f1?5|@Z;P$CzTYa`lT&K!rN8s=nF&?yL%kO6vFsEajm<@J
z$uZbyWDh$nIZ9}vd6xaz>xaV*4YMz1m~f#H;`pIX6H=SI7ki5y!OxAXIgKD8w=MZ0
zYTi4Ad%|r(Rnt^){%itwv<XwHmJF(|QDD!n_QG1X<5@vSDA$xB$xS{j&gH}|#s_zw
z#amkAIQiA{SpV{`sBWf=Apb=;SMBS7e`aoG-!uwKm*F|stU8`8d@!FaUgV3V54hn4
z!!me{^Ik5ss#dT&-UY{oQ?Mj7go`|>%^p<H$3GSY2z;x)pe+~0xepHR!e=9b7eB6L
zcQycI|E`ZMFy7A1cpZ<{XdK1y8Npn$atIq!nu(9!JI*<qzhX<4CA05}%{kp`rfgQF
z6*g}5<R0U@tXhdNJD3`enQLhnF8>HuoiF9Us5n0RM~T%g%@wk>)(MuZl3{iA(-D|$
zgOeU4aJwo6$k~29?yWe*K05vpeRe;<S?;~hK6l)RwcGNM<lHUX*1g&MJf|u&dcX>G
ze3!y9Nom{?M_X>wj(oIRIRSb7OySP|t>VhUf57|m_MlA@9(YUcAeug!#>q@^_^%je
z_y5K?>;L?GH89cNyy-nsj153;*8^bhGz!<IjG=hBX!J|@1<HMrizH-^TK#V>>i=P)
z7FtRF?=QsvJ^J4pbv_ca*jg83_T14<fxJG+-PR99OFoAp%j9-J>j7P~?R++Rwqq6d
zZB-3xyF&%D6(j7rsguw|x3C#R>khkbZ8W>^^Ifz(&=?WkW2{-P8B3XB984s!vg%Qs
za(BKUbbU1v52{2hX(O!5Mh!M*OBZ|R?p?I0Pk?T|)<nxU{)YbKebl_ciF@>-Ur_3~
z87>*~K@sni(WT`q47OX&$<Lb*%nfuzK5;YH)A4dRb<7+KZLzrAX9hx6!y)|iO)8F`
z;lRnx7Gu}^1JtHSXJk7?l5;i|P;;us;f*sfC@Z)C9$)hSnNM`FO@VWejOk-`ZCo;E
z+VW3uN5}$I^Oe9oMnIs%)<IprUL<*TDZ2Y&h+H}?7EYP`g`tUQT#Yau&h839XG_PS
zJKqvN3QFLwPFTnqxBX+6+38@JJL@?rLybG?dW!XXtBYfDJh?y8A+TUn=nVO53Rd~l
z30afr*j{lX4%@h%%OX8FR>*{rJBZnj+kT=GweMkp!w}WeZOZ<9Z-;7kS>PyTUH0`J
zQ#^d$fOUNTj=g@(m`g0Y!a5HJq1SrhFhM&>aJAZxzeBqOs~WK^hhGU=nRfQFs5M^q
zR*4P#87|}u%|Nmb6u9H2TLk<9dF-0L0qN40P+L|2w{i6kB(hdmxU+rB?lun-@UMm;
zo4z{MXZ$Wab>S3mgKIFm=w}8$<Jx^BaPi|dbgV)?ve(!{E+c~e%qZ^EXfc26^F4NP
zq9hktXTp|?MIt3{E##M+!1YELvA$thC_8l$8a9gN4#cMjHa#6hLq}h*0X4!{bcSI+
zW^KUZk8YvLprxFMw;UI|?mN0yn#7K8N#VLW&ajItlGwks=B$#;Z2=fKhLluHakpAF
zW&30kzvGx4A|s0MkwiUcza*Y3d8~=k0<`e$!Jn)&`p3?3y$TQhJc?MJ0)C=1kC{{2
zjOKjWFF12y2#pmxaDL}x*rOAAe9f|JaIZ_A;J6#XT70<Awt1Mblja<v<Z9E=ibvlB
zya@}|VXguvtE9y}8mvRJA7{amtGUqOy9IYy$p71RltsZMhTIO~FuQ81j9|uuB04YS
zz)q{2#H#+X<V2Ref`tm5u!#L62>-sDwOZPXG8T*BC)u8GpJFMx_A3vIWYn@VOw_rz
z=NQzll`N=yc~cN#%|btsJ8b^ldx9m&uc;H4>!F)Pjo=?8i38`HrKa}XCHGg2v3lSH
z3X(a9<}22)^G$!k7ZF3~n>{P|vsi`gc-oF!glyg$!}Hi%>-><idor88$X;M#d;ned
z{=iz^TrC)@+=`k{UxqK|#IsH>HL>fC8Wee`kTu-vj)RT8xS@78w)NC;n6jjbGkU%N
zw<R3Fbyr&1K-&aCjyn<@tUJt_xa?#j)izS#c?Fx{(#UT6<xQ4F1#_uQ3%Q>o+p)@0
zaW4MzX8!uIBGzloDnvJ&Luc>I=brt@q~@BM;=#{X(WzTGtbVzgAake&ojS4<ZRH7l
zo@Q@A{VuW`|JH56{mAp&m(2rYd+SalvEGH-kyp&U*UUzPYqPMiWg)kAx)?VT{voS0
zLj`M!=HlNz`CQq<2P{2t0GHlwXa7!H0Cxt>#G;cNkivZ-KUjMax7Xf~(}@-Gh7J}X
znQ!V`cBKX@|4hhUoS}tlRvTdHD3-mc62-Qzn8dy8sN*h<aIEVG4gA+JjdibR<9h$u
za?@yUl(}ImetUBZH|72Xwm~MC-Ty~{JNIZKM|SMPBAKUf!nb_x870fLKUP4Q8mAd>
z{yeKQCz9Pg;l!SM{Q%LN5~r7@&;47Fg3i^Zp~le!_Kbxhatgo6MzV-o@p%jli!R{4
zr`02a$W{2w&4Zkn^+JxHcYw{GoF?Q0*5H^;Iq2C=5v&z-mOcElL2#Ix$)%2Y;Wxx(
z9LDBzdp%{j{2_nTx#ttwcP^B3${nU!>dY|D%MQ;EjYX3N6$M%2d+|JNUwm4zo-16A
z@iSj@PV@B?&gHTOo@t3VHu3>Vkt48~8ONP_MsU~t9<Y-a2>G4&hxzNb?hzb}li*4}
zwX^TAJi2LLh|YhD!LrR$uuLIjU0T<12KL7>><q?V$vSS}&2&~TuAG%k{)FBRuVwp2
z1SoemLp}a1hG*|Q#OWPg#?lX;g7Mz3s8fMrb3V^zzg{-t8tEWdx<(G`G&ZxZy7~nV
z=f4zu&WL2!G@WJjx0!PfgAY^WS$#p*z6I=&woRzu-d_|})5~tD7-7_3W}=79LN;Bl
z7Dv81$`1LiM#SP&_VKQCye2#uz31;^&p&O1F6s-}oo~Oedu&tLRcVI>mkJkiYS|;`
z;JgMdV4{{?A4s8ifg>u*zr{w}*5EW#{qf^DPMiqzgxj69x#{Y%xY|sT8}G7af6n>C
z8i%gHGpHBL$)wFFYojOr7PFsgd_Re+mGDHFVZ*G)s4jl=SCrd&AWtAak&jNi=t8Z>
zEwQK68qVTr4Eb`)J<5LFVfO#&>rBJ3>Y_ew%9zX{JVi1Tl~RWLtgR9%AxbI=g@p7_
znp7l1gUXbIQfQ)-B5|L!q@>}ANQI=Clr(Bm@!oxTuj~Eto)71oYk%Em|F6B){-59f
zd)WhsQ52)$-2;4$>@!&PNduOC<|w1L7JABC1R51ST<k@A`YAG8iDw4WhXZvG_jU+@
z`YvXdf0k45IK_Jg3E^i=t>9MJzhqw+iy=`fQ6)j7MGqbe{SWQJ7ss1n_==D4MC(5h
zKU#&{qZ-ksNQ_KluA<VmFed)yDOV=x$2m>AE-de8;r3p#B%6s}tHM7wqTEPJvX1?i
zZ`kk;ei|J@|4n-)&~;hE0xM2oUy&AhF0+NZ*KdO0&Ia5hcZ>Fz62Bm)nXkC7j(s}*
z)cvWFYp~kKYBbE5TDk!X%0CN2%c*o*-xt5#oJE1AZlD<11DzK&M4YgEs$1$W93OrY
zwnYTM>AtZLJE9A|<tfvAt2<D(_6j`<%|c#fGW)&AfI9rg!Qo9-;Je%x9__TDi=vut
znZY2xDpY|6(+k07$^gzVDMr5_d4YV48O0cG0Kt$c6feTXoDgO5t+;cEKBPyoVO#+J
zc6BrU`|~@Q8U?_=MM_k8cL(c!l*Jt_13V{l7T*j;f}o=w@w7a03x9J%FHXmJ-!;@T
z#)oanUBvceYNE~t6KqOJ#c<KSTlvr*_;`WQ++0JnXd4iC^Lo%XDyK@sL!!k0z6&mh
zzKM0a6zS}2RS`#7k*-A?1+kzF)DXRx&c|e+TZcGEpGv~;L<4fKk*B~{1+3+jDGaLA
z!OXWA`0>mQzH8E5Y%0ve%2dMMI7!OhHVIvV-=US389V6#>|Es#iiwt`^zkB2?w7;7
zwnjGEx1?g-fyGcgn&*5XmkVUlAK_-tA1H1Sj@N!kFlCv8xX8K`-UrSQ2-5d(-YNFv
z-L3(VnX6gq2MIbl?Im9PRS6Q-P8jww53dvoFt^APCZ>vkVa`mD3)zOo@3&J+egY)M
zI*R7)D!=ddPV{YG&V|$u1GoK}6uZEKsiqvG`d4At6_AgO$JVo*enZJxX%@HTye9WK
z&<W*6RN|B8t088CIa}rM9+y2%VaYLLuwJthHoBOTL0=I29r_5*RlEWFy5XFh$7Nj8
zbsY2iWm*68&15n{j0NQ1z@msIyqi_R5Bp)nT5YE@?V|Bibj_Bz9F(B;Tz@Lx<IY}|
z+S8iAqcC=64L{ec7Oq~frF>;0=F;I$8Bwpnu4_Aqed~ZRz6<EvBOMlIGmU&xx}ZH#
ziY{wi<_@PjGSki)Xty6rGR?!8sp)i_F{&4~CpzPT@f@B`8wQKjSHPO&Y)}pTiYf*H
zoT=4iOte#{lnutrJpKskx>a%$T$ZsR%#$t6?Im?ZclM}q2?~-4I`lxKA3yoT)>-sb
z#FkzWCeM=EFJjh^eYiaM9%Q!^L)@>)tXAz9)!aD*k!S1i@xgcC{@}T=H)b1k910N`
z;qQR#5>dU<vIXak>_>~=YJ%=7?zD1=JezfL7kg3@MafSu(a4wH?9V?nFe=>^a#IB?
zJE)p7daXd?#~FcX$!^;J{IIb4yc~(ilyRxus#GtTf){k7S@o6zilul8IaUWsmrjx;
zvtl~dqWULv2mVx#MMnuuh+FB*_D3htlV6EYem4i(q>;u+i}w4`CENn-ELgw)1IeA~
z;&R*k!S$9bmhGOwCY!6V)VvOqwX|oqwt4Z_BiC~I*3#H7U&*CvpTW3U@u<2z69!+E
z!MU_Hbe=b!KbxCHx73%yVskgX&1)juNYX?3ftAcVU!K*M7GdZo8`fM9PU;SZ<hIls
zj4aBjZ(spiFP9?B+G@ZGcc;>~k+y8QSr(|872~x7g}hH0f}Y6yIpeS!D95P7j1@|v
z9_V5I&E#^}G%6W89pYK2|1o~{lx4yVE}8Jbi{XK_9;EDKLmHZ85UXdy#_cG@d75J&
z+vfy~UOJTZ>mS6c4-@$(zImwg^#*Pdp5*eT7;|+!ZSWyai{*}x0%43AZ(&r1SIeH_
zh`QStc;KFp-?fW7s%Rs8A*)9wttIHW%LHO4CbPEOEoh-V8P2sUkb3!OyxwMvY1-b<
z@{b{t=#v3^*Hp0CaD=RWu4kX-k7g<+8$q={5rYFVL_HpR(him5u4jD^>1i%JSzt%I
z-zVZJA2;@Ws{^$?@5SxTE&L^&GwhSc3tT4ReZQHY3z`ossnGcd7*|~3rk@-^kSW7t
zJAz4fhpym$_5>>Z5d$%;*?ghh1su}qz*<~0$fhEk&3teKOnmLZ=fgg>(R>#jmoBD=
z?r^{u6Lve?f-Tm`Lx=Z@B%f-`tq}1PKgWiUhPD~Wjo!|hN>@;Mz%c6Yb>*#ZC9!jE
zuCQFP7?1jAl0&i_8(0-d<$1rL)p{C9Pm{nGEdtT{M!aOd9#SUU!vy&zeqEvlt#G!W
z*#ROx*|S;XoWDxMp7&;Jtq0)DA5U^pJi|L2(Fds~ig@4q4|t!A1^uc(>f6pk+T(PH
zzIq0w9mA>meJOkJU?KL^H4BcA6s5!&L04x1?fsMlC5O^+s+T2sru4#_ZPqZQdNM5i
zv6aGBpXP6#jv$?>wUlrfIit8ZJ~uX*55001J<LTp2<I%>yPiy3oMp;39ZrEcOC>Pi
zQV{5$pTOM@8_TX=J49oPlA&jYNXsfR@mKX^cGf$GgZ>`e3_dWgei_|8tqnP^Gf3-O
zJg3K6(A3rs4#)YkTapo^eSI98bx4{dnln)UMJiLPTTO>;m1&CXM9NT&X2l~d;L|xr
zGF?>#?ropID<c@LO?CremoY^Sjs=aaW{}Nap^Zb`X;ig3-#z~~d~p|N9!|07Fn%;^
zIGu<okG!efM0EC$_Kf?S?~G1q2cX9<lS_*15hldVVSZMp`8g{K@Pt!2WWF|~S#2>?
zc-js>&v9h84GT$X)l53%Li|p%?Kn^4E-X{gq7mkGs4V`fYO232_<6-~$tkDtcY*{n
zx~4*zO$N-~#)kx--oQ#TBODrCz<WKv0T%r}SQlUb(PQ`G)5aIv{O999MpljYa{h|u
z79VhGT_0|reS<%ANR@S*980HsC)nnxX_1L;Ju1{OYHCV?#^4!M!UbbVH*7A1DSYQ%
z=X7$0t|Fe?EJ?UL5X{F#4G0&tPR54#>0G~!9b0Pn4_!&xLHi0X!>MVaAA4$4*~fzl
zEM~SCCB#}_e3Uz<H4uVjB}38qmk#CB<lxzNWB6{N0H-=nq$pJ(sApwCin}^QpNeHt
zhPF6#eGxUZJVA7cW$C&#-14XcI4@s^`W5S7@t`VwbUTm5uSFW_mtAEm<A#^)<Y>$s
zHM*Lb#N1sy1sBaSx%o+}!4O7KK<h=Y593icE)UPg=COX}%8eY`L>ELkE!V6}X&^I#
zO&{WnhozLrRVNXO6a5fIEr(<27I><{78ZT3M+bLp>fLyPKk_<SWTv_WM_>O-a>aMK
z;reyhy3R+~^zJ37?_WXwH3wj-xd%*L^oSFma~RephEeRpxtH1>zQY&Qax}VP9-F`3
z5stVHqQF3bg+9B>-5fRuaVpvT5pe>K7cE%qY0Ik4>EY^t$GqqEdR(2=AW&bqoLH3?
zUUt=GYZN_^%L%3t?GofUZ!uavF2Ohl#_NCa!_XCo{pyWyb9MnFxG{FH=?ULnxfyz`
zkDz+#B5JEFpdo!1Ie%#hW>ydb0bh1fg^@Qa|2mv9&HfXN?gV~ddlB5*^#%|3)pARU
zIUdW8Aw<mO9r|2({Xjk15&s9021{UOd<jHs5o2#}tl;jPF{K51@6lS^71(@#w5xaz
zbEf&Rlz?P1P#(tgBN#pjk)f9-?I8HxPO2GUfvst(lydwyIi)RQQ%jZEG}pTr-yDVe
zY#&20q*2^=O|Z#JqONfU99+$TwEP)#{=|1IOUQwt=?478%@G*zt_N<;F@(?-O<MZ;
zI_m6lXCVuCTvt+8(H-_f08cYX?^r&RU6EuH?_9>8BSn4H!7B8UFQ8d+LEPNWC2U07
z*~*B9P^wWV1&v7;Dfpl^3sauTjyyewQeF4CsScZXK3|&^*?GZZ#a>t#G?mH@jU;_<
zHS#e&AgtR{3#z^)+<w;rxSDrcv__xuN?xO&An-RoZs8a>sJw<x_{0m1Cs|>vVI0i&
z{fS<>3wep2I_~}-YcAhu2^(V8&OaU5f%l_3aQjY2un2cUY`%nXWAtE9FCC^yJM;6h
z?_)>94?J~T4@&3GL-nc#jOmpocaPop^kEJLI>}N*Pa(fvstW|%3G6Mtg17G}iL!G?
zv(m3|aBWAY@OpCuP4BOTq8Z&F8EQd~pMB<PHJ@|QtuOgWO{?&MNjH2?352NB2Hb44
z2EHv!Mvp}|g=4pxur*clpyQq+wg2#evA!)f)s5!3Cp?pTlhlefN;06jE)%PU_(Flv
z40JX-DM(i+fn~E-@~ivL@(JBnxxG){^XKklGK*Usywz+Cvb52mZG&pSMGwGUzuUM?
zGnijNO&A_N7tJCCtkLB>zt2S$l-$O%cjsS0+psXmZo3U2eggWPYpU|?6ewrOfS}{Y
z9QL2oIuvLqv5pX+^an<)*&~bVwfqjd2KD%&ayyi6%f=a5!)e0~Bjy&}!JiP{OL6OF
z!;43j?2BnI-x;}p;(Hz8hi@$JAEU;k+gEXExn9`VSO<^myM!xWucnAI69Gp@LX>d>
zs&?K-onN*5fkkPy%Y8;MpNUhb_3KUSWU(mQydOF*n6Qw#WpJ}~6ze#ff&*zT<Qz7J
zbQb2*{pX#a8C1fGQb*uIMMo6-nG00C2d=xcVD%Iwmex{_S6gN1o1z=qyPV>T=Oy5Q
z-|MJaFbPk>Xa04QBkSFD8mgRB$V4D5_>yxDTvZ=q<+JgmzV;F?*RmNZ6&3icMgF+>
z&O^B7dJI;_z2!CIJ@{kwM%0mzM9*zSInL8`X&mI?<)8|v3duy*95LFmpqd|JzmmNQ
zSxm))L-{+K$B^;b8~pp@dF-jmdywXj@c+DxfC{0N046DN!v`i))qWLGQd$^)<3|hU
z64?Zu4O?N-y4kpDojJGBUYedr5%g~{;)>L~=!eMGIM6;!u)MhlEn`E4J4!O3@y%E8
zaJ<GHC`rYma{9FLniR`VG6ySTNm9?VqJzQrc$doa;P+h&e=5}RL0Yp}*yZ1t97Wg@
zYK38|eXBx8rShllNy3KR`Fw`s2ME&f<tGf8NVOZ^VbVr*Y8`J(Yd!{Gv-L?F_M#gi
zq8{<%oi1=*AEu*sZ5lk%djXoJL)o%M6M^BwCc&_}Rj|B<;LO8R@M*jOf(&E+YVCeZ
z_DjGw%GG${;BffAMxDP#mH%VZk<;1_8@CigvgHt_E?EYDeRH{CVqy}1U%KBm9s2te
v|9iXg`Pg|eaVc@JymHC^9Xu+pRasarDO*}Dsr+~F|GT_?#qKeTa%%q{GNV(B

literal 0
HcmV?d00001

diff --git a/classifiers/tf_graph_creation_helper.py b/classifiers/tf_graph_creation_helper.py
index 43d0c6e..71240aa 100644
--- a/classifiers/tf_graph_creation_helper.py
+++ b/classifiers/tf_graph_creation_helper.py
@@ -1,5 +1,6 @@
 import numpy as np
 import tensorflow as tf
+import answer_classifier.ans_data_io_helper as ans_io_helper
 
 def weight_variable(shape, var_name = 'W'):
     initial = tf.truncated_normal(shape, stddev=0.1)
@@ -30,6 +31,18 @@ def placeholder_inputs(mode = 'gt'):
         print 'No placeholder for ground truth'
         return (x, keep_prob)
 
+def placeholder_inputs_ans(total_vocab_size, ans_vocab_size, mode='gt'):
+    image_regions = tf.placeholder(tf.float32, shape=[None,25,25,3])
+    keep_prob = tf.placeholder(tf.float32)
+    questions = tf.placeholder(tf.float32, shape=[None,total_vocab_size])
+    if mode == 'gt':
+        print 'Creating placeholder for ground truth'
+        gt_answer = tf.placeholder(tf.float32, shape=[None, ans_vocab_size])
+        return (image_regions, questions, keep_prob, gt_answer)
+    if mode == 'no_gt':
+        print 'No placeholder for ground truth'
+        return (image_regions, questions, keep_prob)
+        
 
 def obj_comp_graph(x, keep_prob):
     with tf.name_scope('obj') as obj_graph:
@@ -77,6 +90,50 @@ def atr_comp_graph(x, keep_prob, obj_feat):
         tf.add_to_collection('atr_feat', h_pool2_drop_flat)
     return y_pred
 
+def ans_comp_graph(image_regions, questions, keep_prob, \
+                   obj_feat, atr_feat, vocab, inv_vocab, ans_vocab_size):
+    with tf.name_scope('ans') as ans_graph:
+
+        with tf.name_scope('word_embed') as word_embed:
+            initial = tf.random_uniform(shape=[len(vocab),100], minval=0, maxval=1)
+            word_vecs = tf.Variable(initial, name='word_vecs')
+
+        with tf.name_scope('q_embed') as q_embed:
+            q_feat = tf.matmul(questions, word_vecs)
+            num_words = tf.reduce_sum(questions, 1, keep_dims=True)
+            q_feat = tf.truediv(q_feat, num_words)
+
+        with tf.name_scope('conv1') as conv1:
+            W_conv1 = weight_variable([5,5,3,4])
+            b_conv1 = bias_variable([4])
+            h_conv1 = tf.nn.relu(conv2d(image_regions, W_conv1) + b_conv1, name='h')
+            h_pool1 = max_pool_2x2(h_conv1)
+            h_conv1_drop = tf.nn.dropout(h_pool1, keep_prob, name='h_pool_drop')
+
+        with tf.name_scope('conv2') as conv2:
+            W_conv2 = weight_variable([3,3,4,8])
+            b_conv2 = bias_variable([8])
+            h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2, name='h')
+            h_pool2 = max_pool_2x2(h_conv2)
+            h_pool2_drop = tf.nn.dropout(h_pool2, keep_prob, name='h_pool_drop')
+            h_pool2_drop_flat = tf.reshape(h_pool2_drop, [-1, 392], name='h_pool_drop_flat')
+       
+        with tf.name_scope('fc1') as fc1:
+            W_region_fc1 = weight_variable([392, ans_vocab_size], var_name='W_region')
+            W_obj_fc1 = weight_variable([392, ans_vocab_size], var_name='W_obj')
+            W_atr_fc1 = weight_variable([392, ans_vocab_size], var_name='W_atr')
+            W_q_fc1 = weight_variable([100, ans_vocab_size], var_name='W_q')
+            b_fc1 = bias_variable([ans_vocab_size])
+
+        y_pred = tf.nn.softmax(tf.matmul(h_pool2_drop_flat, W_region_fc1) + \
+                               tf.matmul(obj_feat, W_obj_fc1) + \
+                               tf.matmul(atr_feat, W_atr_fc1) + \
+                               tf.matmul(q_feat, W_q_fc1) + b_fc1)
+
+        tf.add_to_collection('region_feat', h_pool2_drop_flat)
+        tf.add_to_collection('q_feat', q_feat)
+
+        return y_pred
 
 def evaluation(y, y_pred):
     correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_pred, 1), name='correct_prediction')
@@ -91,19 +148,31 @@ def loss(y, y_pred):
 
 if __name__ == '__main__':
     lg_dir = '/home/tanmay/Code/GenVQA/Exp_Results/lg_files/'
+
+    ans_vocab, _ = ans_io_helper.create_ans_dict()
+
+    train_anno_filename = '/home/tanmay/Code/GenVQA/GenVQA/' + \
+                          'shapes_dataset/train_anno.json'
+
+    qa_dict = ans_io_helper.parse_qa_anno(train_anno_filename)
+    vocab, inv_vocab = ans_io_helper.get_vocab(qa_dict)
+
     g = tf.Graph()
     with g.as_default():
-        x, y, keep_prob = placeholder_inputs(mode='gt')
-        y_pred = obj_comp_graph(x, keep_prob)
+        image_regions, questions, keep_prob = \
+            placeholder_inputs_ans(len(vocab), len(ans_vocab), mode='no_gt')
+        y_pred = obj_comp_graph(image_regions, keep_prob)
         obj_feat = tf.get_collection('obj_feat', scope='obj/conv2')
-        y_pred2 = atr_comp_graph(x, keep_prob, obj_feat[0])
-        accuracy = evaluation(y, y_pred2)
-        accuracy_summary = tf.scalar_summary('accuracy', accuracy)
+        y_pred2 = atr_comp_graph(image_regions, keep_prob, obj_feat[0])
+        atr_feat = tf.get_collection('atr_feat', scope='atr/conv2')
+        y_pred3 = ans_comp_graph(image_regions, questions, keep_prob, \
+                                 obj_feat[0], atr_feat[0], 
+                                 vocab, inv_vocab, len(ans_vocab))
+#        accuracy = evaluation(y, y_pred2)
         sess = tf.Session()
         sess.run(tf.initialize_all_variables())
-        merged = tf.merge_all_summaries()
-        summary_writer = tf.train.SummaryWriter(lg_dir, graph_def=g.as_graph_def())
-        result = sess.run([merged, y_pred], feed_dict={x: np.random.rand(10, 25, 25, 3),
-         y: np.random.rand(10, 4),
-         keep_prob: 1.0})
-        summary_writer.add_summary(result[0], 1)
+        # result = sess.run([merged, y_pred], feed_dict={x: np.random.rand(10, 25, 25, 3),
+        #                                                y: np.random.rand(10, 4),
+        #                                                keep_prob: 1.0})
+        
+        
diff --git a/classifiers/tf_graph_creation_helper.pyc b/classifiers/tf_graph_creation_helper.pyc
index cc7087d41170050991a04ef6986c615efc6ba662..0a2ca99d6b8999cdfb57a84d3560b6204947ad8c 100644
GIT binary patch
literal 7351
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

delta 1611
zcmai!&2Jk;6u{s3d+l9kZO7k^QzuU1gq8{ffubh#K<I%~YPV8@TqJAdnV5BLr`lap
z<zyuHzyXPmx%3a<0vw2x1BYIEfHOrx{0|5usCwb!0Pl_CriYsDdVl-oea)MBv;OwN
zy|d-uV<UdG{p*c3oLmOJFX7|;^jWzw3IGqnT?Wk%aQuap90rd1h>|0~qrhWIMnMA}
zS8@z^0`3AdQKKs%4%|>e0(ephItT;!9NY?k`;c)Hnn@5r=+40y15FU-2)Zd6e6r4%
zz?3PPVGQiOAT-m^%s_J<ga#rFVjji;Xl7M{9Pl*o3~*F3*35&5pZJJ8@GKO^7+(O9
z0FePvP?1FySpuE|QB;~Th!Iv(QPnJfSb%O-IW3ZA%z#m`XOy|73`@{m29X4gGn&w?
zPyASOWg3ibS?J*A6~GCCV9;HK?i%nSaGV)`Wf+I3)Xj<Q(uomk2vDt?9P5~eO<Gk0
z#0qrRK{V8oc$IwE9%pdv-2ni;uQwLuKkP?#S$<z!*4sVX^PGK0xZZhbYZduhAj3kR
z2fvtQ|1Owfn*2HV;Mor4h?T-~l9cyDKRnx`BEJfoEPZ@G{3)B|aVwh3<><Jj5y0v!
z&2$!KRc0K2qx}_NHTk8!!|L*P{U%$L?-=K1CAw#%+0yaX#&%$<hMAl&AxH=ztN>w&
zuuP~UoEYI>yqu31>Q>0GDp$={ZZt^L2s*(etP^O(7S(HQ5MCghC7dI?h-fG)t;Sj)
ztP#!=YVy#mMAg*RtMbTPzy&=r&txx>aSK7SPT<XG*-k1QxqwdIhCDKs<%g++9OZv0
zQLyzk;qo+t$~7a+TpYc`2X=30`_94Onmj7Fulb~O1s}FW%NzE6+PdCBr$KM4N>H<0
zLFxH*4vI0hC+`$@qgI7N*JQp_dy9(mX;(Y0ef#|u7yD|oF9dIKr|mmbf>R_sX<P?K
zc>VFFgDrx_hTJVRHlAwDX+sv#Zfz5G2)l%<^6yebeq3HORYTM=R9Cj-gK~b0dgDhC
zhppSV^q1B4`AJlGZM$c?v=M#VJ@n}S*zNYvwcCeNrTnw}#>mg0r7zr$XxY8qiOCV3
zADQa8PbblLZD-)qf9v&0%01Wdh3nJtvc1;nhN#IWF0DHgA4=ug1Afr==_r$^(!0W|
z4|~3!pd6e}>pJbu|DAy=F^sy{Kj6cj*ru)ZUPtIm59ndMLwM_2UMpx3Ev&N$ev}3)
UusN1xIV63g8GNejB^(><KTO(Di~s-t

diff --git a/classifiers/train_classifiers.py b/classifiers/train_classifiers.py
index dc0d5aa..2600262 100644
--- a/classifiers/train_classifiers.py
+++ b/classifiers/train_classifiers.py
@@ -11,10 +11,10 @@ import attribute_classifiers.train_atr_classifier as atr_trainer
 import attribute_classifiers.eval_atr_classifier as atr_evaluator
 
 workflow = {
-    'train_obj': True,
-    'eval_obj': True,
-    'train_atr': True,
-    'eval_atr': True,
+    'train_obj': False,
+    'eval_obj': False,
+    'train_atr': False,
+    'eval_atr': False,
 }
 
 obj_classifier_train_params = {
@@ -28,7 +28,7 @@ obj_classifier_train_params = {
 
 obj_classifier_eval_params = {
     'out_dir': '/home/tanmay/Code/GenVQA/Exp_Results/Obj_Classifier',
-    'model_name': '/home/tanmay/Code/GenVQA/Exp_Results/Obj_Classifier/obj_classifier',
+    'model_name': '/home/tanmay/Code/GenVQA/Exp_Results/Atr_Classifier/obj_atr_classifier',
     'global_step': 1,
     'test_json': '/home/tanmay/Code/GenVQA/GenVQA/shapes_dataset/test_anno.json',
     'image_dir': '/home/tanmay/Code/GenVQA/GenVQA/shapes_dataset/images',
-- 
GitLab