From e2bf12bcc588096a57fb3f8024939105f504f148 Mon Sep 17 00:00:00 2001 From: angeladai Date: Wed, 4 Jul 2018 06:46:17 -0700 Subject: [PATCH 01/41] fix typo --- BenchmarkScripts/3d_evaluation/evaluate_semantic_label.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BenchmarkScripts/3d_evaluation/evaluate_semantic_label.py b/BenchmarkScripts/3d_evaluation/evaluate_semantic_label.py index 883e5aa..0a2f6b6 100644 --- a/BenchmarkScripts/3d_evaluation/evaluate_semantic_label.py +++ b/BenchmarkScripts/3d_evaluation/evaluate_semantic_label.py @@ -31,7 +31,7 @@ import util_3d parser = argparse.ArgumentParser() -parser.add_argument('--pred_path', required=True, help='path to directory of predicted grids and world2grids as np arrays') +parser.add_argument('--pred_path', required=True, help='path to directory of predicted .txt files') parser.add_argument('--gt_path', required=True, help='path to gt files') parser.add_argument('--output_file', default='', help='output file [default: pred_path/semantic_label_evaluation.txt]') opt = parser.parse_args() From e604e20e5e936e5e175d40aabb14eed513a87209 Mon Sep 17 00:00:00 2001 From: angeladai Date: Wed, 11 Jul 2018 16:45:51 -0700 Subject: [PATCH 02/41] bug fix --- .../2d_evaluation/evalInstanceLevelSemanticLabeling.py | 6 +++--- BenchmarkScripts/2d_evaluation/instance.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/BenchmarkScripts/2d_evaluation/evalInstanceLevelSemanticLabeling.py b/BenchmarkScripts/2d_evaluation/evalInstanceLevelSemanticLabeling.py index 1dda4d8..3e3d95e 100644 --- a/BenchmarkScripts/2d_evaluation/evalInstanceLevelSemanticLabeling.py +++ b/BenchmarkScripts/2d_evaluation/evalInstanceLevelSemanticLabeling.py @@ -604,6 +604,7 @@ def evaluateImgLists(predictionList, groundTruthList): def main(argv): #pred_files = [os.path.join(opt.pred_path, file) for file in os.listdir(opt.pred_path) if not os.path.isdir(os.path.join(opt.pred_path, file)) and file.endswith('.txt')] + pred_files = [] # find all the text files recursively for root, dirs, files in os.walk(opt.pred_path): for file in files: @@ -617,9 +618,8 @@ def main(argv): if not os.path.isfile(gt_file): printError("Result file {} does not match any gt file".format(pred_files[i]), user_fault=True) gt_files.append(gt_file) - pred_files[i] = os.path.join(opt.pred_path, pred_files[i]) - print pred_files - print gt_files + #print pred_files + #print gt_files # print some info for user print "Note that this tool uses the file '{}' to cache the ground truth instances.".format(opt.gtInstancesFile) diff --git a/BenchmarkScripts/2d_evaluation/instance.py b/BenchmarkScripts/2d_evaluation/instance.py index 773ff36..562a69f 100644 --- a/BenchmarkScripts/2d_evaluation/instance.py +++ b/BenchmarkScripts/2d_evaluation/instance.py @@ -18,7 +18,7 @@ def __init__(self, imgNp, instID): self.pixelCount = int(self.getInstancePixels(imgNp, instID)) def getLabelID(self, instID): - return int(instID // 256) + return int(instID // 1000) def getInstancePixels(self, imgNp, instLabel): return (imgNp == instLabel).sum() From b4add0262e93a815a0a766620493f3dd1bf07e06 Mon Sep 17 00:00:00 2001 From: angeladai Date: Tue, 17 Jul 2018 16:31:31 -0700 Subject: [PATCH 03/41] 3d semantic instance eval --- .../evaluate_semantic_instance.py | 41 +++++++++++++++---- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/BenchmarkScripts/3d_evaluation/evaluate_semantic_instance.py b/BenchmarkScripts/3d_evaluation/evaluate_semantic_instance.py index 86b24f2..be6ff5a 100644 --- a/BenchmarkScripts/3d_evaluation/evaluate_semantic_instance.py +++ b/BenchmarkScripts/3d_evaluation/evaluate_semantic_instance.py @@ -63,7 +63,7 @@ ID_TO_LABEL[VALID_CLASS_IDS[i]] = CLASS_LABELS[i] # ---------- Evaluation params ---------- # # overlaps for evaluation -opt.overlaps = np.arange(0.5,1.,0.05) +opt.overlaps = np.append(np.arange(0.5,0.95,0.05), 0.25) # minimum region size for evaluation [verts] opt.min_region_sizes = np.array( [ 100 ] ) # distance thresholds [m] @@ -82,6 +82,13 @@ def evaluate_matches(matches): ap = np.zeros( (len(dist_threshes) , len(CLASS_LABELS) , len(overlaps)) , np.float ) for di, (min_region_size, distance_thresh, distance_conf) in enumerate(zip(min_region_sizes, dist_threshes, dist_confs)): for oi, overlap_th in enumerate(overlaps): + pred_visited = {} + for m in matches: + for p in matches[m]['pred']: + for label_name in CLASS_LABELS: + for p in matches[m]['pred'][label_name]: + if 'filename' in p: + pred_visited[p['filename']] = False for li, label_name in enumerate(CLASS_LABELS): y_true = np.empty(0) y_score = np.empty(0) @@ -104,7 +111,11 @@ def evaluate_matches(matches): # collect matches for (gti,gt) in enumerate(gt_instances): found_match = False + num_pred = len(gt['matched_pred']) for pred in gt['matched_pred']: + # greedy assignments + if pred_visited[pred['filename']]: + continue overlap = float(pred['intersection']) / (gt['vert_count']+pred['vert_count']-pred['intersection']) if overlap > overlap_th: confidence = pred['confidence'] @@ -123,8 +134,9 @@ def evaluate_matches(matches): found_match = True cur_match[gti] = True cur_score[gti] = confidence + pred_visited[pred['filename']] = True if not found_match: - hardFns += 1 + hard_false_negatives += 1 # remove non-matched ground truth instances cur_true = cur_true [ cur_match==True ] cur_score = cur_score[ cur_match==True ] @@ -135,16 +147,16 @@ def evaluate_matches(matches): for gt in pred['matched_gt']: overlap = float(gt['intersection']) / (gt['vert_count']+pred['vert_count']-gt['intersection']) if overlap > overlap_th: - foundGt = True + found_gt = True break - if not foundGt: + if not found_gt: num_ignore = pred['void_intersection'] for gt in pred['matched_gt']: # group? if gt['instance_id'] < 1000: num_ignore += gt['intersection'] # small ground truth instances - if gt['vert_count'] < min_region_size or gt['med_dist']>distance_thresh or gt['dist_conf']distance_thresh or gt['dist_conf']15.3f}".format(ap_avg ) + sep line += sep + "{:>15.3f}".format(ap_50o ) + sep + line += sep + "{:>15.3f}".format(ap_25o ) + sep print line all_ap_avg = avgs["all_ap"] all_ap_50o = avgs["all_ap_50%"] + all_ap_25o = avgs["all_ap_25%"] print "-"*lineLen line = "{:<15}".format("average") + sep + col1 line += "{:>15.3f}".format(all_ap_avg) + sep line += "{:>15.3f}".format(all_ap_50o) + sep + line += "{:>15.3f}".format(all_ap_25o) + sep print line print "" From 0a881f53d8a8ec1fe921b74e77ef628250a86247 Mon Sep 17 00:00:00 2001 From: angeladai Date: Wed, 18 Jul 2018 18:20:32 -0700 Subject: [PATCH 04/41] small update --- .../3d_evaluation/evaluate_semantic_instance.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/BenchmarkScripts/3d_evaluation/evaluate_semantic_instance.py b/BenchmarkScripts/3d_evaluation/evaluate_semantic_instance.py index be6ff5a..79ea7ba 100644 --- a/BenchmarkScripts/3d_evaluation/evaluate_semantic_instance.py +++ b/BenchmarkScripts/3d_evaluation/evaluate_semantic_instance.py @@ -274,6 +274,8 @@ def assign_instances_for_scan(pred_file, gt_file, pred_path): label_name = ID_TO_LABEL[label_id] # read the mask pred_mask = util_3d.load_ids(pred_mask_file) + if len(pred_mask) != len(gt_ids): + util.print_error('wrong number of lines in ' + pred_mask_file + '(%d) vs #mesh vertices (%d), please double check and/or re-download the mesh' % (len(pred_mask), len(gt_ids))) # convert to binary pred_mask = np.not_equal(pred_mask, 0) num = np.count_nonzero(pred_mask) @@ -348,13 +350,14 @@ def print_results(avgs): def write_result_file(avgs, filename): _SPLITTER = ',' with open(filename, 'w') as f: - f.write(_SPLITTER.join(['class', 'class id', 'ap', 'ap50']) + '\n') + f.write(_SPLITTER.join(['class', 'class id', 'ap', 'ap50', 'ap25']) + '\n') for i in range(len(VALID_CLASS_IDS)): class_name = CLASS_LABELS[i] class_id = VALID_CLASS_IDS[i] ap = avgs["classes"][class_name]["ap"] ap50 = avgs["classes"][class_name]["ap50%"] - f.write(_SPLITTER.join([str(x) for x in [class_name, class_id, ap, ap50]]) + '\n') + ap25 = avgs["classes"][class_name]["ap25%"] + f.write(_SPLITTER.join([str(x) for x in [class_name, class_id, ap, ap50, ap25]]) + '\n') def evaluate(pred_files, gt_files, pred_path, output_file): From ee61c790e2129e9b677ed423adab3f5b79184555 Mon Sep 17 00:00:00 2001 From: angeladai Date: Tue, 31 Jul 2018 17:34:05 -0700 Subject: [PATCH 05/41] frame skip option --- SensReader/python/SensorData.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/SensReader/python/SensorData.py b/SensReader/python/SensorData.py index 95c8d99..1454ec5 100644 --- a/SensReader/python/SensorData.py +++ b/SensReader/python/SensorData.py @@ -73,21 +73,21 @@ def load(self, filename): self.frames.append(frame) - def export_depth_images(self, output_path): + def export_depth_images(self, output_path, frame_skip=1): if not os.path.exists(output_path): os.makedirs(output_path) - print 'exporting', len(self.frames), ' depth frames to', output_path - for f in range(len(self.frames)): + print 'exporting', len(self.frames)//frame_skip, ' depth frames to', output_path + for f in range(0, len(self.frames), frame_skip): depth_data = self.frames[f].decompress_depth(self.depth_compression_type) depth = np.fromstring(depth_data, dtype=np.uint16).reshape(self.depth_height, self.depth_width) imageio.imwrite(os.path.join(output_path, str(f) + '.png'), depth) - def export_color_images(self, output_path): + def export_color_images(self, output_path, frame_skip=1): if not os.path.exists(output_path): os.makedirs(output_path) - print 'exporting', len(self.frames), 'color frames to', output_path - for f in range(len(self.frames)): + print 'exporting', len(self.frames)//frame_skip, 'color frames to', output_path + for f in range(0, len(self.frames), frame_skip): color = self.frames[f].decompress_color(self.color_compression_type) imageio.imwrite(os.path.join(output_path, str(f) + '.jpg'), color) @@ -98,11 +98,11 @@ def save_mat_to_file(self, matrix, filename): np.savetxt(f, line[np.newaxis], fmt='%f') - def export_poses(self, output_path): + def export_poses(self, output_path, frame_skip=1): if not os.path.exists(output_path): os.makedirs(output_path) - print 'exporting', len(self.frames), 'camera poses to', output_path - for f in range(len(self.frames)): + print 'exporting', len(self.frames)//frame_skip, 'camera poses to', output_path + for f in range(0, len(self.frames), frame_skip): self.save_mat_to_file(self.frames[f].camera_to_world, os.path.join(output_path, str(f) + '.txt')) @@ -114,4 +114,3 @@ def export_intrinsics(self, output_path): self.save_mat_to_file(self.extrinsic_color, os.path.join(output_path, 'extrinsic_color.txt')) self.save_mat_to_file(self.intrinsic_depth, os.path.join(output_path, 'intrinsic_depth.txt')) self.save_mat_to_file(self.extrinsic_depth, os.path.join(output_path, 'extrinsic_depth.txt')) - From 913f3dc31d097029e1ce7cc9f55372ec077c0bf3 Mon Sep 17 00:00:00 2001 From: angeladai Date: Tue, 31 Jul 2018 18:09:41 -0700 Subject: [PATCH 06/41] image resize --- SensReader/python/SensorData.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/SensReader/python/SensorData.py b/SensReader/python/SensorData.py index 1454ec5..9a67d1c 100644 --- a/SensReader/python/SensorData.py +++ b/SensReader/python/SensorData.py @@ -3,6 +3,7 @@ import numpy as np import zlib import imageio +import cv2 COMPRESSION_TYPE_COLOR = {-1:'unknown', 0:'raw', 1:'png', 2:'jpeg'} COMPRESSION_TYPE_DEPTH = {-1:'unknown', 0:'raw_ushort', 1:'zlib_ushort', 2:'occi_ushort'} @@ -73,22 +74,26 @@ def load(self, filename): self.frames.append(frame) - def export_depth_images(self, output_path, frame_skip=1): + def export_depth_images(self, output_path, image_size=None, frame_skip=1): if not os.path.exists(output_path): os.makedirs(output_path) print 'exporting', len(self.frames)//frame_skip, ' depth frames to', output_path for f in range(0, len(self.frames), frame_skip): depth_data = self.frames[f].decompress_depth(self.depth_compression_type) depth = np.fromstring(depth_data, dtype=np.uint16).reshape(self.depth_height, self.depth_width) + if image_size is not None: + depth = cv2.resize(depth, (image_size[1], image_size[0]), interpolation=cv2.INTER_NEAREST) imageio.imwrite(os.path.join(output_path, str(f) + '.png'), depth) - def export_color_images(self, output_path, frame_skip=1): + def export_color_images(self, output_path, image_size=None, frame_skip=1): if not os.path.exists(output_path): os.makedirs(output_path) print 'exporting', len(self.frames)//frame_skip, 'color frames to', output_path for f in range(0, len(self.frames), frame_skip): color = self.frames[f].decompress_color(self.color_compression_type) + if image_size is not None: + color = cv2.resize(color, (image_size[1], image_size[0]), interpolation=cv2.INTER_NEAREST) imageio.imwrite(os.path.join(output_path, str(f) + '.jpg'), color) From c519cfc38597122c7669215d9ddd33ba6b708f82 Mon Sep 17 00:00:00 2001 From: angeladai Date: Sun, 5 Aug 2018 14:58:44 -0700 Subject: [PATCH 07/41] scene type --- .../evaluate_scene_type.py | 41 +++++++++++++++---- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/BenchmarkScripts/scene_type_evaluation/evaluate_scene_type.py b/BenchmarkScripts/scene_type_evaluation/evaluate_scene_type.py index 1ad5569..cb89f02 100644 --- a/BenchmarkScripts/scene_type_evaluation/evaluate_scene_type.py +++ b/BenchmarkScripts/scene_type_evaluation/evaluate_scene_type.py @@ -62,22 +62,41 @@ def get_iou(label_id, confusion): return (float(tp) / denom, tp, denom) -def write_result_file(confusion, ious, filename): +def get_acc(label_id, confusion): + if not label_id in VALID_CLASS_IDS: + return float('nan') + # #true positives + tp = np.longlong(confusion[label_id, label_id]) + # #false negatives + fn = np.longlong(confusion[label_id, :].sum()) - tp + denom = (tp + fn) + if denom == 0: + return float('nan') + return (float(tp) / denom, tp, denom) + + +def write_result_file(confusion, ious, accs, filename): with open(filename, 'w') as f: f.write('iou scores\n') for i in range(len(VALID_CLASS_IDS)): label_id = VALID_CLASS_IDS[i] label_name = CLASS_LABELS[i] iou = ious[label_name][0] - f.write('{0:<14s}({1:<2d}): {2:>5.3f}\n'.format(label_name, label_id, iou)) + f.write('{0:<32s}({1:<2d}): {2:>5.3f}\n'.format(label_name, label_id, iou)) + f.write('class accuracies\n') + for i in range(len(VALID_CLASS_IDS)): + label_id = VALID_CLASS_IDS[i] + label_name = CLASS_LABELS[i] + acc = accs[label_name][0] + f.write('{0:<32s}({1:<2d}): {2:>5.3f}\n'.format(label_name, label_id, acc)) f.write('\nconfusion matrix\n') f.write('\t\t\t') for i in range(len(VALID_CLASS_IDS)): - #f.write('\t{0:<14s}({1:<2d})'.format(CLASS_LABELS[i], VALID_CLASS_IDS[i])) + #f.write('\t{0:<32s}({1:<2d})'.format(CLASS_LABELS[i], VALID_CLASS_IDS[i])) f.write('{0:<8d}'.format(VALID_CLASS_IDS[i])) f.write('\n') for r in range(len(VALID_CLASS_IDS)): - f.write('{0:<14s}({1:<2d})'.format(CLASS_LABELS[r], VALID_CLASS_IDS[r])) + f.write('{0:<32s}({1:<2d})'.format(CLASS_LABELS[r], VALID_CLASS_IDS[r])) for c in range(len(VALID_CLASS_IDS)): f.write('\t{0:>5.3f}'.format(confusion[VALID_CLASS_IDS[r],VALID_CLASS_IDS[c]])) f.write('\n') @@ -123,18 +142,26 @@ def evaluate(pred_file, gt_file, output_file): confusion[gt_type][pred_type] += 1 class_ious = {} + class_accs = {} for i in range(len(VALID_CLASS_IDS)): label_name = CLASS_LABELS[i] label_id = VALID_CLASS_IDS[i] class_ious[label_name] = get_iou(label_id, confusion) + class_accs[label_name] = get_acc(label_id, confusion) # print print 'classes IoU' print '----------------------------' for i in range(len(VALID_CLASS_IDS)): label_name = CLASS_LABELS[i] - #print('{{0:<14s}: 1:>5.3f}'.format(label_name, class_ious[label_name][0])) - print('{0:<14s}: {1:>5.3f} ({2:>6d}/{3:<6d})'.format(label_name, class_ious[label_name][0], class_ious[label_name][1], class_ious[label_name][2])) - write_result_file(confusion, class_ious, output_file) + #print('{{0:<32s}: 1:>5.3f}'.format(label_name, class_ious[label_name][0])) + print('{0:<32s}: {1:>5.3f} ({2:>6d}/{3:<6d})'.format(label_name, class_ious[label_name][0], class_ious[label_name][1], class_ious[label_name][2])) + print '' + print 'classes acc' + print '----------------------------' + for i in range(len(VALID_CLASS_IDS)): + label_name = CLASS_LABELS[i] + print('{0:<32s}: {1:>5.3f} ({2:>6d}/{3:<6d})'.format(label_name, class_accs[label_name][0], class_accs[label_name][1], class_accs[label_name][2])) + write_result_file(confusion, class_ious, class_accs, output_file) def main(): From b2cd2d1ad372b828eae180bc3c29da21fce778b0 Mon Sep 17 00:00:00 2001 From: angeladai Date: Sun, 5 Aug 2018 15:04:46 -0700 Subject: [PATCH 08/41] scene type --- BenchmarkScripts/scene_type_evaluation/evaluate_scene_type.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BenchmarkScripts/scene_type_evaluation/evaluate_scene_type.py b/BenchmarkScripts/scene_type_evaluation/evaluate_scene_type.py index cb89f02..922a984 100644 --- a/BenchmarkScripts/scene_type_evaluation/evaluate_scene_type.py +++ b/BenchmarkScripts/scene_type_evaluation/evaluate_scene_type.py @@ -83,7 +83,7 @@ def write_result_file(confusion, ious, accs, filename): label_name = CLASS_LABELS[i] iou = ious[label_name][0] f.write('{0:<32s}({1:<2d}): {2:>5.3f}\n'.format(label_name, label_id, iou)) - f.write('class accuracies\n') + f.write('recall scores\n') for i in range(len(VALID_CLASS_IDS)): label_id = VALID_CLASS_IDS[i] label_name = CLASS_LABELS[i] @@ -156,7 +156,7 @@ def evaluate(pred_file, gt_file, output_file): #print('{{0:<32s}: 1:>5.3f}'.format(label_name, class_ious[label_name][0])) print('{0:<32s}: {1:>5.3f} ({2:>6d}/{3:<6d})'.format(label_name, class_ious[label_name][0], class_ious[label_name][1], class_ious[label_name][2])) print '' - print 'classes acc' + print 'classes recall' print '----------------------------' for i in range(len(VALID_CLASS_IDS)): label_name = CLASS_LABELS[i] From 280d42f3c585a69fa52122c5706683461e1f8b50 Mon Sep 17 00:00:00 2001 From: angeladai Date: Tue, 7 Aug 2018 11:01:09 -0700 Subject: [PATCH 09/41] update train/test splits --- .../{scannet_test.txt => scannetv1_test.txt} | 0 ...{scannet_train.txt => scannetv1_train.txt} | 0 .../{scannet_val.txt => scannetv1_val.txt} | 0 ...cannet_rob_test.txt => scannetv2_test.txt} | 20 ++ ...annet_trainval.txt => scannetv2_train.txt} | 0 Tasks/Benchmark/scannetv2_val.txt | 312 ++++++++++++++++++ 6 files changed, 332 insertions(+) rename Tasks/Benchmark/{scannet_test.txt => scannetv1_test.txt} (100%) rename Tasks/Benchmark/{scannet_train.txt => scannetv1_train.txt} (100%) rename Tasks/Benchmark/{scannet_val.txt => scannetv1_val.txt} (100%) rename Tasks/Benchmark/{scannet_rob_test.txt => scannetv2_test.txt} (80%) rename Tasks/Benchmark/{scannet_trainval.txt => scannetv2_train.txt} (100%) create mode 100644 Tasks/Benchmark/scannetv2_val.txt diff --git a/Tasks/Benchmark/scannet_test.txt b/Tasks/Benchmark/scannetv1_test.txt similarity index 100% rename from Tasks/Benchmark/scannet_test.txt rename to Tasks/Benchmark/scannetv1_test.txt diff --git a/Tasks/Benchmark/scannet_train.txt b/Tasks/Benchmark/scannetv1_train.txt similarity index 100% rename from Tasks/Benchmark/scannet_train.txt rename to Tasks/Benchmark/scannetv1_train.txt diff --git a/Tasks/Benchmark/scannet_val.txt b/Tasks/Benchmark/scannetv1_val.txt similarity index 100% rename from Tasks/Benchmark/scannet_val.txt rename to Tasks/Benchmark/scannetv1_val.txt diff --git a/Tasks/Benchmark/scannet_rob_test.txt b/Tasks/Benchmark/scannetv2_test.txt similarity index 80% rename from Tasks/Benchmark/scannet_rob_test.txt rename to Tasks/Benchmark/scannetv2_test.txt index c04e670..79d15b0 100644 --- a/Tasks/Benchmark/scannet_rob_test.txt +++ b/Tasks/Benchmark/scannetv2_test.txt @@ -78,3 +78,23 @@ scene0783_00 scene0784_00 scene0785_00 scene0786_00 +scene0787_00 +scene0788_00 +scene0789_00 +scene0790_00 +scene0791_00 +scene0792_00 +scene0793_00 +scene0794_00 +scene0795_00 +scene0796_00 +scene0797_00 +scene0798_00 +scene0799_00 +scene0800_00 +scene0801_00 +scene0802_00 +scene0803_00 +scene0804_00 +scene0805_00 +scene0806_00 diff --git a/Tasks/Benchmark/scannet_trainval.txt b/Tasks/Benchmark/scannetv2_train.txt similarity index 100% rename from Tasks/Benchmark/scannet_trainval.txt rename to Tasks/Benchmark/scannetv2_train.txt diff --git a/Tasks/Benchmark/scannetv2_val.txt b/Tasks/Benchmark/scannetv2_val.txt new file mode 100644 index 0000000..b9e7d92 --- /dev/null +++ b/Tasks/Benchmark/scannetv2_val.txt @@ -0,0 +1,312 @@ +scene0568_00 +scene0568_01 +scene0568_02 +scene0304_00 +scene0488_00 +scene0488_01 +scene0412_00 +scene0412_01 +scene0217_00 +scene0019_00 +scene0019_01 +scene0414_00 +scene0575_00 +scene0575_01 +scene0575_02 +scene0426_00 +scene0426_01 +scene0426_02 +scene0426_03 +scene0549_00 +scene0549_01 +scene0578_00 +scene0578_01 +scene0578_02 +scene0665_00 +scene0665_01 +scene0050_00 +scene0050_01 +scene0050_02 +scene0257_00 +scene0025_00 +scene0025_01 +scene0025_02 +scene0583_00 +scene0583_01 +scene0583_02 +scene0701_00 +scene0701_01 +scene0701_02 +scene0580_00 +scene0580_01 +scene0565_00 +scene0169_00 +scene0169_01 +scene0655_00 +scene0655_01 +scene0655_02 +scene0063_00 +scene0221_00 +scene0221_01 +scene0591_00 +scene0591_01 +scene0591_02 +scene0678_00 +scene0678_01 +scene0678_02 +scene0462_00 +scene0427_00 +scene0595_00 +scene0193_00 +scene0193_01 +scene0164_00 +scene0164_01 +scene0164_02 +scene0164_03 +scene0598_00 +scene0598_01 +scene0598_02 +scene0599_00 +scene0599_01 +scene0599_02 +scene0328_00 +scene0300_00 +scene0300_01 +scene0354_00 +scene0458_00 +scene0458_01 +scene0423_00 +scene0423_01 +scene0423_02 +scene0307_00 +scene0307_01 +scene0307_02 +scene0606_00 +scene0606_01 +scene0606_02 +scene0432_00 +scene0432_01 +scene0608_00 +scene0608_01 +scene0608_02 +scene0651_00 +scene0651_01 +scene0651_02 +scene0430_00 +scene0430_01 +scene0689_00 +scene0357_00 +scene0357_01 +scene0574_00 +scene0574_01 +scene0574_02 +scene0329_00 +scene0329_01 +scene0329_02 +scene0153_00 +scene0153_01 +scene0616_00 +scene0616_01 +scene0671_00 +scene0671_01 +scene0618_00 +scene0382_00 +scene0382_01 +scene0490_00 +scene0621_00 +scene0607_00 +scene0607_01 +scene0149_00 +scene0695_00 +scene0695_01 +scene0695_02 +scene0695_03 +scene0389_00 +scene0377_00 +scene0377_01 +scene0377_02 +scene0342_00 +scene0139_00 +scene0629_00 +scene0629_01 +scene0629_02 +scene0496_00 +scene0633_00 +scene0633_01 +scene0518_00 +scene0652_00 +scene0406_00 +scene0406_01 +scene0406_02 +scene0144_00 +scene0144_01 +scene0494_00 +scene0278_00 +scene0278_01 +scene0316_00 +scene0609_00 +scene0609_01 +scene0609_02 +scene0609_03 +scene0084_00 +scene0084_01 +scene0084_02 +scene0696_00 +scene0696_01 +scene0696_02 +scene0351_00 +scene0351_01 +scene0643_00 +scene0644_00 +scene0645_00 +scene0645_01 +scene0645_02 +scene0081_00 +scene0081_01 +scene0081_02 +scene0647_00 +scene0647_01 +scene0535_00 +scene0353_00 +scene0353_01 +scene0353_02 +scene0559_00 +scene0559_01 +scene0559_02 +scene0593_00 +scene0593_01 +scene0246_00 +scene0653_00 +scene0653_01 +scene0064_00 +scene0064_01 +scene0356_00 +scene0356_01 +scene0356_02 +scene0030_00 +scene0030_01 +scene0030_02 +scene0222_00 +scene0222_01 +scene0338_00 +scene0338_01 +scene0338_02 +scene0378_00 +scene0378_01 +scene0378_02 +scene0660_00 +scene0553_00 +scene0553_01 +scene0553_02 +scene0527_00 +scene0663_00 +scene0663_01 +scene0663_02 +scene0664_00 +scene0664_01 +scene0664_02 +scene0334_00 +scene0334_01 +scene0334_02 +scene0046_00 +scene0046_01 +scene0046_02 +scene0203_00 +scene0203_01 +scene0203_02 +scene0088_00 +scene0088_01 +scene0088_02 +scene0088_03 +scene0086_00 +scene0086_01 +scene0086_02 +scene0670_00 +scene0670_01 +scene0256_00 +scene0256_01 +scene0256_02 +scene0249_00 +scene0441_00 +scene0658_00 +scene0704_00 +scene0704_01 +scene0187_00 +scene0187_01 +scene0131_00 +scene0131_01 +scene0131_02 +scene0207_00 +scene0207_01 +scene0207_02 +scene0461_00 +scene0011_00 +scene0011_01 +scene0343_00 +scene0251_00 +scene0077_00 +scene0077_01 +scene0684_00 +scene0684_01 +scene0550_00 +scene0686_00 +scene0686_01 +scene0686_02 +scene0208_00 +scene0500_00 +scene0500_01 +scene0552_00 +scene0552_01 +scene0648_00 +scene0648_01 +scene0435_00 +scene0435_01 +scene0435_02 +scene0435_03 +scene0690_00 +scene0690_01 +scene0693_00 +scene0693_01 +scene0693_02 +scene0700_00 +scene0700_01 +scene0700_02 +scene0699_00 +scene0231_00 +scene0231_01 +scene0231_02 +scene0697_00 +scene0697_01 +scene0697_02 +scene0697_03 +scene0474_00 +scene0474_01 +scene0474_02 +scene0474_03 +scene0474_04 +scene0474_05 +scene0355_00 +scene0355_01 +scene0146_00 +scene0146_01 +scene0146_02 +scene0196_00 +scene0702_00 +scene0702_01 +scene0702_02 +scene0314_00 +scene0277_00 +scene0277_01 +scene0277_02 +scene0095_00 +scene0095_01 +scene0015_00 +scene0100_00 +scene0100_01 +scene0100_02 +scene0558_00 +scene0558_01 +scene0558_02 +scene0685_00 +scene0685_01 +scene0685_02 From 582a3df15e402b2a4cfa49e83e697cab4bdadaca Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Tue, 7 Aug 2018 11:03:37 -0700 Subject: [PATCH 10/41] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5e36e84..dcbb663 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,7 @@ We provide code for several scene understanding benchmarks on ScanNet: * 3D object retrieval * Semantic voxel labeling +Train/test splits are given at [Tasks/Benchmark](Tasks/Benchmark). Label mappings and trained models can be downloaded with the ScanNet data release. See [Tasks](Tasks). From e7cf32af95cb0217d84f82a5f4fdaa737870f37a Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Fri, 28 Sep 2018 00:29:11 +0200 Subject: [PATCH 11/41] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index dcbb663..aff9238 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ ScanNet is an RGB-D video dataset containing 2.5 million views in more than 1500 If you would like to download the ScanNet data, please fill out an agreement to the [ScanNet Terms of Use](http://dovahkiin.stanford.edu/scannet-public/ScanNet_TOS.pdf) and send it to us at scannet@googlegroups.com. +Please check the [changelog](http://www.scan-net.org/changelog) for updates to the data release. + If you have not received a response within a week, it is likely that your email is bouncing - please check this before sending repeat requests. ### Data Organization From 9960112ccb82725441a3293f514b70833371389c Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Fri, 28 Sep 2018 00:29:38 +0200 Subject: [PATCH 12/41] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index aff9238..41af604 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,10 @@ ScanNet is an RGB-D video dataset containing 2.5 million views in more than 1500 If you would like to download the ScanNet data, please fill out an agreement to the [ScanNet Terms of Use](http://dovahkiin.stanford.edu/scannet-public/ScanNet_TOS.pdf) and send it to us at scannet@googlegroups.com. +If you have not received a response within a week, it is likely that your email is bouncing - please check this before sending repeat requests. + Please check the [changelog](http://www.scan-net.org/changelog) for updates to the data release. -If you have not received a response within a week, it is likely that your email is bouncing - please check this before sending repeat requests. ### Data Organization The data in ScanNet is organized by RGB-D sequence. Each sequence is stored under a directory with named `scene_`, or `scene%04d_%02d`, where each space corresponds to a unique location (0-indexed). The raw data captured during scanning, camera poses and surface mesh reconstructions, and annotation metadata are all stored together for the given sequence. The directory has the following structure: From f1c45aa69578db1326542320fc75eaaf3f54fe8c Mon Sep 17 00:00:00 2001 From: angeladai Date: Sun, 18 Nov 2018 18:16:23 +0100 Subject: [PATCH 13/41] add converter --- Converter/README.md | 16 ++ Converter/converter.sln | 22 +++ Converter/converter.vcxproj | 123 ++++++++++++++ Converter/converter.vcxproj.filters | 90 +++++++++++ Converter/main.cpp | 241 ++++++++++++++++++++++++++++ Converter/src/mLibInclude.h | 12 ++ Converter/src/mLibSource.cpp | 7 + Converter/src/metaData.h | 76 +++++++++ Converter/src/targetver.h | 8 + Converter/stdafx.cpp | 10 ++ Converter/stdafx.h | 18 +++ 11 files changed, 623 insertions(+) create mode 100644 Converter/README.md create mode 100644 Converter/converter.sln create mode 100644 Converter/converter.vcxproj create mode 100644 Converter/converter.vcxproj.filters create mode 100644 Converter/main.cpp create mode 100644 Converter/src/mLibInclude.h create mode 100644 Converter/src/mLibSource.cpp create mode 100644 Converter/src/metaData.h create mode 100644 Converter/src/targetver.h create mode 100644 Converter/stdafx.cpp create mode 100644 Converter/stdafx.h diff --git a/Converter/README.md b/Converter/README.md new file mode 100644 index 0000000..204dcc6 --- /dev/null +++ b/Converter/README.md @@ -0,0 +1,16 @@ +## Converter from ScannerApp capture to .sens data +=============================================== + +Converts raw capture data (`.h264`, `.depth`, `.txt`, `.imu`) from the ScannerApp to `.sens` format. + +### Installation. +This code was developed under VS2013. + +Requirements: +- ffmpeg (assumes that `ffmpeg.exe` is at the relativel path `./ffmpeg/ffmpeg.exe`) +- our research library mLib, a git submodule in ../external/mLib +- mLib external libraries can be downloaded [here](https://www.dropbox.com/s/fve3uen5mzonidx/mLibExternal.zip?dl=0) + + +To run: +`converter.exe [path to directory of ScannerApp outputs] [name of ScannerApp output to convert]` \ No newline at end of file diff --git a/Converter/converter.sln b/Converter/converter.sln new file mode 100644 index 0000000..ebfb91a --- /dev/null +++ b/Converter/converter.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "converter", "converter.vcxproj", "{6DFC3959-985F-4B6D-96FC-D6A3CC41BDC3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6DFC3959-985F-4B6D-96FC-D6A3CC41BDC3}.Debug|x64.ActiveCfg = Debug|x64 + {6DFC3959-985F-4B6D-96FC-D6A3CC41BDC3}.Debug|x64.Build.0 = Debug|x64 + {6DFC3959-985F-4B6D-96FC-D6A3CC41BDC3}.Release|x64.ActiveCfg = Release|x64 + {6DFC3959-985F-4B6D-96FC-D6A3CC41BDC3}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Converter/converter.vcxproj b/Converter/converter.vcxproj new file mode 100644 index 0000000..0bbd410 --- /dev/null +++ b/Converter/converter.vcxproj @@ -0,0 +1,123 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {6DFC3959-985F-4B6D-96FC-D6A3CC41BDC3} + Win32Proj + converter + + + + Application + true + v120 + Unicode + + + Application + false + v120 + true + Unicode + + + + + + + + + + + + + true + ./;./src/;../external/mLib/include/;../external/mLibExternal/include/;$(IncludePath) + ../external/mLibExternal/libsWindows/lib64/;$(LibraryPath) + + + false + ./;./src/;../external/mLib/include/;../external/mLibExternal/include/;$(IncludePath) + ../external/mLibExternal/libsWindows/lib64/;$(LibraryPath) + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;NOMINMAX;_WINSOCK_DEPRECATED_NO_WARNINGS + true + stdafx.h + + + Console + true + zlib64.lib;FreeImage.lib;%(AdditionalDependencies) + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;NOMINMAX;_WINSOCK_DEPRECATED_NO_WARNINGS + true + stdafx.h + + + Console + true + true + true + zlib64.lib;FreeImage.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + + + + + + \ No newline at end of file diff --git a/Converter/converter.vcxproj.filters b/Converter/converter.vcxproj.filters new file mode 100644 index 0000000..d073cfc --- /dev/null +++ b/Converter/converter.vcxproj.filters @@ -0,0 +1,90 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {50fd99dc-5001-4643-abab-04f4c216b8a3} + + + {555583f0-31b9-4962-b5da-bb3133d6e4d9} + + + + + + + input + + + input + + + input + + + input + + + input + + + input + + + input + + + input + + + input + + + input + + + input + + + input + + + input + + + input + + + + sensorData + + + sensorData + + + sensorData + + + sensorData + + + sensorData + + + sensorData + + + sensorData + + + sensorData + + + + + + + \ No newline at end of file diff --git a/Converter/main.cpp b/Converter/main.cpp new file mode 100644 index 0000000..5dd1f21 --- /dev/null +++ b/Converter/main.cpp @@ -0,0 +1,241 @@ +// sensorFile.cpp : Defines the entry point for the console application. +// + +#include "stdafx.h" +#include + +#include "metaData.h" + + +//converts from seconds to microseconds +UINT64 timeToUINT64(double d) { + return (UINT64)(d*1000.0*1000.0); +} + + +void convertToSens(const std::string& baseFilename, ml::SensorData& sens) +{ + sens.free(); + + const std::string srcFileMeta = ml::util::removeExtensions(baseFilename) + ".txt"; + const std::string srcFileDepth = ml::util::removeExtensions(baseFilename) + ".depth"; + const std::string srcFileColor = ml::util::removeExtensions(baseFilename) + ".h264"; + const std::string srcFileIMU = ml::util::removeExtensions(baseFilename) + ".imu"; + + + if (!ml::util::fileExists(srcFileMeta)) throw MLIB_EXCEPTION("file not found " + srcFileMeta); + if (!ml::util::fileExists(srcFileDepth)) throw MLIB_EXCEPTION("file not found " + srcFileDepth); + if (!ml::util::fileExists(srcFileColor)) throw MLIB_EXCEPTION("file not found " + srcFileColor); + if (!ml::util::fileExists(srcFileIMU)) throw MLIB_EXCEPTION("file not found " + srcFileIMU); + + MetaData meta(srcFileMeta); + sens.initDefault( + meta.colorWidth, meta.colorHeight, + meta.depthWidth, meta.depthHeight, + meta.colorCalibration, + meta.depthCalibration, + ml::SensorData::COMPRESSION_TYPE_COLOR::TYPE_JPEG, + ml::SensorData::COMPRESSION_TYPE_DEPTH::TYPE_ZLIB_USHORT, + 1000.0f, + ml::SensorData::getName().StructureSensor + ); + + std::string execPath = ml::util::getExecutablePath(); + const std::string tmpDir = execPath + "/tmp1337/"; + ml::util::deleteDirectory(tmpDir); // in case we have a leftover directory + + const std::string baseNameColor = "frame-"; + std::string ffmpegPath = execPath + "../../ffmpeg/ffmpeg.exe"; + if (!ml::util::fileExists(ffmpegPath)) { + ffmpegPath = execPath + "./ffmpeg/ffmpeg.exe"; + } + + if (!ml::util::fileExists(ffmpegPath)) throw MLIB_EXCEPTION("could not find ffmpeg.exe in path: " + ffmpegPath); + std::string command = ffmpegPath + " -i " + srcFileColor + " " + tmpDir + baseNameColor + "%6d.color.png"; + std::cout << "running: " << command << std::endl; + ml::util::makeDirectory(tmpDir); + command = command + " > nul 2>&1"; //pipe output to dev/null + int res = system(command.c_str()); + + + std::ifstream inDepth(srcFileDepth, std::ios::binary); + + ml::Directory dir(tmpDir); + const unsigned int numColorFrames = (unsigned int)dir.getFiles().size(); + unsigned int numFrames = std::min(meta.numDepthFrames, meta.numColorFrames); + numFrames = std::min(numFrames, numColorFrames); + if (numFrames != meta.numDepthFrames || numFrames != meta.numColorFrames || numFrames != numColorFrames) { + MLIB_WARNING("frame counts are different:numColorImages(" + std::to_string(numColorFrames) + ") meta.numDepthImages(" + std::to_string(meta.numDepthFrames) + ") meta.numColorImages(" + std::to_string(meta.numColorFrames) + ")"); + } + + unsigned int frame = 0; + ml::SensorData::StringCounter scColor(tmpDir + "/" + baseNameColor, "color.png", 6); scColor.getNext(); + + while (frame < numFrames) { + assert(inDepth.good()); + + //ml::Timer t; + uint32_t byteSize; + inDepth.read((char*)&byteSize, sizeof(uint32_t)); + char* depthCompressed = new char[byteSize]; + inDepth.read((char*)depthCompressed, byteSize); + + const unsigned int depthWidth = meta.depthWidth; + const unsigned int depthHeight = meta.depthHeight; + + unsigned short* depth = (unsigned short*)std::malloc(depthWidth*depthHeight * 2); + + uplinksimple::decode((unsigned char*)depthCompressed, (unsigned int)byteSize, depthWidth*depthHeight, depth); + uplinksimple::shift2depth(depth, depthWidth*depthHeight); + + //check for invalid values + for (unsigned int i = 0; i < depthWidth*depthHeight; i++) { + if (depth[i] >= uplinksimple::shift2depth(0xffff)) { + depth[i] = 0; + } + } + + SAFE_DELETE(depthCompressed); + + std::string colorFile = scColor.getNext(); + ml::ColorImageR8G8B8 cImage; + ml::FreeImageWrapper::loadImage(colorFile, cImage); + + sens.addFrame(cImage.getData(), depth); + + std::free(depth); + std::cout << "\rframe " << frame << ": read " << byteSize << " [bytes] "; + frame++; + + //std::cout << t.getElapsedTimeMS() << " [ms]" << std::endl << std::endl; + } + + //read the rest of the depth frames + for (; frame < meta.numDepthFrames; frame++) { + assert(inDepth.good()); + uint32_t byteSize; + inDepth.read((char*)&byteSize, sizeof(uint32_t)); + char* depthCompressed = new char[byteSize]; + inDepth.read((char*)depthCompressed, byteSize); + SAFE_DELETE_ARRAY(depthCompressed); + } + + + for (unsigned int i = 0; i < meta.numDepthFrames; i++) { + //TODO read time stamps here + double timeStampDouble; + inDepth.read((char*)&timeStampDouble, sizeof(double)); + UINT64 timeStamp = timeToUINT64(timeStampDouble); + + if (i < (unsigned int)sens.m_frames.size()) { + sens.m_frames[i].setTimeStampColor(timeStamp); + sens.m_frames[i].setTimeStampDepth(timeStamp); + } + + //std::cout << timeStamp << std::endl; + //std::cout << std::setprecision(20) << timeStampDouble << std::endl; + } + + + std::ifstream inIMU(srcFileIMU, std::ios::binary); + for (unsigned int i = 0; i < meta.numIMUmeasurements; i++) { + ml::SensorData::IMUFrame f; + double timeStamp = 0.0; + inIMU.read((char*)&timeStamp, sizeof(double)); + + inIMU.read((char*)&f.rotationRate, sizeof(ml::vec3d)); + inIMU.read((char*)&f.acceleration, sizeof(ml::vec3d)); + inIMU.read((char*)&f.magneticField, sizeof(ml::vec3d)); + inIMU.read((char*)&f.attitude, sizeof(ml::vec3d)); + inIMU.read((char*)&f.gravity, sizeof(ml::vec3d)); + f.timeStamp = timeToUINT64(timeStamp); + + if (f.timeStamp == 0) { + std::cout << "invalid IMUFrame -> skipping" << std::endl; + continue; + } + sens.addIMUFrame(f); + } + inIMU.close(); + + std::cout << std::endl; + + //for (size_t i = 0; i < sens.m_frames.size(); i++) { + // const ml::SensorData::IMUFrame& f = sens.findClosestIMUFrame(i); + // std::cout << "frame time: " << sens.m_frames[i].getTimeStampColor() << "\t imu time: " << f.timeStamp << std::endl; + //} + + for (size_t i = 0; i < sens.m_frames.size(); i++) { + const ml::mat4f& t = sens.m_frames[i].getCameraToWorld(); + const ml::mat4f id = ml::mat4f::identity(); + for (unsigned int i = 0; i < 16; i++) { + if (t[i] != id[i]) throw MLIB_EXCEPTION("matrix needs to be the identity"); + } + + //std::cout << sens.m_frames[i].getCameraToWorld() << std::endl; + } + + ml::util::deleteDirectory(tmpDir); +} + +void processStagingFolder(std::string stagingFolder, const std::string& outSensFilename, bool forceOverwrite = false) +{ + stagingFolder = ml::util::replace(stagingFolder, "\\", "/"); //we assume forward slashes + + ml::Directory stagingFolderDir(stagingFolder); + + const std::vector tmp = ml::util::split(stagingFolder, "/"); + const std::string base = tmp.back(); + const std::string baseFile = stagingFolder + "/" + base; + + std::cout << "converting: " << baseFile << std::endl; + + //const std::string sensFile = baseFile + ".sens"; + if (ml::util::fileExists(outSensFilename)) { + std::cout << "sensFile already available: " << outSensFilename << "\n\t -> skipping folder" << std::endl; + return; + } + + ml::SensorData sd; + convertToSens(baseFile, sd); + sd.saveToFile(outSensFilename); + std::cout << sd << std::endl; + +} + + + +int main(int argc, char* argv[]) +{ +#if defined(DEBUG) | defined(_DEBUG) + _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); +#endif + //_CrtSetBreakAlloc(7545); + try { + + if (argc == 3) { //converts a specific scan given by the command line argument + std::string stagingFolder(argv[1]); + std::string outSensFilename(argv[2]); + std::cout << stagingFolder << std::endl; + std::cout << outSensFilename << std::endl; + processStagingFolder(stagingFolder, outSensFilename); + } + else { + throw MLIB_EXCEPTION("requires the path and output file as a command line arguments"); + } + } + catch (const std::exception& e) + { + MessageBoxA(NULL, e.what(), "Exception caught", MB_ICONERROR); + exit(EXIT_FAILURE); + } + catch (...) + { + MessageBoxA(NULL, "UNKNOWN EXCEPTION", "Exception caught", MB_ICONERROR); + exit(EXIT_FAILURE); + } + //std::cout << "" << std::endl; + //getchar(); + return 0; +} + diff --git a/Converter/src/mLibInclude.h b/Converter/src/mLibInclude.h new file mode 100644 index 0000000..6874251 --- /dev/null +++ b/Converter/src/mLibInclude.h @@ -0,0 +1,12 @@ + +// +// mLib includes +// + +#include "mLibCore.h" +//#include "mLibEigen.h" +#include "mLibLodePNG.h" +//#include "mLibZLib.h" +#include "mLibFreeImage.h" //This has to come after OpenMesh otherwise there is a crash +#include "mLibDepthCamera.h" + \ No newline at end of file diff --git a/Converter/src/mLibSource.cpp b/Converter/src/mLibSource.cpp new file mode 100644 index 0000000..826c78f --- /dev/null +++ b/Converter/src/mLibSource.cpp @@ -0,0 +1,7 @@ + +#include "stdafx.h" + +#include "mLibCore.cpp" +#include "mLibLodePNG.cpp" +//#include "mLibZLib.cpp" +#include "mLibDepthCamera.cpp" \ No newline at end of file diff --git a/Converter/src/metaData.h b/Converter/src/metaData.h new file mode 100644 index 0000000..6616c3f --- /dev/null +++ b/Converter/src/metaData.h @@ -0,0 +1,76 @@ + +#pragma once + +#include "stdafx.h" + +#ifndef VAR_NAME +#define VAR_NAME(x) #x +#endif + +struct MetaData { + + MetaData(const std::string& filename) { + loadFromFile(filename); + } + + void loadFromFile(const std::string& filename) { + ml::ParameterFile parameterFile(filename); + readParameter(parameterFile, std::string(VAR_NAME(numColorFrames)), numColorFrames); + readParameter(parameterFile, std::string(VAR_NAME(numDepthFrames)), numDepthFrames); + readParameter(parameterFile, std::string(VAR_NAME(numIMUmeasurements)), numIMUmeasurements); + readParameter(parameterFile, std::string(VAR_NAME(colorWidth)), colorWidth); + readParameter(parameterFile, std::string(VAR_NAME(colorHeight)), colorHeight); + readParameter(parameterFile, std::string(VAR_NAME(depthWidth)), depthWidth); + readParameter(parameterFile, std::string(VAR_NAME(depthHeight)), depthHeight); + + { + float fx_color, fy_color, mx_color, my_color; + readParameter(parameterFile, std::string(VAR_NAME(fx_color)), fx_color); + readParameter(parameterFile, std::string(VAR_NAME(fy_color)), fy_color); + readParameter(parameterFile, std::string(VAR_NAME(mx_color)), mx_color); + readParameter(parameterFile, std::string(VAR_NAME(my_color)), my_color); + colorCalibration = ml::SensorData::CalibrationData( + ml::mat4f( + fx_color, 0.0f, mx_color, 0.0f, + 0.0f, fy_color, my_color, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + ), + ml::mat4f::identity()); + } + { + float fx_depth, fy_depth, mx_depth, my_depth; + readParameter(parameterFile, std::string(VAR_NAME(fx_depth)), fx_depth); + readParameter(parameterFile, std::string(VAR_NAME(fy_depth)), fy_depth); + readParameter(parameterFile, std::string(VAR_NAME(mx_depth)), mx_depth); + readParameter(parameterFile, std::string(VAR_NAME(my_depth)), my_depth); + + ml::mat4f depthToColorExtrinsics = ml::mat4f::identity(); + if (readParameter(parameterFile, std::string(VAR_NAME(colorToDepthExtrinsics)), depthToColorExtrinsics)) depthToColorExtrinsics.invert(); + depthCalibration = ml::SensorData::CalibrationData( + ml::mat4f( + fx_depth, 0.0f, mx_depth, 0.0f, + 0.0f, fy_depth, my_depth, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + ), + depthToColorExtrinsics); + } + } + + template + bool readParameter(const ml::ParameterFile& pf, const std::string& varName, T& var) { + if (!pf.readParameter(varName, var)) { MLIB_WARNING(std::string(varName).append(" ").append("uninitialized")); return false; } + return true; + } + + unsigned int numColorFrames; + unsigned int numDepthFrames; + unsigned int numIMUmeasurements; + unsigned int colorWidth; + unsigned int colorHeight; + unsigned int depthWidth; + unsigned int depthHeight; + ml::SensorData::CalibrationData colorCalibration; + ml::SensorData::CalibrationData depthCalibration; +}; \ No newline at end of file diff --git a/Converter/src/targetver.h b/Converter/src/targetver.h new file mode 100644 index 0000000..87c0086 --- /dev/null +++ b/Converter/src/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/Converter/stdafx.cpp b/Converter/stdafx.cpp new file mode 100644 index 0000000..8a34e6e --- /dev/null +++ b/Converter/stdafx.cpp @@ -0,0 +1,10 @@ +// stdafx.cpp : source file that includes just the standard includes +// sensorFile.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file + +#include "mLibSource.cpp" diff --git a/Converter/stdafx.h b/Converter/stdafx.h new file mode 100644 index 0000000..99247d5 --- /dev/null +++ b/Converter/stdafx.h @@ -0,0 +1,18 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#include +#include + +#include "WinSock2.h" +#include "windows.h" + +// TODO: reference additional headers your program requires here +#include "mLibInclude.h" + From cf24191a8bbb8d40577c26db7b11bad732e0500f Mon Sep 17 00:00:00 2001 From: angeladai Date: Sun, 18 Nov 2018 18:25:03 +0100 Subject: [PATCH 14/41] add calibrate --- Calibrate/README.md | 17 ++ Calibrate/calibrate.sln | 22 ++ Calibrate/calibrate.vcxproj | 113 +++++++ Calibrate/calibrate.vcxproj.filters | 21 ++ Calibrate/shaders/aligner.hlsl | 180 ++++++++++++ Calibrate/src/aligner.cpp | 4 + Calibrate/src/aligner.h | 145 +++++++++ Calibrate/src/calibration.h | 311 ++++++++++++++++++++ Calibrate/src/grid3d.cpp | 437 ++++++++++++++++++++++++++++ Calibrate/src/grid3d.h | 55 ++++ Calibrate/src/mLibInclude.h | 20 ++ Calibrate/src/mLibSource.cpp | 8 + Calibrate/src/main.cpp | 80 +++++ Calibrate/src/main.h | 9 + Calibrate/src/processedFile.h | 87 ++++++ Calibrate/src/stdafx.cpp | 11 + Calibrate/src/stdafx.h | 16 + 17 files changed, 1536 insertions(+) create mode 100644 Calibrate/README.md create mode 100644 Calibrate/calibrate.sln create mode 100644 Calibrate/calibrate.vcxproj create mode 100644 Calibrate/calibrate.vcxproj.filters create mode 100644 Calibrate/shaders/aligner.hlsl create mode 100644 Calibrate/src/aligner.cpp create mode 100644 Calibrate/src/aligner.h create mode 100644 Calibrate/src/calibration.h create mode 100644 Calibrate/src/grid3d.cpp create mode 100644 Calibrate/src/grid3d.h create mode 100644 Calibrate/src/mLibInclude.h create mode 100644 Calibrate/src/mLibSource.cpp create mode 100644 Calibrate/src/main.cpp create mode 100644 Calibrate/src/main.h create mode 100644 Calibrate/src/processedFile.h create mode 100644 Calibrate/src/stdafx.cpp create mode 100644 Calibrate/src/stdafx.h diff --git a/Calibrate/README.md b/Calibrate/README.md new file mode 100644 index 0000000..303d826 --- /dev/null +++ b/Calibrate/README.md @@ -0,0 +1,17 @@ +## Converts uncalibrated .sens data to color/depth calibrated .sens data +=========================================================================== + +Converts uncalibrated `.sens` file to calibrated `.sens` file; calibrates color and depth distortion and aligns depth with color space. +Uses the calibration output of [CameraParameterEstimation](../CameraParameterEstimation) for a calibrated device. + +### Installation. +This code was developed under VS2013. + +Requirements: +- DirectX SDK June 2010 +- our research library mLib, a git submodule in ../external/mLib +- mLib external libraries can be downloaded [here](https://www.dropbox.com/s/fve3uen5mzonidx/mLibExternal.zip?dl=0) + + +To run: +`calibrate.exe [input sens file] [output sens file] [device calibration map file (from CameraParameterEstimation)] [directory of device calibration map files]` \ No newline at end of file diff --git a/Calibrate/calibrate.sln b/Calibrate/calibrate.sln new file mode 100644 index 0000000..9ac4411 --- /dev/null +++ b/Calibrate/calibrate.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.31101.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "calibrate", "calibrate.vcxproj", "{EB0D04B5-579C-4BF9-8FC3-58DFB235231F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EB0D04B5-579C-4BF9-8FC3-58DFB235231F}.Debug|x64.ActiveCfg = Debug|x64 + {EB0D04B5-579C-4BF9-8FC3-58DFB235231F}.Debug|x64.Build.0 = Debug|x64 + {EB0D04B5-579C-4BF9-8FC3-58DFB235231F}.Release|x64.ActiveCfg = Release|x64 + {EB0D04B5-579C-4BF9-8FC3-58DFB235231F}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Calibrate/calibrate.vcxproj b/Calibrate/calibrate.vcxproj new file mode 100644 index 0000000..ba7c9f7 --- /dev/null +++ b/Calibrate/calibrate.vcxproj @@ -0,0 +1,113 @@ + + + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + + + + true + true + + + Create + Create + + + + + true + true + + + + {EB0D04B5-579C-4BF9-8FC3-58DFB235231F} + alignment + calibrate + + + + Application + true + v120 + MultiByte + + + Application + false + v120 + true + MultiByte + + + + + + + + + + + + + ../external/mLib/include;../external/mLibExternal/include/;./src/;C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include;$(IncludePath) + ..\external\mLibExternal\libsWindows\lib64;C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x64;$(LibraryPath) + + + ../external/mLib/include;../external/mLibExternal/include/;./src/;C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include;$(IncludePath) + ..\external\mLibExternal\libsWindows\lib64;C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x64;$(LibraryPath) + + + + Level3 + Disabled + true + NOMINMAX;_CRT_SECURE_NO_WARNINGS;_DEBUG;%(PreprocessorDefinitions) + Use + -Zm400 %(AdditionalOptions) + + + true + D3DCompiler.lib;FW1FontWrapper.lib;d3d11.lib;d3dx11.lib;kernel32.lib;user32.lib;gdi32.lib;zlib64.lib;freeimage.lib;%(AdditionalDependencies) + + + + + Level2 + MaxSpeed + true + true + true + NOMINMAX;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + Use + -Zm400 %(AdditionalOptions) + + + true + true + true + D3DCompiler.lib;FW1FontWrapper.lib;d3d11.lib;d3dx11.lib;kernel32.lib;user32.lib;gdi32.lib;zlib64.lib;freeimage.lib;%(AdditionalDependencies) + + + + + + \ No newline at end of file diff --git a/Calibrate/calibrate.vcxproj.filters b/Calibrate/calibrate.vcxproj.filters new file mode 100644 index 0000000..3c5acfa --- /dev/null +++ b/Calibrate/calibrate.vcxproj.filters @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Calibrate/shaders/aligner.hlsl b/Calibrate/shaders/aligner.hlsl new file mode 100644 index 0000000..f8760a1 --- /dev/null +++ b/Calibrate/shaders/aligner.hlsl @@ -0,0 +1,180 @@ + +#define MINF asfloat(0xff800000) + +#define DEPTH_WORLD_MIN 0.1f +#define DEPTH_WORLD_MAX 10.0f + +float cameraToKinectProjZ(float z) +{ + return (z - DEPTH_WORLD_MIN) / (DEPTH_WORLD_MAX - DEPTH_WORLD_MIN); +} + +float kinectProjZToCamera(float z) +{ + return DEPTH_WORLD_MIN + z*(DEPTH_WORLD_MAX - DEPTH_WORLD_MIN); +} + + +Buffer g_depth : register(t0); + +cbuffer ConstantBuffer : register(b0) +{ + matrix g_mIntrinsicInverse; + matrix g_mIntrinsicNew; + matrix g_mExtrinsic; + uint g_uWidth; + uint g_uHeight; + uint g_uWidthNew; + uint g_uHeightNew; + float g_fDepthThreshOffset; + float g_fDepthThreshLin; + float2 g_dummy123; +} + + +void vertexShaderMain() +{ +} + +struct GS_INPUT +{ +}; + +struct PS_INPUT +{ + float4 vPosition : SV_POSITION; + float fDepth : DE; +}; + +struct PS_OUTPUT +{ + float depth; +}; + +float4 getWorldSpacePosition(uint x, uint y) +{ + float d = g_depth[y*g_uWidth + x]; + float4 posCam = mul(float4((float)x*d, (float)y*d, d, d), g_mIntrinsicInverse); + posCam = float4(posCam.x, posCam.y, posCam.z, 1.0f); + + float4 posWorld = mul(posCam, g_mExtrinsic); + posWorld /= posWorld.w; + + return posWorld; +} + +PS_INPUT ComputeQuadVertex(uint x, uint y) +{ + float d = g_depth[y*g_uWidth + x]; + float4 posWorldCC = getWorldSpacePosition(x, y); + + //float4 posWorlMC = getWorldSpacePosition(x - 1, y + 0); + //float4 posWorlCM = getWorldSpacePosition(x + 0, y - 1); + //float4 posWorlCP = getWorldSpacePosition(x + 0, y + 1); + //float4 posWorlPC = getWorldSpacePosition(x + 1, y + 0); + + //float3 normal = cross(posWorlCP.xyz - posWorlCM.xyz, posWorlPC.xyz - posWorlMC.xyz); + // normal = normalize(normal); + + float4 posClip = mul(float4(posWorldCC.x, posWorldCC.y, posWorldCC.z, 1.0f), g_mIntrinsicNew); + posClip = float4(posClip.x / posClip.z, posClip.y / posClip.z, posClip.z, 1.0f); + + // NOTE: The aspect ratio is not 2.0! + float fx = ((float)posClip.x / (float)(g_uWidthNew - 1))*2.0f - 1.0f; + //float fy = ((float)posClip.y / (float)(g_uHeightNew-1))*2.0f - 1.0f; + float fy = 1.0f - ((float) posClip.y / (float) (g_uHeightNew - 1.0f))*2.0f; + float fz = cameraToKinectProjZ(posClip.z); + posClip.x = fx; + posClip.y = fy; + posClip.z = fz; + posClip.w = 1.0f; + + PS_INPUT Out; + //Out.camSpacePosition = posWorldCC; + Out.vPosition = posClip; + //Out.vNormal = float4(normal, 1.0f); + //Out.vTexCoord = float2(0.0f, 0.0f); + Out.fDepth = d; + + return Out; +} + +PS_INPUT ComputeDebugQuadVertex(uint x, uint y) { + float d = g_depth[y*g_uWidth + x]; + + float4 posClip; + float fx = ((float)x / (float)(g_uWidth - 1))*2.0f - 1.0f; + float fy = 1.0f - ((float)y / (float)(g_uHeight - 1))*2.0f; + float fz = cameraToKinectProjZ(d); + + posClip.x = fx; + posClip.y = fy; + posClip.z = fz; + posClip.w = 1.0f; + + PS_INPUT Out; + Out.vPosition = posClip; + Out.fDepth = d; + return Out; +} + +bool isValidVertex(PS_INPUT v) { + if (v.vPosition.x < -1.0f || v.vPosition.x > 1.0f) return false; + if (v.vPosition.y < -1.0f || v.vPosition.y > 1.0f) return false; + if (v.vPosition.z < 0.0f || v.vPosition.z > 1.0f) return false; + + return true; +} + +[maxvertexcount(4)] +void geometryShaderMain(point GS_INPUT fake[1], uint quadIdx : SV_PrimitiveID, inout TriangleStream OutStream) +{ + PS_INPUT Out = (PS_INPUT)0; + + uint x = quadIdx % g_uWidth; + uint y = quadIdx / g_uWidth; + + if (x >= g_uWidth - 1) return; + if (y >= g_uHeight - 1) return; + + float d0 = g_depth[(x + 0) + g_uWidth*(y + 0)]; + float d1 = g_depth[(x + 0) + g_uWidth*(y + 1)]; + float d2 = g_depth[(x + 1) + g_uWidth*(y + 0)]; + float d3 = g_depth[(x + 1) + g_uWidth*(y + 1)]; + + if (d0 <= DEPTH_WORLD_MIN || d1 <= DEPTH_WORLD_MIN || d2 <= DEPTH_WORLD_MIN || d3 <= DEPTH_WORLD_MIN) return; + if (d0 == MINF || d1 == MINF || d2 == MINF || d3 == MINF) return; + + float dmax = max(max(d0, d1), max(d2, d3)); + float dmin = min(min(d0, d1), min(d2, d3)); + + float d = 0.5f*(dmax + dmin); + if (dmax - dmin > g_fDepthThreshOffset + g_fDepthThreshLin*d) return; + + //be aware of the order for CULLING + PS_INPUT v0 = ComputeQuadVertex(x + 0, y + 1); + PS_INPUT v1 = ComputeQuadVertex(x + 0, y + 0); + PS_INPUT v2 = ComputeQuadVertex(x + 1, y + 1); + PS_INPUT v3 = ComputeQuadVertex(x + 1, y + 0); + + if (isValidVertex(v0) && isValidVertex(v1) && isValidVertex(v2) && isValidVertex(v3)) { + OutStream.Append(v0); + OutStream.Append(v1); + OutStream.Append(v2); + OutStream.Append(v3); + } + + //OutStream.Append(ComputeQuadVertex(x + 0, y + 1)); + //OutStream.Append(ComputeQuadVertex(x + 0, y + 0)); + //OutStream.Append(ComputeQuadVertex(x + 1, y + 1)); + //OutStream.Append(ComputeQuadVertex(x + 1, y + 0)); +} + +float4 pixelShaderMain(PS_INPUT input) : SV_Target +{ + PS_OUTPUT res; + res.depth = input.fDepth; + + return float4(res, res, res, 1.0f); +} + diff --git a/Calibrate/src/aligner.cpp b/Calibrate/src/aligner.cpp new file mode 100644 index 0000000..55d6a1c --- /dev/null +++ b/Calibrate/src/aligner.cpp @@ -0,0 +1,4 @@ + +#include "stdafx.h" + +#include "aligner.h" \ No newline at end of file diff --git a/Calibrate/src/aligner.h b/Calibrate/src/aligner.h new file mode 100644 index 0000000..5c8ca1c --- /dev/null +++ b/Calibrate/src/aligner.h @@ -0,0 +1,145 @@ + +#pragma once + +#include "mLibInclude.h" + +class Aligner { +public: + Aligner(GraphicsDevice& g) { + m_graphics = &g; + + m_shaderManager.init(*m_graphics); + std::string shaderPath = util::getExecutablePath() + "../../"; + const std::string shaderFile = "shaders/aligner.hlsl"; + if (!util::fileExists(shaderPath + shaderFile)) shaderPath = util::getExecutablePath(); + m_shaderManager.registerShaderWithGS(shaderPath + shaderFile, "aligner"); + + m_constantBuffer.init(*m_graphics); + } + + ~Aligner() { + + } + + DepthImage32 depthToColor(const DepthImage32& input, const mat4f& depthIntrinsic, const mat4f& depthExtrinsic, const mat4f& colorIntrinsic, unsigned int colorWidth, unsigned int colorHeight) { + + CB cb; + cb.intrinsicInverse = depthIntrinsic.getInverse(); + cb.extrinsic = depthExtrinsic; + cb.intrinsicNew = colorIntrinsic; + cb.width = input.getWidth(); + cb.height = input.getHeight(); + cb.widthNew = colorWidth; + cb.heightNew = colorHeight; + cb.depthThreshLin = 0.05f; // additional discontinuity threshold per meter + cb.depthThreshOffset = 0.01f; // discontinuity offset in meter + m_constantBuffer.update(cb); + + D3D11Buffer depthGPU; + std::vector inputVec(input.getWidth()*input.getHeight()); + for (size_t i = 0; i < inputVec.size(); i++) inputVec[i] = input.getData()[i]; + depthGPU.init(*m_graphics, inputVec); + + D3D11RenderTarget renderTarget; + renderTarget.init(m_graphics->castD3D11(), input.getWidth(), input.getHeight(), std::vector < DXGI_FORMAT > {DXGI_FORMAT_R8G8B8A8_UNORM}, true); + renderTarget.clear(); + renderTarget.bind(); + + ID3D11DeviceContext& context = m_graphics->castD3D11().getContext(); + + context.IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST); + context.IASetInputLayout(NULL); + unsigned int stride = 0; + unsigned int offset = 0; + context.IASetVertexBuffers(0, 0, NULL, &stride, &offset); + + m_shaderManager.bindShaders("aligner"); + depthGPU.bindSRV(0); + m_constantBuffer.bind(0); + + m_graphics->castD3D11().setCullMode(D3D11_CULL_NONE); + unsigned int numQuads = input.getWidth()*input.getHeight(); + context.Draw(numQuads, 0); + + + //! reset the state + m_shaderManager.unbindShaders(); + depthGPU.unbindSRV(0); + + renderTarget.unbind(); + + DepthImage32 res; + res.setInvalidValue(input.getInvalidValue()); + renderTarget.captureDepthBuffer(res); + for (auto& r : res) { + if (r.value == 1.0f) r.value = res.getInvalidValue(); + else r.value = kinectProjZToCamera(r.value); + } + + context.Flush(); + + return res; + } + + //projects a depth image into color space (debug version with aliasing) + static DepthImage32 depthToColorDebug(const DepthImage32& input, const mat4f& depthIntrinsic, const mat4f& depthExtrinsic, const mat4f& colorIntrinsic, unsigned int colorWidth, unsigned int colorHeight) { + + mat4f depthIntrinsicInv = depthIntrinsic.getInverse(); + + float scalarWidth = (float)(input.getWidth()-1) / (float)(colorWidth-1); + float scalarHeight = (float)(input.getHeight()-1) / (float)(colorHeight-1); + + DepthImage32 res(input.getWidth(), input.getHeight()); + res.setInvalidValue(input.getInvalidValue()); + res.setPixels(input.getInvalidValue()); + + for (auto& o : input) { + float d = o.value; + if (d != res.getInvalidValue()) { + vec3f p = depthIntrinsicInv*vec3f((float)o.x*d, (float)o.y*d, d); //back-project to camera space + p = depthExtrinsic * p; //project to color frame + vec3f colorCoord = colorIntrinsic * p; //project to color image space + colorCoord.x /= colorCoord.z; colorCoord.y /= colorCoord.z; + vec2i colorCoordi = math::round(colorCoord); //use that to get color values + colorCoordi.x = math::round(colorCoord.x * scalarWidth); + colorCoordi.y = math::round(colorCoord.y * scalarHeight); + + if (colorCoordi.x >= 0 && colorCoordi.x < (int)res.getWidth() && colorCoordi.y >= 0 && colorCoordi.y < (int)res.getHeight()) { + res(colorCoordi.x, colorCoordi.y) = colorCoord.z; + } + } + } + return res; + } +private: +#define DEPTH_WORLD_MIN 0.1f +#define DEPTH_WORLD_MAX 10.0f + + float cameraToKinectProjZ(float z) + { + return (z - DEPTH_WORLD_MIN) / (DEPTH_WORLD_MAX - DEPTH_WORLD_MIN); + } + + float kinectProjZToCamera(float z) + { + return DEPTH_WORLD_MIN + z*(DEPTH_WORLD_MAX - DEPTH_WORLD_MIN); + } + + GraphicsDevice* m_graphics; + D3D11ShaderManager m_shaderManager; + + struct CB { + mat4f intrinsicInverse; + mat4f intrinsicNew; + mat4f extrinsic; + unsigned int width; + unsigned int height; + unsigned int widthNew; + unsigned int heightNew; + float depthThreshOffset; + float depthThreshLin; + vec2f dummy; + }; + D3D11ConstantBuffer m_constantBuffer; + +}; \ No newline at end of file diff --git a/Calibrate/src/calibration.h b/Calibrate/src/calibration.h new file mode 100644 index 0000000..8f14d93 --- /dev/null +++ b/Calibrate/src/calibration.h @@ -0,0 +1,311 @@ +#pragma once + +#include "stdafx.h" +#include "grid3d.h" + +#include "aligner.h" + +#include "omp.h" + +class Calib { +public: + Calib(const std::string& str) { + reset(); + readFromFile(str); + } + ~Calib() { + } + + void readFromFile(const std::string& str) { + ParameterFile parameterFile(str); + + reset(); + + parameterFile.readParameter("colorWidth", color_width); + parameterFile.readParameter("colorHeight", color_height); + parameterFile.readParameter("fx_color", color_intrinsic(0, 0)); + parameterFile.readParameter("fy_color", color_intrinsic(1, 1)); + parameterFile.readParameter("mx_color", color_intrinsic(0, 2)); + parameterFile.readParameter("my_color", color_intrinsic(1, 2)); + parameterFile.readParameter("k1_color", color_dist_coeff[0]); + parameterFile.readParameter("k2_color", color_dist_coeff[1]); + parameterFile.readParameter("k3_color", color_dist_coeff[2]); + parameterFile.readParameter("k4_color", color_dist_coeff[3]); + parameterFile.readParameter("k5_color", color_dist_coeff[4]); + + parameterFile.readParameter("depthWidth", depth_width); + parameterFile.readParameter("depthHeight", depth_height); + parameterFile.readParameter("fx_depth", depth_intrinsic(0, 0)); + parameterFile.readParameter("fy_depth", depth_intrinsic(1, 1)); + parameterFile.readParameter("mx_depth", depth_intrinsic(0, 2)); + parameterFile.readParameter("my_depth", depth_intrinsic(1, 2)); + parameterFile.readParameter("k1_depth", depth_dist_coeff[0]); + parameterFile.readParameter("k2_depth", depth_dist_coeff[1]); + parameterFile.readParameter("k3_depth", depth_dist_coeff[2]); + parameterFile.readParameter("k4_depth", depth_dist_coeff[3]); + parameterFile.readParameter("k5_depth", depth_dist_coeff[4]); + + parameterFile.readParameter("depthToColorExtrinsics", depth_extrinsic); + } + + unsigned int color_width, color_height; + mat4f color_extrinsic; + mat4f color_intrinsic; + float color_dist_coeff[5]; + + unsigned int depth_width, depth_height; + mat4f depth_intrinsic; + mat4f depth_extrinsic; //depth-to-color map; + float depth_dist_coeff[5]; + +private: + void reset() + { + color_extrinsic.setIdentity(); + color_intrinsic.setIdentity(); + memset(color_dist_coeff, 0, sizeof(float) * 5); + depth_extrinsic.setIdentity(); + depth_intrinsic.setIdentity(); + memset(depth_dist_coeff, 0, sizeof(float) * 5); + } + +}; + +// "Public" interface +class Calibration +{ +public: + Calibration() { + m_graphics = new D3D11GraphicsDevice(); + m_graphics->initWithoutWindow(); + } + ~Calibration() { + SAFE_DELETE(m_graphics); + } + + + void Calibration::calibrateScan(const std::string& inSensFilename, const std::string &outSensFilename, const std::string& parametersFilename, const std::string& undistortTableFilename) + { + if (!util::fileExists(inSensFilename)) { + if (util::fileExists(outSensFilename)) { + std::cout << "output sens file " << outSensFilename << " already exists, skipping" << std::endl; + return; + } + else { + throw MLIB_EXCEPTION("no sens file: " + inSensFilename); + } + } + if (!util::fileExists(parametersFilename) || !util::fileExists(undistortTableFilename)) throw MLIB_EXCEPTION("no calibration param file(s): " + parametersFilename + " / " + undistortTableFilename); + + // Read in lookup table + Grid3D undistortTable(undistortTableFilename); + + + // Read in parameters + Calib cd(parametersFilename); + + // Read in sens file + std::cout << "loading .sens file " << inSensFilename << "... "; + SensorData sd(inSensFilename); + std::cout << "done!" << std::endl; + + if (sd.m_calibrationDepth.m_extrinsic == mat4f::identity()) { + if (inSensFilename != outSensFilename) util::moveFile(inSensFilename, outSensFilename); + std::cout << "color and depth is already aligned -- cannot further calibrate .sens file -> exiting" << std::endl; + return; + } + + calibrateScan(sd, cd, undistortTable); + + // Updating .sens file meta data + sd.m_sensorName = sd.m_sensorName + " (calibrated)"; + sd.m_calibrationColor.m_extrinsic.setIdentity(); + sd.m_calibrationColor.m_intrinsic = cd.color_intrinsic; + sd.m_calibrationDepth.m_extrinsic.setIdentity(); + sd.m_calibrationDepth.m_intrinsic = sd.m_calibrationColor.m_intrinsic; + + sd.m_calibrationDepth.m_intrinsic(0, 0) *= (float)sd.m_depthWidth / (float)sd.m_colorWidth; + sd.m_calibrationDepth.m_intrinsic(1, 1) *= (float)sd.m_depthHeight / (float)sd.m_colorHeight; + sd.m_calibrationDepth.m_intrinsic(0, 2) *= (float)(sd.m_depthWidth - 1) / (float)(sd.m_colorWidth - 1); + sd.m_calibrationDepth.m_intrinsic(1, 2) *= (float)(sd.m_depthHeight - 1) / (float)(sd.m_colorHeight - 1); + + + // write sens file + std::cout << "saving .sens file " << outSensFilename << "... "; + sd.saveToFile(outSensFilename); + if (inSensFilename != outSensFilename) util::deleteFile(inSensFilename); + std::cout << "done!" << std::endl; + } + +private: + + DepthImage32 depthToColor(const DepthImage32& input, const Calib& cb) { + DepthImage32 res; +#pragma omp critical + { + Aligner aligner(*m_graphics); + res = aligner.depthToColor(input, cb.depth_intrinsic, cb.depth_extrinsic, cb.color_intrinsic, cb.color_width, cb.color_height); + } + return res; + } + + //projects a depth image into color space + DepthImage32 depthToColorDebug(const DepthImage32& input, const Calib& cb) { + + mat4f depthIntrinsicInv = cb.depth_intrinsic.getInverse(); + const mat4f& extrinsic = cb.depth_extrinsic; + const mat4f& colorIntrinsic = cb.color_intrinsic; + + float scalarWidth = (float)(input.getWidth()-1) / (float)(cb.color_width-1); + float scalarHeight = (float)(input.getHeight()-1) / (float)(cb.color_height-1); + + DepthImage32 res(input.getWidth(), input.getHeight()); + res.setInvalidValue(input.getInvalidValue()); + res.setPixels(input.getInvalidValue()); + + for (auto& o : input) { + float d = o.value; + if (d != res.getInvalidValue()) { + vec3f p = depthIntrinsicInv*vec3f((float)o.x*d, (float)o.y*d, d); //back-project to camera space + p = extrinsic * p; //project to color frame + vec3f colorCoord = colorIntrinsic * p; //project to color image space + colorCoord.x /= colorCoord.z; colorCoord.y /= colorCoord.z; + vec2i colorCoordi = math::round(colorCoord); //use that to get color values + colorCoordi.x = math::round(colorCoord.x * scalarWidth); + colorCoordi.y = math::round(colorCoord.y * scalarHeight); + + if (colorCoordi.x >= 0 && colorCoordi.x < (int)res.getWidth() && colorCoordi.y >= 0 && colorCoordi.y < (int)res.getHeight()) { + res(colorCoordi.x, colorCoordi.y) = colorCoord.z; + } + } + } + return res; + } + + template BaseImage undistort(const BaseImage& src, const mat4f& intrinsic, const float coeff[5]) + { + BaseImage res(src.getWidth(), src.getHeight()); + res.setInvalidValue(src.getInvalidValue()); + res.setPixels(res.getInvalidValue()); + + for (unsigned int y = 0; y < src.getHeight(); y++) { + for (unsigned int x = 0; x < src.getWidth(); x++) { + vec2f nic_loc; + vec2f sample_loc; + + //Normalized image coords + nic_loc.x = (x - intrinsic(0, 2)) / intrinsic(0, 0); + nic_loc.y = (y - intrinsic(1, 2)) / intrinsic(1, 1); + + float r2 = nic_loc.x * nic_loc.x + nic_loc.y * nic_loc.y; + + // Radial distortion + sample_loc.x = nic_loc.x * (1.0f + r2 * coeff[0] + r2*r2 * coeff[1] + r2*r2*r2 * coeff[4]); + sample_loc.y = nic_loc.y * (1.0f + r2 * coeff[0] + r2*r2 * coeff[1] + r2*r2*r2 * coeff[4]); + + // Tangential distortion + sample_loc.x += 2.0f * coeff[2] * nic_loc.x * nic_loc.y + coeff[3] * (r2 + 2.0f * nic_loc.x * nic_loc.x); + sample_loc.y += coeff[2] * (r2 + 2.0f * nic_loc.y * nic_loc.y) + 2.0f * coeff[3] * nic_loc.x * nic_loc.y; + + // Move back to the image space + sample_loc.x = sample_loc.x * intrinsic(0, 0) + intrinsic(0, 2); + sample_loc.y = sample_loc.y * intrinsic(1, 1) + intrinsic(1, 2); + + //TODO CONTINUE HERE + vec2i sample_loc_i = math::round(sample_loc); + if (src.isValidCoordinate(sample_loc_i)) { + res(x, y) = src(sample_loc_i); + } + } + } + return res; + } + + + void undistortDistance(unsigned short * depthData, const SensorData &sd, const Grid3D& undistortTable) { + + // Prepare storage + // Useful vars + int w = sd.m_depthWidth; + int h = sd.m_depthHeight; + int nSlices = undistortTable.ZRes(); + float xBin = (float)(w / undistortTable.XRes()); + float yBin = (float)(h / undistortTable.YRes()); + float zBin = undistortTable.ZRes() / undistortTable.MaxDist(); + float depthShift = sd.m_depthShift; + + for (int j = 0; j < h; ++j) + { + for (int i = 0; i < w; ++i) + { + float depth = depthData[j * w + i] / depthShift; + float zIdx = std::min((float)depth * zBin, (float)nSlices - 1.0f); + + float multiplier = 1.0f / undistortTable.GetValue((float)i / xBin, (float)j / yBin, zIdx); + float newDepth = depth * multiplier; + depthData[j*w + i] = (unsigned short)(newDepth * depthShift); + + } + } + } + + + void calibrateScan(SensorData& sd, const Calib& cd, const Grid3D& undistortTable) { + if (cd.depth_width != sd.m_depthWidth || cd.depth_height != sd.m_depthHeight) throw MLIB_EXCEPTION("image dimensions do not match with calibration"); + +#pragma omp parallel for + for (int i = 0; i < (int)sd.m_frames.size(); i ++) { + auto& f = sd.m_frames[i]; + if (omp_get_thread_num() == 0) { + std::cout << "\rcalibrateScan frame [ " << i*omp_get_num_threads() << " | " << sd.m_frames.size() << " ] "; + } + + // apply un-distortion to color + vec3uc* color = sd.decompressColorAlloc(f); + ColorImageR8G8B8 c(sd.m_colorWidth, sd.m_colorHeight, color); + c.setInvalidValue(vec3uc(0, 0, 0)); + c = undistort(c, cd.color_intrinsic, cd.color_dist_coeff); + std::free(color); + sd.replaceColor(f, c.getData()); + + + unsigned short* depth = sd.decompressDepthAlloc(f); + undistortDistance(depth, sd, undistortTable); // apply un-distortion based on distance + DepthImage32 d(sd.m_depthWidth, sd.m_depthHeight); + d.setInvalidValue(0.0f); + for (auto& v : d) { + unsigned int idx = v.y*sd.m_depthWidth + v.x; + v.value = (float)depth[idx] / sd.m_depthShift; + } + + // apply barell un-distortion to depth + d = (DepthImage32)Calibration::undistort(d, cd.depth_intrinsic, cd.depth_dist_coeff); + // align depth to color + d = Calibration::depthToColor(d, cd); + + // invalidate depth where we have no color + float scalarWidth = (float)(d.getWidth()-1) / (float)(sd.m_colorWidth-1); + float scalarHeight = (float)(d.getHeight()-1) / (float)(sd.m_colorHeight-1); + + for (auto& v : d) { + int x = math::round(v.x / scalarWidth); + int y = math::round(v.y / scalarHeight); + if (c(x,y) == vec3uc(0, 0, 0)) { + v.value = d.getInvalidValue(); + } + } + + // convert back to u16 + for (auto& v : d) { + unsigned int idx = v.y*(size_t)sd.m_depthWidth + v.x; + depth[idx] = math::round(v.value * sd.m_depthShift); + } + sd.replaceDepth(f, depth); + + std::free(depth); + } + std::cout << std::endl; + } + + D3D11GraphicsDevice* m_graphics; +}; \ No newline at end of file diff --git a/Calibrate/src/grid3d.cpp b/Calibrate/src/grid3d.cpp new file mode 100644 index 0000000..938838b --- /dev/null +++ b/Calibrate/src/grid3d.cpp @@ -0,0 +1,437 @@ +#include "stdafx.h" +#include "grid3d.h" + +Grid3D:: +Grid3D() +{ + m_xRes = -1; + m_yRes = -1; + m_zRes = -1; + m_maxDist = -1; + + m_data = nullptr; +} + +Grid3D:: +Grid3D(int xRes, int yRes, int zRes, float maxDist) +{ + m_xRes = xRes; + m_yRes = yRes; + m_zRes = zRes; + m_maxDist = maxDist; + + int nElements = NElements(); + m_data = new float[nElements]; + for (int i = 0; i < nElements; ++i) + { + m_data[i] = 0.0f; + } +} + +Grid3D:: +Grid3D(const Grid3D &other) +{ + m_xRes = other.XRes(); + m_yRes = other.YRes(); + m_zRes = other.ZRes(); + m_maxDist = other.MaxDist(); + + int nElements = NElements(); + m_data = new float[nElements]; + for (int i = 0; i < nElements; ++i) + { + m_data[i] = other.GetValue(i); + } +} + +Grid3D:: +Grid3D(const std::string &filename) +{ + ReadFile(filename); +} + +Grid3D:: +~Grid3D() +{ + if (m_data != nullptr) + { + delete [] m_data; + m_data = nullptr; + } + m_xRes = -1; + m_yRes = -1; + m_zRes = -1; + m_maxDist = -1; +} + +int Grid3D:: +ToIndex(int x, int y, int z) const +{ + return (z * m_xRes * m_yRes) + (y * m_xRes) + x; +} + +int Grid3D:: +XRes() const +{ + return m_xRes; +} + +int Grid3D:: +YRes() const +{ + return m_yRes; +} + +int Grid3D:: +ZRes() const +{ + return m_zRes; +} + +int Grid3D:: +NElements() const +{ + return m_xRes * m_yRes * m_zRes; +} + +float Grid3D:: +MaxDist() const +{ + return m_maxDist; +} + +float Grid3D:: +GetValue(int i) const +{ + assert(i >= 0 && i < NElements()); + return m_data[i]; +} + +float Grid3D:: +GetValue(int x, int y, int z) const +{ + assert(x >= 0 && x < m_xRes); + assert(y >= 0 && y < m_yRes); + assert(z >= 0 && z < m_zRes); + return m_data[ToIndex(x, y, z)]; +} + +float Grid3D:: +GetValue(float x, float y, float z) const +{ + assert(x >= 0 && x < m_xRes); + assert(y >= 0 && y < m_yRes); + assert(z >= 0 && z < m_zRes); + + int x1 = (int) x; + int y1 = (int) y; + int z1 = (int) z; + int x2 = x1 + 1; + int y2 = y1 + 1; + int z2 = z1 + 1; + if (x2 >= m_xRes) x2 = x1; + if (y2 >= m_yRes) y2 = y1; + if (z2 >= m_zRes) z2 = z1; + float dx = x - x1; + float dy = y - y1; + float dz = z - z1; + + float value = 0.0f; + value += GetValue(x1, y1, z1) * (1.0f - dx) * (1.0f - dy) * (1.0f - dz); + value += GetValue(x1, y1, z2) * (1.0f - dx) * (1.0f - dy) * dz; + value += GetValue(x1, y2, z1) * (1.0f - dx) * dy * (1.0f - dz); + value += GetValue(x1, y2, z2) * (1.0f - dx) * dy * dz; + + value += GetValue(x2, y1, z1) * dx * (1.0f - dy) * (1.0f - dz); + value += GetValue(x2, y1, z2) * dx * (1.0f - dy) * dz; + value += GetValue(x2, y2, z1) * dx * dy * (1.0f - dz); + value += GetValue(x2, y2, z2) * dx * dy * dz; + + return value; +} + +void Grid3D:: +SetValue(int i, float val) +{ + assert(i >= 0 && i < NElements()); + + m_data[i] = val; +} + +void Grid3D:: +SetValue(int x, int y, int z, float val) +{ + assert(x >= 0 && x < m_xRes); + assert(y >= 0 && y < m_yRes); + assert(z >= 0 && z < m_zRes); + + m_data[ToIndex(x, y, z)] = val; +} + +void Grid3D:: +Add(const float val) +{ + int nElements = NElements(); + for (int i = 0; i < nElements; ++i) + { + if (m_data[i] != GRID3D_UNKNOWN_VALUE) + m_data[i] += val; + } +} + +void Grid3D:: +Add(int x, int y, int z, float val) +{ + assert(x >= 0 && x < m_xRes); + assert(y >= 0 && y < m_yRes); + assert(z >= 0 && z < m_zRes); + int i = ToIndex(x, y, z); + if (m_data[i] != GRID3D_UNKNOWN_VALUE) + { + m_data[i] += val; + } +} + +void Grid3D:: +Add(const Grid3D &other) +{ + assert(other.XRes() == m_xRes); + assert(other.YRes() == m_yRes); + assert(other.ZRes() == m_zRes); + + int nElements = NElements(); + for (int i = 0; i < nElements; ++i) + { + if (m_data[i] != GRID3D_UNKNOWN_VALUE && + other.GetValue(i) != GRID3D_UNKNOWN_VALUE) + { + m_data[i] += other.GetValue(i); + } + } +} + +void Grid3D:: +Multiply(const float val) +{ + int nElements = NElements(); + for (int i = 0; i < nElements; ++i) + { + if (m_data[i] != GRID3D_UNKNOWN_VALUE) + { + m_data[i] *= val; + } + } +} + +void Grid3D:: +Multiply(int x, int y, int z, float val) +{ + assert(x >= 0 && x < m_xRes); + assert(y >= 0 && y < m_yRes); + assert(z >= 0 && z < m_zRes); + int i = ToIndex(x, y, z); + if (m_data[i] != GRID3D_UNKNOWN_VALUE) + { + m_data[i] *= val; + } +} + +void Grid3D:: +Multiply(const Grid3D &other) +{ + assert(other.XRes() == m_xRes); + assert(other.YRes() == m_yRes); + assert(other.ZRes() == m_zRes); + + int nElements = NElements(); + for (int i = 0; i < nElements; ++i) + { + if (m_data[i] != GRID3D_UNKNOWN_VALUE && + other.GetValue(i) != GRID3D_UNKNOWN_VALUE) + { + m_data[i] *= other.GetValue(i); + } + } +} + +void Grid3D:: +Divide(const float val) +{ + if (val == 0.0f) return; + + int nElements = NElements(); + for (int i = 0; i < nElements; ++i) + { + if (m_data[i] != GRID3D_UNKNOWN_VALUE) + { + m_data[i] /= val; + } + } +} + +void Grid3D:: +Divide(int x, int y, int z, float val) +{ + if (val == 0.0f) return; + assert(x >= 0 && x < m_xRes); + assert(y >= 0 && y < m_yRes); + assert(z >= 0 && z < m_zRes); + + int i = ToIndex(x, y, z); + if (m_data[i] != GRID3D_UNKNOWN_VALUE) + { + m_data[i] /= val; + } +} + +void Grid3D:: +Divide(const Grid3D &other) +{ + assert(other.XRes() == m_xRes); + assert(other.YRes() == m_yRes); + assert(other.ZRes() == m_zRes); + + int nElements = NElements(); + for (int i = 0; i < nElements; ++i) + { + if (other.GetValue(i) == 0.0f) // dont divide by zero. + { + m_data[i] = GRID3D_UNKNOWN_VALUE; + continue; + } + + if (m_data[i] != GRID3D_UNKNOWN_VALUE && + other.GetValue(i) != GRID3D_UNKNOWN_VALUE) + { + m_data[i] /= other.GetValue(i); + } + } +} + +void Grid3D:: +InvertElements() +{ + int nElements = NElements(); + for (int i = 0; i < nElements; ++i) + { + if (m_data[i] == 0.0f) // dont divide by zero. + { + m_data[i] = GRID3D_UNKNOWN_VALUE; + continue; + } + + if (m_data[i] != GRID3D_UNKNOWN_VALUE) + { + m_data[i] = 1.0f / m_data[i]; + } + } +} + +float Grid3D:: +Min() const +{ + float min = 1e9; + int nElements = NElements(); + for (int i = 0; i < nElements; ++i) + { + if (m_data[i] != GRID3D_UNKNOWN_VALUE && + m_data[i] < min) + { + min = m_data[i]; + } + } + return min; +} + +float Grid3D:: +Max() const +{ + float max = -1e9; + int nElements = NElements(); + for (int i = 0; i < nElements; ++i) + { + if (m_data[i] != GRID3D_UNKNOWN_VALUE && + m_data[i] > max) + { + max = m_data[i]; + } + } + return max; +} + +int Grid3D:: +ReadFile(const std::string &filename) +{ + // clear old data + if (m_data != nullptr) + { + delete [] m_data; + m_data = nullptr; + } + + // open file + FILE * fp = fopen(filename.c_str(), "rb"); + if (!fp) + { + printf("Could not open file %s for reading!\n", filename.c_str()); + fflush(stdout); + return 0; + } + + // read in header + int res[3]; + if (fread(res, sizeof(int), 3, fp) != 3) { + printf("Unable to read resolution from file %s\n", filename.c_str()); + return 0; + } + m_xRes = res[0]; + m_yRes = res[1]; + m_zRes = res[2]; + + if (fread(&m_maxDist, sizeof(float), 1, fp) != 1) { + printf("Unable to read max. distance from file %s\n", filename.c_str()); + return 0; + } + + // allocate and read data + int nElements = NElements(); + m_data = new float[nElements]; + if (fread(&(m_data[0]), sizeof(float), nElements, fp) != nElements) { + printf("Unable to read grid values from file %s\n", filename.c_str()); + return 0; + } + + return -1; +} + +int Grid3D:: +WriteFile(const std::string &filename) const +{ + FILE * fp = fopen(filename.c_str(), "wb"); + if (!fp) + { + printf("Could not open file %s for writing!\n", filename.c_str()); + return 0; + } + + if (fwrite(&m_xRes, sizeof(int), 3, fp) != 3) { + printf("Unable to write resolution to file %s\n", filename.c_str()); + return 0; + } + + if (fwrite(&m_maxDist, sizeof(float), 1, fp) != 1) { + printf("Unable to write maximum distance to file %s\n", filename.c_str()); + return 0; + } + + const int nElements = NElements(); + int test = (int)fwrite(&(m_data[0]), sizeof(float), nElements, fp); + if (test != nElements) { + printf("Unable to write grid values to file %s\n", filename.c_str()); + return 0; + } + + fclose(fp); + + return 1; +} \ No newline at end of file diff --git a/Calibrate/src/grid3d.h b/Calibrate/src/grid3d.h new file mode 100644 index 0000000..cd3309c --- /dev/null +++ b/Calibrate/src/grid3d.h @@ -0,0 +1,55 @@ +#pragma once + +#define GRID3D_UNKNOWN_VALUE -321 + +class Grid3D +{ +public: + Grid3D(); + Grid3D(int xRes, int yRes, int zRes, float maxDist); + Grid3D(const Grid3D &other); + Grid3D(const std::string &filename); + ~Grid3D(); + + int XRes() const; + int YRes() const; + int ZRes() const; + int NElements() const; + float MaxDist() const; + + float GetValue(int i) const; + float GetValue(int x, int y, int z) const; + float GetValue(float x, float y, float z) const; + void SetValue(int i, float val); + void SetValue(int x, int y, int z, float val); + + void Add(const float val); + void Add(int x, int y, int z, float val); + void Add(const Grid3D &other); + + void Multiply(const float val); + void Multiply(int x, int y, int z, float val); + void Multiply(const Grid3D &other); + + void Divide(const float val); + void Divide(int x, int y, int z, float val); + void Divide(const Grid3D &other); + + float Min() const; + float Max() const; + + void InvertElements(); + + int ReadFile(const std::string &filename); + int WriteFile(const std::string &filename) const; + +private: + int m_xRes; + int m_yRes; + int m_zRes; + float m_maxDist; + + float * m_data; + + int ToIndex(int x, int y, int z) const; +}; diff --git a/Calibrate/src/mLibInclude.h b/Calibrate/src/mLibInclude.h new file mode 100644 index 0000000..ddc5706 --- /dev/null +++ b/Calibrate/src/mLibInclude.h @@ -0,0 +1,20 @@ +#ifndef _MLIB_INCLUDE_H_ +#define _MLIB_INCLUDE_H_ + + +#include "mLibCore.h" +#include "mLibLodePNG.h" + +#include "mLibD3D11.h" +#include "mLibD3D11Font.h" + +#include "mLibFreeImage.h" +#include "mLibDepthCamera.h" + +#include "mLibZLib.h" + + + +using namespace ml; + +#endif \ No newline at end of file diff --git a/Calibrate/src/mLibSource.cpp b/Calibrate/src/mLibSource.cpp new file mode 100644 index 0000000..05f5606 --- /dev/null +++ b/Calibrate/src/mLibSource.cpp @@ -0,0 +1,8 @@ + +#include "stdafx.h" + +#include "mLibCore.cpp" +#include "mLibD3D11.cpp" +#include "mLibLodePNG.cpp" +#include "mLibDepthCamera.cpp" +#include "mLibZLib.cpp" \ No newline at end of file diff --git a/Calibrate/src/main.cpp b/Calibrate/src/main.cpp new file mode 100644 index 0000000..02f3cb7 --- /dev/null +++ b/Calibrate/src/main.cpp @@ -0,0 +1,80 @@ + +#include "stdafx.h" + +#include "main.h" +#include "calibration.h" +#include "aligner.h" + +std::string getCalibrationNameFromMap(const std::string& deviceCalibrationMapCsv, std::string scanDirectory) { + if (!util::directoryExists(scanDirectory)) throw MLIB_EXCEPTION(scanDirectory + " does not exist!"); + scanDirectory = util::replace(scanDirectory, '\\', '/'); + if (scanDirectory.back() == '/') scanDirectory.pop_back(); + const std::string scanMetaFile = scanDirectory + "/" + util::split(scanDirectory, '/').back() + ".txt"; + if (!util::fileExists(scanMetaFile)) return ""; + ParameterFile pf(scanMetaFile); std::string deviceId; + if (!pf.readParameter("deviceId", deviceId)) throw MLIB_EXCEPTION("no device id in meta file: " + scanMetaFile); + + std::unordered_map deviceIdToCalibrationName; + const std::string deviceIdHeader = "id", calibNameHeader = "calibration_name"; + unsigned int deviceIdIndex = (unsigned int)-1, calibNameIndex = (unsigned int)-1; + std::ifstream s(deviceCalibrationMapCsv); + //read header + std::string line; + if (!std::getline(s, line)) throw MLIB_EXCEPTION("failed to read device calibration map csv: " + deviceCalibrationMapCsv); + const auto headers = util::split(line, ','); + for (unsigned int i = 0; i < headers.size(); i++) { + if (headers[i] == deviceIdHeader) deviceIdIndex = i; + if (headers[i] == calibNameHeader) calibNameIndex = i; + } + if (deviceIdIndex == (unsigned int)-1 || calibNameIndex == (unsigned int)-1) throw MLIB_EXCEPTION("unable to find device id/calibration name in device calibration map cs file: " + deviceCalibrationMapCsv); + //find our device id + while (std::getline(s, line)) { + const auto elements = util::split(line, ',', true); //include empty strings + if (elements[deviceIdIndex] == deviceId) { + std::cout << "\tdevice id: " << deviceId << ", calibration name: " << elements[calibNameIndex] << std::endl; + return elements[calibNameIndex]; + } + } + s.close(); + + return ""; //nothing found +} + + +int main(int argc, char* argv[]) +{ + try { + if (argc == 5) { //converts a specific scan given by the command line arguments ( input_sens_file, output_sens_file, device_calibration_map, device_calibration_directory ) + const std::string inputSensFilename(argv[1]); + const std::string outputSensFilename(argv[2]); + const std::string deviceCalibrationMapFile(argv[3]); + std::string deviceCalibrationDir(argv[4]); + if (!(deviceCalibrationDir.back() == '/' || deviceCalibrationDir.back() == '\\')) deviceCalibrationDir.push_back('/'); + + const std::string calibrationName = getCalibrationNameFromMap(deviceCalibrationMapFile, util::directoryFromPath(inputSensFilename)); + if (!calibrationName.empty()) { + Calibration cb; + cb.calibrateScan(inputSensFilename, outputSensFilename, + deviceCalibrationDir + calibrationName + ".txt", deviceCalibrationDir + calibrationName + ".lut"); + } + else std::cout << "no calibration name found" << std::endl; + } + else { + throw MLIB_EXCEPTION("requires the input sens filepath, output sens filepath, parameter file, and input undistortion table as a command line arguments"); + } + } + catch (const std::exception& e) + { + MessageBoxA(NULL, e.what(), "Exception caught", MB_ICONERROR); + exit(EXIT_FAILURE); + } + catch (...) + { + MessageBoxA(NULL, "UNKNOWN EXCEPTION", "Exception caught", MB_ICONERROR); + exit(EXIT_FAILURE); + } + + return 0; +} + + diff --git a/Calibrate/src/main.h b/Calibrate/src/main.h new file mode 100644 index 0000000..9e593e5 --- /dev/null +++ b/Calibrate/src/main.h @@ -0,0 +1,9 @@ + +#include +#include +#include +#include +#include +#include + +#include "stdafx.h" diff --git a/Calibrate/src/processedFile.h b/Calibrate/src/processedFile.h new file mode 100644 index 0000000..3930691 --- /dev/null +++ b/Calibrate/src/processedFile.h @@ -0,0 +1,87 @@ +#pragma once + + +#include "mLibInclude.h" + +#define X_PROCESSED_FILE_STATE_FIELDS \ + X(bool, valid) \ + X(unsigned int, heapFreeCount) \ + X(unsigned int, numValidOptTransforms) \ + X(unsigned int, numTransforms) \ + X(bool, aligned) + + +#ifndef VAR_NAME +#define VAR_NAME(x) #x +#endif + +#define checkSizeArray(a, d)( (((sizeof a)/(sizeof a[0])) >= d)) + +class ProcessedFile +{ +public: + +#define X(type, name) type name; + X_PROCESSED_FILE_STATE_FIELDS +#undef X + + //! sets the parameter file and reads + void readMembers(const ParameterFile& parameterFile) { + m_ParameterFile = parameterFile; + readMembers(); + } + + //! reads all the members from the given parameter file (could be called for reloading) + void readMembers() { + aligned = false; + +#define X(type, name) \ + if (!m_ParameterFile.readParameter(std::string(#name), name) && std::string(#name) != "aligned") {MLIB_WARNING(std::string(#name).append(" ").append("uninitialized")); name = type();} + X_PROCESSED_FILE_STATE_FIELDS +#undef X + + m_bIsInitialized = true; + } + + template + std::string makeString(const T& in) { + std::string ret = std::to_string(in); + return ret; + } + template <> + std::string makeString(const bool& in) { + if (in == true) return "true"; + else return "false"; + } + + void saveToFile(const std::string& outFile) { + std::ofstream out(outFile); +#define X(type, name) \ + { out << #name << " = " << makeString(name) << std::endl; } + X_PROCESSED_FILE_STATE_FIELDS +#undef X + } + + void print() const { +#define X(type, name) \ + std::cout << #name " = " << name << std::endl; + X_PROCESSED_FILE_STATE_FIELDS +#undef X + } + + + //! constructor + ProcessedFile() { + m_bIsInitialized = false; + } + + //! destructor + ~ProcessedFile() { + } + + +private: + bool m_bIsInitialized; + ParameterFile m_ParameterFile; +}; + diff --git a/Calibrate/src/stdafx.cpp b/Calibrate/src/stdafx.cpp new file mode 100644 index 0000000..3f38672 --- /dev/null +++ b/Calibrate/src/stdafx.cpp @@ -0,0 +1,11 @@ +// stdafx.cpp : source file that includes just the standard includes +// VirtualScan.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#pragma warning (disable : 4996) + +#include "stdafx.h" + +#include "mLibSource.cpp" +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/Calibrate/src/stdafx.h b/Calibrate/src/stdafx.h new file mode 100644 index 0000000..7c83918 --- /dev/null +++ b/Calibrate/src/stdafx.h @@ -0,0 +1,16 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include +#include + +// TODO: reference additional headers your program requires here + +#include "WinSock2.h" +#include "windows.h" + +#include "mLibInclude.h" \ No newline at end of file From f6faf68ddcc9157cc7c33fb8de786821a6c2000c Mon Sep 17 00:00:00 2001 From: angeladai Date: Sun, 18 Nov 2018 18:33:28 +0100 Subject: [PATCH 15/41] tools params --- Server/tools/meshclean/clean.mlx | 11 ++ Server/tools/meshclean/cleanLoRes.mlx | 11 ++ Server/tools/meshclean/simplify.mlx | 25 ++++ .../recons/zParametersBundlingScanNet.txt | 76 +++++++++++ Server/tools/recons/zParametersScanNet.txt | 126 ++++++++++++++++++ 5 files changed, 249 insertions(+) create mode 100644 Server/tools/meshclean/clean.mlx create mode 100644 Server/tools/meshclean/cleanLoRes.mlx create mode 100644 Server/tools/meshclean/simplify.mlx create mode 100644 Server/tools/recons/zParametersBundlingScanNet.txt create mode 100644 Server/tools/recons/zParametersScanNet.txt diff --git a/Server/tools/meshclean/clean.mlx b/Server/tools/meshclean/clean.mlx new file mode 100644 index 0000000..55f9fe2 --- /dev/null +++ b/Server/tools/meshclean/clean.mlx @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Server/tools/meshclean/cleanLoRes.mlx b/Server/tools/meshclean/cleanLoRes.mlx new file mode 100644 index 0000000..e5c177a --- /dev/null +++ b/Server/tools/meshclean/cleanLoRes.mlx @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Server/tools/meshclean/simplify.mlx b/Server/tools/meshclean/simplify.mlx new file mode 100644 index 0000000..f48fe2c --- /dev/null +++ b/Server/tools/meshclean/simplify.mlx @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Server/tools/recons/zParametersBundlingScanNet.txt b/Server/tools/recons/zParametersBundlingScanNet.txt new file mode 100644 index 0000000..e4d5625 --- /dev/null +++ b/Server/tools/recons/zParametersBundlingScanNet.txt @@ -0,0 +1,76 @@ + + +s_verbose = true; // output debug statements (invalid frames etc) + +s_erodeSIFTdepth = true; +s_sendUplinkFeedbackImage = true; + +s_recordSolverConvergence = false; + +s_enablePerFrameTimings = true; +s_enableGlobalTimings = false; + +s_widthSIFT = 640; +s_heightSIFT = 480; + +s_minKeyScale = 3.0f;//5.0f; +s_siftMatchThresh = 0.7f;//0.5f; +s_siftMatchRatioMaxLocal = 0.8f; +s_siftMatchRatioMaxGlobal = 0.8f; + +s_optMaxResThresh = 0.12f; //not squared (per axis component) +s_denseDistThresh = 0.15f; +s_denseNormalThresh = 0.95f; +s_denseColorThresh = 0.1f; +s_denseColorGradientMin = 0.005f; +s_denseDepthMin = 0.5f; +s_denseDepthMax = 4.0f;//4.5f; +s_denseOverlapCheckSubsampleFactor = 4; + +s_maxNumImages = 2000; +s_submapSize = 10; +s_maxNumKeysPerImage = 512; +s_maxNumCorrPerImage = 2000; // over-conservative +s_maxNumResidualsRemoved = 10; + +s_useLocalDense = true; +s_numOptPerResidualRemoval = 1; + +s_numLocalNonLinIterations = 2; +s_numLocalLinIterations = 100; +s_numGlobalNonLinIterations = 3; +s_numGlobalLinIterations = 150; + +s_downsampledWidth = 80; +s_downsampledHeight = 60; + + +//dense term filtering +s_colorDownSigma = 2.5f; +s_depthDownSigmaD = 1.0f; +s_depthDownSigmaR = 0.05f; + +s_maxKabschResidual2 = 0.0006f; + +s_projCorrDistThres = 0.15f; +s_projCorrNormalThres = 0.95f; +s_projCorrColorThresh = 0.1f; + +s_verifySiftErrThresh = 0.12f; +s_verifySiftCorrThresh = 0.02f; + +s_useLocalVerify = true; +s_verifyOptErrThresh = 0.05f; +s_verifyOptCorrThresh = 0.001f; + +s_surfAreaPcaThresh = 0.032f; + +s_minNumMatchesLocal = 4; +s_minNumMatchesGlobal = 4; + +// filtering +s_depthSigmaD = 2.0f; //bilateral filter sigma domain +s_depthSigmaR = 0.05f; //bilateral filter sigma range +s_depthFilter = true; //bilateral filter enabled depth + +s_useComprehensiveFrameInvalidation = true; \ No newline at end of file diff --git a/Server/tools/recons/zParametersScanNet.txt b/Server/tools/recons/zParametersScanNet.txt new file mode 100644 index 0000000..45a8649 --- /dev/null +++ b/Server/tools/recons/zParametersScanNet.txt @@ -0,0 +1,126 @@ +// 0=Kinect; 1=PrimeSense; 2=KinectOne; 3=BinaryDumpReader; 4=NetworkSensor; 5=IntelSensor; 6=RealSense; 7=StructureSensor; 8=SensorDataReader +s_sensorIdx = 8; + +s_numSolveFramesBeforeExit = 60; //#frames to run after scan is done before saving ply and exiting; -1 to keep running +s_overwriteOrigSensTrajectory = true; + +s_generateVideo = false; +s_generateVideoDir = "output/"; +s_printTimingsDirectory = ""; +s_printConvergenceFile = ""; +s_topVideoTransformWorld = 1.0f 0.0f 0.0f 0.0f 0.0f 1.0f 0.0f 0.0f 0.0f 0.0f 1.0f 0.0f 0.0f 0.0f 0.0f 1.0f; +s_topVideoCameraPose = 0.0f 0.0f 0.0f 0.0f; //rotation (deg around z axis), translation (m) +s_topVideoMinMax = 0.0f 0.0f; + +s_windowWidth = 640; //render window width +s_windowHeight = 480; //render window height +//s_windowWidth = 1600; //render window width +//s_windowHeight = 1200; //render window height + +s_integrationWidth = 320; //input depth gets re-sampled to this width (decrease to improve perf.) +s_integrationHeight = 240; //input depth gets re-sampled to this height (decrease to improve perf.) +s_rayCastWidth = 320; //should be same as integration except if rendering video +s_rayCastHeight = 240; + +//trajectory manager/reintegration +s_maxFrameFixes = 30; //max number of frames reintegrated per frame +s_topNActive = 30; //max number of active elements to be reintegrated (sorted list) +s_minPoseDistSqrt = 0.0f; //reintegrate everything above that pose distance (squared dist) + +//////////////////////////////////// +// **** DEPTH SENSING BELOW ***** // +//////////////////////////////////// + +s_sensorDepthMax = 6.0f; //maximum sensor depth in meter +s_sensorDepthMin = 0.1f; //minimum sensor depth in meter +s_renderDepthMax = 6.0f; //maximum render depth in meter +s_renderDepthMin = 0.1f; //minimum render depth in meter + +// cropping options for PrimeSense & Asus Xtion Pro +s_enableColorCropping = false; +s_colorCropX = 320; +s_colorCropY = 272; +s_colorCropWidth = 640; +s_colorCropHeight = 480; + +// sdf and hash settings +s_SDFVoxelSize = 0.010f; //voxel size in meter (IMPORTANT: reduces to improve perf.) +s_SDFMarchingCubeThreshFactor = 10.0f; //marching cube thresh: s_SDFMarchingCubeThresh = s_SDFMarchingCubeThreshFactor*s_SDFVoxelSize +s_SDFTruncation = 0.06f; //truncation in meter +s_SDFTruncationScale = 0.02f; //truncation scale in meter per meter +s_SDFMaxIntegrationDistance = 4.0f; //maximum integration in meter +s_SDFIntegrationWeightSample = 1; //weight for an integrated depth value +s_SDFIntegrationWeightMax = 99999999; //maximum integration weight for a voxel +// s_SDFBlockSize is pound defined (SDF_BLOCK_SIZE) +// s_hashBucketSize is pound defined (HASH_BUCKET_SIZE) +s_hashNumBuckets = 800000; //smaller voxels require more space +s_hashNumSDFBlocks = 600000;//100000; //smaller voxels require more space +s_hashMaxCollisionLinkedListSize = 7; + +// raycast +s_SDFRayIncrementFactor = 0.8f; //(don't touch) s_SDFRayIncrement = s_SDFRayIncrementFactor*s_SDFTrunaction; +s_SDFRayThresSampleDistFactor = 50.5f; //(don't touch) s_SDFRayThresSampleDist = s_SDFRayThresSampleDistFactor*s_rayIncrement; +s_SDFRayThresDistFactor = 50.0f; //(don't touch) s_SDFRayThresDist = s_SDFRayThresSampleDistFactor*s_rayIncrement; +s_SDFUseGradients = false; //analytic gradients for rendering + + +s_binaryDumpSensorFile = ""; +s_binaryDumpSensorUseTrajectory = false; + +// filtering (unused in FriedLiver) +s_depthSigmaD = 2.0f; //bilateral filter sigma domain +s_depthSigmaR = 0.1f; //bilateral filter sigma range +s_depthFilter = false; //bilateral filter enabled depth + +s_colorSigmaD = 2.0f; //bilateral filter sigma domain +s_colorSigmaR = 0.1f; //bilateral filter sigma range +s_colorFilter = false; //bilateral filter enabled depth + +s_integrationEnabled = true; +s_trackingEnabled = true; +s_timingsDetailledEnabled = true; //enable timing output +s_timingsTotalEnabled = false; //enable timing output +s_garbageCollectionEnabled = true; +s_garbageCollectionStarve = 0; //decrement the voxel weight every n'th frame + +// rendering +s_materialShininess = 16.0f; +s_materialAmbient = 0.75f 0.65f 0.5f 1.0f; +s_materialDiffuse = 1.0f 0.9f 0.7f 1.0f; +s_materialSpecular = 1.0f 1.0f 1.0f 1.0f; +s_lightAmbient = 0.4f 0.4f 0.4f 1.0f; +s_lightDiffuse = 0.6f 0.52944f 0.4566f 0.6f; +s_lightSpecular = 0.3f 0.3f 0.3f 1.0f; +s_lightDirection = 0.0f -1.0f 2.0f; + +s_RenderMode = 1; +s_playData = true; + +s_renderingDepthDiscontinuityThresOffset = 0.012f; // discontinuity offset in meter +s_renderingDepthDiscontinuityThresLin = 0.001f; // additional discontinuity threshold per meter +s_remappingDepthDiscontinuityThresOffset = 0.012f; // discontinuity offset in meter +s_remappingDepthDiscontinuityThresLin = 0.01f; + +s_bUseCameraCalibration = false; + +s_marchingCubesMaxNumTriangles = 5000000; // max buffer size for marching cube + +//streaming parameters +s_streamingEnabled = false; +s_streamingVoxelExtents = 1.0f 1.0f 1.0f; +s_streamingGridDimensions = 257 257 257; // dimensions have to be odd (number of samples) +s_streamingMinGridPos = -128 -128 -128; +s_streamingInitialChunkListSize = 2000; +s_streamingRadius = 5.0f; // Depends on DepthMin and DepthMax +s_streamingPos = 0.0f 0.0f 3.0f 1.0f; // Depends on DepthMin and DepthMax +s_streamingOutParts = 80; // number of frames required to sweep through the entire hash + +//recording of the input data +s_recordData = false; // master flag for data recording: enables or disables data recording +s_recordCompression = true; //if recoding is enabled; then compression is used (.sens instead of .sensor) +s_recordDataWidth = 640; //only applies to the non compressed version (see RGBDSensor.cpp) +s_recordDataHeight = 480; //only applies to the non compressed version (see RGBDSensor.cpp) +s_recordDataFile = "dump/recording.sens"; +s_reconstructionEnabled = true; + + From fc255fefa3918a21930681ce7c52502a4447c228 Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Sun, 18 Nov 2018 18:34:26 +0100 Subject: [PATCH 16/41] Update README.md --- Converter/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Converter/README.md b/Converter/README.md index 204dcc6..9367517 100644 --- a/Converter/README.md +++ b/Converter/README.md @@ -1,7 +1,7 @@ ## Converter from ScannerApp capture to .sens data =============================================== -Converts raw capture data (`.h264`, `.depth`, `.txt`, `.imu`) from the ScannerApp to `.sens` format. +Converts raw capture data (`.h264`, `.depth`, `.txt`, `.imu`) output from the ScannerApp to `.sens` format. ### Installation. This code was developed under VS2013. @@ -13,4 +13,4 @@ Requirements: To run: -`converter.exe [path to directory of ScannerApp outputs] [name of ScannerApp output to convert]` \ No newline at end of file +`converter.exe [path to directory of ScannerApp outputs] [name of ScannerApp output to convert]` From a7cecc65d772ce4990d6bbddf5b037295b9b99f4 Mon Sep 17 00:00:00 2001 From: angeladai Date: Wed, 21 Nov 2018 09:08:55 +0100 Subject: [PATCH 17/41] add alignment --- Alignment/README.md | 15 ++ Alignment/alignment.sln | 22 ++ Alignment/alignment.vcxproj | 105 ++++++++ Alignment/alignment.vcxproj.filters | 17 ++ Alignment/src/alignment.h | 366 ++++++++++++++++++++++++++++ Alignment/src/globalAppState.h | 72 ++++++ Alignment/src/mLibInclude.h | 16 ++ Alignment/src/mLibSource.cpp | 7 + Alignment/src/main.cpp | 62 +++++ Alignment/src/main.h | 9 + Alignment/src/planeExtract.h | 203 +++++++++++++++ Alignment/src/processedFile.h | 87 +++++++ Alignment/src/stdafx.cpp | 11 + Alignment/src/stdafx.h | 13 + 14 files changed, 1005 insertions(+) create mode 100644 Alignment/README.md create mode 100644 Alignment/alignment.sln create mode 100644 Alignment/alignment.vcxproj create mode 100644 Alignment/alignment.vcxproj.filters create mode 100644 Alignment/src/alignment.h create mode 100644 Alignment/src/globalAppState.h create mode 100644 Alignment/src/mLibInclude.h create mode 100644 Alignment/src/mLibSource.cpp create mode 100644 Alignment/src/main.cpp create mode 100644 Alignment/src/main.h create mode 100644 Alignment/src/planeExtract.h create mode 100644 Alignment/src/processedFile.h create mode 100644 Alignment/src/stdafx.cpp create mode 100644 Alignment/src/stdafx.h diff --git a/Alignment/README.md b/Alignment/README.md new file mode 100644 index 0000000..01c3245 --- /dev/null +++ b/Alignment/README.md @@ -0,0 +1,15 @@ +## Aligner for scanned .sens, .ply files +========================================= + +Transforms scans to z-up alignment for scans and tries to align walls to x-y planes. + +### Installation. +This code was developed under VS2013. + +Requirements: +- our research library mLib, a git submodule in ../external/mLib +- mLib external libraries can be downloaded [here](https://www.dropbox.com/s/fve3uen5mzonidx/mLibExternal.zip?dl=0) + + +To run: +`alignment.exe [path to directory of scan to align]` \ No newline at end of file diff --git a/Alignment/alignment.sln b/Alignment/alignment.sln new file mode 100644 index 0000000..ef6367d --- /dev/null +++ b/Alignment/alignment.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.31101.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "alignment", "alignment.vcxproj", "{EB0D04B5-579C-4BF9-8FC3-58DFB235231F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EB0D04B5-579C-4BF9-8FC3-58DFB235231F}.Debug|x64.ActiveCfg = Debug|x64 + {EB0D04B5-579C-4BF9-8FC3-58DFB235231F}.Debug|x64.Build.0 = Debug|x64 + {EB0D04B5-579C-4BF9-8FC3-58DFB235231F}.Release|x64.ActiveCfg = Release|x64 + {EB0D04B5-579C-4BF9-8FC3-58DFB235231F}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Alignment/alignment.vcxproj b/Alignment/alignment.vcxproj new file mode 100644 index 0000000..02c79cc --- /dev/null +++ b/Alignment/alignment.vcxproj @@ -0,0 +1,105 @@ + + + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + + + true + true + + + Create + Create + + + + {EB0D04B5-579C-4BF9-8FC3-58DFB235231F} + alignment + + + + Application + true + v120 + MultiByte + + + Application + false + v120 + true + MultiByte + + + + + + + + + + + + + ../external/mLib/include;../external/mLibExternal/include/;./src/;$(IncludePath) + ..\external\mLibExternal\libsWindows\lib64;$(LibraryPath) + + + ../external/mLib/include;../external/mLibExternal/include/;./src/;$(IncludePath) + ..\external\mLibExternal\libsWindows\lib64;$(LibraryPath) + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;_DEBUG;%(PreprocessorDefinitions) + Use + -Zm400 %(AdditionalOptions) + + + true + freeimage.lib;%(AdditionalDependencies) + + + + + Level2 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + Use + -Zm400 %(AdditionalOptions) + + + true + true + true + freeimage.lib;%(AdditionalDependencies) + + + + + + \ No newline at end of file diff --git a/Alignment/alignment.vcxproj.filters b/Alignment/alignment.vcxproj.filters new file mode 100644 index 0000000..2c9c538 --- /dev/null +++ b/Alignment/alignment.vcxproj.filters @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Alignment/src/alignment.h b/Alignment/src/alignment.h new file mode 100644 index 0000000..588c020 --- /dev/null +++ b/Alignment/src/alignment.h @@ -0,0 +1,366 @@ + +#pragma once + +#include "stdafx.h" + +#include "processedFile.h" +#include "planeExtract.h" + +class Alignment { +public: + + static MeshDataf makeNormalMesh(const vec3f& p0, const vec3f& p1, const vec4f& color = vec4f(0.8f, 0.2f, 0.2f, 1.0f)) + { + TriMeshf normalMesh0 = Shapesf::sphere(0.05f, p0, 10, 10, color); + TriMeshf normalMesh1 = Shapesf::cylinder(p0, p1, 0.025f, 10, 10, color); + MeshDataf nMesh = normalMesh0.computeMeshData(); + nMesh.merge(normalMesh1.computeMeshData()); + return nMesh; + } + + + + static vec3f upVectorFromViews(const SensorData& sd) { + vec3f v(0.0f, 0.0f, 0.0f); + for (size_t i = 0; i < sd.m_frames.size(); i++) { + const mat4f& t = sd.m_frames[i].getCameraToWorld(); + if (sd.m_frames[i].getCameraToWorld()(0, 0) == -std::numeric_limits::infinity()) continue; + + const vec3f cameraUp(0.0f, -1.0f, 0.0f); + const vec3f worldUp = (t.getRotation() * cameraUp).getNormalized(); + v += worldUp; + } + v /= (float)sd.m_frames.size(); + return v.getNormalized(); + } + + static bool hasAccel(const SensorData& sd, unsigned int numThresh = 10) { + unsigned int numValidAccel = 0; + for (const SensorData::IMUFrame& f : sd.m_IMUFrames) { + if (f.acceleration != vec3d(0.0)) numValidAccel++; + } + + if (numValidAccel > numThresh) return true; + else return false; + } + + static vec3f upVectorFromAccel(const SensorData& sd) + { + if (sd.m_IMUFrames.size() == 0) throw MLIB_EXCEPTION("no imu data found"); + + vec3f v(0.0f, 0.0f, 0.0f); + for (size_t i = 0; i < sd.m_frames.size(); i++) { + const SensorData::IMUFrame& f = sd.findClosestIMUFrame(i); + + if (sd.m_frames[i].getCameraToWorld()(0, 0) == -std::numeric_limits::infinity()) continue; + + if (f.acceleration == vec3d::origin) { + std::cout << "invalid IMU acceleration data entry at " << i << "-th frame" << std::endl; + continue; + } + + vec3f cameraUp = -vec3f((float)f.acceleration.x, (float)f.acceleration.y, (float)f.acceleration.z).getNormalized(); + const mat4f& t = sd.m_frames[i].getCameraToWorld(); + const vec3f worldUp = (t.getRotation() * cameraUp).getNormalized(); + v += worldUp; + } + + return v.getNormalized(); + } + + static bool hasGravity(const SensorData& sd, unsigned int numThresh = 10) + { + unsigned int numValidGravity = 0; + for (const SensorData::IMUFrame& f : sd.m_IMUFrames) { + if (f.gravity != vec3d(0.0)) numValidGravity++; + } + + if (numValidGravity > numThresh) return true; + else return false; + } + + static vec3f upVectorFromGravity(const SensorData& sd) + { + if (sd.m_IMUFrames.size() == 0) throw MLIB_EXCEPTION("no imu data found"); + + vec3f v(0.0f, 0.0f, 0.0f); + for (size_t i = 0; i < sd.m_frames.size(); i++) { + const SensorData::IMUFrame& f = sd.findClosestIMUFrame(i); + if (sd.m_frames[i].getCameraToWorld()(0, 0) == -std::numeric_limits::infinity()) continue; + + if (f.gravity == vec3d::origin) { + std::cout << "invalid IMU gravity data entry at " << i << "-th frame" << std::endl; + continue; + } + + vec3f cameraUp = vec3f((float)f.gravity.x, (float)f.gravity.y, (float)f.gravity.z).getNormalized(); + + cameraUp = vec3f(cameraUp.y, cameraUp.x, cameraUp.z); + + const mat4f& t = sd.m_frames[i].getCameraToWorld(); + const vec3f worldUp = (t.getRotation() * cameraUp).getNormalized(); + v += worldUp; + } + v /= (float)sd.m_frames.size(); + + return v.getNormalized(); + } + + static void writeTrajectoryFile(const std::string& outFile, const SensorData& sd) { + + std::vector trajecotry; + for (size_t i = 0; i < sd.m_frames.size(); i++) { + trajecotry.push_back(sd.m_frames[i].getCameraToWorld()); + } + + BinaryDataStreamFile outStream(outFile, true); + outStream << trajecotry; + outStream.close(); + } + + static std::vector readTrajectoryFile(const std::string& inFile) { + BinaryDataStreamFile in(inFile, false); + std::vector trajectory; + in >> trajectory; + return trajectory; + } + + static void removeInvalidIMUFrames(SensorData& sd) { + const bool checkTimeStamp = true; //at the moment only remove invalid time frames + const bool checkGravity = false; + const bool checkAccel = false; + + unsigned int removedInvalidFrames = 0; + for (std::vector::iterator iter = sd.m_IMUFrames.begin(); iter != sd.m_IMUFrames.end();) { + bool rem = false; + if (checkTimeStamp && iter->timeStamp == 0) rem = true; + if (checkGravity && iter->gravity == vec3d::origin) rem = true; + if (checkAccel && iter->gravity == vec3d::origin) rem = true; + + if (rem == true) { + iter = sd.m_IMUFrames.erase(iter); + removedInvalidFrames++; + } + else { + iter++; + } + } + + if (removedInvalidFrames > 0) { + std::cout << "removed " << removedInvalidFrames << " invalid IMUFrames" << std::endl; + } + } + + static void alignScan(const std::string& path, bool forceRealign = false) { + + const std::string processedFile(path + "/" + "processed.txt"); + if (!util::fileExists(processedFile)) { + std::cout << "no reconstruction available for " << path << "\n\t -> skipping folder" << std::endl; + return; + } + ParameterFile parameterFile(processedFile); + ProcessedFile pf; pf.readMembers(parameterFile); + if (!pf.valid) { + std::cout << "reconstruction was invalid for " << path << "\n\t -> skipping folder" << std::endl; + return; + } + if (pf.aligned && !forceRealign) { + std::cout << "reconstruction is already aligned " << path << "\n\t -> skipping folder" << std::endl; + return; + } + + Directory dir(path); + const std::vector tmp = ml::util::split(util::replace(path, "\\", "/"), "/"); //we assume forward slashes + const std::string base = tmp.back(); + const std::string baseFile = path + "/" + base; + + const std::string sensFile = path + "/" + base + ".sens"; + const std::string plyFile = path + "/" + base + ".ply"; + const std::string trajFile = util::replace(sensFile, ".sens", ".traj"); + + + mat4f transform = mat4f::identity(); + + SensorData sd(sensFile); + removeInvalidIMUFrames(sd); + + if (sd.m_frames.size() == 0) throw MLIB_EXCEPTION("no frames found in the sensor file"); + + if (sd.m_frames[0].getCameraToWorld() != mat4f::identity()) { + std::cout << "already found a previous alignment -> reverting to original" << std::endl; + + if (sd.m_frames[0].getCameraToWorld()(0, 0) == -std::numeric_limits::infinity()) { + std::cout << "error can't revert due to an invalid transform in the first frame" << std::endl; + std::cout << "\tskipping folder " << std::endl; + return; + } + mat4f inverse = sd.m_frames[0].getCameraToWorld().getInverse(); + sd.applyTransform(inverse); + + //if we have a multiple ply files (e.g., if VH was already run): + Directory dir(path); + std::vector plyFiles = dir.getFilesWithSuffix(".ply"); + for (const std::string& plyFile : plyFiles) { + MeshDataf md = MeshIOf::loadFromFile(dir.getPath() + "/" + plyFile); + md.applyTransform(inverse); + MeshIOf::saveToFile(dir.getPath() + "/" + plyFile, md); + } + } + + MeshDataf md = MeshIOf::loadFromFile(plyFile); + md.mergeCloseVertices(0.0005f, true); + md.removeIsolatedPieces(5000); + + //compute approx up vector from camera views or gravity (if available) + if (true) { + vec3f upEstimateView = upVectorFromViews(sd); + vec3f upEstimate = upEstimateView; + if (hasGravity(sd)) { //try to use gravity if possible + vec3f upEstimateGrav = upVectorFromGravity(sd); + upEstimate = upEstimateGrav; + } + + vec3f x = upEstimate ^ vec3f(upEstimate.y, -upEstimate.z, upEstimate.x); x.normalize(); + vec3f y = upEstimate ^ x; y.normalize(); + vec3f z = upEstimate; + mat4f mat = mat4f(x, y, z); + md.applyTransform(mat); + transform = mat * transform; + } + + md.computeVertexNormals(); + + //attempting to find a ground plane (and align to it) + if (true) { + PlaneExtract pe(md); + pe.cluster(); + pe.removeSmallClusters(); + pe.removeNonBoundingClusters(0.1f, 100); //the + const auto& clusters = pe.getClusters(); + + bool foundHorizontalPlane = false; + const size_t maxClusters = clusters.size(); + size_t i = 0; + for (const Cluster& c : clusters) { + if ((c.m_rep.plane.getNormal() | vec3f(0.0f, 0.0f, 1.0f)) > 0.8f) { + mat4f mat = c.reComputeNormalAlignment(); + md.applyTransform(mat); + transform = mat * transform; + foundHorizontalPlane = true; + break; + } + i++; + if (i >= maxClusters) break; + } + if (!foundHorizontalPlane) std::cout << "could not find a horizontal plane" << std::endl; + + //final alignment with xy plane (translation) + if (true) { + BoundingBox3f bb = md.computeBoundingBox(); + mat4f mat = mat4f::translation(-bb.getMinZ()); + transform = mat * transform; + md.applyTransform(mat); + + bb = md.computeBoundingBox(); + mat = mat4f::translation(-vec3f(bb.getCenter().x, bb.getCenter().y, 0.0f)); + md.applyTransform(mat); + transform = mat * transform; + } + + //attempting to find a vertical plane to align with the x and y axis + if (true) { + if (true) { + //first find the bounding box using cgal + OrientedBoundingBox3f obb = CGALWrapperf::computeOrientedBoundingBox(md.m_Vertices, CGALWrapperf::CONSTRAIN_Z); + mat4f mat = mat4f(obb.getAxisX().getNormalized(), obb.getAxisY().getNormalized(), obb.getAxisZ().getNormalized()); + md.applyTransform(mat); + transform = mat * transform; + } + + //make sure x and y are in the positive quadrant + if (true) { + BoundingBox3f bb = md.computeBoundingBox(); + mat4f mat = mat4f::translation(-vec3f(bb.getMin().x, bb.getMin().y, 0.0f)); + md.applyTransform(mat); + transform = mat * transform; + } + } + } + + md.m_Normals.clear(); + + { + //if we have a multiple ply files (e.g., if VH was already run): + Directory dir(path); + std::vector plyFiles = dir.getFilesWithSuffix(".ply"); + for (const std::string& plyFile : plyFiles) { + MeshDataf mesh = MeshIOf::loadFromFile(dir.getPath() + "/" + plyFile); + mesh.applyTransform(transform); + MeshIOf::saveToFile(dir.getPath() + "/" + plyFile, mesh); + } + + + sd.applyTransform(transform); + sd.saveToFile(sensFile); + pf.aligned = true; //it's now aligned + pf.saveToFile(processedFile); + } + } + + static mat4f readTransformFromAln(const std::string& filename) + { + std::ifstream s(filename); + if (!s.is_open()) throw MLIB_EXCEPTION("failed to open file " + filename + " for read"); + std::string tmp; + std::getline(s, tmp); std::getline(s, tmp); std::getline(s, tmp);//ignore header lines + mat4f m; + for (unsigned int i = 0; i < 16; i++) s >> m[i]; + s.close(); + return m; + } + + static void alignScanFromAlnFile(const std::string& path) { + + const std::string processedFile(path + "/" + "processed.txt"); + if (!util::fileExists(processedFile)) { + std::cout << "no reconstruction available for " << path << "\n\t -> skipping folder" << std::endl; + return; + } + ParameterFile parameterFile(processedFile); + ProcessedFile pf; pf.readMembers(parameterFile); + if (!pf.valid) { + std::cout << "reconstruction was invalid for " << path << "\n\t -> skipping folder" << std::endl; + return; + } + + Directory dir(path); + const std::vector tmp = ml::util::split(util::replace(path, "\\", "/"), "/"); //we assume forward slashes + const std::string base = tmp.back(); + const std::string baseFile = path + "/" + base; + + const std::string alnFile = path + "/alignment.aln"; + const std::string sensFile = path + "/" + base + ".sens"; + std::vector plyFiles = dir.getFilesWithSuffix(".ply"); + + const mat4f transform = readTransformFromAln(alnFile); + + SensorData sd(sensFile); + if (sd.m_frames.size() == 0) throw MLIB_EXCEPTION("no frames found in the sensor file"); + sd.applyTransform(transform); + + { //save out transformed + for (const std::string& plyFile : plyFiles) { + MeshDataf mesh = MeshIOf::loadFromFile(dir.getPath() + "/" + plyFile); + mesh.applyTransform(transform); + MeshIOf::saveToFile(dir.getPath() + "/" + plyFile, mesh); + } + sd.applyTransform(transform); + sd.saveToFile(sensFile); + pf.aligned = true; //it's now aligned + pf.saveToFile(processedFile); + } + } + + +private: +}; \ No newline at end of file diff --git a/Alignment/src/globalAppState.h b/Alignment/src/globalAppState.h new file mode 100644 index 0000000..1ff697b --- /dev/null +++ b/Alignment/src/globalAppState.h @@ -0,0 +1,72 @@ +#pragma once + +#ifndef _GLOBAL_APP_STATE_H_ +#define _GLOBAL_APP_STATE_H_ + +#include "mLibInclude.h" + +#define X_GLOBAL_APP_STATE_FIELDS \ + X(std::string, s_inputTestFile) \ + X(std::string, s_sourceDirectory) \ + X(std::vector, s_methods) + + +#ifndef VAR_NAME +#define VAR_NAME(x) #x +#endif + +#define checkSizeArray(a, d)( (((sizeof a)/(sizeof a[0])) >= d)) + +class GlobalAppState +{ +public: + +#define X(type, name) type name; + X_GLOBAL_APP_STATE_FIELDS +#undef X + + //! sets the parameter file and reads + void readMembers(const ParameterFile& parameterFile) { + m_ParameterFile = parameterFile; + readMembers(); + } + + //! reads all the members from the given parameter file (could be called for reloading) + void readMembers() { +#define X(type, name) \ + if (!m_ParameterFile.readParameter(std::string(#name), name)) {MLIB_WARNING(std::string(#name).append(" ").append("uninitialized")); name = type();} + X_GLOBAL_APP_STATE_FIELDS +#undef X + m_bIsInitialized = true; + } + + void print() const { +#define X(type, name) \ + std::cout << #name " = " << name << std::endl; + X_GLOBAL_APP_STATE_FIELDS +#undef X + } + + static GlobalAppState& get() { + static GlobalAppState s; + return s; + } + + + //! constructor + GlobalAppState() { + m_bIsInitialized = false; + } + + //! destructor + ~GlobalAppState() { + } + + + +private: + bool m_bIsInitialized; + ParameterFile m_ParameterFile; +}; + +#endif \ No newline at end of file diff --git a/Alignment/src/mLibInclude.h b/Alignment/src/mLibInclude.h new file mode 100644 index 0000000..4ea883d --- /dev/null +++ b/Alignment/src/mLibInclude.h @@ -0,0 +1,16 @@ +#ifndef _MLIB_INCLUDE_H_ +#define _MLIB_INCLUDE_H_ + +#ifdef _DEBUG +#define MLIB_ERROR_CHECK +#endif + +#include +#include +#include +#include +#include + +using namespace ml; + +#endif \ No newline at end of file diff --git a/Alignment/src/mLibSource.cpp b/Alignment/src/mLibSource.cpp new file mode 100644 index 0000000..f836f68 --- /dev/null +++ b/Alignment/src/mLibSource.cpp @@ -0,0 +1,7 @@ + +#include "main.h" + +#include "mLibCore.cpp" +#include "mLibLodePNG.cpp" +#include "mLibDepthCamera.cpp" +//#include "mLibZLib.cpp" \ No newline at end of file diff --git a/Alignment/src/main.cpp b/Alignment/src/main.cpp new file mode 100644 index 0000000..fdbe6f8 --- /dev/null +++ b/Alignment/src/main.cpp @@ -0,0 +1,62 @@ + +#include "stdafx.h" + +#include "main.h" +#include "alignment.h" + +void alignScan(const std::string& sceneFolder, bool forceRealign = false) +{ + std::cout << "aligning: " << sceneFolder << std::endl; + Alignment::alignScan(sceneFolder, forceRealign); +} + +void alignScanFromAlnFile(const std::string& sceneFolder) +{ + std::cout << "aligning: " << sceneFolder << std::endl; + Alignment::alignScanFromAlnFile(sceneFolder); +} + + + +void alignDirectory(const std::string& path, bool forceRealign = false) { + Directory dir(path); + std::vector scenes = dir.getDirectories(); + std::sort(scenes.begin(), scenes.end()); + for (size_t i = 0; i < scenes.size(); i++) { + const std::string& scene = scenes[i]; + const std::string sceneFolder = path + scene; + alignScan(sceneFolder); + //break; + //if (i >= 20) break; + } +} + +int main(int argc, char* argv[]) +{ + try { + if (argc == 2) { //converts a specific scan given by the command line argument + std::string stagingFolder(argv[1]); + alignScan(stagingFolder); + } + else { + throw MLIB_EXCEPTION("requires the path as a command line argument"); + } + } + catch (const std::exception& e) + { + MessageBoxA(NULL, e.what(), "Exception caught", MB_ICONERROR); + exit(EXIT_FAILURE); + } + catch (...) + { + MessageBoxA(NULL, "UNKNOWN EXCEPTION", "Exception caught", MB_ICONERROR); + exit(EXIT_FAILURE); + } + + //std::cout << "" << std::endl; + //getchar(); + + return 0; +} + + diff --git a/Alignment/src/main.h b/Alignment/src/main.h new file mode 100644 index 0000000..9e593e5 --- /dev/null +++ b/Alignment/src/main.h @@ -0,0 +1,9 @@ + +#include +#include +#include +#include +#include +#include + +#include "stdafx.h" diff --git a/Alignment/src/planeExtract.h b/Alignment/src/planeExtract.h new file mode 100644 index 0000000..3db2dbb --- /dev/null +++ b/Alignment/src/planeExtract.h @@ -0,0 +1,203 @@ + +#pragma once + +#include "stdafx.h" + + +struct Point { + Planef plane; + vec3f point; + size_t urIdx; +}; + +struct Cluster { + Cluster(const Point* init) { + m_points.push_back(init); + m_rep = *m_points.front(); + + sumNormal = init->plane.getNormal(); + sumPoint = init->point; + } + void addPoint(const Point* p) { + + m_points.push_back(p); + + sumNormal += p->plane.getNormal(); + sumPoint += p->point; + + m_rep.plane = Planef(sumNormal.getNormalized(), sumPoint / (float)m_points.size()); + } + + bool check(const Point& p, float normalThresh, float distThresh) { + float d_norm = p.plane.getNormal() | m_rep.plane.getNormal(); + float d_dist = m_rep.plane.distanceToPointAbs(p.point); + + return (d_norm > normalThresh) && (d_dist < distThresh); + } + + mat4f reComputeNormalAlignment() const { + std::vector points; + for (const Point* p : m_points) { + if (m_rep.plane.distanceToPointAbs(p->point) < 0.05f) { + points.push_back(p->point); + } + } + auto res = math::pointSetPCA(points); + mat4f m(res[0].first.getNormalized(), res[1].first.getNormalized(), res[2].first.getNormalized()); + return m.getTranspose(); + } + + vec3f reComputeNormal() const { + std::vector points; + for (const Point* p : m_points) { + if (m_rep.plane.distanceToPointAbs(p->point) < 0.05f) { + points.push_back(p->point); + } + } + auto res = math::pointSetPCA(points); + mat3f m(res[0].first.getNormalized(), res[1].first.getNormalized(), res[2].first.getNormalized()); + return m.zcol().getNormalized(); + } + + bool operator<(const Cluster& other) const { + return m_points.size() > other.m_points.size(); + } + + Point m_rep; + std::list m_points; + + vec3f sumNormal; + vec3f sumPoint; +}; + +class PlaneExtract { +public: + PlaneExtract(const MeshDataf& md) { + if (!md.hasNormals()) throw MLIB_EXCEPTION("need to compute normals first"); + + m_points.resize(md.m_Vertices.size()); + for (size_t i = 0; i < md.m_Vertices.size(); i++) { + Point& p = m_points[i]; + p.plane = Planef(md.m_Normals[i], md.m_Vertices[i]); + p.point = md.m_Vertices[i]; + p.urIdx = i; + m_pointsRef.push_back(&m_points[i]); + } + } + + void cluster(float normalThresh = 0.90f, float distThresh = 0.05f) { + for (const Point* p : m_pointsRef) { + bool foundCluster = false; + for (Cluster& c : m_clusters) { + if (c.check(*p, normalThresh, distThresh)) { + c.addPoint(p); + foundCluster = true; + break; + } + } + if (!foundCluster) { + m_clusters.push_back(Cluster(p)); + } + } + + m_clusters.sort(); + } + + void print(unsigned int topN = 10) const { + std::cout << m_points.size() << " points " << std::endl; + std::cout << m_clusters.size() << " clusters " << std::endl; + unsigned int i = 0; + for (const Cluster& c : m_clusters) { + if (i >= topN) break; + std::cout << "\t" << c.m_points.size() << std::endl; + i++; + } + } + + + const std::list getClusters() const { + return m_clusters; + } + + void removeSmallClusters(size_t minSize = 500) { + for (std::list::iterator iter = m_clusters.begin(); iter != m_clusters.end();) { + if (iter->m_points.size() < minSize) { + iter = m_clusters.erase(iter); + } + else { + iter++; + } + } + } + + //threshold is 10cm by default + void removeNonBoundingClusters(float distThresh, unsigned int numthresh) { + for (std::list::iterator iter = m_clusters.begin(); iter != m_clusters.end();) { + if (!isBoundingCluster(*iter, distThresh, numthresh)) { + iter = m_clusters.erase(iter); + } + else { + iter++; + } + } + } + + //check whether there are points behind the plane -- if so then return false + bool isBoundingCluster(const Cluster& c, float distThresh, unsigned int numThresh) const { + unsigned int countBehind = 0; + for (size_t i = 0; i < m_points.size(); i++) { + const float d = c.m_rep.plane.distanceToPoint(m_points[i].point); + if (d < -distThresh) countBehind++; + } + if (countBehind > numThresh) return false; + else return true; + } + + void saveColoredPlanes(const std::string& filename, const MeshDataf& md, unsigned int topN = 0) { + topN = (unsigned int)std::min(topN, m_clusters.size()); + + MeshDataf mesh = md; + + if (mesh.m_Colors.size() != mesh.m_Vertices.size()) { + mesh.m_Colors.resize(mesh.m_Vertices.size()); + } + + size_t i = 0; + for (const Cluster& c : m_clusters) { + RGBColor color = RGBColor::randomColor(); + for (const Point* p : c.m_points) { + mesh.m_Colors[p->urIdx] = color; + } + + i++; + if (topN != 0 && i >= topN) { + break; + } + } + + MeshIOf::saveToFile(filename, mesh); + } + + + void saveColoredPlane(const std::string& filename, const Cluster& c, const MeshDataf& md, const RGBColor& color = RGBColor::randomColor()) { + + MeshDataf mesh = md; + + if (mesh.m_Colors.size() != mesh.m_Vertices.size()) { + mesh.m_Colors.resize(mesh.m_Vertices.size()); + } + + for (const Point* p : c.m_points) { + mesh.m_Colors[p->urIdx] = color; + } + + MeshIOf::saveToFile(filename, mesh); + } + +private: + + + std::vector m_points; + std::list m_pointsRef; + std::list m_clusters; +}; diff --git a/Alignment/src/processedFile.h b/Alignment/src/processedFile.h new file mode 100644 index 0000000..3930691 --- /dev/null +++ b/Alignment/src/processedFile.h @@ -0,0 +1,87 @@ +#pragma once + + +#include "mLibInclude.h" + +#define X_PROCESSED_FILE_STATE_FIELDS \ + X(bool, valid) \ + X(unsigned int, heapFreeCount) \ + X(unsigned int, numValidOptTransforms) \ + X(unsigned int, numTransforms) \ + X(bool, aligned) + + +#ifndef VAR_NAME +#define VAR_NAME(x) #x +#endif + +#define checkSizeArray(a, d)( (((sizeof a)/(sizeof a[0])) >= d)) + +class ProcessedFile +{ +public: + +#define X(type, name) type name; + X_PROCESSED_FILE_STATE_FIELDS +#undef X + + //! sets the parameter file and reads + void readMembers(const ParameterFile& parameterFile) { + m_ParameterFile = parameterFile; + readMembers(); + } + + //! reads all the members from the given parameter file (could be called for reloading) + void readMembers() { + aligned = false; + +#define X(type, name) \ + if (!m_ParameterFile.readParameter(std::string(#name), name) && std::string(#name) != "aligned") {MLIB_WARNING(std::string(#name).append(" ").append("uninitialized")); name = type();} + X_PROCESSED_FILE_STATE_FIELDS +#undef X + + m_bIsInitialized = true; + } + + template + std::string makeString(const T& in) { + std::string ret = std::to_string(in); + return ret; + } + template <> + std::string makeString(const bool& in) { + if (in == true) return "true"; + else return "false"; + } + + void saveToFile(const std::string& outFile) { + std::ofstream out(outFile); +#define X(type, name) \ + { out << #name << " = " << makeString(name) << std::endl; } + X_PROCESSED_FILE_STATE_FIELDS +#undef X + } + + void print() const { +#define X(type, name) \ + std::cout << #name " = " << name << std::endl; + X_PROCESSED_FILE_STATE_FIELDS +#undef X + } + + + //! constructor + ProcessedFile() { + m_bIsInitialized = false; + } + + //! destructor + ~ProcessedFile() { + } + + +private: + bool m_bIsInitialized; + ParameterFile m_ParameterFile; +}; + diff --git a/Alignment/src/stdafx.cpp b/Alignment/src/stdafx.cpp new file mode 100644 index 0000000..3f38672 --- /dev/null +++ b/Alignment/src/stdafx.cpp @@ -0,0 +1,11 @@ +// stdafx.cpp : source file that includes just the standard includes +// VirtualScan.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#pragma warning (disable : 4996) + +#include "stdafx.h" + +#include "mLibSource.cpp" +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/Alignment/src/stdafx.h b/Alignment/src/stdafx.h new file mode 100644 index 0000000..c695e5c --- /dev/null +++ b/Alignment/src/stdafx.h @@ -0,0 +1,13 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include +#include + +// TODO: reference additional headers your program requires here + +#include "mLibInclude.h" \ No newline at end of file From 55acb258c7707f1a716e67ff9d76b1b9f66f4e2c Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Wed, 21 Nov 2018 09:11:23 +0100 Subject: [PATCH 18/41] Update README.md --- CameraParameterEstimation/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CameraParameterEstimation/README.md b/CameraParameterEstimation/README.md index bb29ca5..998a0fc 100644 --- a/CameraParameterEstimation/README.md +++ b/CameraParameterEstimation/README.md @@ -3,7 +3,7 @@ Structured Light Camera Calibration This repository includes set of Matlab scripts and C++ programs used for calibration of structured light depth camera. Specifically, we have calibrated -a set of Structure Sensor Cameras from Occipital [link](http://http://occipital.com) +a set of Structure Sensor Cameras from [Occipital](http://http://occipital.com) We perform two types of calibration: 1. Depth-To-Color Calibration From 4053b382b666c086764df1701905adf6ec3744e2 Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Wed, 21 Nov 2018 09:20:24 +0100 Subject: [PATCH 19/41] Update README.md --- CameraParameterEstimation/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CameraParameterEstimation/README.md b/CameraParameterEstimation/README.md index 998a0fc..e063244 100644 --- a/CameraParameterEstimation/README.md +++ b/CameraParameterEstimation/README.md @@ -3,7 +3,7 @@ Structured Light Camera Calibration This repository includes set of Matlab scripts and C++ programs used for calibration of structured light depth camera. Specifically, we have calibrated -a set of Structure Sensor Cameras from [Occipital](http://http://occipital.com) +a set of Structure Sensor Cameras from [Occipital](http://http://occipital.com). We perform two types of calibration: 1. Depth-To-Color Calibration From a3c66b48f6c6c8d64e8b2b25b4f0ae2ffc75252d Mon Sep 17 00:00:00 2001 From: angeladai Date: Wed, 21 Nov 2018 20:41:55 +0100 Subject: [PATCH 20/41] small bug fix --- BenchmarkScripts/3d_evaluation/evaluate_semantic_instance.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BenchmarkScripts/3d_evaluation/evaluate_semantic_instance.py b/BenchmarkScripts/3d_evaluation/evaluate_semantic_instance.py index 79ea7ba..a70d98a 100644 --- a/BenchmarkScripts/3d_evaluation/evaluate_semantic_instance.py +++ b/BenchmarkScripts/3d_evaluation/evaluate_semantic_instance.py @@ -264,7 +264,7 @@ def assign_instances_for_scan(pred_file, gt_file, pred_path): pred2gt[label] = [] num_pred_instances = 0 # mask of void labels in the groundtruth - bool_void = np.in1d(gt_ids, VALID_CLASS_IDS) + bool_void = np.logical_not(np.in1d(gt_ids//1000, VALID_CLASS_IDS)) # go thru all prediction masks for pred_mask_file in pred_info: label_id = int(pred_info[pred_mask_file]['label_id']) From 99f72adbd0e0c03a012faeab0c073b62c532d533 Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Mon, 17 Dec 2018 23:46:09 +0100 Subject: [PATCH 21/41] Update README.md --- SensReader/README.md | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/SensReader/README.md b/SensReader/README.md index 1a9c5c2..7b71ba3 100644 --- a/SensReader/README.md +++ b/SensReader/README.md @@ -1,10 +1,11 @@ # Sens File Format (see [sensorData.h](c++/src/sensorData.h)): +``` struct SensorData { unsigned int m_versionNumber; - std::string m_sensorName; + std::string m_sensorName; - CalibrationData m_calibrationColor; //4x4 intrinsic matrix - CalibrationData m_calibrationDepth; //4x4 intrinsic matrix + CalibrationData m_calibrationColor; //4x4 intrinsic matrix + CalibrationData m_calibrationDepth; //4x4 intrinsic matrix COMPRESSION_TYPE_COLOR m_colorCompressionType; //scannet color frames are typically jpeg encoded COMPRESSION_TYPE_DEPTH m_depthCompressionType; //scannet depth frames are typically zLib encoded @@ -13,14 +14,34 @@ struct SensorData { unsigned int m_colorHeight; unsigned int m_depthWidth; unsigned int m_depthHeight; - float m_depthShift; //conversion from float[m] to ushort (typically 1000.0f) + float m_depthShift; //conversion from float[m] to ushort (typically 1000.0f) - std::vector m_frames; // <= Main data (contains timestamps and rigid transforms) + std::vector m_frames; // <= Main data (contains timestamps and rigid transforms) std::vector m_IMUFrames; } +class RGBDFrame { + UINT64 m_colorSizeBytes; //compressed byte size + UINT64 m_depthSizeBytes; //compressed byte size + unsigned char* m_colorCompressed; //compressed color data + unsigned char* m_depthCompressed; //compressed depth data + UINT64 m_timeStampColor; //time stamp color (convection: in microseconds) + UINT64 m_timeStampDepth; //time stamp depth (convention: in microseconds) + mat4f m_cameraToWorld; //camera trajectory: from current frame to base(world) frame +} + +struct IMUFrame { + vec3d rotationRate; //angular velocity (raw data) + vec3d acceleration; //acceleration in x,y,z direction (raw data) + vec3d magneticField; //magnetometer data (raw data) + vec3d attitude; //roll, pitch, yaw estimate (inferred) + vec3d gravity; //gravitation dir estimate (inferred) + UINT64 timeStamp; //timestamp (typically in microseconds) +} +``` + ## C++ ToolKit See [c++/](c++) ## Simple Python Data Exporter -See [python/](python) \ No newline at end of file +See [python/](python) From 64965e0110ce54d3ccf190687502cceb68730460 Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Mon, 17 Dec 2018 23:50:25 +0100 Subject: [PATCH 22/41] Update README.md --- SensReader/README.md | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/SensReader/README.md b/SensReader/README.md index 7b71ba3..b6835b1 100644 --- a/SensReader/README.md +++ b/SensReader/README.md @@ -20,24 +20,16 @@ struct SensorData { std::vector m_IMUFrames; } -class RGBDFrame { - UINT64 m_colorSizeBytes; //compressed byte size - UINT64 m_depthSizeBytes; //compressed byte size - unsigned char* m_colorCompressed; //compressed color data - unsigned char* m_depthCompressed; //compressed depth data - UINT64 m_timeStampColor; //time stamp color (convection: in microseconds) - UINT64 m_timeStampDepth; //time stamp depth (convention: in microseconds) - mat4f m_cameraToWorld; //camera trajectory: from current frame to base(world) frame -} - -struct IMUFrame { - vec3d rotationRate; //angular velocity (raw data) - vec3d acceleration; //acceleration in x,y,z direction (raw data) - vec3d magneticField; //magnetometer data (raw data) - vec3d attitude; //roll, pitch, yaw estimate (inferred) - vec3d gravity; //gravitation dir estimate (inferred) - UINT64 timeStamp; //timestamp (typically in microseconds) -} +// example get color frame, depth frame, pose (camera to world) +SensorData sd("sensfile.sens"); +unsigned int frame = 0; +vec3uc* color = sd.decompressColorAlloc(frame); // note: must be freed after use +unsigned short* depth = sd.decompressDepthAlloc(frame); // note: must be freed after use +const mat4f cameraToWorld = sd.m_frames[frame].getCameraToWorld(); +std::free(color); +std::free(depth); +// if using mlib, can save a frame to a point cloud with: +sd.saveToPointCloud("frame" + std::to_string(frame) + ".ply", frame); ``` ## C++ ToolKit From 6aa3da8c7864506df9b22db94d009f2fde1ae704 Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Wed, 3 Apr 2019 17:09:25 +0200 Subject: [PATCH 23/41] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 41af604..d8ce1f6 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ScanNet is an RGB-D video dataset containing 2.5 million views in more than 1500 ## ScanNet Data -If you would like to download the ScanNet data, please fill out an agreement to the [ScanNet Terms of Use](http://dovahkiin.stanford.edu/scannet-public/ScanNet_TOS.pdf) and send it to us at scannet@googlegroups.com. +If you would like to download the ScanNet data, please fill out an agreement to the [ScanNet Terms of Use](http://kaldir.vc.in.tum.de/scannet/ScanNet_TOS.pdf) and send it to us at scannet@googlegroups.com. If you have not received a response within a week, it is likely that your email is bouncing - please check this before sending repeat requests. @@ -151,6 +151,6 @@ If you have any questions, please contact us at scannet@googlegroups.com ## Changelog ## License -The data is released under the [ScanNet Terms of Use](http://dovahkiin.stanford.edu/scannet-public/ScanNet_TOS.pdf), and the code is released under the MIT license. +The data is released under the [ScanNet Terms of Use](http://kaldir.vc.in.tum.de/scannet/ScanNet_TOS.pdf), and the code is released under the MIT license. Copyright (c) 2017 From 4e31827566e7f1678bb38969393c8b22d320abdc Mon Sep 17 00:00:00 2001 From: angeladai Date: Fri, 19 Apr 2019 13:06:33 +0200 Subject: [PATCH 24/41] update to sdk 12.1 --- .../GPUImage.xcodeproj/project.pbxproj | 28 +- .../xcschemes/Documentation.xcscheme | 2 +- .../xcshareddata/xcschemes/GPUImage.xcscheme | 2 +- .../xcschemes/GPUImageFramework.xcscheme | 2 +- .../GPUImageMac.xcodeproj/project.pbxproj | 1647 ----------------- .../xcshareddata/xcschemes/GPUImage.xcscheme | 59 - .../Source/GPUImage3x3TextureSamplingFilter.m | 12 +- .../framework/Source/GPUImageAverageColor.m | 22 +- .../Source/GPUImageColorPackingFilter.m | 6 +- .../GPUImageColourFASTSamplingOperation.m | 14 +- .../Source/GPUImageCrosshairGenerator.m | 12 +- ...geDirectionalNonMaximumSuppressionFilter.m | 6 +- .../framework/Source/GPUImageFilter.m | 26 +- .../Source/GPUImageFourInputFilter.m | 6 +- .../framework/Source/GPUImageFramebuffer.m | 78 +- .../Source/GPUImageFramebufferCache.m | 22 +- .../Source/GPUImageGaussianBlurFilter.m | 64 +- .../Source/GPUImageHistogramFilter.m | 38 +- .../Source/GPUImageLanczosResamplingFilter.m | 14 +- .../framework/Source/GPUImageLineGenerator.m | 12 +- .../framework/Source/GPUImageLuminosity.m | 48 +- .../GPUImage/framework/Source/GPUImageMovie.m | 52 +- .../framework/Source/GPUImageOutput.m | 22 +- .../framework/Source/GPUImageRawDataInput.m | 18 +- .../framework/Source/GPUImageRawDataOutput.m | 6 +- .../framework/Source/GPUImageSharpenFilter.m | 12 +- .../Source/GPUImageSobelEdgeDetectionFilter.m | 6 +- .../Source/GPUImageSolidColorGenerator.m | 8 +- .../framework/Source/GPUImageStillCamera.m | 40 +- .../framework/Source/GPUImageTextureInput.m | 12 +- .../Source/GPUImageThreeInputFilter.m | 6 +- .../Source/GPUImageToneCurveFilter.m | 36 +- ...UImageTwoInputCrossTextureSamplingFilter.m | 12 +- .../framework/Source/GPUImageTwoInputFilter.m | 6 +- .../framework/Source/GPUImageTwoPassFilter.m | 28 +- .../GPUImageTwoPassTextureSamplingFilter.m | 22 +- .../framework/Source/GPUImageVideoCamera.m | 156 +- .../GPUImage/framework/Source/Mac/GPUImage.h | 167 -- .../framework/Source/Mac/GPUImageAVCamera.h | 132 -- .../framework/Source/Mac/GPUImageAVCamera.m | 771 -------- .../framework/Source/Mac/GPUImageContext.h | 55 - .../framework/Source/Mac/GPUImageContext.m | 268 --- .../Source/Mac/GPUImageMac-Info.plist | 30 - .../Source/Mac/GPUImageMac-Prefix.pch | 7 - .../Source/Mac/GPUImageMovieWriter.h | 57 - .../Source/Mac/GPUImageMovieWriter.m | 644 ------- .../framework/Source/Mac/GPUImagePicture.h | 25 - .../framework/Source/Mac/GPUImagePicture.m | 299 --- .../framework/Source/Mac/GPUImageView.h | 39 - .../framework/Source/Mac/GPUImageView.m | 458 ----- .../Source/Mac/en.lproj/InfoPlist.strings | 2 - .../Source/iOS/GPUImageMovieWriter.m | 178 +- .../iOS/GPUImagePicture+TextureSubimage.m | 4 +- .../framework/Source/iOS/GPUImagePicture.m | 18 +- .../framework/Source/iOS/GPUImageView.m | 74 +- ScannerApp/Scanner.xcodeproj/project.pbxproj | 32 +- .../ViewController_iPad.xib | 0 ScannerApp/Scanner/Scanner-Info.plist | 4 +- 58 files changed, 603 insertions(+), 5223 deletions(-) delete mode 100644 ScannerApp/Frameworks/GPUImage/framework/GPUImageMac.xcodeproj/project.pbxproj delete mode 100644 ScannerApp/Frameworks/GPUImage/framework/GPUImageMac.xcodeproj/xcshareddata/xcschemes/GPUImage.xcscheme delete mode 100755 ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImage.h delete mode 100755 ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageAVCamera.h delete mode 100644 ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageAVCamera.m delete mode 100755 ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageContext.h delete mode 100755 ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageContext.m delete mode 100644 ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageMac-Info.plist delete mode 100644 ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageMac-Prefix.pch delete mode 100755 ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageMovieWriter.h delete mode 100755 ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageMovieWriter.m delete mode 100755 ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImagePicture.h delete mode 100755 ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImagePicture.m delete mode 100755 ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageView.h delete mode 100755 ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageView.m delete mode 100644 ScannerApp/Frameworks/GPUImage/framework/Source/Mac/en.lproj/InfoPlist.strings rename ScannerApp/Scanner/{en.lproj => Base.lproj}/ViewController_iPad.xib (100%) diff --git a/ScannerApp/Frameworks/GPUImage/framework/GPUImage.xcodeproj/project.pbxproj b/ScannerApp/Frameworks/GPUImage/framework/GPUImage.xcodeproj/project.pbxproj index 462f2f2..ac85190 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/GPUImage.xcodeproj/project.pbxproj +++ b/ScannerApp/Frameworks/GPUImage/framework/GPUImage.xcodeproj/project.pbxproj @@ -1968,7 +1968,7 @@ isa = PBXProject; attributes = { LastTestingUpgradeCheck = 0510; - LastUpgradeCheck = 0700; + LastUpgradeCheck = 1000; ORGANIZATIONNAME = "Brad Larson"; TargetAttributes = { BCE209E41943F20C002FEED8 = { @@ -2401,6 +2401,7 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -2436,6 +2437,7 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -2466,11 +2468,21 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; @@ -2494,7 +2506,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = YES; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; @@ -2508,11 +2520,21 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; @@ -2528,7 +2550,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; SYMROOT = "$(PROJECT_DIR)/../build"; diff --git a/ScannerApp/Frameworks/GPUImage/framework/GPUImage.xcodeproj/xcshareddata/xcschemes/Documentation.xcscheme b/ScannerApp/Frameworks/GPUImage/framework/GPUImage.xcodeproj/xcshareddata/xcschemes/Documentation.xcscheme index 880c931..9fe101f 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/GPUImage.xcodeproj/xcshareddata/xcschemes/Documentation.xcscheme +++ b/ScannerApp/Frameworks/GPUImage/framework/GPUImage.xcodeproj/xcshareddata/xcschemes/Documentation.xcscheme @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImage3x3TextureSamplingFilter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImage3x3TextureSamplingFilter.m index 05c4d50..0550f04 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImage3x3TextureSamplingFilter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImage3x3TextureSamplingFilter.m @@ -84,16 +84,16 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelHeight = 1.0 / filterFrameSize.height; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext setActiveShaderProgram:filterProgram]; - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + [GPUImageContext setActiveShaderProgram:self->filterProgram]; + if (GPUImageRotationSwapsWidthAndHeight(self->inputRotation)) { - glUniform1f(texelWidthUniform, _texelHeight); - glUniform1f(texelHeightUniform, _texelWidth); + glUniform1f(self->texelWidthUniform, self->_texelHeight); + glUniform1f(self->texelHeightUniform, self->_texelWidth); } else { - glUniform1f(texelWidthUniform, _texelWidth); - glUniform1f(texelHeightUniform, _texelHeight); + glUniform1f(self->texelWidthUniform, self->_texelWidth); + glUniform1f(self->texelHeightUniform, self->_texelHeight); } }); } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageAverageColor.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageAverageColor.m index e2dd7e7..2135aaf 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageAverageColor.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageAverageColor.m @@ -168,25 +168,25 @@ - (void)extractAverageColorAtFrameTime:(CMTime)frameTime; NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"The output texture internal format for this filter must be GL_RGBA."); NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); - NSUInteger totalNumberOfPixels = round(finalStageSize.width * finalStageSize.height); + NSUInteger totalNumberOfPixels = round(self->finalStageSize.width * self->finalStageSize.height); - if (rawImagePixels == NULL) + if (self->rawImagePixels == NULL) { - rawImagePixels = (GLubyte *)malloc(totalNumberOfPixels * 4); + self->rawImagePixels = (GLubyte *)malloc(totalNumberOfPixels * 4); } [GPUImageContext useImageProcessingContext]; - [outputFramebuffer activateFramebuffer]; - glReadPixels(0, 0, (int)finalStageSize.width, (int)finalStageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); + [self->outputFramebuffer activateFramebuffer]; + glReadPixels(0, 0, (int)self->finalStageSize.width, (int)self->finalStageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, self->rawImagePixels); NSUInteger redTotal = 0, greenTotal = 0, blueTotal = 0, alphaTotal = 0; NSUInteger byteIndex = 0; for (NSUInteger currentPixel = 0; currentPixel < totalNumberOfPixels; currentPixel++) { - redTotal += rawImagePixels[byteIndex++]; - greenTotal += rawImagePixels[byteIndex++]; - blueTotal += rawImagePixels[byteIndex++]; - alphaTotal += rawImagePixels[byteIndex++]; + redTotal += self->rawImagePixels[byteIndex++]; + greenTotal += self->rawImagePixels[byteIndex++]; + blueTotal += self->rawImagePixels[byteIndex++]; + alphaTotal += self->rawImagePixels[byteIndex++]; } CGFloat normalizedRedTotal = (CGFloat)redTotal / (CGFloat)totalNumberOfPixels / 255.0; @@ -194,9 +194,9 @@ - (void)extractAverageColorAtFrameTime:(CMTime)frameTime; CGFloat normalizedBlueTotal = (CGFloat)blueTotal / (CGFloat)totalNumberOfPixels / 255.0; CGFloat normalizedAlphaTotal = (CGFloat)alphaTotal / (CGFloat)totalNumberOfPixels / 255.0; - if (_colorAverageProcessingFinishedBlock != NULL) + if (self->_colorAverageProcessingFinishedBlock != NULL) { - _colorAverageProcessingFinishedBlock(normalizedRedTotal, normalizedGreenTotal, normalizedBlueTotal, normalizedAlphaTotal, frameTime); + self->_colorAverageProcessingFinishedBlock(normalizedRedTotal, normalizedGreenTotal, normalizedBlueTotal, normalizedAlphaTotal, frameTime); } }); } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageColorPackingFilter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageColorPackingFilter.m index 1a087ca..e98ba09 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageColorPackingFilter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageColorPackingFilter.m @@ -100,9 +100,9 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; texelHeight = 0.5 / inputTextureSize.height; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext setActiveShaderProgram:filterProgram]; - glUniform1f(texelWidthUniform, texelWidth); - glUniform1f(texelHeightUniform, texelHeight); + [GPUImageContext setActiveShaderProgram:self->filterProgram]; + glUniform1f(self->texelWidthUniform, self->texelWidth); + glUniform1f(self->texelHeightUniform, self->texelHeight); }); } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageColourFASTSamplingOperation.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageColourFASTSamplingOperation.m index fc67f47..b2107fe 100755 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageColourFASTSamplingOperation.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageColourFASTSamplingOperation.m @@ -167,16 +167,16 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelHeight = 1.0 / filterFrameSize.height; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext setActiveShaderProgram:filterProgram]; - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + [GPUImageContext setActiveShaderProgram:self->filterProgram]; + if (GPUImageRotationSwapsWidthAndHeight(self->inputRotation)) { - glUniform1f(texelWidthUniform, _texelHeight); - glUniform1f(texelHeightUniform, _texelWidth); + glUniform1f(self->texelWidthUniform, self->_texelHeight); + glUniform1f(self->texelHeightUniform, self->_texelWidth); } else { - glUniform1f(texelWidthUniform, _texelWidth); - glUniform1f(texelHeightUniform, _texelHeight); + glUniform1f(self->texelWidthUniform, self->_texelWidth); + glUniform1f(self->texelHeightUniform, self->_texelHeight); } }); } @@ -201,4 +201,4 @@ - (void)setTexelHeight:(CGFloat)newValue; [self setFloat:_texelHeight forUniform:texelHeightUniform program:filterProgram]; } -@end \ No newline at end of file +@end diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageCrosshairGenerator.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageCrosshairGenerator.m index 9e2a29a..9c70fc3 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageCrosshairGenerator.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageCrosshairGenerator.m @@ -71,8 +71,8 @@ - (id)init; } runSynchronouslyOnVideoProcessingQueue(^{ - crosshairWidthUniform = [filterProgram uniformIndex:@"crosshairWidth"]; - crosshairColorUniform = [filterProgram uniformIndex:@"crosshairColor"]; + self->crosshairWidthUniform = [self->filterProgram uniformIndex:@"crosshairWidth"]; + self->crosshairColorUniform = [self->filterProgram uniformIndex:@"crosshairColor"]; self.crosshairWidth = 5.0; [self setCrosshairColorRed:0.0 green:1.0 blue:0.0]; @@ -92,7 +92,7 @@ - (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInte } runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:self->filterProgram]; #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE #else @@ -100,13 +100,13 @@ - (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInte glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); #endif - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; - [outputFramebuffer activateFramebuffer]; + self->outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; + [self->outputFramebuffer activateFramebuffer]; glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); - glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, crosshairCoordinates); + glVertexAttribPointer(self->filterPositionAttribute, 2, GL_FLOAT, 0, 0, crosshairCoordinates); glDrawArrays(GL_POINTS, 0, (GLsizei)numberOfCrosshairs); diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m index b442f3a..d317b2f 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m @@ -96,9 +96,9 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelHeight = 1.0 / filterFrameSize.height; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext setActiveShaderProgram:filterProgram]; - glUniform1f(texelWidthUniform, _texelWidth); - glUniform1f(texelHeightUniform, _texelHeight); + [GPUImageContext setActiveShaderProgram:self->filterProgram]; + glUniform1f(self->texelWidthUniform, self->_texelWidth); + glUniform1f(self->texelHeightUniform, self->_texelHeight); }); } } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageFilter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageFilter.m index 406d707..96d8563 100755 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageFilter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageFilter.m @@ -76,33 +76,33 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - filterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString]; + self->filterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString]; - if (!filterProgram.initialized) + if (!self->filterProgram.initialized) { [self initializeAttributes]; - if (![filterProgram link]) + if (![self->filterProgram link]) { - NSString *progLog = [filterProgram programLog]; + NSString *progLog = [self->filterProgram programLog]; NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [filterProgram fragmentShaderLog]; + NSString *fragLog = [self->filterProgram fragmentShaderLog]; NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [filterProgram vertexShaderLog]; + NSString *vertLog = [self->filterProgram vertexShaderLog]; NSLog(@"Vertex shader compile log: %@", vertLog); - filterProgram = nil; + self->filterProgram = nil; NSAssert(NO, @"Filter shader link failed"); } } - filterPositionAttribute = [filterProgram attributeIndex:@"position"]; - filterTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate"]; - filterInputTextureUniform = [filterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader + self->filterPositionAttribute = [self->filterProgram attributeIndex:@"position"]; + self->filterTextureCoordinateAttribute = [self->filterProgram attributeIndex:@"inputTextureCoordinate"]; + self->filterInputTextureUniform = [self->filterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader - [GPUImageContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:self->filterProgram]; - glEnableVertexAttribArray(filterPositionAttribute); - glEnableVertexAttribArray(filterTextureCoordinateAttribute); + glEnableVertexAttribArray(self->filterPositionAttribute); + glEnableVertexAttribArray(self->filterTextureCoordinateAttribute); }); return self; diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageFourInputFilter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageFourInputFilter.m index bc660a3..b82558d 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageFourInputFilter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageFourInputFilter.m @@ -58,10 +58,10 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - filterFourthTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate4"]; + self->filterFourthTextureCoordinateAttribute = [self->filterProgram attributeIndex:@"inputTextureCoordinate4"]; - filterInputTextureUniform4 = [filterProgram uniformIndex:@"inputImageTexture4"]; // This does assume a name of "inputImageTexture3" for the third input texture in the fragment shader - glEnableVertexAttribArray(filterFourthTextureCoordinateAttribute); + self->filterInputTextureUniform4 = [self->filterProgram uniformIndex:@"inputImageTexture4"]; // This does assume a name of "inputImageTexture3" for the third input texture in the fragment shader + glEnableVertexAttribArray(self->filterFourthTextureCoordinateAttribute); }); return self; diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageFramebuffer.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageFramebuffer.m index ea55c26..b71a2c9 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageFramebuffer.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageFramebuffer.m @@ -51,7 +51,7 @@ - (id)initWithSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)fbo runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; [self generateTexture]; - framebuffer = 0; + self->framebuffer = 0; }); } else @@ -133,8 +133,8 @@ - (void)generateFramebuffer; runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - glGenFramebuffers(1, &framebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + glGenFramebuffers(1, &self->framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, self->framebuffer); // By default, all framebuffers on iOS 5.0+ devices are backed by texture caches, using one shared cache if ([GPUImageContext supportsFastTextureUpload]) @@ -149,23 +149,23 @@ - (void)generateFramebuffer; attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty); - CVReturn err = CVPixelBufferCreate(kCFAllocatorDefault, (int)_size.width, (int)_size.height, kCVPixelFormatType_32BGRA, attrs, &renderTarget); + CVReturn err = CVPixelBufferCreate(kCFAllocatorDefault, (int)self->_size.width, (int)self->_size.height, kCVPixelFormatType_32BGRA, attrs, &self->renderTarget); if (err) { - NSLog(@"FBO size: %f, %f", _size.width, _size.height); + NSLog(@"FBO size: %f, %f", self->_size.width, self->_size.height); NSAssert(NO, @"Error at CVPixelBufferCreate %d", err); } - err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, coreVideoTextureCache, renderTarget, + err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, coreVideoTextureCache, self->renderTarget, NULL, // texture attributes GL_TEXTURE_2D, - _textureOptions.internalFormat, // opengl format - (int)_size.width, - (int)_size.height, - _textureOptions.format, // native iOS format - _textureOptions.type, + self->_textureOptions.internalFormat, // opengl format + (int)self.size.width, + (int)self.size.height, + self.textureOptions.format, // native iOS format + self.textureOptions.type, 0, - &renderTexture); + &self->renderTexture); if (err) { NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); @@ -174,22 +174,22 @@ - (void)generateFramebuffer; CFRelease(attrs); CFRelease(empty); - glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture)); - _texture = CVOpenGLESTextureGetName(renderTexture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, _textureOptions.wrapS); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, _textureOptions.wrapT); + glBindTexture(CVOpenGLESTextureGetTarget(self->renderTexture), CVOpenGLESTextureGetName(self->renderTexture)); + self->_texture = CVOpenGLESTextureGetName(self->renderTexture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self->_textureOptions.wrapS); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self->_textureOptions.wrapT); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(self->renderTexture), 0); #endif } else { [self generateTexture]; - glBindTexture(GL_TEXTURE_2D, _texture); + glBindTexture(GL_TEXTURE_2D, self->_texture); - glTexImage2D(GL_TEXTURE_2D, 0, _textureOptions.internalFormat, (int)_size.width, (int)_size.height, 0, _textureOptions.format, _textureOptions.type, 0); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _texture, 0); + glTexImage2D(GL_TEXTURE_2D, 0, self->_textureOptions.internalFormat, (int)self->_size.width, (int)self->_size.height, 0, self->_textureOptions.format, self->_textureOptions.type, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, self->_texture, 0); } #ifndef NS_BLOCK_ASSERTIONS @@ -206,32 +206,32 @@ - (void)destroyFramebuffer; runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - if (framebuffer) + if (self->framebuffer) { - glDeleteFramebuffers(1, &framebuffer); - framebuffer = 0; + glDeleteFramebuffers(1, &self->framebuffer); + self->framebuffer = 0; } - if ([GPUImageContext supportsFastTextureUpload] && (!_missingFramebuffer)) + if ([GPUImageContext supportsFastTextureUpload] && (!self->_missingFramebuffer)) { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - if (renderTarget) + if (self->renderTarget) { - CFRelease(renderTarget); - renderTarget = NULL; + CFRelease(self->renderTarget); + self->renderTarget = NULL; } - if (renderTexture) + if (self->renderTexture) { - CFRelease(renderTexture); - renderTexture = NULL; + CFRelease(self->renderTexture); + self->renderTexture = NULL; } #endif } else { - glDeleteTextures(1, &_texture); + glDeleteTextures(1, &self->_texture); } }); @@ -317,7 +317,7 @@ - (CGImageRef)newCGImageFromFramebufferContents; runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - NSUInteger totalBytesForImage = (int)_size.width * (int)_size.height * 4; + NSUInteger totalBytesForImage = (int)self->_size.width * (int)self->_size.height * 4; // It appears that the width of a texture must be padded out to be a multiple of 8 (32 bytes) if reading from it using a texture cache GLubyte *rawImagePixels; @@ -326,13 +326,13 @@ - (CGImageRef)newCGImageFromFramebufferContents; if ([GPUImageContext supportsFastTextureUpload]) { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - NSUInteger paddedWidthOfImage = CVPixelBufferGetBytesPerRow(renderTarget) / 4.0; - NSUInteger paddedBytesForImage = paddedWidthOfImage * (int)_size.height * 4; + NSUInteger paddedWidthOfImage = CVPixelBufferGetBytesPerRow(self->renderTarget) / 4.0; + NSUInteger paddedBytesForImage = paddedWidthOfImage * (int)self->_size.height * 4; glFinish(); - CFRetain(renderTarget); // I need to retain the pixel buffer here and release in the data source callback to prevent its bytes from being prematurely deallocated during a photo write operation + CFRetain(self->renderTarget); // I need to retain the pixel buffer here and release in the data source callback to prevent its bytes from being prematurely deallocated during a photo write operation [self lockForReading]; - rawImagePixels = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); + rawImagePixels = (GLubyte *)CVPixelBufferGetBaseAddress(self->renderTarget); dataProvider = CGDataProviderCreateWithData((__bridge_retained void*)self, rawImagePixels, paddedBytesForImage, dataProviderUnlockCallback); [[GPUImageContext sharedFramebufferCache] addFramebufferToActiveImageCaptureList:self]; // In case the framebuffer is swapped out on the filter, need to have a strong reference to it somewhere for it to hang on while the image is in existence #else @@ -342,7 +342,7 @@ - (CGImageRef)newCGImageFromFramebufferContents; { [self activateFramebuffer]; rawImagePixels = (GLubyte *)malloc(totalBytesForImage); - glReadPixels(0, 0, (int)_size.width, (int)_size.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); + glReadPixels(0, 0, (int)self->_size.width, (int)self->_size.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); dataProvider = CGDataProviderCreateWithData(NULL, rawImagePixels, totalBytesForImage, dataProviderReleaseCallback); [self unlock]; // Don't need to keep this around anymore } @@ -352,13 +352,13 @@ - (CGImageRef)newCGImageFromFramebufferContents; if ([GPUImageContext supportsFastTextureUpload]) { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - cgImageFromBytes = CGImageCreate((int)_size.width, (int)_size.height, 8, 32, CVPixelBufferGetBytesPerRow(renderTarget), defaultRGBColorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault); + cgImageFromBytes = CGImageCreate((int)self->_size.width, (int)self->_size.height, 8, 32, CVPixelBufferGetBytesPerRow(self->renderTarget), defaultRGBColorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault); #else #endif } else { - cgImageFromBytes = CGImageCreate((int)_size.width, (int)_size.height, 8, 32, 4 * (int)_size.width, defaultRGBColorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast, dataProvider, NULL, NO, kCGRenderingIntentDefault); + cgImageFromBytes = CGImageCreate((int)self->_size.width, (int)self->_size.height, 8, 32, 4 * (int)self->_size.width, defaultRGBColorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast, dataProvider, NULL, NO, kCGRenderingIntentDefault); } // Capture image with current device orientation diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageFramebufferCache.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageFramebufferCache.m index 53faf2c..aa6e4b1 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageFramebufferCache.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageFramebufferCache.m @@ -84,7 +84,7 @@ - (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize texture // dispatch_sync(framebufferCacheQueue, ^{ runSynchronouslyOnVideoProcessingQueue(^{ NSString *lookupHash = [self hashForSize:framebufferSize textureOptions:textureOptions onlyTexture:onlyTexture]; - NSNumber *numberOfMatchingTexturesInCache = [framebufferTypeCounts objectForKey:lookupHash]; + NSNumber *numberOfMatchingTexturesInCache = [self->framebufferTypeCounts objectForKey:lookupHash]; NSInteger numberOfMatchingTextures = [numberOfMatchingTexturesInCache integerValue]; if ([numberOfMatchingTexturesInCache integerValue] < 1) @@ -99,19 +99,19 @@ - (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize texture while ((framebufferFromCache == nil) && (currentTextureID >= 0)) { NSString *textureHash = [NSString stringWithFormat:@"%@-%ld", lookupHash, (long)currentTextureID]; - framebufferFromCache = [framebufferCache objectForKey:textureHash]; + framebufferFromCache = [self->framebufferCache objectForKey:textureHash]; // Test the values in the cache first, to see if they got invalidated behind our back if (framebufferFromCache != nil) { // Withdraw this from the cache while it's in use - [framebufferCache removeObjectForKey:textureHash]; + [self->framebufferCache removeObjectForKey:textureHash]; } currentTextureID--; } currentTextureID++; - [framebufferTypeCounts setObject:[NSNumber numberWithInteger:currentTextureID] forKey:lookupHash]; + [self->framebufferTypeCounts setObject:[NSNumber numberWithInteger:currentTextureID] forKey:lookupHash]; if (framebufferFromCache == nil) { @@ -147,14 +147,14 @@ - (void)returnFramebufferToCache:(GPUImageFramebuffer *)framebuffer; CGSize framebufferSize = framebuffer.size; GPUTextureOptions framebufferTextureOptions = framebuffer.textureOptions; NSString *lookupHash = [self hashForSize:framebufferSize textureOptions:framebufferTextureOptions onlyTexture:framebuffer.missingFramebuffer]; - NSNumber *numberOfMatchingTexturesInCache = [framebufferTypeCounts objectForKey:lookupHash]; + NSNumber *numberOfMatchingTexturesInCache = [self->framebufferTypeCounts objectForKey:lookupHash]; NSInteger numberOfMatchingTextures = [numberOfMatchingTexturesInCache integerValue]; NSString *textureHash = [NSString stringWithFormat:@"%@-%ld", lookupHash, (long)numberOfMatchingTextures]; // [framebufferCache setObject:framebuffer forKey:textureHash cost:round(framebufferSize.width * framebufferSize.height * 4.0)]; - [framebufferCache setObject:framebuffer forKey:textureHash]; - [framebufferTypeCounts setObject:[NSNumber numberWithInteger:(numberOfMatchingTextures + 1)] forKey:lookupHash]; + [self->framebufferCache setObject:framebuffer forKey:textureHash]; + [self->framebufferTypeCounts setObject:[NSNumber numberWithInteger:(numberOfMatchingTextures + 1)] forKey:lookupHash]; }); } @@ -162,8 +162,8 @@ - (void)purgeAllUnassignedFramebuffers; { runAsynchronouslyOnVideoProcessingQueue(^{ // dispatch_async(framebufferCacheQueue, ^{ - [framebufferCache removeAllObjects]; - [framebufferTypeCounts removeAllObjects]; + [self->framebufferCache removeAllObjects]; + [self->framebufferTypeCounts removeAllObjects]; #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CVOpenGLESTextureCacheFlush([[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], 0); #else @@ -175,7 +175,7 @@ - (void)addFramebufferToActiveImageCaptureList:(GPUImageFramebuffer *)framebuffe { runAsynchronouslyOnVideoProcessingQueue(^{ // dispatch_async(framebufferCacheQueue, ^{ - [activeImageCaptureList addObject:framebuffer]; + [self->activeImageCaptureList addObject:framebuffer]; }); } @@ -183,7 +183,7 @@ - (void)removeFramebufferFromActiveImageCaptureList:(GPUImageFramebuffer *)frame { runAsynchronouslyOnVideoProcessingQueue(^{ // dispatch_async(framebufferCacheQueue, ^{ - [activeImageCaptureList removeObject:framebuffer]; + [self->activeImageCaptureList removeObject:framebuffer]; }); } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageGaussianBlurFilter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageGaussianBlurFilter.m index ec99352..65e25f1 100755 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageGaussianBlurFilter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageGaussianBlurFilter.m @@ -383,64 +383,64 @@ - (void)switchToVertexShader:(NSString *)newVertexShader fragmentShader:(NSStrin runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - filterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:newVertexShader fragmentShaderString:newFragmentShader]; + self->filterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:newVertexShader fragmentShaderString:newFragmentShader]; - if (!filterProgram.initialized) + if (!self->filterProgram.initialized) { [self initializeAttributes]; - if (![filterProgram link]) + if (![self->filterProgram link]) { - NSString *progLog = [filterProgram programLog]; + NSString *progLog = [self->filterProgram programLog]; NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [filterProgram fragmentShaderLog]; + NSString *fragLog = [self->filterProgram fragmentShaderLog]; NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [filterProgram vertexShaderLog]; + NSString *vertLog = [self->filterProgram vertexShaderLog]; NSLog(@"Vertex shader compile log: %@", vertLog); - filterProgram = nil; + self->filterProgram = nil; NSAssert(NO, @"Filter shader link failed"); } } - filterPositionAttribute = [filterProgram attributeIndex:@"position"]; - filterTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate"]; - filterInputTextureUniform = [filterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader - verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; - verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; - [GPUImageContext setActiveShaderProgram:filterProgram]; + self->filterPositionAttribute = [self->filterProgram attributeIndex:@"position"]; + self->filterTextureCoordinateAttribute = [self->filterProgram attributeIndex:@"inputTextureCoordinate"]; + self->filterInputTextureUniform = [self->filterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader + self->verticalPassTexelWidthOffsetUniform = [self->filterProgram uniformIndex:@"texelWidthOffset"]; + self->verticalPassTexelHeightOffsetUniform = [self->filterProgram uniformIndex:@"texelHeightOffset"]; + [GPUImageContext setActiveShaderProgram:self->filterProgram]; - glEnableVertexAttribArray(filterPositionAttribute); - glEnableVertexAttribArray(filterTextureCoordinateAttribute); + glEnableVertexAttribArray(self->filterPositionAttribute); + glEnableVertexAttribArray(self->filterTextureCoordinateAttribute); - secondFilterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:newVertexShader fragmentShaderString:newFragmentShader]; + self->secondFilterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:newVertexShader fragmentShaderString:newFragmentShader]; - if (!secondFilterProgram.initialized) + if (!self->secondFilterProgram.initialized) { [self initializeSecondaryAttributes]; - if (![secondFilterProgram link]) + if (![self->secondFilterProgram link]) { - NSString *progLog = [secondFilterProgram programLog]; + NSString *progLog = [self->secondFilterProgram programLog]; NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [secondFilterProgram fragmentShaderLog]; + NSString *fragLog = [self->secondFilterProgram fragmentShaderLog]; NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [secondFilterProgram vertexShaderLog]; + NSString *vertLog = [self->secondFilterProgram vertexShaderLog]; NSLog(@"Vertex shader compile log: %@", vertLog); - secondFilterProgram = nil; + self->secondFilterProgram = nil; NSAssert(NO, @"Filter shader link failed"); } } - secondFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; - secondFilterTextureCoordinateAttribute = [secondFilterProgram attributeIndex:@"inputTextureCoordinate"]; - secondFilterInputTextureUniform = [secondFilterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader - secondFilterInputTextureUniform2 = [secondFilterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader - horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; - horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; - [GPUImageContext setActiveShaderProgram:secondFilterProgram]; - - glEnableVertexAttribArray(secondFilterPositionAttribute); - glEnableVertexAttribArray(secondFilterTextureCoordinateAttribute); + self->secondFilterPositionAttribute = [self->secondFilterProgram attributeIndex:@"position"]; + self->secondFilterTextureCoordinateAttribute = [self->secondFilterProgram attributeIndex:@"inputTextureCoordinate"]; + self->secondFilterInputTextureUniform = [self->secondFilterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader + self->secondFilterInputTextureUniform2 = [self->secondFilterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader + self->horizontalPassTexelWidthOffsetUniform = [self->secondFilterProgram uniformIndex:@"texelWidthOffset"]; + self->horizontalPassTexelHeightOffsetUniform = [self->secondFilterProgram uniformIndex:@"texelHeightOffset"]; + [GPUImageContext setActiveShaderProgram:self->secondFilterProgram]; + + glEnableVertexAttribArray(self->secondFilterPositionAttribute); + glEnableVertexAttribArray(self->secondFilterTextureCoordinateAttribute); [self setupFilterForSize:[self sizeOfFBO]]; glFinish(); diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageHistogramFilter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageHistogramFilter.m index bb7acce..9664144 100755 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageHistogramFilter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageHistogramFilter.m @@ -145,50 +145,50 @@ - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - secondFilterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageGreenHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; - thirdFilterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageBlueHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; + self->secondFilterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageGreenHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; + self->thirdFilterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageBlueHistogramSamplingVertexShaderString fragmentShaderString:kGPUImageHistogramAccumulationFragmentShaderString]; - if (!secondFilterProgram.initialized) + if (!self->secondFilterProgram.initialized) { [self initializeSecondaryAttributes]; - if (![secondFilterProgram link]) + if (![self->secondFilterProgram link]) { - NSString *progLog = [secondFilterProgram programLog]; + NSString *progLog = [self->secondFilterProgram programLog]; NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [secondFilterProgram fragmentShaderLog]; + NSString *fragLog = [self->secondFilterProgram fragmentShaderLog]; NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [secondFilterProgram vertexShaderLog]; + NSString *vertLog = [self->secondFilterProgram vertexShaderLog]; NSLog(@"Vertex shader compile log: %@", vertLog); - filterProgram = nil; + self->filterProgram = nil; NSAssert(NO, @"Filter shader link failed"); } - [GPUImageContext setActiveShaderProgram:secondFilterProgram]; + [GPUImageContext setActiveShaderProgram:self->secondFilterProgram]; - glEnableVertexAttribArray(secondFilterPositionAttribute); + glEnableVertexAttribArray(self->secondFilterPositionAttribute); - if (![thirdFilterProgram link]) + if (![self->thirdFilterProgram link]) { - NSString *progLog = [secondFilterProgram programLog]; + NSString *progLog = [self->secondFilterProgram programLog]; NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [secondFilterProgram fragmentShaderLog]; + NSString *fragLog = [self->secondFilterProgram fragmentShaderLog]; NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [secondFilterProgram vertexShaderLog]; + NSString *vertLog = [self->secondFilterProgram vertexShaderLog]; NSLog(@"Vertex shader compile log: %@", vertLog); - filterProgram = nil; + self->filterProgram = nil; NSAssert(NO, @"Filter shader link failed"); } } - secondFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; + self->secondFilterPositionAttribute = [self->secondFilterProgram attributeIndex:@"position"]; - thirdFilterPositionAttribute = [thirdFilterProgram attributeIndex:@"position"]; - [GPUImageContext setActiveShaderProgram:thirdFilterProgram]; + self->thirdFilterPositionAttribute = [self->thirdFilterProgram attributeIndex:@"position"]; + [GPUImageContext setActiveShaderProgram:self->thirdFilterProgram]; - glEnableVertexAttribArray(thirdFilterPositionAttribute); + glEnableVertexAttribArray(self->thirdFilterPositionAttribute); }); }; break; } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageLanczosResamplingFilter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageLanczosResamplingFilter.m index a655f48..506359d 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageLanczosResamplingFilter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageLanczosResamplingFilter.m @@ -145,19 +145,19 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; { runSynchronouslyOnVideoProcessingQueue(^{ // The first pass through the framebuffer may rotate the inbound image, so need to account for that by changing up the kernel ordering for that pass - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + if (GPUImageRotationSwapsWidthAndHeight(self->inputRotation)) { - verticalPassTexelWidthOffset = 1.0 / _originalImageSize.height; - verticalPassTexelHeightOffset = 0.0; + self->verticalPassTexelWidthOffset = 1.0 / self->_originalImageSize.height; + self->verticalPassTexelHeightOffset = 0.0; } else { - verticalPassTexelWidthOffset = 0.0; - verticalPassTexelHeightOffset = 1.0 / _originalImageSize.height; + self->verticalPassTexelWidthOffset = 0.0; + self->verticalPassTexelHeightOffset = 1.0 / self->_originalImageSize.height; } - horizontalPassTexelWidthOffset = 1.0 / _originalImageSize.width; - horizontalPassTexelHeightOffset = 0.0; + self->horizontalPassTexelWidthOffset = 1.0 / self->_originalImageSize.width; + self->horizontalPassTexelHeightOffset = 0.0; }); } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageLineGenerator.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageLineGenerator.m index 85d93be..52b8662 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageLineGenerator.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageLineGenerator.m @@ -53,8 +53,8 @@ - (id)init; } runSynchronouslyOnVideoProcessingQueue(^{ - lineWidthUniform = [filterProgram uniformIndex:@"lineWidth"]; - lineColorUniform = [filterProgram uniformIndex:@"lineColor"]; + self->lineWidthUniform = [self->filterProgram uniformIndex:@"lineWidth"]; + self->lineColorUniform = [self->filterProgram uniformIndex:@"lineColor"]; self.lineWidth = 1.0; [self setLineColorRed:0.0 green:1.0 blue:0.0]; @@ -117,10 +117,10 @@ - (void)renderLinesFromArray:(GLfloat *)lineSlopeAndIntercepts count:(NSUInteger } runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:self->filterProgram]; - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; - [outputFramebuffer activateFramebuffer]; + self->outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; + [self->outputFramebuffer activateFramebuffer]; glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); @@ -129,7 +129,7 @@ - (void)renderLinesFromArray:(GLfloat *)lineSlopeAndIntercepts count:(NSUInteger glBlendFunc(GL_ONE, GL_ONE); glEnable(GL_BLEND); - glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, lineCoordinates); + glVertexAttribPointer(self->filterPositionAttribute, 2, GL_FLOAT, 0, 0, self->lineCoordinates); glDrawArrays(GL_LINES, 0, ((unsigned int)numberOfLines * 2)); glDisable(GL_BLEND); diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageLuminosity.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageLuminosity.m index 37f374a..f3b3cab 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageLuminosity.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageLuminosity.m @@ -127,37 +127,37 @@ - (id)init; runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - secondFilterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageColorAveragingVertexShaderString fragmentShaderString:kGPUImageLuminosityFragmentShaderString]; + self->secondFilterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageColorAveragingVertexShaderString fragmentShaderString:kGPUImageLuminosityFragmentShaderString]; - if (!secondFilterProgram.initialized) + if (!self->secondFilterProgram.initialized) { [self initializeSecondaryAttributes]; - if (![secondFilterProgram link]) + if (![self->secondFilterProgram link]) { - NSString *progLog = [secondFilterProgram programLog]; + NSString *progLog = [self->secondFilterProgram programLog]; NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [secondFilterProgram fragmentShaderLog]; + NSString *fragLog = [self->secondFilterProgram fragmentShaderLog]; NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [secondFilterProgram vertexShaderLog]; + NSString *vertLog = [self->secondFilterProgram vertexShaderLog]; NSLog(@"Vertex shader compile log: %@", vertLog); - filterProgram = nil; + self->filterProgram = nil; NSAssert(NO, @"Filter shader link failed"); } } - secondFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; - secondFilterTextureCoordinateAttribute = [secondFilterProgram attributeIndex:@"inputTextureCoordinate"]; - secondFilterInputTextureUniform = [secondFilterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader - secondFilterInputTextureUniform2 = [secondFilterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader + self->secondFilterPositionAttribute = [self->secondFilterProgram attributeIndex:@"position"]; + self->secondFilterTextureCoordinateAttribute = [self->secondFilterProgram attributeIndex:@"inputTextureCoordinate"]; + self->secondFilterInputTextureUniform = [self->secondFilterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader + self->secondFilterInputTextureUniform2 = [self->secondFilterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader - secondFilterTexelWidthUniform = [secondFilterProgram uniformIndex:@"texelWidth"]; - secondFilterTexelHeightUniform = [secondFilterProgram uniformIndex:@"texelHeight"]; + self->secondFilterTexelWidthUniform = [self->secondFilterProgram uniformIndex:@"texelWidth"]; + self->secondFilterTexelHeightUniform = [self->secondFilterProgram uniformIndex:@"texelHeight"]; - [GPUImageContext setActiveShaderProgram:secondFilterProgram]; + [GPUImageContext setActiveShaderProgram:self->secondFilterProgram]; - glEnableVertexAttribArray(secondFilterPositionAttribute); - glEnableVertexAttribArray(secondFilterTextureCoordinateAttribute); + glEnableVertexAttribArray(self->secondFilterPositionAttribute); + glEnableVertexAttribArray(self->secondFilterTextureCoordinateAttribute); }); return self; @@ -296,31 +296,31 @@ - (void)extractLuminosityAtFrameTime:(CMTime)frameTime; NSAssert(self.outputTextureOptions.internalFormat == GL_RGBA, @"The output texture format for this filter must be GL_RGBA."); NSAssert(self.outputTextureOptions.type == GL_UNSIGNED_BYTE, @"The type of the output texture of this filter must be GL_UNSIGNED_BYTE."); - NSUInteger totalNumberOfPixels = round(finalStageSize.width * finalStageSize.height); + NSUInteger totalNumberOfPixels = round(self->finalStageSize.width * self->finalStageSize.height); - if (rawImagePixels == NULL) + if (self->rawImagePixels == NULL) { - rawImagePixels = (GLubyte *)malloc(totalNumberOfPixels * 4); + self->rawImagePixels = (GLubyte *)malloc(totalNumberOfPixels * 4); } [GPUImageContext useImageProcessingContext]; - [outputFramebuffer activateFramebuffer]; + [self->outputFramebuffer activateFramebuffer]; - glReadPixels(0, 0, (int)finalStageSize.width, (int)finalStageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels); + glReadPixels(0, 0, (int)self->finalStageSize.width, (int)self->finalStageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, self->rawImagePixels); NSUInteger luminanceTotal = 0; NSUInteger byteIndex = 0; for (NSUInteger currentPixel = 0; currentPixel < totalNumberOfPixels; currentPixel++) { - luminanceTotal += rawImagePixels[byteIndex]; + luminanceTotal += self->rawImagePixels[byteIndex]; byteIndex += 4; } CGFloat normalizedLuminosityTotal = (CGFloat)luminanceTotal / (CGFloat)totalNumberOfPixels / 255.0; - if (_luminosityProcessingFinishedBlock != NULL) + if (self->_luminosityProcessingFinishedBlock != NULL) { - _luminosityProcessingFinishedBlock(normalizedLuminosityTotal, frameTime); + self->_luminosityProcessingFinishedBlock(normalizedLuminosityTotal, frameTime); } }); } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageMovie.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageMovie.m index 4da050f..7e3de6e 100755 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageMovie.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageMovie.m @@ -101,38 +101,38 @@ - (void)yuvConversionSetup; runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - _preferredConversion = kColorConversion709; - isFullYUVRange = YES; - yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVFullRangeConversionForLAFragmentShaderString]; + self->_preferredConversion = kColorConversion709; + self->isFullYUVRange = YES; + self->yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVFullRangeConversionForLAFragmentShaderString]; - if (!yuvConversionProgram.initialized) + if (!self->yuvConversionProgram.initialized) { - [yuvConversionProgram addAttribute:@"position"]; - [yuvConversionProgram addAttribute:@"inputTextureCoordinate"]; + [self->yuvConversionProgram addAttribute:@"position"]; + [self->yuvConversionProgram addAttribute:@"inputTextureCoordinate"]; - if (![yuvConversionProgram link]) + if (![self->yuvConversionProgram link]) { - NSString *progLog = [yuvConversionProgram programLog]; + NSString *progLog = [self->yuvConversionProgram programLog]; NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [yuvConversionProgram fragmentShaderLog]; + NSString *fragLog = [self->yuvConversionProgram fragmentShaderLog]; NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [yuvConversionProgram vertexShaderLog]; + NSString *vertLog = [self->yuvConversionProgram vertexShaderLog]; NSLog(@"Vertex shader compile log: %@", vertLog); - yuvConversionProgram = nil; + self->yuvConversionProgram = nil; NSAssert(NO, @"Filter shader link failed"); } } - yuvConversionPositionAttribute = [yuvConversionProgram attributeIndex:@"position"]; - yuvConversionTextureCoordinateAttribute = [yuvConversionProgram attributeIndex:@"inputTextureCoordinate"]; - yuvConversionLuminanceTextureUniform = [yuvConversionProgram uniformIndex:@"luminanceTexture"]; - yuvConversionChrominanceTextureUniform = [yuvConversionProgram uniformIndex:@"chrominanceTexture"]; - yuvConversionMatrixUniform = [yuvConversionProgram uniformIndex:@"colorConversionMatrix"]; + self->yuvConversionPositionAttribute = [self->yuvConversionProgram attributeIndex:@"position"]; + self->yuvConversionTextureCoordinateAttribute = [self->yuvConversionProgram attributeIndex:@"inputTextureCoordinate"]; + self->yuvConversionLuminanceTextureUniform = [self->yuvConversionProgram uniformIndex:@"luminanceTexture"]; + self->yuvConversionChrominanceTextureUniform = [self->yuvConversionProgram uniformIndex:@"chrominanceTexture"]; + self->yuvConversionMatrixUniform = [self->yuvConversionProgram uniformIndex:@"colorConversionMatrix"]; - [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; + [GPUImageContext setActiveShaderProgram:self->yuvConversionProgram]; - glEnableVertexAttribArray(yuvConversionPositionAttribute); - glEnableVertexAttribArray(yuvConversionTextureCoordinateAttribute); + glEnableVertexAttribArray(self->yuvConversionPositionAttribute); + glEnableVertexAttribArray(self->yuvConversionTextureCoordinateAttribute); }); } } @@ -317,9 +317,9 @@ - (void)processPlayerItem runSynchronouslyOnVideoProcessingQueue(^{ #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkCallback:)]; - [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; - [displayLink setPaused:YES]; + self->displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkCallback:)]; + [self->displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; + [self->displayLink setPaused:YES]; #else // Suggested implementation: use CVDisplayLink http://stackoverflow.com/questions/14158743/alternative-of-cadisplaylink-for-mac-os-x CGDirectDisplayID displayID = CGMainDisplayID(); @@ -342,11 +342,11 @@ - (void)processPlayerItem else { [pixBuffAttributes setObject:@(kCVPixelFormatType_32BGRA) forKey:(id)kCVPixelBufferPixelFormatTypeKey]; } - playerItemOutput = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:pixBuffAttributes]; - [playerItemOutput setDelegate:self queue:videoProcessingQueue]; + self->playerItemOutput = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:pixBuffAttributes]; + [self->playerItemOutput setDelegate:self queue:videoProcessingQueue]; - [_playerItem addOutput:playerItemOutput]; - [playerItemOutput requestNotificationOfMediaDataChangeWithAdvanceInterval:0.1]; + [self->_playerItem addOutput:self->playerItemOutput]; + [self->playerItemOutput requestNotificationOfMediaDataChangeWithAdvanceInterval:0.1]; }); } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageOutput.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageOutput.m index d9bdaef..56f8159 100755 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageOutput.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageOutput.m @@ -225,10 +225,10 @@ - (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)text cachedMaximumOutputSize = CGSizeZero; runSynchronouslyOnVideoProcessingQueue(^{ [self setInputFramebufferForTarget:newTarget atIndex:textureLocation]; - [targets addObject:newTarget]; - [targetTextureIndices addObject:[NSNumber numberWithInteger:textureLocation]]; + [self->targets addObject:newTarget]; + [self->targetTextureIndices addObject:[NSNumber numberWithInteger:textureLocation]]; - allTargetsWantMonochromeData = allTargetsWantMonochromeData && [newTarget wantsMonochromeInput]; + self->allTargetsWantMonochromeData = self->allTargetsWantMonochromeData && [newTarget wantsMonochromeInput]; }); } @@ -253,8 +253,8 @@ - (void)removeTarget:(id)targetToRemove; [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; [targetToRemove setInputRotation:kGPUImageNoRotation atIndex:textureIndexOfTarget]; - [targetTextureIndices removeObjectAtIndex:indexOfObject]; - [targets removeObject:targetToRemove]; + [self->targetTextureIndices removeObjectAtIndex:indexOfObject]; + [self->targets removeObject:targetToRemove]; [targetToRemove endProcessing]; }); } @@ -263,18 +263,18 @@ - (void)removeAllTargets; { cachedMaximumOutputSize = CGSizeZero; runSynchronouslyOnVideoProcessingQueue(^{ - for (id targetToRemove in targets) + for (id targetToRemove in self->targets) { - NSInteger indexOfObject = [targets indexOfObject:targetToRemove]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + NSInteger indexOfObject = [self->targets indexOfObject:targetToRemove]; + NSInteger textureIndexOfTarget = [[self->targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [targetToRemove setInputSize:CGSizeZero atIndex:textureIndexOfTarget]; [targetToRemove setInputRotation:kGPUImageNoRotation atIndex:textureIndexOfTarget]; } - [targets removeAllObjects]; - [targetTextureIndices removeAllObjects]; + [self->targets removeAllObjects]; + [self->targetTextureIndices removeAllObjects]; - allTargetsWantMonochromeData = YES; + self->allTargetsWantMonochromeData = YES; }); } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageRawDataInput.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageRawDataInput.m index cfa3b12..05c2c87 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageRawDataInput.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageRawDataInput.m @@ -93,17 +93,17 @@ - (void)processData; CGSize pixelSizeOfImage = [self outputImageSize]; - for (id currentTarget in targets) + for (id currentTarget in self->targets) { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + NSInteger indexOfObject = [self->targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[self->targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; - [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; + [currentTarget setInputFramebuffer:self->outputFramebuffer atIndex:textureIndexOfTarget]; [currentTarget newFrameReadyAtTime:kCMTimeInvalid atIndex:textureIndexOfTarget]; } - dispatch_semaphore_signal(dataUpdateSemaphore); + dispatch_semaphore_signal(self->dataUpdateSemaphore); }); } @@ -118,16 +118,16 @@ - (void)processDataForTimestamp:(CMTime)frameTime; CGSize pixelSizeOfImage = [self outputImageSize]; - for (id currentTarget in targets) + for (id currentTarget in self->targets) { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + NSInteger indexOfObject = [self->targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[self->targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; [currentTarget newFrameReadyAtTime:frameTime atIndex:textureIndexOfTarget]; } - dispatch_semaphore_signal(dataUpdateSemaphore); + dispatch_semaphore_signal(self->dataUpdateSemaphore); }); } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageRawDataOutput.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageRawDataOutput.m index 18101e2..7f18c50 100755 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageRawDataOutput.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageRawDataOutput.m @@ -261,16 +261,16 @@ - (GLubyte *)rawBytesForImage; if ([GPUImageContext supportsFastTextureUpload]) { glFinish(); - _rawBytesForImage = [outputFramebuffer byteBuffer]; + self->_rawBytesForImage = [self->outputFramebuffer byteBuffer]; } else { - glReadPixels(0, 0, imageSize.width, imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, _rawBytesForImage); + glReadPixels(0, 0, self->imageSize.width, self->imageSize.height, GL_RGBA, GL_UNSIGNED_BYTE, self->_rawBytesForImage); // GL_EXT_read_format_bgra // glReadPixels(0, 0, imageSize.width, imageSize.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, _rawBytesForImage); } - hasReadFromTheCurrentFrame = YES; + self->hasReadFromTheCurrentFrame = YES; }); diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageSharpenFilter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageSharpenFilter.m index 6d7367a..c14b037 100755 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageSharpenFilter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageSharpenFilter.m @@ -118,17 +118,17 @@ - (id)init; - (void)setupFilterForSize:(CGSize)filterFrameSize; { runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:self->filterProgram]; - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + if (GPUImageRotationSwapsWidthAndHeight(self->inputRotation)) { - glUniform1f(imageWidthFactorUniform, 1.0 / filterFrameSize.height); - glUniform1f(imageHeightFactorUniform, 1.0 / filterFrameSize.width); + glUniform1f(self->imageWidthFactorUniform, 1.0 / filterFrameSize.height); + glUniform1f(self->imageHeightFactorUniform, 1.0 / filterFrameSize.width); } else { - glUniform1f(imageWidthFactorUniform, 1.0 / filterFrameSize.width); - glUniform1f(imageHeightFactorUniform, 1.0 / filterFrameSize.height); + glUniform1f(self->imageWidthFactorUniform, 1.0 / filterFrameSize.width); + glUniform1f(self->imageHeightFactorUniform, 1.0 / filterFrameSize.height); } }); } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageSobelEdgeDetectionFilter.m index e193f02..7aac23f 100755 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -126,9 +126,9 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; runSynchronouslyOnVideoProcessingQueue(^{ GLProgram *previousProgram = [GPUImageContext sharedImageProcessingContext].currentShaderProgram; - [GPUImageContext setActiveShaderProgram:secondFilterProgram]; - glUniform1f(texelWidthUniform, _texelWidth); - glUniform1f(texelHeightUniform, _texelHeight); + [GPUImageContext setActiveShaderProgram:self->secondFilterProgram]; + glUniform1f(self->texelWidthUniform, self->_texelWidth); + glUniform1f(self->texelHeightUniform, self->_texelHeight); [GPUImageContext setActiveShaderProgram:previousProgram]; }); } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageSolidColorGenerator.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageSolidColorGenerator.m index 9b555ce..512910b 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageSolidColorGenerator.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageSolidColorGenerator.m @@ -60,12 +60,12 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates } runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext setActiveShaderProgram:filterProgram]; + [GPUImageContext setActiveShaderProgram:self->filterProgram]; - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; - [outputFramebuffer activateFramebuffer]; + self->outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO]; + [self->outputFramebuffer activateFramebuffer]; - glClearColor(_color.one, _color.two, _color.three, _color.four); + glClearColor(self->_color.one, self->_color.two, self->_color.three, self->_color.four); glClear(GL_COLOR_BUFFER_BIT); }); } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageStillCamera.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageStillCamera.m index 447f79f..53737ab 100755 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageStillCamera.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageStillCamera.m @@ -161,7 +161,7 @@ - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *) if(!error){ filteredPhoto = [finalFilterInChain imageFromCurrentFramebuffer]; } - dispatch_semaphore_signal(frameRenderingSemaphore); + dispatch_semaphore_signal(self->frameRenderingSemaphore); block(filteredPhoto, error); }]; @@ -174,7 +174,7 @@ - (void)capturePhotoAsImageProcessedUpToFilter:(GPUImageOutput *) if(!error) { filteredPhoto = [finalFilterInChain imageFromCurrentFramebufferWithOrientation:orientation]; } - dispatch_semaphore_signal(frameRenderingSemaphore); + dispatch_semaphore_signal(self->frameRenderingSemaphore); block(filteredPhoto, error); }]; @@ -190,7 +190,7 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f if(!error){ @autoreleasepool { UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentFramebuffer]; - dispatch_semaphore_signal(frameRenderingSemaphore); + dispatch_semaphore_signal(self->frameRenderingSemaphore); // reportAvailableMemoryForGPUImage(@"After UIImage generation"); dataForJPEGFile = UIImageJPEGRepresentation(filteredPhoto,self.jpegCompressionQuality); @@ -199,7 +199,7 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f // reportAvailableMemoryForGPUImage(@"After autorelease pool"); }else{ - dispatch_semaphore_signal(frameRenderingSemaphore); + dispatch_semaphore_signal(self->frameRenderingSemaphore); } block(dataForJPEGFile, error); @@ -213,12 +213,12 @@ - (void)capturePhotoAsJPEGProcessedUpToFilter:(GPUImageOutput *)f if(!error) { @autoreleasepool { UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentFramebufferWithOrientation:orientation]; - dispatch_semaphore_signal(frameRenderingSemaphore); + dispatch_semaphore_signal(self->frameRenderingSemaphore); dataForJPEGFile = UIImageJPEGRepresentation(filteredPhoto, self.jpegCompressionQuality); } } else { - dispatch_semaphore_signal(frameRenderingSemaphore); + dispatch_semaphore_signal(self->frameRenderingSemaphore); } block(dataForJPEGFile, error); @@ -234,11 +234,11 @@ - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)fi if(!error){ @autoreleasepool { UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentFramebuffer]; - dispatch_semaphore_signal(frameRenderingSemaphore); + dispatch_semaphore_signal(self->frameRenderingSemaphore); dataForPNGFile = UIImagePNGRepresentation(filteredPhoto); } }else{ - dispatch_semaphore_signal(frameRenderingSemaphore); + dispatch_semaphore_signal(self->frameRenderingSemaphore); } block(dataForPNGFile, error); @@ -256,11 +256,11 @@ - (void)capturePhotoAsPNGProcessedUpToFilter:(GPUImageOutput *)fi if(!error){ @autoreleasepool { UIImage *filteredPhoto = [finalFilterInChain imageFromCurrentFramebufferWithOrientation:orientation]; - dispatch_semaphore_signal(frameRenderingSemaphore); + dispatch_semaphore_signal(self->frameRenderingSemaphore); dataForPNGFile = UIImagePNGRepresentation(filteredPhoto); } }else{ - dispatch_semaphore_signal(frameRenderingSemaphore); + dispatch_semaphore_signal(self->frameRenderingSemaphore); } block(dataForPNGFile, error); @@ -304,32 +304,32 @@ - (void)capturePhotoProcessedUpToFilter:(GPUImageOutput *)finalFi GPUImageCreateResizedSampleBuffer(cameraFrame, scaledImageSizeToFitOnGPU, &sampleBuffer); } - dispatch_semaphore_signal(frameRenderingSemaphore); + dispatch_semaphore_signal(self->frameRenderingSemaphore); [finalFilterInChain useNextFrameForImageCapture]; - [self captureOutput:photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; - dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + [self captureOutput:self->photoOutput didOutputSampleBuffer:sampleBuffer fromConnection:[[self->photoOutput connections] objectAtIndex:0]]; + dispatch_semaphore_wait(self->frameRenderingSemaphore, DISPATCH_TIME_FOREVER); if (sampleBuffer != NULL) CFRelease(sampleBuffer); } else { // This is a workaround for the corrupt images that are sometimes returned when taking a photo with the front camera and using the iOS 5.0 texture caches - AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; - if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageContext supportsFastTextureUpload]) || !requiresFrontCameraTextureCacheCorruptionWorkaround) + AVCaptureDevicePosition currentCameraPosition = [[self->videoInput device] position]; + if ( (currentCameraPosition != AVCaptureDevicePositionFront) || (![GPUImageContext supportsFastTextureUpload]) || !self->requiresFrontCameraTextureCacheCorruptionWorkaround) { - dispatch_semaphore_signal(frameRenderingSemaphore); + dispatch_semaphore_signal(self->frameRenderingSemaphore); [finalFilterInChain useNextFrameForImageCapture]; - [self captureOutput:photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[photoOutput connections] objectAtIndex:0]]; - dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_FOREVER); + [self captureOutput:self->photoOutput didOutputSampleBuffer:imageSampleBuffer fromConnection:[[self->photoOutput connections] objectAtIndex:0]]; + dispatch_semaphore_wait(self->frameRenderingSemaphore, DISPATCH_TIME_FOREVER); } } CFDictionaryRef metadata = CMCopyDictionaryOfAttachments(NULL, imageSampleBuffer, kCMAttachmentMode_ShouldPropagate); - _currentCaptureMetadata = (__bridge_transfer NSDictionary *)metadata; + self->_currentCaptureMetadata = (__bridge_transfer NSDictionary *)metadata; block(nil); - _currentCaptureMetadata = nil; + self->_currentCaptureMetadata = nil; }]; } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTextureInput.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTextureInput.m index ad3ca1d..c7f62cc 100755 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTextureInput.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTextureInput.m @@ -19,7 +19,7 @@ - (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize; textureSize = newTextureSize; runSynchronouslyOnVideoProcessingQueue(^{ - outputFramebuffer = [[GPUImageFramebuffer alloc] initWithSize:newTextureSize overriddenTexture:newInputTexture]; + self->outputFramebuffer = [[GPUImageFramebuffer alloc] initWithSize:newTextureSize overriddenTexture:newInputTexture]; }); return self; @@ -31,13 +31,13 @@ - (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize; - (void)processTextureWithFrameTime:(CMTime)frameTime; { runAsynchronouslyOnVideoProcessingQueue(^{ - for (id currentTarget in targets) + for (id currentTarget in self->targets) { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + NSInteger indexOfObject = [self->targets indexOfObject:currentTarget]; + NSInteger targetTextureIndex = [[self->targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - [currentTarget setInputSize:textureSize atIndex:targetTextureIndex]; - [currentTarget setInputFramebuffer:outputFramebuffer atIndex:targetTextureIndex]; + [currentTarget setInputSize:self->textureSize atIndex:targetTextureIndex]; + [currentTarget setInputFramebuffer:self->outputFramebuffer atIndex:targetTextureIndex]; [currentTarget newFrameReadyAtTime:frameTime atIndex:targetTextureIndex]; } }); diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageThreeInputFilter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageThreeInputFilter.m index 2f4f113..89f62da 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageThreeInputFilter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageThreeInputFilter.m @@ -55,10 +55,10 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - filterThirdTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate3"]; + self->filterThirdTextureCoordinateAttribute = [self->filterProgram attributeIndex:@"inputTextureCoordinate3"]; - filterInputTextureUniform3 = [filterProgram uniformIndex:@"inputImageTexture3"]; // This does assume a name of "inputImageTexture3" for the third input texture in the fragment shader - glEnableVertexAttribArray(filterThirdTextureCoordinateAttribute); + self->filterInputTextureUniform3 = [self->filterProgram uniformIndex:@"inputImageTexture3"]; // This does assume a name of "inputImageTexture3" for the third input texture in the fragment shader + glEnableVertexAttribArray(self->filterThirdTextureCoordinateAttribute); }); return self; diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageToneCurveFilter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageToneCurveFilter.m index 18a717e..fa2f9d3 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageToneCurveFilter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageToneCurveFilter.m @@ -232,11 +232,11 @@ - (void)dealloc runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - if (toneCurveTexture) + if (self->toneCurveTexture) { - glDeleteTextures(1, &toneCurveTexture); - toneCurveTexture = 0; - free(toneCurveByteArray); + glDeleteTextures(1, &self->toneCurveTexture); + self->toneCurveTexture = 0; + free(self->toneCurveByteArray); } }); } @@ -487,39 +487,39 @@ - (void)updateToneCurveTexture; { runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - if (!toneCurveTexture) + if (!self->toneCurveTexture) { glActiveTexture(GL_TEXTURE3); - glGenTextures(1, &toneCurveTexture); - glBindTexture(GL_TEXTURE_2D, toneCurveTexture); + glGenTextures(1, &self->toneCurveTexture); + glBindTexture(GL_TEXTURE_2D, self->toneCurveTexture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - toneCurveByteArray = calloc(256 * 4, sizeof(GLubyte)); + self->toneCurveByteArray = calloc(256 * 4, sizeof(GLubyte)); } else { glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, toneCurveTexture); + glBindTexture(GL_TEXTURE_2D, self->toneCurveTexture); } - if ( ([_redCurve count] >= 256) && ([_greenCurve count] >= 256) && ([_blueCurve count] >= 256) && ([_rgbCompositeCurve count] >= 256)) + if ( ([self->_redCurve count] >= 256) && ([self->_greenCurve count] >= 256) && ([self->_blueCurve count] >= 256) && ([self->_rgbCompositeCurve count] >= 256)) { for (unsigned int currentCurveIndex = 0; currentCurveIndex < 256; currentCurveIndex++) { // BGRA for upload to texture - GLubyte b = fmin(fmax(currentCurveIndex + [[_blueCurve objectAtIndex:currentCurveIndex] floatValue], 0), 255); - toneCurveByteArray[currentCurveIndex * 4] = fmin(fmax(b + [[_rgbCompositeCurve objectAtIndex:b] floatValue], 0), 255); - GLubyte g = fmin(fmax(currentCurveIndex + [[_greenCurve objectAtIndex:currentCurveIndex] floatValue], 0), 255); - toneCurveByteArray[currentCurveIndex * 4 + 1] = fmin(fmax(g + [[_rgbCompositeCurve objectAtIndex:g] floatValue], 0), 255); - GLubyte r = fmin(fmax(currentCurveIndex + [[_redCurve objectAtIndex:currentCurveIndex] floatValue], 0), 255); - toneCurveByteArray[currentCurveIndex * 4 + 2] = fmin(fmax(r + [[_rgbCompositeCurve objectAtIndex:r] floatValue], 0), 255); - toneCurveByteArray[currentCurveIndex * 4 + 3] = 255; + GLubyte b = fmin(fmax(currentCurveIndex + [[self->_blueCurve objectAtIndex:currentCurveIndex] floatValue], 0), 255); + self->toneCurveByteArray[currentCurveIndex * 4] = fmin(fmax(b + [[self->_rgbCompositeCurve objectAtIndex:b] floatValue], 0), 255); + GLubyte g = fmin(fmax(currentCurveIndex + [[self->_greenCurve objectAtIndex:currentCurveIndex] floatValue], 0), 255); + self->toneCurveByteArray[currentCurveIndex * 4 + 1] = fmin(fmax(g + [[self->_rgbCompositeCurve objectAtIndex:g] floatValue], 0), 255); + GLubyte r = fmin(fmax(currentCurveIndex + [[self->_redCurve objectAtIndex:currentCurveIndex] floatValue], 0), 255); + self->toneCurveByteArray[currentCurveIndex * 4 + 2] = fmin(fmax(r + [[self->_rgbCompositeCurve objectAtIndex:r] floatValue], 0), 255); + self->toneCurveByteArray[currentCurveIndex * 4 + 3] = 255; } - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256 /*width*/, 1 /*height*/, 0, GL_BGRA, GL_UNSIGNED_BYTE, toneCurveByteArray); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256 /*width*/, 1 /*height*/, 0, GL_BGRA, GL_UNSIGNED_BYTE, self->toneCurveByteArray); } }); } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m index aa338f8..6d9b6b3 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTwoInputCrossTextureSamplingFilter.m @@ -71,16 +71,16 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelHeight = 1.0 / filterFrameSize.height; runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext setActiveShaderProgram:filterProgram]; - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + [GPUImageContext setActiveShaderProgram:self->filterProgram]; + if (GPUImageRotationSwapsWidthAndHeight(self->inputRotation)) { - glUniform1f(texelWidthUniform, _texelHeight); - glUniform1f(texelHeightUniform, _texelWidth); + glUniform1f(self->texelWidthUniform, self->_texelHeight); + glUniform1f(self->texelHeightUniform, self->_texelWidth); } else { - glUniform1f(texelWidthUniform, _texelWidth); - glUniform1f(texelHeightUniform, _texelHeight); + glUniform1f(self->texelWidthUniform, self->_texelWidth); + glUniform1f(self->texelHeightUniform, self->_texelHeight); } }); } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTwoInputFilter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTwoInputFilter.m index cf31873..17c7a97 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTwoInputFilter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTwoInputFilter.m @@ -56,10 +56,10 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - filterSecondTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate2"]; + self->filterSecondTextureCoordinateAttribute = [self->filterProgram attributeIndex:@"inputTextureCoordinate2"]; - filterInputTextureUniform2 = [filterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader - glEnableVertexAttribArray(filterSecondTextureCoordinateAttribute); + self->filterInputTextureUniform2 = [self->filterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader + glEnableVertexAttribArray(self->filterSecondTextureCoordinateAttribute); }); return self; diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTwoPassFilter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTwoPassFilter.m index 9eb292b..da20514 100755 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTwoPassFilter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTwoPassFilter.m @@ -17,34 +17,34 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - secondFilterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:secondStageVertexShaderString fragmentShaderString:secondStageFragmentShaderString]; + self->secondFilterProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:secondStageVertexShaderString fragmentShaderString:secondStageFragmentShaderString]; - if (!secondFilterProgram.initialized) + if (!self->secondFilterProgram.initialized) { [self initializeSecondaryAttributes]; - if (![secondFilterProgram link]) + if (![self->secondFilterProgram link]) { - NSString *progLog = [secondFilterProgram programLog]; + NSString *progLog = [self->secondFilterProgram programLog]; NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [secondFilterProgram fragmentShaderLog]; + NSString *fragLog = [self->secondFilterProgram fragmentShaderLog]; NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [secondFilterProgram vertexShaderLog]; + NSString *vertLog = [self->secondFilterProgram vertexShaderLog]; NSLog(@"Vertex shader compile log: %@", vertLog); - secondFilterProgram = nil; + self->secondFilterProgram = nil; NSAssert(NO, @"Filter shader link failed"); } } - secondFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; - secondFilterTextureCoordinateAttribute = [secondFilterProgram attributeIndex:@"inputTextureCoordinate"]; - secondFilterInputTextureUniform = [secondFilterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader - secondFilterInputTextureUniform2 = [secondFilterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader + self->secondFilterPositionAttribute = [self->secondFilterProgram attributeIndex:@"position"]; + self->secondFilterTextureCoordinateAttribute = [self->secondFilterProgram attributeIndex:@"inputTextureCoordinate"]; + self->secondFilterInputTextureUniform = [self->secondFilterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader + self->secondFilterInputTextureUniform2 = [self->secondFilterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader - [GPUImageContext setActiveShaderProgram:secondFilterProgram]; + [GPUImageContext setActiveShaderProgram:self->secondFilterProgram]; - glEnableVertexAttribArray(secondFilterPositionAttribute); - glEnableVertexAttribArray(secondFilterTextureCoordinateAttribute); + glEnableVertexAttribArray(self->secondFilterPositionAttribute); + glEnableVertexAttribArray(self->secondFilterTextureCoordinateAttribute); }); return self; diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTwoPassTextureSamplingFilter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTwoPassTextureSamplingFilter.m index b6a2ec5..2511181 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTwoPassTextureSamplingFilter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageTwoPassTextureSamplingFilter.m @@ -18,11 +18,11 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - verticalPassTexelWidthOffsetUniform = [filterProgram uniformIndex:@"texelWidthOffset"]; - verticalPassTexelHeightOffsetUniform = [filterProgram uniformIndex:@"texelHeightOffset"]; + self->verticalPassTexelWidthOffsetUniform = [self->filterProgram uniformIndex:@"texelWidthOffset"]; + self->verticalPassTexelHeightOffsetUniform = [self->filterProgram uniformIndex:@"texelHeightOffset"]; - horizontalPassTexelWidthOffsetUniform = [secondFilterProgram uniformIndex:@"texelWidthOffset"]; - horizontalPassTexelHeightOffsetUniform = [secondFilterProgram uniformIndex:@"texelHeightOffset"]; + self->horizontalPassTexelWidthOffsetUniform = [self->secondFilterProgram uniformIndex:@"texelWidthOffset"]; + self->horizontalPassTexelHeightOffsetUniform = [self->secondFilterProgram uniformIndex:@"texelHeightOffset"]; }); self.verticalTexelSpacing = 1.0; @@ -51,19 +51,19 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; { runSynchronouslyOnVideoProcessingQueue(^{ // The first pass through the framebuffer may rotate the inbound image, so need to account for that by changing up the kernel ordering for that pass - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + if (GPUImageRotationSwapsWidthAndHeight(self->inputRotation)) { - verticalPassTexelWidthOffset = _verticalTexelSpacing / filterFrameSize.height; - verticalPassTexelHeightOffset = 0.0; + self->verticalPassTexelWidthOffset = self->_verticalTexelSpacing / filterFrameSize.height; + self->verticalPassTexelHeightOffset = 0.0; } else { - verticalPassTexelWidthOffset = 0.0; - verticalPassTexelHeightOffset = _verticalTexelSpacing / filterFrameSize.height; + self->verticalPassTexelWidthOffset = 0.0; + self->verticalPassTexelHeightOffset = self->_verticalTexelSpacing / filterFrameSize.height; } - horizontalPassTexelWidthOffset = _horizontalTexelSpacing / filterFrameSize.width; - horizontalPassTexelHeightOffset = 0.0; + self->horizontalPassTexelWidthOffset = self->_horizontalTexelSpacing / filterFrameSize.width; + self->horizontalPassTexelHeightOffset = 0.0; }); } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageVideoCamera.m b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageVideoCamera.m index 18aa60c..9e9721e 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageVideoCamera.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/GPUImageVideoCamera.m @@ -153,7 +153,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD runSynchronouslyOnVideoProcessingQueue(^{ - if (captureAsYUV) + if (self->captureAsYUV) { [GPUImageContext useImageProcessingContext]; // if ([GPUImageContext deviceSupportsRedTextures]) @@ -162,45 +162,45 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD // } // else // { - if (isFullYUVRange) + if (self->isFullYUVRange) { - yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVFullRangeConversionForLAFragmentShaderString]; + self->yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVFullRangeConversionForLAFragmentShaderString]; } else { - yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForLAFragmentShaderString]; + self->yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForLAFragmentShaderString]; } // } - if (!yuvConversionProgram.initialized) + if (!self->yuvConversionProgram.initialized) { - [yuvConversionProgram addAttribute:@"position"]; - [yuvConversionProgram addAttribute:@"inputTextureCoordinate"]; + [self->yuvConversionProgram addAttribute:@"position"]; + [self->yuvConversionProgram addAttribute:@"inputTextureCoordinate"]; - if (![yuvConversionProgram link]) + if (![self->yuvConversionProgram link]) { - NSString *progLog = [yuvConversionProgram programLog]; + NSString *progLog = [self->yuvConversionProgram programLog]; NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [yuvConversionProgram fragmentShaderLog]; + NSString *fragLog = [self->yuvConversionProgram fragmentShaderLog]; NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [yuvConversionProgram vertexShaderLog]; + NSString *vertLog = [self->yuvConversionProgram vertexShaderLog]; NSLog(@"Vertex shader compile log: %@", vertLog); - yuvConversionProgram = nil; + self->yuvConversionProgram = nil; NSAssert(NO, @"Filter shader link failed"); } } - yuvConversionPositionAttribute = [yuvConversionProgram attributeIndex:@"position"]; - yuvConversionTextureCoordinateAttribute = [yuvConversionProgram attributeIndex:@"inputTextureCoordinate"]; - yuvConversionLuminanceTextureUniform = [yuvConversionProgram uniformIndex:@"luminanceTexture"]; - yuvConversionChrominanceTextureUniform = [yuvConversionProgram uniformIndex:@"chrominanceTexture"]; - yuvConversionMatrixUniform = [yuvConversionProgram uniformIndex:@"colorConversionMatrix"]; + self->yuvConversionPositionAttribute = [self->yuvConversionProgram attributeIndex:@"position"]; + self->yuvConversionTextureCoordinateAttribute = [self->yuvConversionProgram attributeIndex:@"inputTextureCoordinate"]; + self->yuvConversionLuminanceTextureUniform = [self->yuvConversionProgram uniformIndex:@"luminanceTexture"]; + self->yuvConversionChrominanceTextureUniform = [self->yuvConversionProgram uniformIndex:@"chrominanceTexture"]; + self->yuvConversionMatrixUniform = [self->yuvConversionProgram uniformIndex:@"colorConversionMatrix"]; - [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; + [GPUImageContext setActiveShaderProgram:self->yuvConversionProgram]; - glEnableVertexAttribArray(yuvConversionPositionAttribute); - glEnableVertexAttribArray(yuvConversionTextureCoordinateAttribute); + glEnableVertexAttribArray(self->yuvConversionPositionAttribute); + glEnableVertexAttribArray(self->yuvConversionTextureCoordinateAttribute); } }); @@ -896,7 +896,7 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CM [self processVideoSampleBuffer:sampleBuffer]; CFRelease(sampleBuffer); - dispatch_semaphore_signal(frameRenderingSemaphore); + dispatch_semaphore_signal(self->frameRenderingSemaphore); }); } } @@ -925,56 +925,56 @@ - (void)updateOrientationSendToTargets; // From the iOS 5.0 release notes: // In previous iOS versions, the front-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeLeft and the back-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeRight. - if (captureAsYUV && [GPUImageContext supportsFastTextureUpload]) + if (self->captureAsYUV && [GPUImageContext supportsFastTextureUpload]) { - outputRotation = kGPUImageNoRotation; + self->outputRotation = kGPUImageNoRotation; if ([self cameraPosition] == AVCaptureDevicePositionBack) { - if (_horizontallyMirrorRearFacingCamera) + if (self->_horizontallyMirrorRearFacingCamera) { - switch(_outputImageOrientation) + switch(self->_outputImageOrientation) { - case UIInterfaceOrientationPortrait:internalRotation = kGPUImageRotateRightFlipVertical; break; - case UIInterfaceOrientationPortraitUpsideDown:internalRotation = kGPUImageRotate180; break; - case UIInterfaceOrientationLandscapeLeft:internalRotation = kGPUImageFlipHorizonal; break; - case UIInterfaceOrientationLandscapeRight:internalRotation = kGPUImageFlipVertical; break; - default:internalRotation = kGPUImageNoRotation; + case UIInterfaceOrientationPortrait:self->internalRotation = kGPUImageRotateRightFlipVertical; break; + case UIInterfaceOrientationPortraitUpsideDown:self->internalRotation = kGPUImageRotate180; break; + case UIInterfaceOrientationLandscapeLeft:self->internalRotation = kGPUImageFlipHorizonal; break; + case UIInterfaceOrientationLandscapeRight:self->internalRotation = kGPUImageFlipVertical; break; + default:self->internalRotation = kGPUImageNoRotation; } } else { - switch(_outputImageOrientation) + switch(self->_outputImageOrientation) { - case UIInterfaceOrientationPortrait:internalRotation = kGPUImageRotateRight; break; - case UIInterfaceOrientationPortraitUpsideDown:internalRotation = kGPUImageRotateLeft; break; - case UIInterfaceOrientationLandscapeLeft:internalRotation = kGPUImageRotate180; break; - case UIInterfaceOrientationLandscapeRight:internalRotation = kGPUImageNoRotation; break; - default:internalRotation = kGPUImageNoRotation; + case UIInterfaceOrientationPortrait:self->internalRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationPortraitUpsideDown:self->internalRotation = kGPUImageRotateLeft; break; + case UIInterfaceOrientationLandscapeLeft:self->internalRotation = kGPUImageRotate180; break; + case UIInterfaceOrientationLandscapeRight:self->internalRotation = kGPUImageNoRotation; break; + default:self->internalRotation = kGPUImageNoRotation; } } } else { - if (_horizontallyMirrorFrontFacingCamera) + if (self->_horizontallyMirrorFrontFacingCamera) { - switch(_outputImageOrientation) + switch(self->_outputImageOrientation) { - case UIInterfaceOrientationPortrait:internalRotation = kGPUImageRotateRightFlipVertical; break; - case UIInterfaceOrientationPortraitUpsideDown:internalRotation = kGPUImageRotateRightFlipHorizontal; break; - case UIInterfaceOrientationLandscapeLeft:internalRotation = kGPUImageFlipHorizonal; break; - case UIInterfaceOrientationLandscapeRight:internalRotation = kGPUImageFlipVertical; break; - default:internalRotation = kGPUImageNoRotation; + case UIInterfaceOrientationPortrait:self->internalRotation = kGPUImageRotateRightFlipVertical; break; + case UIInterfaceOrientationPortraitUpsideDown:self->internalRotation = kGPUImageRotateRightFlipHorizontal; break; + case UIInterfaceOrientationLandscapeLeft:self->internalRotation = kGPUImageFlipHorizonal; break; + case UIInterfaceOrientationLandscapeRight:self->internalRotation = kGPUImageFlipVertical; break; + default:self->internalRotation = kGPUImageNoRotation; } } else { - switch(_outputImageOrientation) + switch(self->_outputImageOrientation) { - case UIInterfaceOrientationPortrait:internalRotation = kGPUImageRotateRight; break; - case UIInterfaceOrientationPortraitUpsideDown:internalRotation = kGPUImageRotateLeft; break; - case UIInterfaceOrientationLandscapeLeft:internalRotation = kGPUImageNoRotation; break; - case UIInterfaceOrientationLandscapeRight:internalRotation = kGPUImageRotate180; break; - default:internalRotation = kGPUImageNoRotation; + case UIInterfaceOrientationPortrait:self->internalRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationPortraitUpsideDown:self->internalRotation = kGPUImageRotateLeft; break; + case UIInterfaceOrientationLandscapeLeft:self->internalRotation = kGPUImageNoRotation; break; + case UIInterfaceOrientationLandscapeRight:self->internalRotation = kGPUImageRotate180; break; + default:self->internalRotation = kGPUImageNoRotation; } } } @@ -983,60 +983,60 @@ - (void)updateOrientationSendToTargets; { if ([self cameraPosition] == AVCaptureDevicePositionBack) { - if (_horizontallyMirrorRearFacingCamera) + if (self->_horizontallyMirrorRearFacingCamera) { - switch(_outputImageOrientation) + switch(self->_outputImageOrientation) { - case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRightFlipVertical; break; - case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotate180; break; - case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageFlipHorizonal; break; - case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageFlipVertical; break; - default:outputRotation = kGPUImageNoRotation; + case UIInterfaceOrientationPortrait:self->outputRotation = kGPUImageRotateRightFlipVertical; break; + case UIInterfaceOrientationPortraitUpsideDown:self->outputRotation = kGPUImageRotate180; break; + case UIInterfaceOrientationLandscapeLeft:self->outputRotation = kGPUImageFlipHorizonal; break; + case UIInterfaceOrientationLandscapeRight:self->outputRotation = kGPUImageFlipVertical; break; + default:self->outputRotation = kGPUImageNoRotation; } } else { - switch(_outputImageOrientation) + switch(self->_outputImageOrientation) { - case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; - case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; - case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageRotate180; break; - case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageNoRotation; break; - default:outputRotation = kGPUImageNoRotation; + case UIInterfaceOrientationPortrait:self->outputRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationPortraitUpsideDown:self->outputRotation = kGPUImageRotateLeft; break; + case UIInterfaceOrientationLandscapeLeft:self->outputRotation = kGPUImageRotate180; break; + case UIInterfaceOrientationLandscapeRight:self->outputRotation = kGPUImageNoRotation; break; + default:self->outputRotation = kGPUImageNoRotation; } } } else { - if (_horizontallyMirrorFrontFacingCamera) + if (self->_horizontallyMirrorFrontFacingCamera) { - switch(_outputImageOrientation) + switch(self->_outputImageOrientation) { - case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRightFlipVertical; break; - case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateRightFlipHorizontal; break; - case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageFlipHorizonal; break; - case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageFlipVertical; break; - default:outputRotation = kGPUImageNoRotation; + case UIInterfaceOrientationPortrait:self->outputRotation = kGPUImageRotateRightFlipVertical; break; + case UIInterfaceOrientationPortraitUpsideDown:self->outputRotation = kGPUImageRotateRightFlipHorizontal; break; + case UIInterfaceOrientationLandscapeLeft:self->outputRotation = kGPUImageFlipHorizonal; break; + case UIInterfaceOrientationLandscapeRight:self->outputRotation = kGPUImageFlipVertical; break; + default:self->outputRotation = kGPUImageNoRotation; } } else { - switch(_outputImageOrientation) + switch(self->_outputImageOrientation) { - case UIInterfaceOrientationPortrait:outputRotation = kGPUImageRotateRight; break; - case UIInterfaceOrientationPortraitUpsideDown:outputRotation = kGPUImageRotateLeft; break; - case UIInterfaceOrientationLandscapeLeft:outputRotation = kGPUImageNoRotation; break; - case UIInterfaceOrientationLandscapeRight:outputRotation = kGPUImageRotate180; break; - default:outputRotation = kGPUImageNoRotation; + case UIInterfaceOrientationPortrait:self->outputRotation = kGPUImageRotateRight; break; + case UIInterfaceOrientationPortraitUpsideDown:self->outputRotation = kGPUImageRotateLeft; break; + case UIInterfaceOrientationLandscapeLeft:self->outputRotation = kGPUImageNoRotation; break; + case UIInterfaceOrientationLandscapeRight:self->outputRotation = kGPUImageRotate180; break; + default:self->outputRotation = kGPUImageNoRotation; } } } } - for (id currentTarget in targets) + for (id currentTarget in self->targets) { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - [currentTarget setInputRotation:outputRotation atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; + NSInteger indexOfObject = [self->targets indexOfObject:currentTarget]; + [currentTarget setInputRotation:self->outputRotation atIndex:[[self->targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; } }); } diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImage.h b/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImage.h deleted file mode 100755 index 0546740..0000000 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImage.h +++ /dev/null @@ -1,167 +0,0 @@ -#import - -// Base classes -#import -#import - -// Sources -#import -#import -#import -#import -#import -#import -#import -#import - -// Filters -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -// Outputs -#import -#import -#import diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageAVCamera.h b/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageAVCamera.h deleted file mode 100755 index 54c1a2f..0000000 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageAVCamera.h +++ /dev/null @@ -1,132 +0,0 @@ -#import -#import -#import -#import "GPUImageContext.h" -#import "GPUImageOutput.h" - -//Delegate Protocal for Face Detection. -@protocol GPUImageVideoCameraDelegate - -@optional -- (void)willOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer; -@end - - -/** - A GPUImageOutput that provides frames from either camera -*/ -@interface GPUImageAVCamera : GPUImageOutput -{ - NSUInteger numberOfFramesCaptured; - CGFloat totalFrameTimeDuringCapture; - - AVCaptureSession *_captureSession; - AVCaptureDevice *_inputCamera; - AVCaptureDevice *_microphone; - AVCaptureDeviceInput *videoInput; - AVCaptureVideoDataOutput *videoOutput; - - BOOL capturePaused; - GPUImageRotationMode outputRotation; - dispatch_semaphore_t frameRenderingSemaphore; - - BOOL captureAsYUV; - GLuint luminanceTexture, chrominanceTexture; - - __unsafe_unretained id _delegate; -} - -/// The AVCaptureSession used to capture from the camera -@property(readonly, retain, nonatomic) AVCaptureSession *captureSession; - -/// This enables the capture session preset to be changed on the fly -@property (readwrite, nonatomic, copy) NSString *captureSessionPreset; - -/// This sets the frame rate of the camera (iOS 5 and above only) -/** - Setting this to 0 or below will set the frame rate back to the default setting for a particular preset. - */ -@property (readwrite) NSInteger frameRate; - -/// Easy way to tell if front-facing camera is present on device -@property (readonly, getter = isFrontFacingCameraPresent) BOOL frontFacingCameraPresent; - -/// This enables the benchmarking mode, which logs out instantaneous and average frame times to the console -@property(readwrite, nonatomic) BOOL runBenchmark; - -/// Use this property to manage camera settings. Focus point, exposure point, etc. -@property(readonly) AVCaptureDevice *inputCamera; - -/// These properties determine whether or not the two camera orientations should be mirrored. By default, both are NO. -@property(readwrite, nonatomic) BOOL horizontallyMirrorFrontFacingCamera, horizontallyMirrorRearFacingCamera; - -@property(nonatomic, assign) id delegate; - -/// @name Initialization and teardown - -+ (NSArray *)connectedCameraDevices; - -/** Begin a capture session - - See AVCaptureSession for acceptable values - - @param sessionPreset Session preset to use - @param cameraPosition Camera to capture from - */ -- (id)initWithDeviceUniqueID:(NSString *)deviceUniqueID; -- (id)initWithSessionPreset:(NSString *)sessionPreset deviceUniqueID:(NSString *)deviceUniqueID; -- (id)initWithSessionPreset:(NSString *)sessionPreset cameraDevice:(AVCaptureDevice *)cameraDevice; - -/** Tear down the capture session - */ -- (void)removeInputsAndOutputs; - -/// @name Manage the camera video stream - -/** Start camera capturing - */ -- (void)startCameraCapture; - -/** Stop camera capturing - */ -- (void)stopCameraCapture; - -/** Pause camera capturing - */ -- (void)pauseCameraCapture; - -/** Resume camera capturing - */ -- (void)resumeCameraCapture; - -/** Process a video sample - @param sampleBuffer Buffer to process - */ -- (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; - -/** Process an audio sample - @param sampleBuffer Buffer to process - */ -- (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; - -/** Get the position (front, rear) of the source camera - */ -- (AVCaptureDevicePosition)cameraPosition; - -/** Get the AVCaptureConnection of the source camera - */ -- (AVCaptureConnection *)videoCaptureConnection; - -/** This flips between the front and rear cameras - */ -- (void)rotateCamera; - -/// @name Benchmarking - -/** When benchmarking is enabled, this will keep a running average of the time from uploading, processing, and final recording or display - */ -- (CGFloat)averageFrameDurationDuringCapture; - -- (void)printSupportedPixelFormats; - -@end diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageAVCamera.m b/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageAVCamera.m deleted file mode 100644 index 4b26c75..0000000 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageAVCamera.m +++ /dev/null @@ -1,771 +0,0 @@ -#import "GPUImageAVCamera.h" -#import "GPUImageMovieWriter.h" -#import "GPUImageFilter.h" -#import "GPUImageColorConversion.h" - -#pragma mark - -#pragma mark Private methods and instance variables - -@interface GPUImageAVCamera () -{ - AVCaptureDeviceInput *audioInput; - AVCaptureAudioDataOutput *audioOutput; - NSDate *startingCaptureTime; - - NSInteger _frameRate; - - dispatch_queue_t cameraProcessingQueue, audioProcessingQueue; - - GLProgram *yuvConversionProgram; - GLint yuvConversionPositionAttribute, yuvConversionTextureCoordinateAttribute; - GLint yuvConversionLuminanceTextureUniform, yuvConversionChrominanceTextureUniform; - - int imageBufferWidth, imageBufferHeight; -} - -- (void)updateOrientationSendToTargets; -- (void)convertYUVToRGBOutput; - -@end - -@implementation GPUImageAVCamera - -@synthesize captureSessionPreset = _captureSessionPreset; -@synthesize captureSession = _captureSession; -@synthesize inputCamera = _inputCamera; -@synthesize runBenchmark = _runBenchmark; -@synthesize delegate = _delegate; -@synthesize horizontallyMirrorFrontFacingCamera = _horizontallyMirrorFrontFacingCamera, horizontallyMirrorRearFacingCamera = _horizontallyMirrorRearFacingCamera; - -#pragma mark - -#pragma mark Initialization and teardown - -+ (NSArray *)connectedCameraDevices; -{ - NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; - return devices; -} - -- (id)init; -{ - if (!(self = [self initWithSessionPreset:AVCaptureSessionPreset640x480 cameraDevice:nil])) - { - return nil; - } - - return self; -} - -- (id)initWithDeviceUniqueID:(NSString *)deviceUniqueID; -{ - if (!(self = [self initWithSessionPreset:AVCaptureSessionPreset640x480 deviceUniqueID:deviceUniqueID])) - { - return nil; - } - - return self; -} - -- (id)initWithSessionPreset:(NSString *)sessionPreset deviceUniqueID:(NSString *)deviceUniqueID; -{ - if (!(self = [self initWithSessionPreset:sessionPreset cameraDevice:[AVCaptureDevice deviceWithUniqueID:deviceUniqueID]])) - { - return nil; - } - - return self; -} - -- (id)initWithSessionPreset:(NSString *)sessionPreset cameraDevice:(AVCaptureDevice *)cameraDevice; -{ - if (!(self = [super init])) - { - return nil; - } - - cameraProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.cameraProcessingQueue", NULL); - audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.audioProcessingQueue", NULL); - frameRenderingSemaphore = dispatch_semaphore_create(1); - - _frameRate = 0; // This will not set frame rate unless this value gets set to 1 or above - _runBenchmark = NO; - capturePaused = NO; - outputRotation = kGPUImageNoRotation; -// captureAsYUV = YES; - captureAsYUV = NO; - - runSynchronouslyOnVideoProcessingQueue(^{ - - if (captureAsYUV) - { - [GPUImageContext useImageProcessingContext]; -// if ([GPUImageContext deviceSupportsRedTextures]) -// { -// yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForRGFragmentShaderString]; -// } -// else -// { - yuvConversionProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageYUVVideoRangeConversionForLAFragmentShaderString]; -// } - - if (!yuvConversionProgram.initialized) - { - [yuvConversionProgram addAttribute:@"position"]; - [yuvConversionProgram addAttribute:@"inputTextureCoordinate"]; - - if (![yuvConversionProgram link]) - { - NSString *progLog = [yuvConversionProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [yuvConversionProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [yuvConversionProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - yuvConversionProgram = nil; - NSAssert(NO, @"Filter shader link failed"); - } - } - - yuvConversionPositionAttribute = [yuvConversionProgram attributeIndex:@"position"]; - yuvConversionTextureCoordinateAttribute = [yuvConversionProgram attributeIndex:@"inputTextureCoordinate"]; - yuvConversionLuminanceTextureUniform = [yuvConversionProgram uniformIndex:@"luminanceTexture"]; - yuvConversionChrominanceTextureUniform = [yuvConversionProgram uniformIndex:@"chrominanceTexture"]; - - [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; - - glEnableVertexAttribArray(yuvConversionPositionAttribute); - glEnableVertexAttribArray(yuvConversionTextureCoordinateAttribute); - } - }); - - // Grab the back-facing or front-facing camera - _inputCamera = nil; - - if (cameraDevice == nil) - { - _inputCamera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; - } - else - { - _inputCamera = cameraDevice; - } - - if (!_inputCamera) { - return nil; - } - - // Create the capture session - _captureSession = [[AVCaptureSession alloc] init]; - - [_captureSession beginConfiguration]; - - // Add the video input - NSError *error = nil; - videoInput = [[AVCaptureDeviceInput alloc] initWithDevice:_inputCamera error:&error]; - if ([_captureSession canAddInput:videoInput]) - { - [_captureSession addInput:videoInput]; - } - - // Add the video frame output - videoOutput = [[AVCaptureVideoDataOutput alloc] init]; - [videoOutput setAlwaysDiscardsLateVideoFrames:NO]; - -// NSLog(@"Camera: %@", _inputCamera); -// [self printSupportedPixelFormats]; - -// if (captureAsYUV && [GPUImageContext deviceSupportsRedTextures]) - if (captureAsYUV && [GPUImageContext supportsFastTextureUpload]) - { - BOOL supportsFullYUVRange = NO; - NSArray *supportedPixelFormats = videoOutput.availableVideoCVPixelFormatTypes; - for (NSNumber *currentPixelFormat in supportedPixelFormats) - { - if ([currentPixelFormat intValue] == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) - { - supportsFullYUVRange = YES; - } - } - - if (supportsFullYUVRange) - { - [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; - } - else - { - [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; - } - } - else - { - // Despite returning a longer list of supported pixel formats, only RGB, RGBA, BGRA, and the YUV 4:2:2 variants seem to return cleanly - [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; -// [videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_422YpCbCr8_yuvs] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; - } - - [videoOutput setSampleBufferDelegate:self queue:cameraProcessingQueue]; -// [videoOutput setSampleBufferDelegate:self queue:[GPUImageContext sharedContextQueue]]; - if ([_captureSession canAddOutput:videoOutput]) - { - [_captureSession addOutput:videoOutput]; - } - else - { - NSLog(@"Couldn't add video output"); - return nil; - } - - _captureSessionPreset = sessionPreset; - [_captureSession setSessionPreset:_captureSessionPreset]; - -// This will let you get 60 FPS video from the 720p preset on an iPhone 4S, but only that device and that preset -// AVCaptureConnection *conn = [videoOutput connectionWithMediaType:AVMediaTypeVideo]; -// -// if (conn.supportsVideoMinFrameDuration) -// conn.videoMinFrameDuration = CMTimeMake(1,60); -// if (conn.supportsVideoMaxFrameDuration) -// conn.videoMaxFrameDuration = CMTimeMake(1,60); - - [_captureSession commitConfiguration]; - - return self; -} - -- (void)dealloc -{ - [self stopCameraCapture]; - [videoOutput setSampleBufferDelegate:nil queue:dispatch_get_main_queue()]; - [audioOutput setSampleBufferDelegate:nil queue:dispatch_get_main_queue()]; - - [self removeInputsAndOutputs]; - -// ARC forbids explicit message send of 'release'; since iOS 6 even for dispatch_release() calls: stripping it out in that case is required. -//#if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) -#if __MAC_OS_X_VERSION_MAX_ALLOWED <= __MAC_10_7 - if (cameraProcessingQueue != NULL) - { - dispatch_release(cameraProcessingQueue); - } - - if (audioProcessingQueue != NULL) - { - dispatch_release(audioProcessingQueue); - } - - if (frameRenderingSemaphore != NULL) - { - dispatch_release(frameRenderingSemaphore); - } -#endif -} - -- (void)removeInputsAndOutputs; -{ - [_captureSession removeInput:videoInput]; - [_captureSession removeOutput:videoOutput]; - if (_microphone != nil) - { - [_captureSession removeInput:audioInput]; - [_captureSession removeOutput:audioOutput]; - } -} - -#pragma mark - -#pragma mark Managing targets - -- (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)textureLocation; -{ - [super addTarget:newTarget atTextureLocation:textureLocation]; - - [newTarget setInputRotation:outputRotation atIndex:textureLocation]; -} - -#pragma mark - -#pragma mark Manage the camera video stream - -- (void)startCameraCapture; -{ - if (![_captureSession isRunning]) - { - startingCaptureTime = [NSDate date]; - [_captureSession startRunning]; - }; -} - -- (void)stopCameraCapture; -{ - if ([_captureSession isRunning]) - { - [_captureSession stopRunning]; - } -} - -- (void)pauseCameraCapture; -{ - capturePaused = YES; -} - -- (void)resumeCameraCapture; -{ - capturePaused = NO; -} - -- (void)rotateCamera -{ - if (self.frontFacingCameraPresent == NO) - return; - - NSError *error; - AVCaptureDeviceInput *newVideoInput; - AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position]; - - if (currentCameraPosition == AVCaptureDevicePositionBack) - { - currentCameraPosition = AVCaptureDevicePositionFront; - } - else - { - currentCameraPosition = AVCaptureDevicePositionBack; - } - - AVCaptureDevice *backFacingCamera = nil; - NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; - for (AVCaptureDevice *device in devices) - { - if ([device position] == currentCameraPosition) - { - backFacingCamera = device; - } - } - newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:backFacingCamera error:&error]; - - if (newVideoInput != nil) - { - [_captureSession beginConfiguration]; - - [_captureSession removeInput:videoInput]; - if ([_captureSession canAddInput:newVideoInput]) - { - [_captureSession addInput:newVideoInput]; - videoInput = newVideoInput; - } - else - { - [_captureSession addInput:videoInput]; - } - //captureSession.sessionPreset = oriPreset; - [_captureSession commitConfiguration]; - } - - _inputCamera = backFacingCamera; -} - -- (AVCaptureDevicePosition)cameraPosition -{ - return [[videoInput device] position]; -} - -- (BOOL)isFrontFacingCameraPresent; -{ - NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; - - for (AVCaptureDevice *device in devices) - { - if ([device position] == AVCaptureDevicePositionFront) - return YES; - } - - return NO; -} - -- (void)setCaptureSessionPreset:(NSString *)captureSessionPreset; -{ - [_captureSession beginConfiguration]; - - _captureSessionPreset = captureSessionPreset; - [_captureSession setSessionPreset:_captureSessionPreset]; - - [_captureSession commitConfiguration]; -} - -- (void)setFrameRate:(NSInteger)frameRate; -{ - _frameRate = frameRate; - - if (_frameRate > 0) - { - for (AVCaptureConnection *connection in videoOutput.connections) - { - if ([connection respondsToSelector:@selector(setVideoMinFrameDuration:)]) - connection.videoMinFrameDuration = CMTimeMake(1, (int32_t)_frameRate); - - } - } - else - { - for (AVCaptureConnection *connection in videoOutput.connections) - { - if ([connection respondsToSelector:@selector(setVideoMinFrameDuration:)]) - connection.videoMinFrameDuration = kCMTimeInvalid; // This sets videoMinFrameDuration back to default - } - } -} - -- (NSInteger)frameRate; -{ - return _frameRate; -} - -- (AVCaptureConnection *)videoCaptureConnection { - for (AVCaptureConnection *connection in [videoOutput connections] ) { - for ( AVCaptureInputPort *port in [connection inputPorts] ) { - if ( [[port mediaType] isEqual:AVMediaTypeVideo] ) { - return connection; - } - } - } - - return nil; -} - -#define INITIALFRAMESTOIGNOREFORBENCHMARK 5 - -- (void)updateTargetsForVideoCameraUsingCacheTextureAtWidth:(int)bufferWidth height:(int)bufferHeight time:(CMTime)currentTime; -{ - // First, update all the framebuffers in the targets - for (id currentTarget in targets) - { - if ([currentTarget enabled]) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - if (currentTarget != self.targetToIgnoreForUpdates) - { - [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; - [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; - - if ([currentTarget wantsMonochromeInput] && captureAsYUV) - { - [currentTarget setCurrentlyReceivingMonochromeInput:YES]; - // TODO: Replace optimization for monochrome output - [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; - } - else - { - [currentTarget setCurrentlyReceivingMonochromeInput:NO]; - [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; - } - } - else - { - [currentTarget setInputRotation:outputRotation atIndex:textureIndexOfTarget]; - [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; - } - } - } - - // Then release our hold on the local framebuffer to send it back to the cache as soon as it's no longer needed - [outputFramebuffer unlock]; - - // Finally, trigger rendering as needed - for (id currentTarget in targets) - { - if ([currentTarget enabled]) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - if (currentTarget != self.targetToIgnoreForUpdates) - { - [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; - } - } - } -} - -- (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; -{ - if (capturePaused) - { - return; - } - - CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); - CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(sampleBuffer); - GLsizei bufferWidth = (GLsizei)CVPixelBufferGetWidth(cameraFrame); - GLsizei bufferHeight = (GLsizei)CVPixelBufferGetHeight(cameraFrame); - - CMTime currentTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); - - [GPUImageContext useImageProcessingContext]; - - CVPixelBufferLockBaseAddress(cameraFrame, 0); - - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(bufferWidth, bufferHeight) onlyTexture:YES]; - - glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); - - // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); - - // Using BGRA extension to pull in video frame data directly -// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bytesPerRow / 3, bufferHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); -// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, CVPixelBufferGetBaseAddress(cameraFrame)); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame)); - - [self updateTargetsForVideoCameraUsingCacheTextureAtWidth:bufferWidth height:bufferHeight time:currentTime]; - -// for (id currentTarget in targets) -// { -// if ([currentTarget enabled]) -// { -// if (currentTarget != self.targetToIgnoreForUpdates) -// { -// NSInteger indexOfObject = [targets indexOfObject:currentTarget]; -// NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; -// -// [currentTarget setInputSize:CGSizeMake(bufferWidth, bufferHeight) atIndex:textureIndexOfTarget]; -// [currentTarget newFrameReadyAtTime:currentTime atIndex:textureIndexOfTarget]; -// } -// } -// } - - CVPixelBufferUnlockBaseAddress(cameraFrame, 0); - - if (_runBenchmark) - { - numberOfFramesCaptured++; - if (numberOfFramesCaptured > INITIALFRAMESTOIGNOREFORBENCHMARK) - { - CFAbsoluteTime currentFrameTime = (CFAbsoluteTimeGetCurrent() - startTime); - totalFrameTimeDuringCapture += currentFrameTime; - NSLog(@"Average frame time : %f ms", [self averageFrameDurationDuringCapture]); - NSLog(@"Current frame time : %f ms", 1000.0 * currentFrameTime); - } - } -} - -- (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer; -{ - [self.audioEncodingTarget processAudioBuffer:sampleBuffer]; -} - -- (void)convertYUVToRGBOutput; -{ - [GPUImageContext setActiveShaderProgram:yuvConversionProgram]; - - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(imageBufferWidth, imageBufferHeight) textureOptions:self.outputTextureOptions onlyTexture:NO]; - [outputFramebuffer activateFramebuffer]; - - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - static const GLfloat squareVertices[] = { - -1.0f, -1.0f, - 1.0f, -1.0f, - -1.0f, 1.0f, - 1.0f, 1.0f, - }; - - static const GLfloat textureCoordinates[] = { - 0.0f, 0.0f, - 1.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 1.0f, - }; - - glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, luminanceTexture); - glUniform1i(yuvConversionLuminanceTextureUniform, 4); - - glActiveTexture(GL_TEXTURE5); - glBindTexture(GL_TEXTURE_2D, chrominanceTexture); - glUniform1i(yuvConversionChrominanceTextureUniform, 5); - - glVertexAttribPointer(yuvConversionPositionAttribute, 2, GL_FLOAT, 0, 0, squareVertices); - glVertexAttribPointer(yuvConversionTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); -} - -#pragma mark - -#pragma mark Benchmarking - -- (CGFloat)averageFrameDurationDuringCapture; -{ - return (totalFrameTimeDuringCapture / (CGFloat)(numberOfFramesCaptured - INITIALFRAMESTOIGNOREFORBENCHMARK)) * 1000.0; -} - -#pragma mark - -#pragma mark AVCaptureVideoDataOutputSampleBufferDelegate - -- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection -{ - if (captureOutput == audioOutput) - { -// if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0) -// { -// return; -// } - - CFRetain(sampleBuffer); - runAsynchronouslyOnVideoProcessingQueue(^{ - [self processAudioSampleBuffer:sampleBuffer]; - CFRelease(sampleBuffer); -// dispatch_semaphore_signal(frameRenderingSemaphore); - }); - } - else - { - if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0) - { - return; - } - - CFRetain(sampleBuffer); - runAsynchronouslyOnVideoProcessingQueue(^{ - //Feature Detection Hook. - if (self.delegate && [self.delegate respondsToSelector:@selector(willOutputSampleBuffer:)]) - { - [self.delegate willOutputSampleBuffer:sampleBuffer]; - } - - [self processVideoSampleBuffer:sampleBuffer]; - - CFRelease(sampleBuffer); - dispatch_semaphore_signal(frameRenderingSemaphore); - }); - } -} - -#pragma mark - -#pragma mark Accessors - -- (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - [_captureSession beginConfiguration]; - - if (newValue == nil) - { - if (audioOutput) - { - [_captureSession removeInput:audioInput]; - [_captureSession removeOutput:audioOutput]; - audioInput = nil; - audioOutput = nil; - _microphone = nil; - } - } - else - { - _microphone = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; - audioInput = [AVCaptureDeviceInput deviceInputWithDevice:_microphone error:nil]; - if ([_captureSession canAddInput:audioInput]) - { - [_captureSession addInput:audioInput]; - } - audioOutput = [[AVCaptureAudioDataOutput alloc] init]; - - if ([_captureSession canAddOutput:audioOutput]) - { - [_captureSession addOutput:audioOutput]; - } - else - { - NSLog(@"Couldn't add audio output"); - } - [audioOutput setSampleBufferDelegate:self queue:audioProcessingQueue]; - } - - [_captureSession commitConfiguration]; - - [super setAudioEncodingTarget:newValue]; - }); -} - -- (void)updateOrientationSendToTargets; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - - // From the iOS 5.0 release notes: - // In previous iOS versions, the front-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeLeft and the back-facing camera would always deliver buffers in AVCaptureVideoOrientationLandscapeRight. - - outputRotation = kGPUImageNoRotation; - for (id currentTarget in targets) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - [currentTarget setInputRotation:outputRotation atIndex:[[targetTextureIndices objectAtIndex:indexOfObject] integerValue]]; - } - }); -} - -- (void)setHorizontallyMirrorFrontFacingCamera:(BOOL)newValue -{ - _horizontallyMirrorFrontFacingCamera = newValue; - [self updateOrientationSendToTargets]; -} - -- (void)setHorizontallyMirrorRearFacingCamera:(BOOL)newValue -{ - _horizontallyMirrorRearFacingCamera = newValue; - [self updateOrientationSendToTargets]; -} - -- (void)printSupportedPixelFormats; -{ - NSArray *supportedPixelFormats = videoOutput.availableVideoCVPixelFormatTypes; - for (NSNumber *currentPixelFormat in supportedPixelFormats) - { - NSString *pixelFormatName = nil; - - switch([currentPixelFormat intValue]) - { - case kCVPixelFormatType_1Monochrome: pixelFormatName = @"kCVPixelFormatType_1Monochrome"; break; - case kCVPixelFormatType_2Indexed: pixelFormatName = @"kCVPixelFormatType_2Indexed"; break; - case kCVPixelFormatType_4Indexed: pixelFormatName = @"kCVPixelFormatType_4Indexed"; break; - case kCVPixelFormatType_8Indexed: pixelFormatName = @"kCVPixelFormatType_8Indexed"; break; - case kCVPixelFormatType_1IndexedGray_WhiteIsZero: pixelFormatName = @"kCVPixelFormatType_1IndexedGray_WhiteIsZero"; break; - case kCVPixelFormatType_2IndexedGray_WhiteIsZero: pixelFormatName = @"kCVPixelFormatType_2IndexedGray_WhiteIsZero"; break; - case kCVPixelFormatType_4IndexedGray_WhiteIsZero: pixelFormatName = @"kCVPixelFormatType_4IndexedGray_WhiteIsZero"; break; - case kCVPixelFormatType_8IndexedGray_WhiteIsZero: pixelFormatName = @"kCVPixelFormatType_8IndexedGray_WhiteIsZero"; break; - case kCVPixelFormatType_16BE555: pixelFormatName = @"kCVPixelFormatType_16BE555"; break; - case kCVPixelFormatType_16LE555: pixelFormatName = @"kCVPixelFormatType_16LE555"; break; - case kCVPixelFormatType_16LE5551: pixelFormatName = @"kCVPixelFormatType_16LE5551"; break; - case kCVPixelFormatType_16BE565: pixelFormatName = @"kCVPixelFormatType_16BE565"; break; - case kCVPixelFormatType_16LE565: pixelFormatName = @"kCVPixelFormatType_16LE565"; break; - case kCVPixelFormatType_24RGB: pixelFormatName = @"kCVPixelFormatType_24RGB"; break; - case kCVPixelFormatType_24BGR: pixelFormatName = @"kCVPixelFormatType_24BGR"; break; - case kCVPixelFormatType_32ARGB: pixelFormatName = @"kCVPixelFormatType_32ARGB"; break; - case kCVPixelFormatType_32BGRA: pixelFormatName = @"kCVPixelFormatType_32BGRA"; break; - case kCVPixelFormatType_32ABGR: pixelFormatName = @"kCVPixelFormatType_32ABGR"; break; - case kCVPixelFormatType_32RGBA: pixelFormatName = @"kCVPixelFormatType_32RGBA"; break; - case kCVPixelFormatType_64ARGB: pixelFormatName = @"kCVPixelFormatType_64ARGB"; break; - case kCVPixelFormatType_48RGB: pixelFormatName = @"kCVPixelFormatType_48RGB"; break; - case kCVPixelFormatType_32AlphaGray: pixelFormatName = @"kCVPixelFormatType_32AlphaGray"; break; - case kCVPixelFormatType_16Gray: pixelFormatName = @"kCVPixelFormatType_16Gray"; break; - case kCVPixelFormatType_30RGB: pixelFormatName = @"kCVPixelFormatType_30RGB"; break; - case kCVPixelFormatType_422YpCbCr8: pixelFormatName = @"kCVPixelFormatType_422YpCbCr8"; break; - case kCVPixelFormatType_4444YpCbCrA8: pixelFormatName = @"kCVPixelFormatType_4444YpCbCrA8"; break; - case kCVPixelFormatType_4444YpCbCrA8R: pixelFormatName = @"kCVPixelFormatType_4444YpCbCrA8R"; break; - case kCVPixelFormatType_4444AYpCbCr8: pixelFormatName = @"kCVPixelFormatType_4444AYpCbCr8"; break; - case kCVPixelFormatType_4444AYpCbCr16: pixelFormatName = @"kCVPixelFormatType_4444AYpCbCr16"; break; - case kCVPixelFormatType_444YpCbCr8: pixelFormatName = @"kCVPixelFormatType_444YpCbCr8"; break; - case kCVPixelFormatType_422YpCbCr16: pixelFormatName = @"kCVPixelFormatType_422YpCbCr16"; break; - case kCVPixelFormatType_422YpCbCr10: pixelFormatName = @"kCVPixelFormatType_422YpCbCr10"; break; - case kCVPixelFormatType_444YpCbCr10: pixelFormatName = @"kCVPixelFormatType_444YpCbCr10"; break; - case kCVPixelFormatType_420YpCbCr8Planar: pixelFormatName = @"kCVPixelFormatType_420YpCbCr8Planar"; break; - case kCVPixelFormatType_420YpCbCr8PlanarFullRange: pixelFormatName = @"kCVPixelFormatType_420YpCbCr8PlanarFullRange"; break; - case kCVPixelFormatType_422YpCbCr_4A_8BiPlanar: pixelFormatName = @"kCVPixelFormatType_422YpCbCr_4A_8BiPlanar"; break; - case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange: pixelFormatName = @"kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange"; break; - case kCVPixelFormatType_420YpCbCr8BiPlanarFullRange: pixelFormatName = @"kCVPixelFormatType_420YpCbCr8BiPlanarFullRange"; break; - case kCVPixelFormatType_422YpCbCr8_yuvs: pixelFormatName = @"kCVPixelFormatType_422YpCbCr8_yuvs"; break; - case kCVPixelFormatType_422YpCbCr8FullRange: pixelFormatName = @"kCVPixelFormatType_422YpCbCr8FullRange"; break; - case kCVPixelFormatType_OneComponent8: pixelFormatName = @"kCVPixelFormatType_OneComponent8"; break; - case kCVPixelFormatType_TwoComponent8: pixelFormatName = @"kCVPixelFormatType_TwoComponent8"; break; - } - NSLog(@"Supported pixel format: %@", pixelFormatName); - } -} - -@end diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageContext.h b/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageContext.h deleted file mode 100755 index d599601..0000000 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageContext.h +++ /dev/null @@ -1,55 +0,0 @@ -#import -#import -#import -#import "GLProgram.h" -#import "GPUImageFramebuffer.h" -#import "GPUImageFramebufferCache.h" - -#define GPUImageRotationSwapsWidthAndHeight(rotation) (((rotation) == kGPUImageRotateLeft) || ((rotation) == kGPUImageRotateRight) || ((rotation) == kGPUImageRotateRightFlipVertical) ) - -typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, kGPUImageFlipVertical, kGPUImageFlipHorizonal, kGPUImageRotateRightFlipVertical, kGPUImageRotateRightFlipHorizontal, kGPUImageRotate180 } GPUImageRotationMode; - -@interface GPUImageContext : NSObject - -@property(readonly, nonatomic) dispatch_queue_t contextQueue; -@property(readwrite, retain, nonatomic) GLProgram *currentShaderProgram; -@property(readonly, retain, nonatomic) NSOpenGLContext *context; -@property(readonly) CVOpenGLTextureCacheRef coreVideoTextureCache; -@property(readonly) GPUImageFramebufferCache *framebufferCache; - -+ (void *)contextKey; -+ (GPUImageContext *)sharedImageProcessingContext; -+ (dispatch_queue_t)sharedContextQueue; -+ (GPUImageFramebufferCache *)sharedFramebufferCache; -+ (void)useImageProcessingContext; -+ (void)setActiveShaderProgram:(GLProgram *)shaderProgram; -+ (GLint)maximumTextureSizeForThisDevice; -+ (GLint)maximumTextureUnitsForThisDevice; -+ (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; -+ (BOOL)deviceSupportsRedTextures; -+ (BOOL)deviceSupportsFramebufferReads; -+ (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; - -- (void)presentBufferForDisplay; -- (GLProgram *)programForVertexShaderString:(NSString *)vertexShaderString fragmentShaderString:(NSString *)fragmentShaderString; - -- (void)useSharegroup:(CGLShareGroupObj *)sharegroup; - -// Manage fast texture upload -+ (BOOL)supportsFastTextureUpload; - -@end - -@protocol GPUImageInput -- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; -- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex; -- (NSInteger)nextAvailableTextureIndex; -- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; -- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; -- (CGSize)maximumOutputSize; -- (void)endProcessing; -- (BOOL)shouldIgnoreUpdatesToThisTarget; -- (BOOL)enabled; -- (BOOL)wantsMonochromeInput; -- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; -@end diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageContext.m b/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageContext.m deleted file mode 100755 index 0532d95..0000000 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageContext.m +++ /dev/null @@ -1,268 +0,0 @@ -#import "GPUImageContext.h" -#import - -@interface GPUImageContext() -{ - NSMutableDictionary *shaderProgramCache; - CGLShareGroupObj *_sharegroup; - NSOpenGLPixelFormat *_pixelFormat; -} - -@end - -@implementation GPUImageContext - -@synthesize context = _context; -@synthesize currentShaderProgram = _currentShaderProgram; -@synthesize contextQueue = _contextQueue; -@synthesize coreVideoTextureCache = _coreVideoTextureCache; -@synthesize framebufferCache = _framebufferCache; - -static void *openGLESContextQueueKey; - -- (id)init; -{ - if (!(self = [super init])) - { - return nil; - } - - openGLESContextQueueKey = &openGLESContextQueueKey; - _contextQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.openGLESContextQueue", NULL); - dispatch_queue_set_specific(_contextQueue, openGLESContextQueueKey, (__bridge void *)self, NULL); - shaderProgramCache = [[NSMutableDictionary alloc] init]; - - return self; -} - -+ (void *)contextKey { - return openGLESContextQueueKey; -} - -// Based on Colin Wheeler's example here: http://cocoasamurai.blogspot.com/2011/04/singletons-your-doing-them-wrong.html -+ (GPUImageContext *)sharedImageProcessingContext; -{ - static dispatch_once_t pred; - static GPUImageContext *sharedImageProcessingContext = nil; - - dispatch_once(&pred, ^{ - sharedImageProcessingContext = [[[self class] alloc] init]; - }); - return sharedImageProcessingContext; -} - -+ (dispatch_queue_t)sharedContextQueue; -{ - return [[self sharedImageProcessingContext] contextQueue]; -} - -+ (GPUImageFramebufferCache *)sharedFramebufferCache; -{ - return [[self sharedImageProcessingContext] framebufferCache]; -} - -+ (void)useImageProcessingContext; -{ - NSOpenGLContext *imageProcessingContext = [[GPUImageContext sharedImageProcessingContext] context]; - if ([NSOpenGLContext currentContext] != imageProcessingContext) - { - [imageProcessingContext makeCurrentContext]; - } -} - -+ (void)setActiveShaderProgram:(GLProgram *)shaderProgram; -{ - GPUImageContext *sharedContext = [GPUImageContext sharedImageProcessingContext]; - NSOpenGLContext *imageProcessingContext = [sharedContext context]; - if ([NSOpenGLContext currentContext] != imageProcessingContext) - { - [imageProcessingContext makeCurrentContext]; - } - - if (sharedContext.currentShaderProgram != shaderProgram) - { - sharedContext.currentShaderProgram = shaderProgram; - [shaderProgram use]; - } -} - -+ (GLint)maximumTextureSizeForThisDevice; -{ - static dispatch_once_t pred; - static GLint maxTextureSize = 0; - - dispatch_once(&pred, ^{ - [self useImageProcessingContext]; - glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); - }); - - return maxTextureSize; -} - -+ (GLint)maximumTextureUnitsForThisDevice; -{ - GLint maxTextureUnits; - glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits); - return maxTextureUnits; -} - -+ (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension; -{ - static dispatch_once_t pred; - static NSArray *extensionNames = nil; - - // Cache extensions for later quick reference, since this won't change for a given device - dispatch_once(&pred, ^{ - [GPUImageContext useImageProcessingContext]; - NSString *extensionsString = [NSString stringWithCString:(const char *)glGetString(GL_EXTENSIONS) encoding:NSASCIIStringEncoding]; - extensionNames = [extensionsString componentsSeparatedByString:@" "]; - }); - - return [extensionNames containsObject:extension]; -} - -+ (BOOL)deviceSupportsFramebufferReads; -{ - return NO; -} - -// http://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_rg.txt - -+ (BOOL)deviceSupportsRedTextures; -{ - static dispatch_once_t pred; - static BOOL supportsRedTextures = NO; - - dispatch_once(&pred, ^{ - supportsRedTextures = [GPUImageContext deviceSupportsOpenGLESExtension:@"GL_EXT_texture_rg"]; - }); - - return supportsRedTextures; -} - - -+ (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; -{ - GLint maxTextureSize = [self maximumTextureSizeForThisDevice]; - if ( (inputSize.width < maxTextureSize) && (inputSize.height < maxTextureSize) ) - { - return inputSize; - } - - CGSize adjustedSize; - if (inputSize.width > inputSize.height) - { - adjustedSize.width = (CGFloat)maxTextureSize; - adjustedSize.height = ((CGFloat)maxTextureSize / inputSize.width) * inputSize.height; - } - else - { - adjustedSize.height = (CGFloat)maxTextureSize; - adjustedSize.width = ((CGFloat)maxTextureSize / inputSize.height) * inputSize.width; - } - - return adjustedSize; -} - -- (void)presentBufferForDisplay; -{ - [self.context flushBuffer]; -} - -- (GLProgram *)programForVertexShaderString:(NSString *)vertexShaderString fragmentShaderString:(NSString *)fragmentShaderString; -{ - NSString *lookupKeyForShaderProgram = [NSString stringWithFormat:@"V: %@ - F: %@", vertexShaderString, fragmentShaderString]; - GLProgram *programFromCache = [shaderProgramCache objectForKey:lookupKeyForShaderProgram]; - - if (programFromCache == nil) - { - programFromCache = [[GLProgram alloc] initWithVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString]; - [shaderProgramCache setObject:programFromCache forKey:lookupKeyForShaderProgram]; - } - - return programFromCache; -} - -- (void)useSharegroup:(CGLShareGroupObj *)sharegroup; -{ - NSAssert(_context == nil, @"Unable to use a share group when the context has already been created. Call this method before you use the context for the first time."); - - _sharegroup = sharegroup; -} - -- (NSOpenGLContext *)createContext; -{ - NSOpenGLPixelFormatAttribute pixelFormatAttributes[] = { - NSOpenGLPFADoubleBuffer, - NSOpenGLPFAAccelerated, 0, - 0 - }; - - _pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:pixelFormatAttributes]; - if (_pixelFormat == nil) - { - NSLog(@"Error: No appropriate pixel format found"); - } - // TODO: Take into account the sharegroup - NSOpenGLContext *context = [[NSOpenGLContext alloc] initWithFormat:_pixelFormat shareContext:nil]; - - NSAssert(context != nil, @"Unable to create an OpenGL context. The GPUImage framework requires OpenGL support to work."); - return context; -} - -- (CVOpenGLTextureCacheRef)coreVideoTextureCache; -{ - if (_coreVideoTextureCache == NULL) - { - - CVReturn err = CVOpenGLTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[self context], [_pixelFormat CGLPixelFormatObj], NULL, &_coreVideoTextureCache); - - if (err) - { - NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err); - } - - } - - return _coreVideoTextureCache; -} - - -#pragma mark - -#pragma mark Manage fast texture upload - -+ (BOOL)supportsFastTextureUpload; -{ - // This may need to be redone to account for the Mac's accelerated data transfer methods - return NO; -} - -#pragma mark - -#pragma mark Accessors - -- (NSOpenGLContext *)context; -{ - if (_context == nil) - { - _context = [self createContext]; - [_context makeCurrentContext]; - - // Set up a few global settings for the image processing pipeline - glDisable(GL_DEPTH_TEST); - glEnable(GL_TEXTURE_2D); - } - - return _context; -} - -- (GPUImageFramebufferCache *)framebufferCache; -{ - if (_framebufferCache == nil) - { - _framebufferCache = [[GPUImageFramebufferCache alloc] init]; - } - - return _framebufferCache; -} - -@end diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageMac-Info.plist b/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageMac-Info.plist deleted file mode 100644 index 88daf2c..0000000 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageMac-Info.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - - CFBundleIdentifier - com.sunsetlakesoftware.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - NSHumanReadableCopyright - Copyright © 2013 Sunset Lake Software LLC. All rights reserved. - NSPrincipalClass - - - diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageMac-Prefix.pch b/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageMac-Prefix.pch deleted file mode 100644 index f01e581..0000000 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageMac-Prefix.pch +++ /dev/null @@ -1,7 +0,0 @@ -// -// Prefix header for all source files of the 'GPUImageMac' target in the 'GPUImageMac' project -// - -#ifdef __OBJC__ - #import -#endif diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageMovieWriter.h b/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageMovieWriter.h deleted file mode 100755 index 530e5a6..0000000 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageMovieWriter.h +++ /dev/null @@ -1,57 +0,0 @@ -#import -#import -#import "GPUImageContext.h" - -extern NSString *const kGPUImageColorSwizzlingFragmentShaderString; - -@protocol GPUImageMovieWriterDelegate - -@optional -- (void)movieRecordingCompleted; -- (void)movieRecordingFailedWithError:(NSError*)error; - -@end - -@interface GPUImageMovieWriter : NSObject -{ - CMVideoDimensions videoDimensions; - CMVideoCodecType videoType; - - NSURL *movieURL; - NSString *fileType; - AVAssetWriter *assetWriter; - AVAssetWriterInput *assetWriterAudioInput; - AVAssetWriterInput *assetWriterVideoInput; - AVAssetWriterInputPixelBufferAdaptor *assetWriterPixelBufferInput; - dispatch_queue_t movieWritingQueue; - - CGSize videoSize; - GPUImageRotationMode inputRotation; -} - -@property(readwrite, nonatomic) BOOL hasAudioTrack; -@property(readwrite, nonatomic) BOOL shouldPassthroughAudio; -@property(nonatomic, copy) void(^completionBlock)(void); -@property(nonatomic, copy) void(^failureBlock)(NSError*); -@property(nonatomic, assign) id delegate; -@property(readwrite, nonatomic) BOOL encodingLiveVideo; -@property(nonatomic, copy) void(^videoInputReadyCallback)(void); -@property(nonatomic, copy) void(^audioInputReadyCallback)(void); -@property(nonatomic) BOOL enabled; - -// Initialization and teardown -- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; -- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings; - -- (void)setHasAudioTrack:(BOOL)hasAudioTrack audioSettings:(NSDictionary *)audioOutputSettings; - -// Movie recording -- (void)startRecording; -- (void)startRecordingInOrientation:(CGAffineTransform)orientationTransform; -- (void)finishRecording; -- (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; -- (void)cancelRecording; -- (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; -- (void)enableSynchronizationCallbacks; - -@end diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageMovieWriter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageMovieWriter.m deleted file mode 100755 index 89f0a37..0000000 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageMovieWriter.m +++ /dev/null @@ -1,644 +0,0 @@ -#import "GPUImageMovieWriter.h" - -#import "GPUImageContext.h" -#import "GLProgram.h" -#import "GPUImageFilter.h" - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE -NSString *const kGPUImageColorSwizzlingFragmentShaderString = SHADER_STRING -( - varying highp vec2 textureCoordinate; - - uniform sampler2D inputImageTexture; - - void main() - { - gl_FragColor = texture2D(inputImageTexture, textureCoordinate).bgra; - } - ); -#else -NSString *const kGPUImageColorSwizzlingFragmentShaderString = SHADER_STRING -( - varying vec2 textureCoordinate; - - uniform sampler2D inputImageTexture; - - void main() - { - gl_FragColor = texture2D(inputImageTexture, textureCoordinate).bgra; - } - ); -#endif - - -@interface GPUImageMovieWriter () -{ - GPUImageFramebuffer *firstInputFramebuffer; - - GLuint movieFramebuffer, movieRenderbuffer; - - GLProgram *colorSwizzlingProgram; - GLint colorSwizzlingPositionAttribute, colorSwizzlingTextureCoordinateAttribute; - GLint colorSwizzlingInputTextureUniform; - - GLubyte *frameData; - - CMTime startTime, previousFrameTime; - - BOOL isRecording; -} - -// Movie recording -- (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; - -// Frame rendering -- (void)createDataFBO; -- (void)destroyDataFBO; -- (void)setFilterFBO; - -- (void)renderAtInternalSize; - -@end - -@implementation GPUImageMovieWriter - -@synthesize hasAudioTrack = _hasAudioTrack; -@synthesize encodingLiveVideo = _encodingLiveVideo; -@synthesize shouldPassthroughAudio = _shouldPassthroughAudio; -@synthesize completionBlock; -@synthesize failureBlock; -@synthesize videoInputReadyCallback; -@synthesize audioInputReadyCallback; -@synthesize enabled; - -@synthesize delegate = _delegate; - -#pragma mark - -#pragma mark Initialization and teardown - -- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize; -{ - return [self initWithMovieURL:newMovieURL size:newSize fileType:AVFileTypeQuickTimeMovie outputSettings:nil]; -} - -- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings; -{ - if (!(self = [super init])) - { - return nil; - } - - self.enabled = YES; - - videoSize = newSize; - movieURL = newMovieURL; - fileType = newFileType; - startTime = kCMTimeInvalid; - _encodingLiveVideo = YES; - previousFrameTime = kCMTimeNegativeInfinity; - inputRotation = kGPUImageNoRotation; - - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - if ([GPUImageContext supportsFastTextureUpload]) - { - colorSwizzlingProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; - } - else - { - colorSwizzlingProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; - } - - if (!colorSwizzlingProgram.initialized) - { - [colorSwizzlingProgram addAttribute:@"position"]; - [colorSwizzlingProgram addAttribute:@"inputTextureCoordinate"]; - - if (![colorSwizzlingProgram link]) - { - NSString *progLog = [colorSwizzlingProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [colorSwizzlingProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [colorSwizzlingProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - colorSwizzlingProgram = nil; - NSAssert(NO, @"Filter shader link failed"); - } - } - - colorSwizzlingPositionAttribute = [colorSwizzlingProgram attributeIndex:@"position"]; - colorSwizzlingTextureCoordinateAttribute = [colorSwizzlingProgram attributeIndex:@"inputTextureCoordinate"]; - colorSwizzlingInputTextureUniform = [colorSwizzlingProgram uniformIndex:@"inputImageTexture"]; - - // REFACTOR: Wrap this in a block for the image processing queue - [GPUImageContext setActiveShaderProgram:colorSwizzlingProgram]; - - glEnableVertexAttribArray(colorSwizzlingPositionAttribute); - glEnableVertexAttribArray(colorSwizzlingTextureCoordinateAttribute); - }); - - [self initializeMovieWithOutputSettings:outputSettings]; - - return self; -} - -- (void)dealloc; -{ - [self destroyDataFBO]; - - if (frameData != NULL) - { - free(frameData); - } -} - -#pragma mark - -#pragma mark Movie recording - -- (void)initializeMovieWithOutputSettings:(NSMutableDictionary *)outputSettings; -{ - isRecording = NO; - - self.enabled = YES; - frameData = (GLubyte *) malloc((int)videoSize.width * (int)videoSize.height * 4); - -// frameData = (GLubyte *) calloc(videoSize.width * videoSize.height * 4, sizeof(GLubyte)); - NSError *error = nil; - assetWriter = [[AVAssetWriter alloc] initWithURL:movieURL fileType:fileType error:&error]; - if (error != nil) - { - NSLog(@"Error: %@", error); - if (failureBlock) - { - failureBlock(error); - } - else - { - if(self.delegate && [self.delegate respondsToSelector:@selector(movieRecordingFailedWithError:)]) - { - [self.delegate movieRecordingFailedWithError:error]; - } - } - } - - // Set this to make sure that a functional movie is produced, even if the recording is cut off mid-stream. Only the last second should be lost in that case. - assetWriter.movieFragmentInterval = CMTimeMakeWithSeconds(1.0, 1000); - - // use default output settings if none specified - if (outputSettings == nil) - { - outputSettings = [[NSMutableDictionary alloc] init]; - [outputSettings setObject:AVVideoCodecH264 forKey:AVVideoCodecKey]; - [outputSettings setObject:[NSNumber numberWithInt:videoSize.width] forKey:AVVideoWidthKey]; - [outputSettings setObject:[NSNumber numberWithInt:videoSize.height] forKey:AVVideoHeightKey]; - } - // custom output settings specified - else - { - #ifndef NS_BLOCK_ASSERTIONS - NSString *videoCodec = [outputSettings objectForKey:AVVideoCodecKey]; - NSNumber *width = [outputSettings objectForKey:AVVideoWidthKey]; - NSNumber *height = [outputSettings objectForKey:AVVideoHeightKey]; - - NSAssert(videoCodec && width && height, @"OutputSettings is missing required parameters."); - #endif - } - - /* - NSDictionary *videoCleanApertureSettings = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithInt:videoSize.width], AVVideoCleanApertureWidthKey, - [NSNumber numberWithInt:videoSize.height], AVVideoCleanApertureHeightKey, - [NSNumber numberWithInt:0], AVVideoCleanApertureHorizontalOffsetKey, - [NSNumber numberWithInt:0], AVVideoCleanApertureVerticalOffsetKey, - nil]; - - NSDictionary *videoAspectRatioSettings = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithInt:3], AVVideoPixelAspectRatioHorizontalSpacingKey, - [NSNumber numberWithInt:3], AVVideoPixelAspectRatioVerticalSpacingKey, - nil]; - - NSMutableDictionary * compressionProperties = [[NSMutableDictionary alloc] init]; - [compressionProperties setObject:videoCleanApertureSettings forKey:AVVideoCleanApertureKey]; - [compressionProperties setObject:videoAspectRatioSettings forKey:AVVideoPixelAspectRatioKey]; - [compressionProperties setObject:[NSNumber numberWithInt: 2000000] forKey:AVVideoAverageBitRateKey]; - [compressionProperties setObject:[NSNumber numberWithInt: 16] forKey:AVVideoMaxKeyFrameIntervalKey]; - [compressionProperties setObject:AVVideoProfileLevelH264Main31 forKey:AVVideoProfileLevelKey]; - - [outputSettings setObject:compressionProperties forKey:AVVideoCompressionPropertiesKey]; - */ - - assetWriterVideoInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:outputSettings]; - assetWriterVideoInput.expectsMediaDataInRealTime = _encodingLiveVideo; - - // You need to use BGRA for the video in order to get realtime encoding. I use a color-swizzling shader to line up glReadPixels' normal RGBA output with the movie input's BGRA. - NSDictionary *sourcePixelBufferAttributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA], kCVPixelBufferPixelFormatTypeKey, - [NSNumber numberWithInt:videoSize.width], kCVPixelBufferWidthKey, - [NSNumber numberWithInt:videoSize.height], kCVPixelBufferHeightKey, - nil]; -// NSDictionary *sourcePixelBufferAttributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kCVPixelFormatType_32ARGB], kCVPixelBufferPixelFormatTypeKey, -// nil]; - - assetWriterPixelBufferInput = [AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:assetWriterVideoInput sourcePixelBufferAttributes:sourcePixelBufferAttributesDictionary]; - - [assetWriter addInput:assetWriterVideoInput]; -} - -- (void)startRecording; -{ - isRecording = YES; - startTime = kCMTimeInvalid; - // [assetWriter startWriting]; - - // [assetWriter startSessionAtSourceTime:kCMTimeZero]; -} - -- (void)startRecordingInOrientation:(CGAffineTransform)orientationTransform; -{ - assetWriterVideoInput.transform = orientationTransform; - - [self startRecording]; -} - -- (void)cancelRecording; -{ - if (assetWriter.status == AVAssetWriterStatusCompleted) - { - return; - } - - isRecording = NO; - runOnMainQueueWithoutDeadlocking(^{ - [assetWriterVideoInput markAsFinished]; - [assetWriterAudioInput markAsFinished]; - [assetWriter cancelWriting]; - }); -} - -- (void)finishRecording; -{ - [self finishRecordingWithCompletionHandler:nil]; -} - -- (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; -{ - if (assetWriter.status == AVAssetWriterStatusCompleted) - { - return; - } - - isRecording = NO; - runOnMainQueueWithoutDeadlocking(^{ - [assetWriterVideoInput markAsFinished]; - [assetWriterAudioInput markAsFinished]; -#if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)) - // Not iOS 6 SDK - [assetWriter finishWriting]; - if (handler) handler(); -#else - // iOS 6 SDK - if ([assetWriter respondsToSelector:@selector(finishWritingWithCompletionHandler:)]) { - // Running iOS 6 - [assetWriter finishWritingWithCompletionHandler:(handler ?: ^{ })]; - } - else { - // Not running iOS 6 - [assetWriter finishWriting]; - if (handler) handler(); - } -#endif - }); -} - -- (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; -{ - if (!isRecording) - { - return; - } - - if (_hasAudioTrack) - { - CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(audioBuffer); - - if (CMTIME_IS_INVALID(startTime)) - { - if (audioInputReadyCallback == NULL) - { - [assetWriter startWriting]; - } - [assetWriter startSessionAtSourceTime:currentSampleTime]; - startTime = currentSampleTime; - } - - if (!assetWriterAudioInput.readyForMoreMediaData) - { - NSLog(@"Had to drop an audio frame"); - return; - } - -// NSLog(@"Recorded audio sample time: %lld, %d, %lld", currentSampleTime.value, currentSampleTime.timescale, currentSampleTime.epoch); - [assetWriterAudioInput appendSampleBuffer:audioBuffer]; - } -} - -- (void)enableSynchronizationCallbacks; -{ - if (videoInputReadyCallback != NULL) - { - [assetWriter startWriting]; - [assetWriterVideoInput requestMediaDataWhenReadyOnQueue:[GPUImageContext sharedContextQueue] usingBlock:videoInputReadyCallback]; - } - - if (audioInputReadyCallback != NULL) - { - [assetWriterAudioInput requestMediaDataWhenReadyOnQueue:[GPUImageContext sharedContextQueue] usingBlock:audioInputReadyCallback]; - } - -} - -#pragma mark - -#pragma mark Frame rendering - -- (void)createDataFBO; -{ - glActiveTexture(GL_TEXTURE1); - glGenFramebuffers(1, &movieFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, movieFramebuffer); - - glGenRenderbuffers(1, &movieRenderbuffer); - glBindRenderbuffer(GL_RENDERBUFFER, movieRenderbuffer); - glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, (int)videoSize.width, (int)videoSize.height); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, movieRenderbuffer); - - #ifndef NS_BLOCK_ASSERTIONS - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status); - #endif -} - -- (void)destroyDataFBO; -{ - [GPUImageContext useImageProcessingContext]; - - if (movieFramebuffer) - { - glDeleteFramebuffers(1, &movieFramebuffer); - movieFramebuffer = 0; - } - - if (movieRenderbuffer) - { - glDeleteRenderbuffers(1, &movieRenderbuffer); - movieRenderbuffer = 0; - } -} - -- (void)setFilterFBO; -{ - if (!movieFramebuffer) - { - [self createDataFBO]; - } - - glBindFramebuffer(GL_FRAMEBUFFER, movieFramebuffer); - - glViewport(0, 0, (int)videoSize.width, (int)videoSize.height); -} - -- (void)renderAtInternalSize; -{ - [GPUImageContext useImageProcessingContext]; - [self setFilterFBO]; - - [GPUImageContext setActiveShaderProgram:colorSwizzlingProgram]; - - glClearColor(1.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - // This needs to be flipped to write out to video correctly - static const GLfloat squareVertices[] = { - -1.0f, -1.0f, - 1.0f, -1.0f, - -1.0f, 1.0f, - 1.0f, 1.0f, - }; - - static const GLfloat textureCoordinates[] = { - 0.0f, 0.0f, - 1.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 1.0f, - }; - - glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, [firstInputFramebuffer texture]); - glUniform1i(colorSwizzlingInputTextureUniform, 4); - - glVertexAttribPointer(colorSwizzlingPositionAttribute, 2, GL_FLOAT, 0, 0, squareVertices); - glVertexAttribPointer(colorSwizzlingTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, textureCoordinates); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - - glFinish(); - [firstInputFramebuffer unlock]; -} - -#pragma mark - -#pragma mark GPUImageInput protocol - -- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; -{ - if (!isRecording) - { - [firstInputFramebuffer unlock]; - return; - } - - // Drop frames forced by images and other things with no time constants - // Also, if two consecutive times with the same value are added to the movie, it aborts recording, so I bail on that case - if ( (CMTIME_IS_INVALID(frameTime)) || (CMTIME_COMPARE_INLINE(frameTime, ==, previousFrameTime)) || (CMTIME_IS_INDEFINITE(frameTime)) ) - { - [firstInputFramebuffer unlock]; - return; - } - - if (CMTIME_IS_INVALID(startTime)) - { - if (videoInputReadyCallback == NULL) - { - [assetWriter startWriting]; - } - - [assetWriter startSessionAtSourceTime:frameTime]; - startTime = frameTime; - } - - if (!assetWriterVideoInput.readyForMoreMediaData) - { - [firstInputFramebuffer unlock]; - NSLog(@"Had to drop a video frame"); - return; - } - - // Render the frame with swizzled colors, so that they can be uploaded quickly as BGRA frames - [GPUImageContext useImageProcessingContext]; - [self renderAtInternalSize]; - - CVPixelBufferRef pixel_buffer = NULL; - - CVReturn status = CVPixelBufferPoolCreatePixelBuffer (NULL, [assetWriterPixelBufferInput pixelBufferPool], &pixel_buffer); - if ((pixel_buffer == NULL) || (status != kCVReturnSuccess)) - { - return; - } - else - { - CVPixelBufferLockBaseAddress(pixel_buffer, 0); - - GLubyte *pixelBufferData = (GLubyte *)CVPixelBufferGetBaseAddress(pixel_buffer); - glReadPixels(0, 0, videoSize.width, videoSize.height, GL_RGBA, GL_UNSIGNED_BYTE, pixelBufferData); - } - -// if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:CMTimeSubtract(frameTime, startTime)]) - if(![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:frameTime]) - { - NSLog(@"Problem appending pixel buffer at time: %lld", frameTime.value); - } - else - { -// NSLog(@"Recorded video sample time: %lld, %d, %lld", frameTime.value, frameTime.timescale, frameTime.epoch); - } - CVPixelBufferUnlockBaseAddress(pixel_buffer, 0); - - previousFrameTime = frameTime; - - if (![GPUImageContext supportsFastTextureUpload]) - { - CVPixelBufferRelease(pixel_buffer); - } -} - -- (NSInteger)nextAvailableTextureIndex; -{ - return 0; -} - -- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex; -{ - firstInputFramebuffer = newInputFramebuffer; - [firstInputFramebuffer lock]; -} - -- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; -{ - inputRotation = newInputRotation; -} - -- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; -{ -} - -- (CGSize)maximumOutputSize; -{ - return videoSize; -} - -- (void)endProcessing -{ - if (completionBlock) - { - completionBlock(); - } - else - { - if (_delegate && [_delegate respondsToSelector:@selector(movieRecordingCompleted)]) - { - [_delegate movieRecordingCompleted]; - } - } -} - -- (BOOL)shouldIgnoreUpdatesToThisTarget; -{ - return NO; -} - -- (void)conserveMemoryForNextFrame; -{ - -} - -- (BOOL)wantsMonochromeInput; -{ - return NO; -} - -- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; -{ - -} - -#pragma mark - -#pragma mark Accessors - -- (void)setHasAudioTrack:(BOOL)newValue -{ - [self setHasAudioTrack:newValue audioSettings:nil]; -} - -- (void)setHasAudioTrack:(BOOL)newValue audioSettings:(NSDictionary *)audioOutputSettings; -{ - _hasAudioTrack = newValue; - - if (_hasAudioTrack) - { - if (_shouldPassthroughAudio) - { - // Do not set any settings so audio will be the same as passthrough - audioOutputSettings = nil; - } - else if (audioOutputSettings == nil) - { -// double preferredHardwareSampleRate = [[AVAudioSession sharedInstance] currentHardwareSampleRate]; - double preferredHardwareSampleRate = 48000; // ? - TODO: Fix this, because it's probably broken - - AudioChannelLayout acl; - bzero( &acl, sizeof(acl)); - acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono; - - audioOutputSettings = [NSDictionary dictionaryWithObjectsAndKeys: - [ NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey, - [ NSNumber numberWithInt: 1 ], AVNumberOfChannelsKey, - [ NSNumber numberWithFloat: preferredHardwareSampleRate ], AVSampleRateKey, - [ NSData dataWithBytes: &acl length: sizeof( acl ) ], AVChannelLayoutKey, - //[ NSNumber numberWithInt:AVAudioQualityLow], AVEncoderAudioQualityKey, - [ NSNumber numberWithInt: 64000 ], AVEncoderBitRateKey, - nil]; -/* - AudioChannelLayout acl; - bzero( &acl, sizeof(acl)); - acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono; - - audioOutputSettings = [NSDictionary dictionaryWithObjectsAndKeys: - [ NSNumber numberWithInt: kAudioFormatMPEG4AAC ], AVFormatIDKey, - [ NSNumber numberWithInt: 1 ], AVNumberOfChannelsKey, - [ NSNumber numberWithFloat: 44100.0 ], AVSampleRateKey, - [ NSNumber numberWithInt: 64000 ], AVEncoderBitRateKey, - [ NSData dataWithBytes: &acl length: sizeof( acl ) ], AVChannelLayoutKey, - nil];*/ - } - - assetWriterAudioInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:audioOutputSettings]; - [assetWriter addInput:assetWriterAudioInput]; - assetWriterAudioInput.expectsMediaDataInRealTime = _encodingLiveVideo; - } - else - { - // Remove audio track if it exists - } -} - - -@end diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImagePicture.h b/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImagePicture.h deleted file mode 100755 index 6597053..0000000 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImagePicture.h +++ /dev/null @@ -1,25 +0,0 @@ -#import -#import "GPUImageOutput.h" - -@interface GPUImagePicture : GPUImageOutput -{ - CGSize pixelSizeOfImage; - BOOL hasProcessedImage; - - dispatch_semaphore_t imageUpdateSemaphore; -} - -// Initialization and teardown -- (id)initWithURL:(NSURL *)url; -- (id)initWithImage:(NSImage *)newImageSource; -- (id)initWithCGImage:(CGImageRef)newImageSource; -- (id)initWithImage:(NSImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothlyScaleOutput; -- (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoothlyScaleOutput; - -// Image rendering -- (void)processImage; -- (BOOL)processImageWithCompletionHandler:(void (^)(void))completion; -- (void)processImageUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSImage *processedImage))block; -- (CGSize)outputImageSize; - -@end diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImagePicture.m b/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImagePicture.m deleted file mode 100755 index 1ef37bf..0000000 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImagePicture.m +++ /dev/null @@ -1,299 +0,0 @@ -#import "GPUImagePicture.h" - -@implementation GPUImagePicture - -#pragma mark - -#pragma mark Initialization and teardown - -- (id)initWithURL:(NSURL *)url; -{ - NSData *imageData = [[NSData alloc] initWithContentsOfURL:url]; - - if (!(self = [self initWithData:imageData])) - { - return nil; - } - - return self; -} - -- (id)initWithData:(NSData *)imageData; -{ - NSImage *inputImage = [[NSImage alloc] initWithData:imageData]; - - if (!(self = [self initWithImage:inputImage])) - { - return nil; - } - - return self; -} - -- (id)initWithImage:(NSImage *)newImageSource; -{ - if (!(self = [self initWithImage:newImageSource smoothlyScaleOutput:NO])) - { - return nil; - } - - return self; -} - -- (id)initWithCGImage:(CGImageRef)newImageSource; -{ - if (!(self = [self initWithCGImage:newImageSource smoothlyScaleOutput:NO])) - { - return nil; - } - return self; -} - -- (id)initWithImage:(NSImage *)newImageSource smoothlyScaleOutput:(BOOL)smoothlyScaleOutput; -{ - return [self initWithCGImage:[newImageSource CGImageForProposedRect:NULL context:NULL hints:nil] smoothlyScaleOutput:smoothlyScaleOutput]; -} - -- (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoothlyScaleOutput; -{ - if (!(self = [super init])) - { - return nil; - } - - hasProcessedImage = NO; - self.shouldSmoothlyScaleOutput = smoothlyScaleOutput; - imageUpdateSemaphore = dispatch_semaphore_create(1); - - // TODO: Dispatch this whole thing asynchronously to move image loading off main thread - CGFloat widthOfImage = CGImageGetWidth(newImageSource); - CGFloat heightOfImage = CGImageGetHeight(newImageSource); - - // If passed an empty image reference, CGContextDrawImage will fail in future versions of the SDK. - NSAssert( widthOfImage > 0 && heightOfImage > 0, @"Passed image must not be empty - it should be at least 1px tall and wide"); - - pixelSizeOfImage = CGSizeMake(widthOfImage, heightOfImage); - CGSize pixelSizeToUseForTexture = pixelSizeOfImage; - - BOOL shouldRedrawUsingCoreGraphics = NO; - - // For now, deal with images larger than the maximum texture size by resizing to be within that limit - CGSize scaledImageSizeToFitOnGPU = [GPUImageContext sizeThatFitsWithinATextureForSize:pixelSizeOfImage]; - if (!CGSizeEqualToSize(scaledImageSizeToFitOnGPU, pixelSizeOfImage)) - { - pixelSizeOfImage = scaledImageSizeToFitOnGPU; - pixelSizeToUseForTexture = pixelSizeOfImage; - shouldRedrawUsingCoreGraphics = YES; - } - - if (self.shouldSmoothlyScaleOutput) - { - // In order to use mipmaps, you need to provide power-of-two textures, so convert to the next largest power of two and stretch to fill - CGFloat powerClosestToWidth = ceil(log2(pixelSizeOfImage.width)); - CGFloat powerClosestToHeight = ceil(log2(pixelSizeOfImage.height)); - - pixelSizeToUseForTexture = CGSizeMake(pow(2.0, powerClosestToWidth), pow(2.0, powerClosestToHeight)); - - shouldRedrawUsingCoreGraphics = YES; - } - - GLubyte *imageData = NULL; - CFDataRef dataFromImageDataProvider; - GLenum format = GL_BGRA; - - if (!shouldRedrawUsingCoreGraphics) { - /* Check that the memory layout is compatible with GL, as we cannot use glPixelStore to - * tell GL about the memory layout with GLES. - */ - if (CGImageGetBytesPerRow(newImageSource) != CGImageGetWidth(newImageSource) * 4 || - CGImageGetBitsPerPixel(newImageSource) != 32 || - CGImageGetBitsPerComponent(newImageSource) != 8) - { - shouldRedrawUsingCoreGraphics = YES; - } else { - /* Check that the bitmap pixel format is compatible with GL */ - CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(newImageSource); - if ((bitmapInfo & kCGBitmapFloatComponents) != 0) { - /* We don't support float components for use directly in GL */ - shouldRedrawUsingCoreGraphics = YES; - } else { - CGBitmapInfo byteOrderInfo = bitmapInfo & kCGBitmapByteOrderMask; - if (byteOrderInfo == kCGBitmapByteOrder32Little) { - /* Little endian, for alpha-first we can use this bitmap directly in GL */ - CGImageAlphaInfo alphaInfo = bitmapInfo & kCGBitmapAlphaInfoMask; - if (alphaInfo != kCGImageAlphaPremultipliedFirst && alphaInfo != kCGImageAlphaFirst && - alphaInfo != kCGImageAlphaNoneSkipFirst) { - shouldRedrawUsingCoreGraphics = YES; - } - } else if (byteOrderInfo == kCGBitmapByteOrderDefault || byteOrderInfo == kCGBitmapByteOrder32Big) { - /* Big endian, for alpha-last we can use this bitmap directly in GL */ - CGImageAlphaInfo alphaInfo = bitmapInfo & kCGBitmapAlphaInfoMask; - if (alphaInfo != kCGImageAlphaPremultipliedLast && alphaInfo != kCGImageAlphaLast && - alphaInfo != kCGImageAlphaNoneSkipLast) { - shouldRedrawUsingCoreGraphics = YES; - } else { - /* Can access directly using GL_RGBA pixel format */ - format = GL_RGBA; - } - } - } - } - } - - // CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent(); - - if (shouldRedrawUsingCoreGraphics) - { - // For resized or incompatible image: redraw - imageData = (GLubyte *) calloc(1, (int)pixelSizeToUseForTexture.width * (int)pixelSizeToUseForTexture.height * 4); - - CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB(); - - CGContextRef imageContext = CGBitmapContextCreate(imageData, (size_t)pixelSizeToUseForTexture.width, (size_t)pixelSizeToUseForTexture.height, 8, (size_t)pixelSizeToUseForTexture.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); - // CGContextSetBlendMode(imageContext, kCGBlendModeCopy); // From Technical Q&A QA1708: http://developer.apple.com/library/ios/#qa/qa1708/_index.html - CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeToUseForTexture.width, pixelSizeToUseForTexture.height), newImageSource); - CGContextRelease(imageContext); - CGColorSpaceRelease(genericRGBColorspace); - } - else - { - // Access the raw image bytes directly - dataFromImageDataProvider = CGDataProviderCopyData(CGImageGetDataProvider(newImageSource)); - imageData = (GLubyte *)CFDataGetBytePtr(dataFromImageDataProvider); - } - - // elapsedTime = (CFAbsoluteTimeGetCurrent() - startTime) * 1000.0; - // NSLog(@"Core Graphics drawing time: %f", elapsedTime); - - // CGFloat currentRedTotal = 0.0f, currentGreenTotal = 0.0f, currentBlueTotal = 0.0f, currentAlphaTotal = 0.0f; - // NSUInteger totalNumberOfPixels = round(pixelSizeToUseForTexture.width * pixelSizeToUseForTexture.height); - // - // for (NSUInteger currentPixel = 0; currentPixel < totalNumberOfPixels; currentPixel++) - // { - // currentBlueTotal += (CGFloat)imageData[(currentPixel * 4)] / 255.0f; - // currentGreenTotal += (CGFloat)imageData[(currentPixel * 4) + 1] / 255.0f; - // currentRedTotal += (CGFloat)imageData[(currentPixel * 4 + 2)] / 255.0f; - // currentAlphaTotal += (CGFloat)imageData[(currentPixel * 4) + 3] / 255.0f; - // } - // - // NSLog(@"Debug, average input image red: %f, green: %f, blue: %f, alpha: %f", currentRedTotal / (CGFloat)totalNumberOfPixels, currentGreenTotal / (CGFloat)totalNumberOfPixels, currentBlueTotal / (CGFloat)totalNumberOfPixels, currentAlphaTotal / (CGFloat)totalNumberOfPixels); - - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:pixelSizeToUseForTexture onlyTexture:YES]; - [outputFramebuffer disableReferenceCounting]; - - glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); - if (self.shouldSmoothlyScaleOutput) - { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - } - // no need to use self.outputTextureOptions here since pictures need this texture formats and type - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 0, format, GL_UNSIGNED_BYTE, imageData); - - if (self.shouldSmoothlyScaleOutput) - { - glGenerateMipmap(GL_TEXTURE_2D); - } - glBindTexture(GL_TEXTURE_2D, 0); - }); - - if (shouldRedrawUsingCoreGraphics) - { - free(imageData); - } - else - { - CFRelease(dataFromImageDataProvider); - } - - return self; -} - -// ARC forbids explicit message send of 'release' on Mountain Lion, but needs this on Lion and older -#if ( (MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_8) || (!defined(__MAC_10_8)) ) -- (void)dealloc; -{ - [outputFramebuffer enableReferenceCounting]; - [outputFramebuffer unlock]; - - if (imageUpdateSemaphore != NULL) - { - dispatch_release(imageUpdateSemaphore); - } -} -#endif - -#pragma mark - -#pragma mark Image rendering - -- (void)removeAllTargets; -{ - [super removeAllTargets]; - hasProcessedImage = NO; -} - -- (void)processImage; -{ - [self processImageWithCompletionHandler:nil]; -} - -- (BOOL)processImageWithCompletionHandler:(void (^)(void))completion; -{ - hasProcessedImage = YES; - - // dispatch_semaphore_wait(imageUpdateSemaphore, DISPATCH_TIME_FOREVER); - - if (dispatch_semaphore_wait(imageUpdateSemaphore, DISPATCH_TIME_NOW) != 0) - { - return NO; - } - - runAsynchronouslyOnVideoProcessingQueue(^{ - for (id currentTarget in targets) - { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; - - [currentTarget setCurrentlyReceivingMonochromeInput:NO]; - [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; - [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; - [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; - } - - dispatch_semaphore_signal(imageUpdateSemaphore); - - if (completion != nil) { - completion(); - } - }); - - return YES; -} - -- (void)processImageUpToFilter:(GPUImageOutput *)finalFilterInChain withCompletionHandler:(void (^)(NSImage *processedImage))block; -{ - [finalFilterInChain useNextFrameForImageCapture]; - [self processImageWithCompletionHandler:^{ - NSImage *imageFromFilter = [finalFilterInChain imageFromCurrentFramebuffer]; - block(imageFromFilter); - }]; -} - -- (CGSize)outputImageSize; -{ - return pixelSizeOfImage; -} - -- (void)addTarget:(id)newTarget atTextureLocation:(NSInteger)textureLocation; -{ - [super addTarget:newTarget atTextureLocation:textureLocation]; - - if (hasProcessedImage) - { - [newTarget setInputSize:pixelSizeOfImage atIndex:textureLocation]; - [newTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureLocation]; - } -} - -@end \ No newline at end of file diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageView.h b/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageView.h deleted file mode 100755 index 029883a..0000000 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageView.h +++ /dev/null @@ -1,39 +0,0 @@ -#import -#import "GPUImageContext.h" - -typedef enum { - kGPUImageFillModeStretch, // Stretch to fill the full view, which may distort the image outside of its normal aspect ratio - kGPUImageFillModePreserveAspectRatio, // Maintains the aspect ratio of the source image, adding bars of the specified background color - kGPUImageFillModePreserveAspectRatioAndFill // Maintains the aspect ratio of the source image, zooming in on its center to fill the view -} GPUImageFillModeType; - -/** - UIView subclass to use as an endpoint for displaying GPUImage outputs - */ -@interface GPUImageView : NSOpenGLView -{ - GPUImageRotationMode inputRotation; -} - -/** The fill mode dictates how images are fit in the view, with the default being kGPUImageFillModePreserveAspectRatio - */ -@property(readwrite, nonatomic) GPUImageFillModeType fillMode; - -/** This calculates the current display size, in pixels, taking into account Retina scaling factors - */ -@property(readonly, nonatomic) CGSize sizeInPixels; - -@property(nonatomic) BOOL enabled; - -/** Handling fill mode - - @param redComponent Red component for background color - @param greenComponent Green component for background color - @param blueComponent Blue component for background color - @param alphaComponent Alpha component for background color - */ -- (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; - -- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; - -@end diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageView.m b/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageView.m deleted file mode 100755 index 9e277ac..0000000 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/GPUImageView.m +++ /dev/null @@ -1,458 +0,0 @@ -#import "GPUImageView.h" -#import -#import "GPUImageContext.h" -#import "GPUImageFilter.h" -#import - -#pragma mark - -#pragma mark Private methods and instance variables - -@interface GPUImageView () -{ - GPUImageFramebuffer *inputFramebufferForDisplay; - - GLProgram *displayProgram; - GLint displayPositionAttribute, displayTextureCoordinateAttribute; - GLint displayInputTextureUniform; - - CGSize inputImageSize; - GLfloat imageVertices[8]; - GLfloat backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha; -} - -// Initialization and teardown -- (void)commonInit; - -// Managing the display FBOs -- (void)createDisplayFramebuffer; -- (void)destroyDisplayFramebuffer; - -// Handling fill mode -- (void)recalculateViewGeometry; - -@end - -@implementation GPUImageView - -@synthesize sizeInPixels = _sizeInPixels; -@synthesize fillMode = _fillMode; -@synthesize enabled; - -#pragma mark - -#pragma mark Initialization and teardown - -- (id)initWithFrame:(CGRect)frame -{ - if (!(self = [super initWithFrame:frame])) - { - return nil; - } - - [self commonInit]; - - return self; -} - --(id)initWithCoder:(NSCoder *)coder -{ - if (!(self = [super initWithCoder:coder])) - { - return nil; - } - - [self commonInit]; - - return self; -} - -- (void)commonInit; -{ - [self setOpenGLContext:[[GPUImageContext sharedImageProcessingContext] context]]; - - if ([self respondsToSelector:@selector(setWantsBestResolutionOpenGLSurface:)]) - { - [self setWantsBestResolutionOpenGLSurface:YES]; - } - - inputRotation = kGPUImageNoRotation; - self.hidden = NO; - - self.enabled = YES; - - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext useImageProcessingContext]; - displayProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; - - if (!displayProgram.initialized) - { - [displayProgram addAttribute:@"position"]; - [displayProgram addAttribute:@"inputTextureCoordinate"]; - - if (![displayProgram link]) - { - NSString *progLog = [displayProgram programLog]; - NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [displayProgram fragmentShaderLog]; - NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [displayProgram vertexShaderLog]; - NSLog(@"Vertex shader compile log: %@", vertLog); - displayProgram = nil; - NSAssert(NO, @"Filter shader link failed"); - } - } - - displayPositionAttribute = [displayProgram attributeIndex:@"position"]; - displayTextureCoordinateAttribute = [displayProgram attributeIndex:@"inputTextureCoordinate"]; - displayInputTextureUniform = [displayProgram uniformIndex:@"inputImageTexture"]; - - [GPUImageContext setActiveShaderProgram:displayProgram]; - - glEnableVertexAttribArray(displayPositionAttribute); - glEnableVertexAttribArray(displayTextureCoordinateAttribute); - - [self setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:1.0]; - _fillMode = kGPUImageFillModePreserveAspectRatio; - [self createDisplayFramebuffer]; - }); - -} - -- (void)dealloc -{ -} - -#pragma mark - -#pragma mark Managing the display FBOs - -- (void)createDisplayFramebuffer; -{ - // Perhaps I'll use an FBO at some time later, but for now will render directly to the screen - if ([self respondsToSelector:@selector(convertSizeToBacking:)]) - { - _sizeInPixels = [self convertSizeToBacking:self.bounds.size]; - } - else - { - _sizeInPixels = self.bounds.size; - } -} - -- (void)destroyDisplayFramebuffer; -{ - [self.openGLContext makeCurrentContext]; -} - -- (void)setDisplayFramebuffer; -{ - glBindFramebuffer(GL_FRAMEBUFFER, 0); - glBindRenderbuffer(GL_RENDERBUFFER, 0); - - glViewport(0, 0, (GLint)_sizeInPixels.width, (GLint)_sizeInPixels.height); -} - -- (void)presentFramebuffer; -{ - [self.openGLContext flushBuffer]; -} - -- (void)reshape; -{ - CGSize viewSize = self.bounds.size; - if ([self respondsToSelector:@selector(convertSizeToBacking:)]) - { - viewSize = [self convertSizeToBacking:self.bounds.size]; - } - - if ( (_sizeInPixels.width == viewSize.width) && (_sizeInPixels.height == viewSize.height) ) - { - return; - } - - _sizeInPixels = viewSize; - - [self recalculateViewGeometry]; - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [self newFrameReadyAtTime:kCMTimeInvalid atIndex:0]; - }); -} - -#pragma mark - -#pragma mark Handling fill mode - -- (void)recalculateViewGeometry; -{ - CGFloat heightScaling, widthScaling; - - CGSize currentViewSize = self.sizeInPixels; - - if ((inputImageSize.width < 1.0) || (inputImageSize.height < 1.0)) - { - return; - } - - CGRect insetRect = AVMakeRectWithAspectRatioInsideRect(inputImageSize, CGRectMake(0.0,0.0,currentViewSize.width,currentViewSize.height)); - if ((insetRect.size.width < 1.0) || (insetRect.size.width < 1.0)) - { - insetRect = CGRectMake(0.0,0.0,currentViewSize.width,currentViewSize.height); - } - - switch(_fillMode) - { - case kGPUImageFillModeStretch: - { - widthScaling = 1.0; - heightScaling = 1.0; - }; break; - case kGPUImageFillModePreserveAspectRatio: - { - widthScaling = insetRect.size.width / currentViewSize.width; - heightScaling = insetRect.size.height / currentViewSize.height; - }; break; - case kGPUImageFillModePreserveAspectRatioAndFill: - { - widthScaling = currentViewSize.height / insetRect.size.height; - heightScaling = currentViewSize.width / insetRect.size.width; - }; break; - } - - imageVertices[0] = -widthScaling; - imageVertices[1] = -heightScaling; - imageVertices[2] = widthScaling; - imageVertices[3] = -heightScaling; - imageVertices[4] = -widthScaling; - imageVertices[5] = heightScaling; - imageVertices[6] = widthScaling; - imageVertices[7] = heightScaling; -} - -- (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; -{ - backgroundColorRed = redComponent; - backgroundColorGreen = greenComponent; - backgroundColorBlue = blueComponent; - backgroundColorAlpha = alphaComponent; -} - -+ (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationMode; -{ -// static const GLfloat noRotationTextureCoordinates[] = { -// 0.0f, 0.0f, -// 1.0f, 0.0f, -// 0.0f, 1.0f, -// 1.0f, 1.0f, -// }; - - static const GLfloat noRotationTextureCoordinates[] = { - 0.0f, 1.0f, - 1.0f, 1.0f, - 0.0f, 0.0f, - 1.0f, 0.0f, - }; - - static const GLfloat rotateRightTextureCoordinates[] = { - 1.0f, 1.0f, - 1.0f, 0.0f, - 0.0f, 1.0f, - 0.0f, 0.0f, - }; - - static const GLfloat rotateLeftTextureCoordinates[] = { - 0.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 0.0f, - 1.0f, 1.0f, - }; - - static const GLfloat verticalFlipTextureCoordinates[] = { - 0.0f, 0.0f, - 1.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 1.0f, - }; - - static const GLfloat horizontalFlipTextureCoordinates[] = { - 1.0f, 1.0f, - 0.0f, 1.0f, - 1.0f, 0.0f, - 0.0f, 0.0f, - }; - - static const GLfloat rotateRightVerticalFlipTextureCoordinates[] = { - 1.0f, 0.0f, - 1.0f, 1.0f, - 0.0f, 0.0f, - 0.0f, 1.0f, - }; - - static const GLfloat rotateRightHorizontalFlipTextureCoordinates[] = { - 1.0f, 1.0f, - 1.0f, 0.0f, - 0.0f, 1.0f, - 0.0f, 0.0f, - }; - - static const GLfloat rotate180TextureCoordinates[] = { - 1.0f, 0.0f, - 0.0f, 0.0f, - 1.0f, 1.0f, - 0.0f, 1.0f, - }; - - switch(rotationMode) - { - case kGPUImageNoRotation: return noRotationTextureCoordinates; - case kGPUImageRotateLeft: return rotateLeftTextureCoordinates; - case kGPUImageRotateRight: return rotateRightTextureCoordinates; - case kGPUImageFlipVertical: return verticalFlipTextureCoordinates; - case kGPUImageFlipHorizonal: return horizontalFlipTextureCoordinates; - case kGPUImageRotateRightFlipVertical: return rotateRightVerticalFlipTextureCoordinates; - case kGPUImageRotateRightFlipHorizontal: return rotateRightHorizontalFlipTextureCoordinates; - case kGPUImageRotate180: return rotate180TextureCoordinates; - } -} - -#pragma mark - -#pragma mark GPUInput protocol - -- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; -{ - runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext setActiveShaderProgram:displayProgram]; - [self setDisplayFramebuffer]; - - glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); - glClear(GL_COLOR_BUFFER_BIT); - - // Re-render onscreen, flipped to a normal orientation - glBindFramebuffer(GL_FRAMEBUFFER, 0); - glBindRenderbuffer(GL_RENDERBUFFER, 0); - - glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, [inputFramebufferForDisplay texture]); - glUniform1i(displayInputTextureUniform, 4); - - glVertexAttribPointer(displayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices); - glVertexAttribPointer(displayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [GPUImageView textureCoordinatesForRotation:inputRotation]); - - BOOL canLockFocus = YES; - if ([self respondsToSelector:@selector(lockFocusIfCanDraw)]) - { - canLockFocus = [self lockFocusIfCanDraw]; - } - else - { - [self lockFocus]; - } - - if (canLockFocus) - { - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - - [self presentFramebuffer]; - glBindTexture(GL_TEXTURE_2D, 0); - [self unlockFocus]; - } - - [inputFramebufferForDisplay unlock]; - inputFramebufferForDisplay = nil; - }); -} - -- (NSInteger)nextAvailableTextureIndex; -{ - return 0; -} - -- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex; -{ - inputFramebufferForDisplay = newInputFramebuffer; - [inputFramebufferForDisplay lock]; -} - -- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; -{ - inputRotation = newInputRotation; -} - -- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; -{ - if ((newSize.width < 1.0) || (newSize.height < 1.0)) - { - return; - } - - runSynchronouslyOnVideoProcessingQueue(^{ - CGSize rotatedSize = newSize; - - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) - { - rotatedSize.width = newSize.height; - rotatedSize.height = newSize.width; - } - - if (!CGSizeEqualToSize(inputImageSize, rotatedSize)) - { - inputImageSize = rotatedSize; - [self recalculateViewGeometry]; - } - }); -} - -- (CGSize)maximumOutputSize; -{ - if ([self respondsToSelector:@selector(convertSizeToBacking:)]) - { - return [self convertSizeToBacking:self.bounds.size]; - } - else - { - return self.bounds.size; - } -} - -- (void)endProcessing -{ -} - -- (BOOL)shouldIgnoreUpdatesToThisTarget; -{ - return NO; -} - -- (void)conserveMemoryForNextFrame; -{ - -} - -- (BOOL)wantsMonochromeInput; -{ - return NO; -} - -- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue; -{ - -} - -#pragma mark - -#pragma mark Accessors - -- (CGSize)sizeInPixels; -{ - if (CGSizeEqualToSize(_sizeInPixels, CGSizeZero)) - { - return [self maximumOutputSize]; - } - else - { - return _sizeInPixels; - } -} - -- (void)setFillMode:(GPUImageFillModeType)newValue; -{ - _fillMode = newValue; - [self recalculateViewGeometry]; -} - -@end diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/en.lproj/InfoPlist.strings b/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28f..0000000 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/Mac/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/iOS/GPUImageMovieWriter.m b/ScannerApp/Frameworks/GPUImage/framework/Source/iOS/GPUImageMovieWriter.m index addc0a7..1974d61 100755 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/iOS/GPUImageMovieWriter.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/iOS/GPUImageMovieWriter.m @@ -101,43 +101,43 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr [_movieWriterContext useSharegroup:[[[GPUImageContext sharedImageProcessingContext] context] sharegroup]]; runSynchronouslyOnContextQueue(_movieWriterContext, ^{ - [_movieWriterContext useAsCurrentContext]; + [self->_movieWriterContext useAsCurrentContext]; if ([GPUImageContext supportsFastTextureUpload]) { - colorSwizzlingProgram = [_movieWriterContext programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; + self->colorSwizzlingProgram = [self->_movieWriterContext programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; } else { - colorSwizzlingProgram = [_movieWriterContext programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; + self->colorSwizzlingProgram = [self->_movieWriterContext programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImageColorSwizzlingFragmentShaderString]; } - if (!colorSwizzlingProgram.initialized) + if (!self->colorSwizzlingProgram.initialized) { - [colorSwizzlingProgram addAttribute:@"position"]; - [colorSwizzlingProgram addAttribute:@"inputTextureCoordinate"]; + [self->colorSwizzlingProgram addAttribute:@"position"]; + [self->colorSwizzlingProgram addAttribute:@"inputTextureCoordinate"]; - if (![colorSwizzlingProgram link]) + if (![self->colorSwizzlingProgram link]) { - NSString *progLog = [colorSwizzlingProgram programLog]; + NSString *progLog = [self->colorSwizzlingProgram programLog]; NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [colorSwizzlingProgram fragmentShaderLog]; + NSString *fragLog = [self->colorSwizzlingProgram fragmentShaderLog]; NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [colorSwizzlingProgram vertexShaderLog]; + NSString *vertLog = [self->colorSwizzlingProgram vertexShaderLog]; NSLog(@"Vertex shader compile log: %@", vertLog); - colorSwizzlingProgram = nil; + self->colorSwizzlingProgram = nil; NSAssert(NO, @"Filter shader link failed"); } } - colorSwizzlingPositionAttribute = [colorSwizzlingProgram attributeIndex:@"position"]; - colorSwizzlingTextureCoordinateAttribute = [colorSwizzlingProgram attributeIndex:@"inputTextureCoordinate"]; - colorSwizzlingInputTextureUniform = [colorSwizzlingProgram uniformIndex:@"inputImageTexture"]; + self->colorSwizzlingPositionAttribute = [self->colorSwizzlingProgram attributeIndex:@"position"]; + self->colorSwizzlingTextureCoordinateAttribute = [self->colorSwizzlingProgram attributeIndex:@"inputTextureCoordinate"]; + self->colorSwizzlingInputTextureUniform = [self->colorSwizzlingProgram uniformIndex:@"inputImageTexture"]; - [_movieWriterContext setContextShaderProgram:colorSwizzlingProgram]; + [self->_movieWriterContext setContextShaderProgram:self->colorSwizzlingProgram]; - glEnableVertexAttribArray(colorSwizzlingPositionAttribute); - glEnableVertexAttribArray(colorSwizzlingTextureCoordinateAttribute); + glEnableVertexAttribArray(self->colorSwizzlingPositionAttribute); + glEnableVertexAttribArray(self->colorSwizzlingTextureCoordinateAttribute); }); [self initializeMovieWithOutputSettings:outputSettings]; @@ -272,9 +272,9 @@ - (void)startRecording; alreadyFinishedRecording = NO; startTime = kCMTimeInvalid; runSynchronouslyOnContextQueue(_movieWriterContext, ^{ - if (audioInputReadyCallback == NULL) + if (self->audioInputReadyCallback == NULL) { - [assetWriter startWriting]; + [self->assetWriter startWriting]; } }); isRecording = YES; @@ -297,19 +297,19 @@ - (void)cancelRecording; isRecording = NO; runSynchronouslyOnContextQueue(_movieWriterContext, ^{ - alreadyFinishedRecording = YES; + self->alreadyFinishedRecording = YES; - if( assetWriter.status == AVAssetWriterStatusWriting && ! videoEncodingIsFinished ) + if( self->assetWriter.status == AVAssetWriterStatusWriting && ! self->videoEncodingIsFinished ) { - videoEncodingIsFinished = YES; - [assetWriterVideoInput markAsFinished]; + self->videoEncodingIsFinished = YES; + [self->assetWriterVideoInput markAsFinished]; } - if( assetWriter.status == AVAssetWriterStatusWriting && ! audioEncodingIsFinished ) + if( self->assetWriter.status == AVAssetWriterStatusWriting && ! self->audioEncodingIsFinished ) { - audioEncodingIsFinished = YES; - [assetWriterAudioInput markAsFinished]; + self->audioEncodingIsFinished = YES; + [self->assetWriterAudioInput markAsFinished]; } - [assetWriter cancelWriting]; + [self->assetWriter cancelWriting]; }); } @@ -321,23 +321,23 @@ - (void)finishRecording; - (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; { runSynchronouslyOnContextQueue(_movieWriterContext, ^{ - isRecording = NO; + self->isRecording = NO; - if (assetWriter.status == AVAssetWriterStatusCompleted || assetWriter.status == AVAssetWriterStatusCancelled || assetWriter.status == AVAssetWriterStatusUnknown) + if (self->assetWriter.status == AVAssetWriterStatusCompleted || self->assetWriter.status == AVAssetWriterStatusCancelled || self->assetWriter.status == AVAssetWriterStatusUnknown) { if (handler) - runAsynchronouslyOnContextQueue(_movieWriterContext, handler); + runAsynchronouslyOnContextQueue(self->_movieWriterContext, handler); return; } - if( assetWriter.status == AVAssetWriterStatusWriting && ! videoEncodingIsFinished ) + if( self->assetWriter.status == AVAssetWriterStatusWriting && ! self->videoEncodingIsFinished ) { - videoEncodingIsFinished = YES; - [assetWriterVideoInput markAsFinished]; + self->videoEncodingIsFinished = YES; + [self->assetWriterVideoInput markAsFinished]; } - if( assetWriter.status == AVAssetWriterStatusWriting && ! audioEncodingIsFinished ) + if( self->assetWriter.status == AVAssetWriterStatusWriting && ! self->audioEncodingIsFinished ) { - audioEncodingIsFinished = YES; - [assetWriterAudioInput markAsFinished]; + self->audioEncodingIsFinished = YES; + [self->assetWriterAudioInput markAsFinished]; } #if (!defined(__IPHONE_6_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)) // Not iOS 6 SDK @@ -346,18 +346,18 @@ - (void)finishRecordingWithCompletionHandler:(void (^)(void))handler; runAsynchronouslyOnContextQueue(_movieWriterContext,handler); #else // iOS 6 SDK - if ([assetWriter respondsToSelector:@selector(finishWritingWithCompletionHandler:)]) { + if ([self->assetWriter respondsToSelector:@selector(finishWritingWithCompletionHandler:)]) { // Running iOS 6 - [assetWriter finishWritingWithCompletionHandler:(handler ?: ^{ })]; + [self->assetWriter finishWritingWithCompletionHandler:(handler ?: ^{ })]; } else { // Not running iOS 6 #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" - [assetWriter finishWriting]; + [self->assetWriter finishWriting]; #pragma clang diagnostic pop if (handler) - runAsynchronouslyOnContextQueue(_movieWriterContext, handler); + runAsynchronouslyOnContextQueue(self->_movieWriterContext, handler); } #endif }); @@ -380,12 +380,12 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; if (CMTIME_IS_INVALID(startTime)) { runSynchronouslyOnContextQueue(_movieWriterContext, ^{ - if ((audioInputReadyCallback == NULL) && (assetWriter.status != AVAssetWriterStatusWriting)) + if ((self->audioInputReadyCallback == NULL) && (self->assetWriter.status != AVAssetWriterStatusWriting)) { - [assetWriter startWriting]; + [self->assetWriter startWriting]; } - [assetWriter startSessionAtSourceTime:currentSampleTime]; - startTime = currentSampleTime; + [self->assetWriter startSessionAtSourceTime:currentSampleTime]; + self->startTime = currentSampleTime; }); } @@ -454,19 +454,19 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; } // NSLog(@"Recorded audio sample time: %lld, %d, %lld", currentSampleTime.value, currentSampleTime.timescale, currentSampleTime.epoch); - void(^write)() = ^() { - while( ! assetWriterAudioInput.readyForMoreMediaData && ! _encodingLiveVideo && ! audioEncodingIsFinished ) { + void(^write)(void) = ^() { + while( ! self->assetWriterAudioInput.readyForMoreMediaData && ! self->_encodingLiveVideo && ! self->audioEncodingIsFinished ) { NSDate *maxDate = [NSDate dateWithTimeIntervalSinceNow:0.5]; //NSLog(@"audio waiting..."); [[NSRunLoop currentRunLoop] runUntilDate:maxDate]; } - if (!assetWriterAudioInput.readyForMoreMediaData) + if (!self->assetWriterAudioInput.readyForMoreMediaData) { NSLog(@"2: Had to drop an audio frame %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, currentSampleTime))); } - else if(assetWriter.status == AVAssetWriterStatusWriting) + else if(self->assetWriter.status == AVAssetWriterStatusWriting) { - if (![assetWriterAudioInput appendSampleBuffer:audioBuffer]) + if (![self->assetWriterAudioInput appendSampleBuffer:audioBuffer]) NSLog(@"Problem appending audio buffer at time: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, currentSampleTime))); } else @@ -474,7 +474,7 @@ - (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; //NSLog(@"Wrote an audio frame %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, currentSampleTime))); } - if (_shouldInvalidateAudioSampleWhenDone) + if (self->_shouldInvalidateAudioSampleWhenDone) { CMSampleBufferInvalidate(audioBuffer); } @@ -503,7 +503,7 @@ - (void)enableSynchronizationCallbacks; } videoQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.videoReadingQueue", GPUImageDefaultQueueAttribute()); [assetWriterVideoInput requestMediaDataWhenReadyOnQueue:videoQueue usingBlock:^{ - if( _paused ) + if( self->_paused ) { //NSLog(@"video requestMediaDataWhenReadyOnQueue paused"); // if we don't sleep, we'll get called back almost immediately, chewing up CPU @@ -511,15 +511,15 @@ - (void)enableSynchronizationCallbacks; return; } //NSLog(@"video requestMediaDataWhenReadyOnQueue begin"); - while( assetWriterVideoInput.readyForMoreMediaData && ! _paused ) + while( self->assetWriterVideoInput.readyForMoreMediaData && ! self->_paused ) { - if( videoInputReadyCallback && ! videoInputReadyCallback() && ! videoEncodingIsFinished ) + if( self->videoInputReadyCallback && ! self->videoInputReadyCallback() && ! self->videoEncodingIsFinished ) { - runAsynchronouslyOnContextQueue(_movieWriterContext, ^{ - if( assetWriter.status == AVAssetWriterStatusWriting && ! videoEncodingIsFinished ) + runAsynchronouslyOnContextQueue(self->_movieWriterContext, ^{ + if( self->assetWriter.status == AVAssetWriterStatusWriting && ! self->videoEncodingIsFinished ) { - videoEncodingIsFinished = YES; - [assetWriterVideoInput markAsFinished]; + self->videoEncodingIsFinished = YES; + [self->assetWriterVideoInput markAsFinished]; } }); } @@ -532,7 +532,7 @@ - (void)enableSynchronizationCallbacks; { audioQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.audioReadingQueue", GPUImageDefaultQueueAttribute()); [assetWriterAudioInput requestMediaDataWhenReadyOnQueue:audioQueue usingBlock:^{ - if( _paused ) + if( self->_paused ) { //NSLog(@"audio requestMediaDataWhenReadyOnQueue paused"); // if we don't sleep, we'll get called back almost immediately, chewing up CPU @@ -540,15 +540,15 @@ - (void)enableSynchronizationCallbacks; return; } //NSLog(@"audio requestMediaDataWhenReadyOnQueue begin"); - while( assetWriterAudioInput.readyForMoreMediaData && ! _paused ) + while( self->assetWriterAudioInput.readyForMoreMediaData && ! self->_paused ) { - if( audioInputReadyCallback && ! audioInputReadyCallback() && ! audioEncodingIsFinished ) + if( self->audioInputReadyCallback && ! self->audioInputReadyCallback() && ! self->audioEncodingIsFinished ) { - runAsynchronouslyOnContextQueue(_movieWriterContext, ^{ - if( assetWriter.status == AVAssetWriterStatusWriting && ! audioEncodingIsFinished ) + runAsynchronouslyOnContextQueue(self->_movieWriterContext, ^{ + if( self->assetWriter.status == AVAssetWriterStatusWriting && ! self->audioEncodingIsFinished ) { - audioEncodingIsFinished = YES; - [assetWriterAudioInput markAsFinished]; + self->audioEncodingIsFinished = YES; + [self->assetWriterAudioInput markAsFinished]; } }); } @@ -618,29 +618,29 @@ - (void)createDataFBO; - (void)destroyDataFBO; { runSynchronouslyOnContextQueue(_movieWriterContext, ^{ - [_movieWriterContext useAsCurrentContext]; + [self->_movieWriterContext useAsCurrentContext]; - if (movieFramebuffer) + if (self->movieFramebuffer) { - glDeleteFramebuffers(1, &movieFramebuffer); - movieFramebuffer = 0; + glDeleteFramebuffers(1, &self->movieFramebuffer); + self->movieFramebuffer = 0; } - if (movieRenderbuffer) + if (self->movieRenderbuffer) { - glDeleteRenderbuffers(1, &movieRenderbuffer); - movieRenderbuffer = 0; + glDeleteRenderbuffers(1, &self->movieRenderbuffer); + self->movieRenderbuffer = 0; } if ([GPUImageContext supportsFastTextureUpload]) { - if (renderTexture) + if (self->renderTexture) { - CFRelease(renderTexture); + CFRelease(self->renderTexture); } - if (renderTarget) + if (self->renderTarget) { - CVPixelBufferRelease(renderTarget); + CVPixelBufferRelease(self->renderTarget); } } @@ -737,13 +737,13 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; if (CMTIME_IS_INVALID(startTime)) { runSynchronouslyOnContextQueue(_movieWriterContext, ^{ - if ((videoInputReadyCallback == NULL) && (assetWriter.status != AVAssetWriterStatusWriting)) + if ((self->videoInputReadyCallback == NULL) && (self->assetWriter.status != AVAssetWriterStatusWriting)) { - [assetWriter startWriting]; + [self->assetWriter startWriting]; } - [assetWriter startSessionAtSourceTime:frameTime]; - startTime = frameTime; + [self->assetWriter startSessionAtSourceTime:frameTime]; + self->startTime = frameTime; }); } @@ -751,7 +751,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; glFinish(); runAsynchronouslyOnContextQueue(_movieWriterContext, ^{ - if (!assetWriterVideoInput.readyForMoreMediaData && _encodingLiveVideo) + if (!self->assetWriterVideoInput.readyForMoreMediaData && self->_encodingLiveVideo) { [inputFramebufferForBlock unlock]; NSLog(@"1: Had to drop a video frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); @@ -759,19 +759,19 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; } // Render the frame with swizzled colors, so that they can be uploaded quickly as BGRA frames - [_movieWriterContext useAsCurrentContext]; + [self->_movieWriterContext useAsCurrentContext]; [self renderAtInternalSizeUsingFramebuffer:inputFramebufferForBlock]; CVPixelBufferRef pixel_buffer = NULL; if ([GPUImageContext supportsFastTextureUpload]) { - pixel_buffer = renderTarget; + pixel_buffer = self->renderTarget; CVPixelBufferLockBaseAddress(pixel_buffer, 0); } else { - CVReturn status = CVPixelBufferPoolCreatePixelBuffer (NULL, [assetWriterPixelBufferInput pixelBufferPool], &pixel_buffer); + CVReturn status = CVPixelBufferPoolCreatePixelBuffer (NULL, [self->assetWriterPixelBufferInput pixelBufferPool], &pixel_buffer); if ((pixel_buffer == NULL) || (status != kCVReturnSuccess)) { CVPixelBufferRelease(pixel_buffer); @@ -782,23 +782,23 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; CVPixelBufferLockBaseAddress(pixel_buffer, 0); GLubyte *pixelBufferData = (GLubyte *)CVPixelBufferGetBaseAddress(pixel_buffer); - glReadPixels(0, 0, videoSize.width, videoSize.height, GL_RGBA, GL_UNSIGNED_BYTE, pixelBufferData); + glReadPixels(0, 0, self->videoSize.width, self->videoSize.height, GL_RGBA, GL_UNSIGNED_BYTE, pixelBufferData); } } - void(^write)() = ^() { - while( ! assetWriterVideoInput.readyForMoreMediaData && ! _encodingLiveVideo && ! videoEncodingIsFinished ) { + void(^write)(void) = ^() { + while( ! self->assetWriterVideoInput.readyForMoreMediaData && ! self->_encodingLiveVideo && ! self->videoEncodingIsFinished ) { NSDate *maxDate = [NSDate dateWithTimeIntervalSinceNow:0.1]; // NSLog(@"video waiting..."); [[NSRunLoop currentRunLoop] runUntilDate:maxDate]; } - if (!assetWriterVideoInput.readyForMoreMediaData) + if (!self->assetWriterVideoInput.readyForMoreMediaData) { NSLog(@"2: Had to drop a video frame: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); } else if(self.assetWriter.status == AVAssetWriterStatusWriting) { - if (![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:frameTime]) + if (![self->assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:frameTime]) NSLog(@"Problem appending pixel buffer at time: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); } else @@ -808,7 +808,7 @@ - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; } CVPixelBufferUnlockBaseAddress(pixel_buffer, 0); - previousFrameTime = frameTime; + self->previousFrameTime = frameTime; if (![GPUImageContext supportsFastTextureUpload]) { diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/iOS/GPUImagePicture+TextureSubimage.m b/ScannerApp/Frameworks/GPUImage/framework/Source/iOS/GPUImagePicture+TextureSubimage.m index 71ef8f9..aa45b66 100644 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/iOS/GPUImagePicture+TextureSubimage.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/iOS/GPUImagePicture+TextureSubimage.m @@ -77,9 +77,9 @@ - (void)replaceTextureWithSubCGImage:(CGImageRef)subimageSource inRect:(CGRect)s runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - [outputFramebuffer disableReferenceCounting]; + [self->outputFramebuffer disableReferenceCounting]; - glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); + glBindTexture(GL_TEXTURE_2D, [self->outputFramebuffer texture]); // no need to use self.outputTextureOptions here since pictures need this texture formats and type glTexSubImage2D(GL_TEXTURE_2D, 0, subRect.origin.x, subRect.origin.y, (GLint)subRect.size.width, subRect.size.height, GL_RGBA, GL_UNSIGNED_BYTE, imageData); diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/iOS/GPUImagePicture.m b/ScannerApp/Frameworks/GPUImage/framework/Source/iOS/GPUImagePicture.m index c525f4d..184e851 100755 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/iOS/GPUImagePicture.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/iOS/GPUImagePicture.m @@ -249,10 +249,10 @@ - (id)initWithCGImage:(CGImageRef)newImageSource smoothlyScaleOutput:(BOOL)smoot runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:pixelSizeToUseForTexture onlyTexture:YES]; - [outputFramebuffer disableReferenceCounting]; + self->outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:pixelSizeToUseForTexture onlyTexture:YES]; + [self->outputFramebuffer disableReferenceCounting]; - glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); + glBindTexture(GL_TEXTURE_2D, [self->outputFramebuffer texture]); if (self.shouldSmoothlyScaleOutput) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); @@ -322,18 +322,18 @@ - (BOOL)processImageWithCompletionHandler:(void (^)(void))completion; } runAsynchronouslyOnVideoProcessingQueue(^{ - for (id currentTarget in targets) + for (id currentTarget in self->targets) { - NSInteger indexOfObject = [targets indexOfObject:currentTarget]; - NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; + NSInteger indexOfObject = [self->targets indexOfObject:currentTarget]; + NSInteger textureIndexOfTarget = [[self->targetTextureIndices objectAtIndex:indexOfObject] integerValue]; [currentTarget setCurrentlyReceivingMonochromeInput:NO]; - [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; - [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; + [currentTarget setInputSize:self->pixelSizeOfImage atIndex:textureIndexOfTarget]; + [currentTarget setInputFramebuffer:self->outputFramebuffer atIndex:textureIndexOfTarget]; [currentTarget newFrameReadyAtTime:kCMTimeIndefinite atIndex:textureIndexOfTarget]; } - dispatch_semaphore_signal(imageUpdateSemaphore); + dispatch_semaphore_signal(self->imageUpdateSemaphore); if (completion != nil) { completion(); diff --git a/ScannerApp/Frameworks/GPUImage/framework/Source/iOS/GPUImageView.m b/ScannerApp/Frameworks/GPUImage/framework/Source/iOS/GPUImageView.m index e092b80..0871066 100755 --- a/ScannerApp/Frameworks/GPUImage/framework/Source/iOS/GPUImageView.m +++ b/ScannerApp/Frameworks/GPUImage/framework/Source/iOS/GPUImageView.m @@ -97,35 +97,35 @@ - (void)commonInit; runSynchronouslyOnVideoProcessingQueue(^{ [GPUImageContext useImageProcessingContext]; - displayProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; - if (!displayProgram.initialized) + self->displayProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString]; + if (!self->displayProgram.initialized) { - [displayProgram addAttribute:@"position"]; - [displayProgram addAttribute:@"inputTextureCoordinate"]; + [self->displayProgram addAttribute:@"position"]; + [self->displayProgram addAttribute:@"inputTextureCoordinate"]; - if (![displayProgram link]) + if (![self->displayProgram link]) { - NSString *progLog = [displayProgram programLog]; + NSString *progLog = [self->displayProgram programLog]; NSLog(@"Program link log: %@", progLog); - NSString *fragLog = [displayProgram fragmentShaderLog]; + NSString *fragLog = [self->displayProgram fragmentShaderLog]; NSLog(@"Fragment shader compile log: %@", fragLog); - NSString *vertLog = [displayProgram vertexShaderLog]; + NSString *vertLog = [self->displayProgram vertexShaderLog]; NSLog(@"Vertex shader compile log: %@", vertLog); - displayProgram = nil; + self->displayProgram = nil; NSAssert(NO, @"Filter shader link failed"); } } - displayPositionAttribute = [displayProgram attributeIndex:@"position"]; - displayTextureCoordinateAttribute = [displayProgram attributeIndex:@"inputTextureCoordinate"]; - displayInputTextureUniform = [displayProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputTexture" for the fragment shader + self->displayPositionAttribute = [self->displayProgram attributeIndex:@"position"]; + self->displayTextureCoordinateAttribute = [self->displayProgram attributeIndex:@"inputTextureCoordinate"]; + self->displayInputTextureUniform = [self->displayProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputTexture" for the fragment shader - [GPUImageContext setActiveShaderProgram:displayProgram]; - glEnableVertexAttribArray(displayPositionAttribute); - glEnableVertexAttribArray(displayTextureCoordinateAttribute); + [GPUImageContext setActiveShaderProgram:self->displayProgram]; + glEnableVertexAttribArray(self->displayPositionAttribute); + glEnableVertexAttribArray(self->displayTextureCoordinateAttribute); [self setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:1.0]; - _fillMode = kGPUImageFillModePreserveAspectRatio; + self->_fillMode = kGPUImageFillModePreserveAspectRatio; [self createDisplayFramebuffer]; }); } @@ -240,9 +240,9 @@ - (void)recalculateViewGeometry; // CGFloat imageAspectRatio = inputImageSize.width / inputImageSize.height; // CGFloat viewAspectRatio = currentViewSize.width / currentViewSize.height; - CGRect insetRect = AVMakeRectWithAspectRatioInsideRect(inputImageSize, self.bounds); + CGRect insetRect = AVMakeRectWithAspectRatioInsideRect(self->inputImageSize, self.bounds); - switch(_fillMode) + switch(self->_fillMode) { case kGPUImageFillModeStretch: { @@ -262,14 +262,14 @@ - (void)recalculateViewGeometry; }; break; } - imageVertices[0] = -widthScaling; - imageVertices[1] = -heightScaling; - imageVertices[2] = widthScaling; - imageVertices[3] = -heightScaling; - imageVertices[4] = -widthScaling; - imageVertices[5] = heightScaling; - imageVertices[6] = widthScaling; - imageVertices[7] = heightScaling; + self->imageVertices[0] = -widthScaling; + self->imageVertices[1] = -heightScaling; + self->imageVertices[2] = widthScaling; + self->imageVertices[3] = -heightScaling; + self->imageVertices[4] = -widthScaling; + self->imageVertices[5] = heightScaling; + self->imageVertices[6] = widthScaling; + self->imageVertices[7] = heightScaling; }); // static const GLfloat imageVertices[] = { @@ -372,24 +372,24 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { runSynchronouslyOnVideoProcessingQueue(^{ - [GPUImageContext setActiveShaderProgram:displayProgram]; + [GPUImageContext setActiveShaderProgram:self->displayProgram]; [self setDisplayFramebuffer]; - glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); + glClearColor(self->backgroundColorRed, self->backgroundColorGreen, self->backgroundColorBlue, self->backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, [inputFramebufferForDisplay texture]); - glUniform1i(displayInputTextureUniform, 4); + glBindTexture(GL_TEXTURE_2D, [self->inputFramebufferForDisplay texture]); + glUniform1i(self->displayInputTextureUniform, 4); - glVertexAttribPointer(displayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices); - glVertexAttribPointer(displayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [GPUImageView textureCoordinatesForRotation:inputRotation]); + glVertexAttribPointer(self->displayPositionAttribute, 2, GL_FLOAT, 0, 0, self->imageVertices); + glVertexAttribPointer(self->displayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [GPUImageView textureCoordinatesForRotation:self->inputRotation]); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); [self presentFramebuffer]; - [inputFramebufferForDisplay unlock]; - inputFramebufferForDisplay = nil; + [self->inputFramebufferForDisplay unlock]; + self->inputFramebufferForDisplay = nil; }); } @@ -414,15 +414,15 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; runSynchronouslyOnVideoProcessingQueue(^{ CGSize rotatedSize = newSize; - if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + if (GPUImageRotationSwapsWidthAndHeight(self->inputRotation)) { rotatedSize.width = newSize.height; rotatedSize.height = newSize.width; } - if (!CGSizeEqualToSize(inputImageSize, rotatedSize)) + if (!CGSizeEqualToSize(self->inputImageSize, rotatedSize)) { - inputImageSize = rotatedSize; + self->inputImageSize = rotatedSize; [self recalculateViewGeometry]; } }); diff --git a/ScannerApp/Scanner.xcodeproj/project.pbxproj b/ScannerApp/Scanner.xcodeproj/project.pbxproj index 1b49ca7..54d36f6 100644 --- a/ScannerApp/Scanner.xcodeproj/project.pbxproj +++ b/ScannerApp/Scanner.xcodeproj/project.pbxproj @@ -136,7 +136,6 @@ 435307C41872825B00B04481 /* Default-Landscape@2x~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Landscape@2x~ipad.png"; sourceTree = ""; }; 435307C51872825B00B04481 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; 435307C61872825B00B04481 /* Default-Landscape~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Landscape~ipad.png"; sourceTree = ""; }; - 438C049918723EB10062E958 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ViewController_iPad.xib; sourceTree = ""; }; 43BB38C8199D2A51009D7AB2 /* calibration.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = calibration.png; sourceTree = ""; }; 6F03CB581862823000518C22 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = InfoPlist.strings; sourceTree = ""; }; 6F03CB5E1862832600518C22 /* EAGLView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAGLView.h; sourceTree = ""; }; @@ -152,6 +151,7 @@ 9591B5211E888E80005863DD /* Structure.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Structure.framework; path = Frameworks/Structure.framework; sourceTree = ""; }; 9591B5231E888EA6005863DD /* GPUImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImage.xcodeproj; path = Frameworks/GPUImage/framework/GPUImage.xcodeproj; sourceTree = ""; }; 95F123031F44E60700265C89 /* Config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Config.h; sourceTree = ""; }; + A8426E672257C5A90024FEFE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ViewController_iPad.xib; sourceTree = ""; }; B60CC1BC1CFD5BB500EA51F4 /* toggleDepth.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = toggleDepth.png; sourceTree = ""; }; B60CC1BE1CFE2FCD00EA51F4 /* toggleAWB.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = toggleAWB.png; sourceTree = ""; }; B631B4521D6637F10064FB0D /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; @@ -367,7 +367,7 @@ 2AFC8D6C176F966000F7F3B5 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0800; + LastUpgradeCheck = 1000; ORGANIZATIONNAME = Occipital; TargetAttributes = { 2AFC8D73176F966000F7F3B5 = { @@ -380,8 +380,10 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, global, + Base, ); mainGroup = 2AFC8D6B176F966000F7F3B5; productRefGroup = 2AFC8D75176F966000F7F3B5 /* Products */; @@ -491,7 +493,7 @@ 438C049818723EB10062E958 /* ViewController_iPad.xib */ = { isa = PBXVariantGroup; children = ( - 438C049918723EB10062E958 /* en */, + A8426E672257C5A90024FEFE /* Base */, ); name = ViewController_iPad.xib; sourceTree = ""; @@ -515,12 +517,20 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -539,7 +549,7 @@ "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.Scanner.*\n"; PROVISIONING_PROFILE = ""; @@ -562,7 +572,7 @@ GCC_PREFIX_HEADER = "Scanner/Scanner-Prefix.pch"; HEADER_SEARCH_PATHS = "./Frameworks/GPUImage/framework/**"; INFOPLIST_FILE = "Scanner/Scanner-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_CFLAGS = "-DWRITE_LOCAL"; "OTHER_LDFLAGS[arch=*]" = "-ObjC"; @@ -580,12 +590,20 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -607,7 +625,7 @@ "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.Scanner.*\n"; PROVISIONING_PROFILE = ""; @@ -629,7 +647,7 @@ GCC_PREFIX_HEADER = "Scanner/Scanner-Prefix.pch"; HEADER_SEARCH_PATHS = "./Frameworks/GPUImage/framework/**"; INFOPLIST_FILE = "Scanner/Scanner-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_CFLAGS = "-DWRITE_LOCAL"; "OTHER_LDFLAGS[arch=*]" = "-ObjC"; diff --git a/ScannerApp/Scanner/en.lproj/ViewController_iPad.xib b/ScannerApp/Scanner/Base.lproj/ViewController_iPad.xib similarity index 100% rename from ScannerApp/Scanner/en.lproj/ViewController_iPad.xib rename to ScannerApp/Scanner/Base.lproj/ViewController_iPad.xib diff --git a/ScannerApp/Scanner/Scanner-Info.plist b/ScannerApp/Scanner/Scanner-Info.plist index 1dac8f5..17ccb29 100644 --- a/ScannerApp/Scanner/Scanner-Info.plist +++ b/ScannerApp/Scanner/Scanner-Info.plist @@ -21,11 +21,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.4.2 + 1.4.3 CFBundleSignature ???? CFBundleVersion - 20170930211932 + 20190409143822 LSRequiresIPhoneOS NSAppTransportSecurity From b8c2a05f7de65efb9c0bf5868341a0f7398cb0f7 Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Thu, 16 May 2019 16:26:59 +0200 Subject: [PATCH 25/41] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d8ce1f6..b9644e1 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,7 @@ Compressed binary format with per-frame color, depth, camera pose and other data "segmentsFile": "..." // id of the *.segs.json segmentation file referenced } ``` +[BenchmarkScripts/util_3d.py](BenchmarkScripts/util_3d.py) gives examples to parsing the semantic instance information from the `*.segs.json`, `*.aggregation.json`, and `*_vh_clean_2.ply` mesh file, with example semantic segmentation visualization in [BenchmarkScripts/3d_helpers/visualize_labels_on_mesh.py](BenchmarkScripts/3d_helpers/visualize_labels_on_mesh.py). **2d annotation projections (`*_2d-label.zip`, `*_2d-instance.zip`, `*_2d-label-filt.zip`, `*_2d-instance-filt.zip`)**: Projection of 3d aggregated annotation of a scan into its RGB-D frames, according to the computed camera trajectory. From fa7178b7679f804f6d6e5aea8e9ba8f313b6f82b Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Tue, 10 Sep 2019 19:28:54 +0200 Subject: [PATCH 26/41] Update README.md --- SensReader/python/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SensReader/python/README.md b/SensReader/python/README.md index 7ab28cd..60da5a8 100644 --- a/SensReader/python/README.md +++ b/SensReader/python/README.md @@ -1,5 +1,7 @@ # Data Exporter +Developed and tested with python 2.7. + Usage: ``` python reader.py --filename [.sens file to export data from] --output_path [output directory to export data to] From 4bab079df75e21cc7aa74069676b48b9bc1811f8 Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Sat, 23 May 2020 16:25:58 +0200 Subject: [PATCH 27/41] Add files via upload --- BenchmarkScripts/convert2panoptic.py | 154 +++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 BenchmarkScripts/convert2panoptic.py diff --git a/BenchmarkScripts/convert2panoptic.py b/BenchmarkScripts/convert2panoptic.py new file mode 100644 index 0000000..7fad1e6 --- /dev/null +++ b/BenchmarkScripts/convert2panoptic.py @@ -0,0 +1,154 @@ +#!/usr/bin/python +# +# Convert to COCO-style panoptic segmentation format (http://cocodataset.org/#format-data). +# + +# python imports +from __future__ import print_function, absolute_import, division, unicode_literals +import os +import glob +import sys +import argparse +import json +import numpy as np + +# Image processing +from PIL import Image + +EVAL_LABELS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 24, 28, 33, 34, 36, 39] + +def splitall(path): + allparts = [] + while 1: + parts = os.path.split(path) + if parts[0] == path: # sentinel for absolute paths + allparts.insert(0, parts[0]) + break + elif parts[1] == path: # sentinel for relative paths + allparts.insert(0, parts[1]) + break + else: + path = parts[0] + allparts.insert(0, parts[1]) + return allparts + +# The main method +def convert2panoptic(scannetPath, outputFolder=None): + + if outputFolder is None: + outputFolder = scannetPath + + # find files + search = os.path.join(scannetPath, "*", "instance", "*.png") + files = glob.glob(search) + files.sort() + # quit if we did not find anything + if not files: + print( + "Did not find any files for using matching pattern {}. Please consult the README.".format(search) + ) + sys.exit(-1) + # a bit verbose + print("Converting {} annotation files.".format(len(files))) + + outputBaseFile = "scannet_panoptic" + outFile = os.path.join(outputFolder, "{}.json".format(outputBaseFile)) + print("Json file with the annotations in panoptic format will be saved in {}".format(outFile)) + panopticFolder = os.path.join(outputFolder, outputBaseFile) + if not os.path.isdir(panopticFolder): + print("Creating folder {} for panoptic segmentation PNGs".format(panopticFolder)) + os.mkdir(panopticFolder) + print("Corresponding segmentations in .png format will be saved in {}".format(panopticFolder)) + + images = [] + annotations = [] + for progress, f in enumerate(files): + + originalFormat = np.array(Image.open(f)) + + parts = splitall(f) + fileName = parts[-1] + sceneName = parts[-3] + outputFileName = "{}__{}".format(sceneName, fileName) + inputFileName = os.path.join(sceneName, "color", fileName) + imageId = os.path.splitext(outputFileName)[0] + # image entry, id for image is its filename without extension + images.append({"id": imageId, + "width": int(originalFormat.shape[1]), + "height": int(originalFormat.shape[0]), + "file_name": inputFileName}) + + pan_format = np.zeros( + (originalFormat.shape[0], originalFormat.shape[1], 3), dtype=np.uint8 + ) + segmentIds = np.unique(originalFormat) + segmInfo = [] + for segmentId in segmentIds: + isCrowd = 0 + if segmentId < 1000: + semanticId = segmentId + else: + semanticId = segmentId // 1000 + if semanticId not in EVAL_LABELS: + continue + + mask = originalFormat == segmentId + color = [segmentId % 256, segmentId // 256, segmentId // 256 // 256] + pan_format[mask] = color + + area = np.sum(mask) # segment area computation + + # bbox computation for a segment + hor = np.sum(mask, axis=0) + hor_idx = np.nonzero(hor)[0] + x = hor_idx[0] + width = hor_idx[-1] - x + 1 + vert = np.sum(mask, axis=1) + vert_idx = np.nonzero(vert)[0] + y = vert_idx[0] + height = vert_idx[-1] - y + 1 + bbox = [int(x), int(y), int(width), int(height)] + + segmInfo.append({"id": int(segmentId), + "category_id": int(semanticId), + "area": int(area), + "bbox": bbox, + "iscrowd": isCrowd}) + + annotations.append({'image_id': imageId, + 'file_name': outputFileName, + "segments_info": segmInfo}) + + Image.fromarray(pan_format).save(os.path.join(panopticFolder, outputFileName)) + + print("\rProgress: {:>3.2f} %".format((progress + 1) * 100 / len(files)), end=' ') + sys.stdout.flush() + + print("\nSaving the json file {}".format(outFile)) + d = {'images': images, + 'annotations': annotations, + 'categories': categories} + with open(outFile, 'w') as f: + json.dump(d, f, sort_keys=True, indent=4) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--dataset-folder", + dest="scannetPath", + help="path to the ScanNet data 'scenes_all' folder", + required=True, + type=str) + parser.add_argument("--output-folder", + dest="outputFolder", + help="path to the output folder.", + default=None, + type=str) + args = parser.parse_args() + + convert2panoptic(args.scannetPath, args.outputFolder) + + +# call the main +if __name__ == "__main__": + main() From 2c2f8003e6f4eb122dc96bcb2e072f9813fc73ab Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Sat, 23 May 2020 16:53:26 +0200 Subject: [PATCH 28/41] Add files via upload --- BenchmarkScripts/convert2panoptic.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/BenchmarkScripts/convert2panoptic.py b/BenchmarkScripts/convert2panoptic.py index 7fad1e6..d1c919f 100644 --- a/BenchmarkScripts/convert2panoptic.py +++ b/BenchmarkScripts/convert2panoptic.py @@ -16,6 +16,9 @@ from PIL import Image EVAL_LABELS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 24, 28, 33, 34, 36, 39] +EVAL_LABEL_NAMES = ["wall", "floor", "cabinet", "bed", "chair", "sofa", "table", "door", "window", "bookshelf", "picture", "counter", "desk", "curtain", "refrigerator", "shower curtain", "toilet", "sink", "bathtub", "otherfurniture"] +EVAL_LABEL_CATS = ["indoor", "indoor", "furniture", "furniture", "furniture", "furniture", "furniture", "furniture", "furniture", "furniture", "furniture", "furniture", "furniture", "furniture", "appliance", "furniture", "furniture", "appliance", "furniture", "furniture"] +EVAL_LABEL_COLORS = [(174, 199, 232), (152, 223, 138), (31, 119, 180), (255, 187, 120), (188, 189, 34), (140, 86, 75), (255, 152, 150), (214, 39, 40), (197, 176, 213), (148, 103, 189), (196, 156, 148), (23, 190, 207), (247, 182, 210), (219, 219, 141), (255, 127, 14), (158, 218, 229), (44, 160, 44), (112, 128, 144), (227, 119, 194), (82, 84, 163)] def splitall(path): allparts = [] @@ -60,6 +63,19 @@ def convert2panoptic(scannetPath, outputFolder=None): os.mkdir(panopticFolder) print("Corresponding segmentations in .png format will be saved in {}".format(panopticFolder)) + categories = [] + for idx in range(len(EVAL_LABELS)): + label = EVAL_LABELS[idx] + name = EVAL_LABEL_NAMES[idx] + cat = EVAL_LABEL_CATS[idx] + color = EVAL_LABEL_COLORS[idx] + isthing = label > 2 + categories.append({'id': int(label), + 'name': name, + 'color': color, + 'supercategory': cat, + 'isthing': isthing}) + images = [] annotations = [] for progress, f in enumerate(files): @@ -136,7 +152,7 @@ def main(): parser = argparse.ArgumentParser() parser.add_argument("--dataset-folder", dest="scannetPath", - help="path to the ScanNet data 'scenes_all' folder", + help="path to the ScanNet data 'scannet_frames_25k' folder", required=True, type=str) parser.add_argument("--output-folder", From c2dc75b9aa693e8c2ae5c386d5a9ca263fa90510 Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Sun, 22 Aug 2021 17:39:59 +0200 Subject: [PATCH 29/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b9644e1..c3c0ef5 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ The data in ScanNet is organized by RGB-D sequence. Each sequence is stored unde |-- _vh_clean_2.0.010000.segs.json, _vh_clean.segs.json Over-segmentation of lo-res, hi-res meshes, respectively (referenced by aggregated semantic annotations) |-- _vh_clean_2.labels.ply - Visualization of aggregated semantic segmentation; colored by nyu40 labels (see img/legend; ply property 'label' denotes the ScanNet label id) + Visualization of aggregated semantic segmentation; colored by nyu40 labels (see img/legend; ply property 'label' denotes the nyu40 label id) |-- _2d-label.zip Raw 2d projections of aggregated annotation labels as 16-bit pngs with ScanNet label ids |-- _2d-instance.zip From 488e5bafd827547a2ea49463df26fe22b8a27cd0 Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Tue, 7 Sep 2021 13:17:52 +0200 Subject: [PATCH 30/41] Update SensorData.py --- SensReader/python/SensorData.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/SensReader/python/SensorData.py b/SensReader/python/SensorData.py index 9a67d1c..16215ca 100644 --- a/SensReader/python/SensorData.py +++ b/SensReader/python/SensorData.py @@ -4,6 +4,7 @@ import zlib import imageio import cv2 +import png COMPRESSION_TYPE_COLOR = {-1:'unknown', 0:'raw', 1:'png', 2:'jpeg'} COMPRESSION_TYPE_DEPTH = {-1:'unknown', 0:'raw_ushort', 1:'zlib_ushort', 2:'occi_ushort'} @@ -83,8 +84,11 @@ def export_depth_images(self, output_path, image_size=None, frame_skip=1): depth = np.fromstring(depth_data, dtype=np.uint16).reshape(self.depth_height, self.depth_width) if image_size is not None: depth = cv2.resize(depth, (image_size[1], image_size[0]), interpolation=cv2.INTER_NEAREST) - imageio.imwrite(os.path.join(output_path, str(f) + '.png'), depth) - + #imageio.imwrite(os.path.join(output_path, str(f) + '.png'), depth) + with open(os.path.join(output_path, str(f) + '.png'), 'wb') as f: # write 16-bit + writer = png.Writer(width=depth.shape[1], height=depth.shape[0], bitdepth=16) + depth = depth.reshape(-1, depth.shape[1]).tolist() + writer.write(f, depth) def export_color_images(self, output_path, image_size=None, frame_skip=1): if not os.path.exists(output_path): From 1cc5149d30d248b776039c76ae8864e63df18831 Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Fri, 24 Sep 2021 21:04:51 +0200 Subject: [PATCH 31/41] Update README.txt --- SensReader/c++/README.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SensReader/c++/README.txt b/SensReader/c++/README.txt index 246287c..906db83 100644 --- a/SensReader/c++/README.txt +++ b/SensReader/c++/README.txt @@ -11,6 +11,8 @@ Run: Hint: keep the sens files as they are a nice represention see processFrame(..) to decode independent frames + +For additional functionality (vector/matrix/point cloud classes, etc), include the mLib library: https://github.com/niessner/mLib. - tested under Windows10 VS2013 - tested 14.04.1-Ubuntu: g++ and clang From 520d564556f919c037ea2ac09961abd6b09f1294 Mon Sep 17 00:00:00 2001 From: David Rozenberszki Date: Fri, 10 Jun 2022 15:02:15 +0200 Subject: [PATCH 32/41] ScanNet200 benchmark --- BenchmarkScripts/ScanNet200/README.md | 39 +++ .../ScanNet200/docs/dataset_histograms.jpg | Bin 0 -> 373707 bytes .../ScanNet200/preprocess_scannet200.py | 133 +++++++++ .../ScanNet200/scannet200_constants.py | 277 ++++++++++++++++++ .../ScanNet200/scannet200_splits.py | 5 + BenchmarkScripts/ScanNet200/utils.py | 115 ++++++++ 6 files changed, 569 insertions(+) create mode 100644 BenchmarkScripts/ScanNet200/README.md create mode 100644 BenchmarkScripts/ScanNet200/docs/dataset_histograms.jpg create mode 100644 BenchmarkScripts/ScanNet200/preprocess_scannet200.py create mode 100644 BenchmarkScripts/ScanNet200/scannet200_constants.py create mode 100644 BenchmarkScripts/ScanNet200/scannet200_splits.py create mode 100644 BenchmarkScripts/ScanNet200/utils.py diff --git a/BenchmarkScripts/ScanNet200/README.md b/BenchmarkScripts/ScanNet200/README.md new file mode 100644 index 0000000..811721e --- /dev/null +++ b/BenchmarkScripts/ScanNet200/README.md @@ -0,0 +1,39 @@ +# ScanNet200 Preprocessing Scripts and description + +We provide the preprocessing scripts and benchmark data for the ScanNet200 Benchmark. +The raw scans and annotations are shared with the original [ScanNet benchmark](http://kaldir.vc.in.tum.de/scannet_benchmark), only the way of parsing it is different. + +Differences and similarities to the original benchmark + - The ScanNet200 benchmark contains 200 categories in contrast with the original set of 20 classical semantic labels. + - This new benchmark follows the original _train_/_val_/_test_ splits published in this repository, + - We presented a further split of the category sets into three sets based on their point and instance frequencies, namely **head**, **common**, and **tail**. The category splits can be found in `scannet200_split.py` file + - The raw annotations in the training set containing 550 distinct categories, many of those only appearing once, so we reduced this extended set to the more reasonable, yet realistic and challenging 200 category setting. The mapping of annotation category IDs to ScanNet200 valid categories can be found in `scannet200_constants.py`. + - This larger vocabulary includes a strong natural imbalance and diversity for evaluating modern 3D scene understanding methods in a challenging scenario. + +![](docs/dataset_histograms.jpg) + +We provide scripts for preprocessing and parsing the scene meshes to semantically and instance labeled meshes in `preprocess_scannet200.py`. +Additionally, helper functions such as mesh voxelization can be found in `utils.py` + +### Running the preprocessing + +The scripts are developed and tested with Python 3, and basic libraries like _pandas_ and _plyfile_ are expected to be installed. +Additionally, we rely on _trimesh_ and _MinkowskiEngine_ for uniform mesh voxelization, but these libraries are not strictly necessary + +The preprocessing can be started with + +``` +python --dataset_root + --output_root + --label_map_file +``` + +Additional options: +``` +--num_workers: + The number of parallel workers for multiprocessing + default=4 +--train_val_splits_path: + Where the txt files with the train/val splits live + default='../../Tasks/Benchmark' +``` diff --git a/BenchmarkScripts/ScanNet200/docs/dataset_histograms.jpg b/BenchmarkScripts/ScanNet200/docs/dataset_histograms.jpg new file mode 100644 index 0000000000000000000000000000000000000000..227baaab0c5a3e045af0122fa82bfa616a1c0a6b GIT binary patch literal 373707 zcmeFa2|U!_|1Um5vLzwAsjQKvg_Lb7*%PHGV%lvff zUUa>n;D${bM8(7OUV7pD$|MxnTPL2p+&{GY$L)_^{)>S@#Z}Hu?lb)?pJoLIo;&>ZXY0vrVq5J}yB&DQflvPyK zwyA4r@73A2U)Sicv5BdfxrObClXmu}PCHztDC!zuip*-fWVt!cfungqoQN( zCEtILlKSvb+Vjk;>=!w?c`x4-mz2IOd-wjs$J)C3hQ_AmzuG%GySjV6_4W->hDSz! zj*U-D(&m3HEYg?YWyZ?5xKP~xKCFL??7tb8C>Ylo9v*HUzLjxtt?>shZc!fIExXok zJa~-noVVE4-M80?A4+=mx`tnI&vB~6`Ri>0o0PPMlxZtN`?rz(-y2xy|ErPxV_^Sv zTzx1ZZZ7cfxJ6M|6x;TBj2i0C>;KF-AgaKNOiS3F9++rsz2Vf`QQdx7*G=k9|6{xPIb_Ni$qeL)yvf?HinB-*lF+wTUWk=Cx0y zY^zJ!Agf+by*}6jGn_NCe`qdLrXg&oyIq?o70}`Qz0V~=U+0QyMVc0K{?+!ENpa{$ zi5KDqhnt|m6lnfR8HuhnNn-3fi4O08J{ogSyvA^|!92gpSG;1*DYqFF^Mq|YyQ|1Y ziuZa?&AM{;Rjoxj6%^oJqDPgqu3_mQS$6#3#ZLS#isd=pkz;%Jel9(=V0-ddZo?m}RuP|&S0MRs56aM`pNU$mhFoO+n58qKou z$aC+@y7{c56fJsGtLM?&g$#;m+#10R^7jW>HNk4!(*mOv*kPvihJdm95Xp$XfFhQz zrqD0*vQMcqq9w7#eEPg&oBb$R3Ef_i8QiC~Yc3KbtzJ0t#zAB zEFIyXP!$J*DPHj$l(bi=h={wP(B2tTp_@-0hVLF(}xP zE|^RitAT`j@%l8=8ciSTH>4g6CWj_Ac_Tv5?C1GmU-!{|Degpv8N;2hNF&4txqCnf z&b-toJ&C?n9>z|5^$O^Y%kh}hPuITwIPhkJ(q`V{@A(9RuN#&=zh!6!TMy#o@mJU{ z`5NZr;6r28x_ptofm%4haowz>N)}N=O#Ay^;dda7-Mn7{Sx#!+_ zPpeli^91(sNiV8AKR#-&_v(~=Tv2Y02jS{5XFsaSJcU`4Z0@69wlVn4!77&>-lYM} zMB^OE&qbG_pHmmJjmvw#sXdR$dL>TE?{c}N>tJmGDMc~G%=^(%i@dT@qS#XG)zQ+==V zse1;RI4JV7U#v$9q-v4njj9|Ju@}1_PP8Oy!CV~F*25gsB2yI!eK6s70ujG{8Ja5% zJ`|%?D6;djZI6B;BgQ3XbTYu7(PMEuF7SkA8NTuD+oCev~NpsMsS{OTDyT& zu|BW!&3Bdiy?zZeK5sLYc>n91vA7M_pVz1B-x7P93$GkR+eAs)b zcD?sw#%JAaP{x`!(bJj^ZHku1Dqk=fL)@mL6fE5rD1Af3l6Hy(m9g3A8O1f=b)UnAXd(S z|GZ3#;9V3C41WOR+^NmIwLf|=ao3CCd$Mx&TJkT_4fA*2d3o0Tqrl834(h7G&zMn` zDoxgu_GF~H&*O7@E&AcW6=RbFLv^`6psWMiDgtJcZF5lzGNKF`6!Cs9CdvG_9$F z#5h=C5c8ZUXo}GR%zF0UaYRWPj+Jb^0o-FT2WdTH4J9pM=jRYI2i4!!9rA^Pn&0hC zSRBVL>~dbl>EO{lrV*ED>vO-R-}XE&S10S{HJ~;H_hiEM!$%BN-d9Gs?RI3Rv|GMu zxYi$fVU(F!b9B{oGTM(*?LhvL1)u1)b?lV$q(a#U*k4FHRh#-j@36CKceLW zupec{qVT~_-R*T`Ji8xUT(YCpzSYhcnAmW&SG|ghXM+vp*8X@jeH}Yn>&cGpFX+Bj z$Fdlyu1(4jKM&kme>)9-*I=rLgStG|n>wuX(JQLaiAHX$w5AwF(zkhXP_M5JJ`ig; zpMB|*MXg3yKb-%UFBw+HM)x&{<%YDNH$1QC)9-p)_F(u&!i|($axR_rg~%7&+lEXU zld^?c*;7N73Xs|2qDiK|c+ag|Ws^HUe=Ouec|wp3iV+i|@sP$r)r+jdtGC;ppruBa z5QW_4v8nP6`8QIg6o>Wfy=4>h*1K}&JbyE(R@$m!;xrU2rr~Q~_QmYdKW;T?IZcA#hy`m&=tk*PcFJ6J*1O zGY%ww6zP*3YHiHd`;^EP@TRfu{O8*~LcI4}_k685D$%KM&8((|xQqR))H+ImH~kDv zv#b#kgk`Nt-`<-$LY*yqc5v(Ws9|YymB2g1_ciDbHYS6p3pFT)#eZjoI!XNa(=P+& zhM+qv)4~anryeqIQ$2$MvzylKebX#c+!)qWqZ-yU*Mct{Ze89F#b6g}O*yD`mjZW| z(9#?1(m0-jQt`9@JAFyE1U$!$f@UBk98~Xw*WaP1N-9999d+16wi^dk+#^OF32tQp zY*5BQ(H9hiIHqEH>U(XHkCp3 zURFiFQ9TAB>LuOsx>P?Mv@I3oxi<-#hd=LT1oU-0?mzR| z@#ZI1Vo@$pw6n@^@`i5Lk9!k#ad*G#Z;6Y)$1Tx1;S@olWgepbB>KJhVTAA5)KdES z*tRo+3jF7$oIZ(~lbsUdGfu{a#f(&TE%cNvKUtIze$tLRUE?FQb${k*N&hpVNrW#i zijx0w%ef42_nJS(@?XGM(nR_^=w;N@>3pxDiHeii9(`$3Ub>F)>)TY-&aZO}89U?h zS*qct44rYI;ogOt8W&y+rJ-PVYj`_f4V?6Zr8!(@EWN$&$Yv2%qH{8H9|u))$WT6{ zQ$gQQoSKnLar78+)9iiMIh~n6zH-TE$Kr!3ugBgoj7tSGKP*Z_-();}y0vP@>#Ft; zu$XHsOXm0k#A{q$1bnL9gA2$sdflfvR1y2x^=jOOsL@L{IZ{e{&6bM~pgnpp!-?U@ z2Kb@YD9tOvmndeMbHt@2(XPbue#D`2OWtcH-i;QM8eb3{d=NEqdTHpBrcZ;tPD-EO z=(jh~1y?SYdue6v<2`S;`JC*%UCUqjzL2R$@=smCZ=*dQ7*Ly;8G@7ZP34ZMoiJ87 zC4d@4?W@kMFc&7)6JhnWiBCPeHIc+YH1A&Gg$vhiQzU;Kjk(+xuzlmlR#kw5gYYgYEiUCW=f-s+n*U%!2xf*N+4yLAA>PP1#NB>DoI zz;b$KyorE~6FW{FD7mXr6SVPgB0oNuQcxWlxGe4~(H-)2U^lfVMyaO)LqYd4>#Gd9 z3MoNWJLa*%rhcB+E}qG+z3I4VQdau1+F$mYs5FPSI@3ZuM04HLv$glz$_YL@5r#qLq^$YeLKcIBi+Q8#ydaJaXvp&2`)3a;KewS81+-{@YlGROo@D|Uy z_q=R4PKH@jCELBIG2=*>HAZGh3gZ@ocwo_--X$aKf>P`{&+EHFCrI7wi8?o2vXh zrnLMg#^$C)T2{%}0)+M{Yj(!F3=T?h78)h9Nx+6brMj?g;c*<)*)|R;^LQa^8?fgI zz`CFHAdZyU))3~oXb?Nh6p6Peqvjxobm!Q&i%9pnJpz)V5Cz52<*mez(6Yip>(XUl z5$Ff*2T8q))UaexkBq0aBCYs zGGiLMz*`i^+PKI;?at$%WKv=D7Y?|SrA z@a3Ly9}sSv+cCQ5Ov@Fb(jC<4sHuAV7|j+jv9xBc?E`QB+G*|kVYdIrn<95+e9Otj zMk){F;;J0pI{FCBi=5SXnW5Nw;_-`qOIGWX`b$$15zhp+Z8I$QolROeDN&2prp3Bv z2!b%6w$!FcH)Y)J%VuS~*Z0Y-U#sz^nDn+&aks;Fn12!Lv;RFZ3|lq(aoi+dD>KXl#6{cO@MqFzt|-K^5) zpdysn`Ox?jKu&Y9iO7yynjBPZfgjkmC5d%Mpq^R|iZ;1q-5X2aOqHCj%yUosne6>C zAi2Kpd7ypBmL3ahaQmJ&P6~e=4yGm3ecGTBd?3@UC0j4gRSRyX zIQA1G<-L*HDiHX%IB`dv)-T-|P|%<@N%^m7ta zl*;~+{dp$$i;fN7#1nB4XI50Zv^g%UW^GCg>f$k_T?O9H8)9}!n4nnOR-({&1IpSi z96bik@{1}Ms_4xcx^giPgrNiXK7Nz;MK{j=yEe7^mET+Tv#M>7S5Zb8)AzBk_LJxH zNUKU~71xi1%6u6Tx50EGn}NnQKUo}O-TR@3eC&Y6v$KGe7)c9=L`a2L`c22bD_G{) z98|LwO@s|OK+}tLOUq~<4r&JnHN!!%EBV5(Bis}Yin%tCE%U%@$eMM>kIdwDf|Oro z{2tC0JJ!XSQfX*Rv&4$${s#T&pkgzQ0i(w#P z9F&nmjVBs6ud5DiEQ2MHfrAv0Wm#=30|EHjM5Yraa!|^A03H{C2YkTc6OE4*pGIIq z0GVeByW{NvKo2Vdn!z~^>Zztr>tHHz`GGauNvh_c_N|A3;Zs!3VTXA_3#YOG31Wre zfj)5-Anyg8>{VNH^EoICwkXFyBuw}hD*{ZXIq42GRXT@6JZKLb=e61gw^ zBsy|IC-M}MvRT(Viz*ZgJjC2mURZ8>8okx@td!w(^ZgSs{*j2j(`4V(_x?MQ1RxiO z*jv%NmYc7=Q%cb7c{C2qTjGJ)$K8NhUZQ!y)Rzqd8%;zKETA*QfFiFqWa~XKr!TMX zLKpX$`}NK*FBkXV1!*0~#+jgL9hr+a@q#?bm5mvW?oXSCU1yw%(rJ>l4)xP^HypYO zTRL<2#l2Fl?r9v<_(=*U%`0?brzL>@d>+4NaE^69UIh7|gT%V~?$Mp`g1O^IcD>$m zR8KAGL-1cr!Z7Belh|-ht$|N5L%;4yQ1!V@Vrccxy3QqcNE&;>q3nPJi2|rxhO6 zD0|cX+fA=%EvKXBJaZ=BN?w0CV&r)(p~m!0#seCTwVyPIX0ZbR5?q@E(b5*ky<-Uf z6t#?g3BHBDG`L&}qEIf%DL*WhRboHg&GWi%l7rnmrp2}JW5p-@mluA2(PU~`*^DU7 zB4|co>TvqydxT5n_oU@=%kJ`hJ~|cF=|iy5nAL>|4Km?H*-SIm@wE1zvbhz7TkuV1 zbVnS`lajvwQ=mfjw`P8!?DvYsRP@}u;TQs}Yd^62H$~P$O?>r0zYs<ho0Z-4lS}VNSt;a4To5) z2lMR|iQFnpUDY{^5o$2FU+M%}9&{VICjU>c)qI$PT3!odk!pbG$Gt39YdmI;I73cH zZ=%=Ajx7t(L|DntI^beF$ZX+lj))l*SgkSSYu4`?3Y2MApZD@Muu{8{{ z7Alr?UsDkIcnwTM+ldO`Llj>CFMCcJT5!v+;se))KZCv7|Zn$+(@DQI+)heKkA z9ZMl>7WwqRwoy`n7;7{=}3JWvHom5Y6NP_=hi=G?E&i zh3895-uSFdHh~UC%Qt8R9`E|i%&X|MOPPo9 z$KRE=5q>MVsGmDWKDU7V7f%a-YT-t zS#e}wrkf9aB~7b}An_8G_1Jk`&>Onw3QtQbAB2|G935V%g-B;1}>0w z*^np*HSeLdGP}`?{dtFuYM)ap*FK749Enp`R`;=T`$AgCePUlrh;iQbj)S_BLYcBp zTP!FEEP7^nOZsq3bJ(r5Hwj-pV8G&%);Ax<$Qr$HPj)CxKd5xa6lL^)TkdDYry(LM z5dMTzOQIR#elCL$E1?(wuDzi12a3Kc=xof1aBl0Z^t(BE?fk0}IS)f)-;xebk)q>_ zJ`;gdQ9Xs2B7SWHyd%{gv2ckXO^tC-7u^>M_2>_~F@B#MH?>WlRQX^g$cMjmW=BXx zPv=lTXt;yBUytUGRObO_msZN|wEJV9%zwH0caWCRhe0aUqG{+KeOzZrGUu#>n8E~QO<(V7AbIVcejW5S=*Pc8!lbyNRmkJd_DwO ze5KAch^zsb8;5agN`5GKt@qf}x3gFCbYj(jLfU}Rd2D3Va)?ROvE z{D4$VqR)$LfSP)NW$#%aF?M$6)C0>5;uAN}j5Xc3DD23UP7Z2{fn!T~*iuNW`||!s zxd@xfBLm{8gg(E78nO|-t$(8?6j;0pcnP3iNM9k0#%pEZ3?2wm6%mqjd9C? zY`^{EcquQ!$eudvycJ6km}Vlhpq1^ltXPZG5}1dQfAjrUsr48tu~`Bgid_VP-NbQO zz+;*k#@vh;7wV6Cxv6v>n{W{44msone1I~qF7mey> zq5x2wP}Bi#Yu=^=!{o085~T5Q8qhh@NbEb8z_l-mU^HT}3Ao>L`=ABam(IXPCv^a~ z{3?#b(CUe|W&eO;7xW~V!0U)i;^0O=;&ke8i&PM+$zg$b&)se?(`OygY>6YQHJ+mA z0MweenABo4R11YIL}TlS%bW1PL7z=zXFR3pu$E(bN3ICf+- zvc{Bk9q0hyzG>T`>9c6Y5m#y%D;X=tK~QN)^XcSp&oqmJOELjC1*yUH4ra2R_8uSp{ZK^}PSd zHn}q_yuH6?)}=dS11%zbI9`!yX%VPY`b$Q$-Na^As+Dib(T`U6^O=7RYYTO`^g~AH z+q@f6wTdbsC#J$2Zi>W~R$_+M=LdP@I~(87jyf+E`1!MVU0u=9fI<60)2O}Sr#wD= z?pvrLQ;+hG_P?{V?5Dk6tdy7^yNzsvU!Zy5#uLf*Y4fwqo`zp~PTf^m7AWKEw6~;s z4cnDctbA-06syXdc7Lgv%{aKuD&1+Vx%{h!^4zh9?r(B7rTKJudiM3;6w?A^?jHBI zPGzvIL!Q5nm!!CavyAhM&%Kzk>q))0=D1Yz_iMX@ZgM*r1eHv7ynLV6tUWS&&0=?K z$permTWJ1=VE->9*su?Mw&wzjWtxY4fh0>m-GF#qQ+xWH^8%72H+lNVyfmx6!5!q? zI@^l3|L%8txOFY;L*cu#sL5CV!71bQ5VI-fM<4E~>m$?s`^OJT3++6J3f*;J!#FSl z`ic}`0Zor1G?T>OEK77+YWEUNUwPN#S>ZU5_A0Hf$kqvTi3>}-<3N`_-;K1MNJDgh z^JM?Y?& zbkR!)X1ooannL%EeI)T#Nw{990kZWhYrmX}j+o=b&HMiL_Clz&ryYazlB$~rUAWiW zGKl%#oD%zW)ikoa!PaFIOhRfhfx*glgl##fEx^%N_u!g6v@6W&AQ91dR+9biAw}vc z=?ev$+7^Lk_&kTE0o{gXMie#!>;9VzgaXoU!AOrj!he&4dIZ>7yd_KI*R8o2!u)Or z=-b{N;CExJL7=Wl2RsP+THq6nZsJyLjUmndVodscg?Ey%O)kHQ!Kwb{`{yt*xFMik zV|kz{VBy=dbc}wd%AV*$v+j|_fy4Vj_~jm11I=r~9Y{?+aFF-jS9M~6|Dsc}soflu z97L}n{gzw<4EB3GGMYmJY+Z6PGP++Ba9tCx+W>w&bH&lc04gzw$)*sN<+UN^I)EZF zt(;bqbBQuJ%n#sJ<2Nu%sR+80L`y_0yrM``gCKRp8ZHFOq7aQ#zr`}tAN{`Rb)8o< z2Zf$eOpC0ISOGyBp=jLvc9;*TK{E{wQoNRx2i5^^SO&bIw)$#qQ+Pj+-G%=0=#xlj zB0LH*ZNQDSP678{ja_)yHsrOe60)Czx>*a93~lr;<3x5GH^?WCR{#>mJ(pp^QUP|s z=Y%Po1hfx;R@yIKz=q<6af}m(VE|MWLV(`zinkF7mp=`I<)fGdo`x_O|5x?0S{(d~ zmdd`h1G}I$*$Ob+vb-wzVb31q_Q`NWMY3mcR~=r0jWyC)32(LvLp`lXQ&;>`un0#% zp_>VoEu-P``=)yY>NY4Iu~E;VxgZkDO=UC<#6mKfG_C9n9+I#->k1e^Y#!7j3$aDz zFX1h~f5RzWO#U+v$mk)-Vn?1&;uaf#5`Eaz!48p!0FJ8o8Ch@1!f;TYBC!M-dx*$H z0pKyN@(ARwim|}FoCO&_LAJ;$Ai>cdeytG8L0Lq%q9aoCS&tN616c{GCD0`R*8O@R zZ#y&+?M|l4f=Ab8b!-YfZ^{Dmf6lR$y;k>LBVv{UmdLqsh%MfUp3NeRCB4C92{`=9Uly-Q$~PxuE{T|a^xEKFh83;Q5%0^MZZqgx zYrezjL4*j8Sc__n^|BgR4T}^0K!=$-5dxrPvjw%09ilp~^{V~;g-CNY7|dJglNP@g zIH*1EU&9~(C|z-GZN}1#7hQ|IWg7HLUut)JcbULhSW%p|4!FcP+5NT6X69nh9ic2g z9WY0Xvu2wq$q`q)4-MgI~dfRSlW4f(u;9c&-7!8+}$EZg^T=-hF0 zO)bMw9Z}3_8-M1kp0_<4@B*nBt;!?+R51+Win=>owXTN*-w`1d*`el1?wp z3x*0M=kI>kT@w;=O~ipdS|{-MW!`aEzKra6V_#K{pJdB>x|PJQwfQvrx++1~YtXdA ztMO5g*R_u3>!FvgzZtyVYrs!D3R}?*yCb}jCuw%XOCCO&ov*TzcONK{l;gU~FHN)+ zNw*=|f9uUVZQ$v7Jc#ur(B{6qj!~y;!4FJb+R;*>dlQT&PZo~7vJVRE`gm_Q*Ji5w zt`e5zu6|G2p#Oxn6+3ILjUKQXBQs*L0SKV!TzAE|6$Pl56b$3vi{?vEX*p% zNjqpThjm{NVl046n|A+~SU$iwvI8z4B(Y_gIKyucjl_QS<;4o3+MSXP)UQn)$j1o) z?CQ;FMu>$@40c)(i$u5^=pYuFIqdKbfZt=1DUq!EUg7{eLu{e$jUaa<6(*Tr-c|}@ z;>q*JORAuA+Iq4|m#{dCzAu#W zsSA1T1_WJWKN3^851{Lu%<3!l)r1XEO6XVp*RfMWu3#)9F;fs-wiEzeYx6D`Ut9=!V3iFFu}KBs`#WA94S5VesA^Je?w)f-H+?JD4!VKbJ!!5cV% zdZ27ZDpBKBm7CPW#3=~S(3}7l)9s#Dd?z%gXJyp-PF$};=?>+0Xp1C(I^ijYzA5{Aj*}P<;ku+o zPsQAU+Y#&dx~m*uKuDF1>d}h;ayOkM#}npt4+54_j$v;so!L&7jPx6AX>mJ^yHrrA zC&x;p4gXuke$Mk&vAE%NDriFLZ?4$lEFkS3?WGn zR*pNY)WlwuXY@YGd`)Fhl_tAzbL3I>JM1Nc3wCjPW4yHWq(<(tq628E$r=5z;*Ia< zPet~6^^eh?bm<4?!PXY+Cs$IPI~K+l9pe=|mhMf;x@=Z_ynE!HcZqQCu*5j@nlST( z=0T5#^9y0GdPvxpEa2v#bX+Az%jbjh=^ywP`?5k!2cAXDJuEVGE@=s(Y>K5~5dqvw zXSm0vluC~r#_%}yyM1{3Y-hx`R-s{EE5&msh8*)|Ndpqe7igGToG5lMPeJA#?2+d% zb=MKro$RT1NJ&;p>9Y~kQg7d)K3#B5dgg(2Q#Fd&@JHPHBkuhX_x^}`|E~M}5%>N- zhFwwAglq@*Kb#QKsdxe^)@tO1Oxrwc`un^ zQ1wuOJuZxy0lca+o;JPNqIvgE?0|@W69ppk@R(Eh=Ujs0&P2^4I-SCpDb3>2**%G}B;^ zFy#!_QZSJjvec6i3G{rgz0pE*V@4IT-)oD4QH2IR^e~!9>>$KH8LdFj9>^^-@!76f zwsd{Q>FLf!iJv41032lpt(lTQyZ<_nK5V_L46-e--vPjGzwP|^^|!R^`BI&3CcDZ~ zUIBqvLvdULun4)QofTp#?j;UunlDq+vg_@Cc+s-d=1mss+JAeO%xR=azH6+Jeerj_>VI zb4^V|d*LT`Icl~qi{4))JEbq|a%CQhS(dHFZmc+|bBE;PWzdh?Jm}5@Z{6Jqzi8azMFjB=`+cDjA}n4GHl?}khUY;&-=3H z)w%PbHgBKG7gWp1(dymgmIRfhmDppKa-8&8%|8wEpI7;JLhiAj&|+sMjA~!$)&_Jx zxAm>QtE5pb3(346_Ua4uS_kK!Z0o6Q_T7GY7k_-O6D;rjic%KXz;E2#dU&RoJUcI` zZ;gMR=caqNb0J-$VU42q8mrL`4xX}9oA zop=y?gNB59NJElL9hMU5EP=UahAYHNvZ7L5P2ldg~x?^KXEgReZktyPKR8TV8uZ+*WR!~_dYI~5TnlXXY@I9hh1Wy z6ic!~`MGD~7(J;RR0D|BO+G?OzagKYVqASCcDSL8Mi@?v*7CHkPn9|Fbzw&Dpe;Sf z(PwK@ud*bcB1(w;Q#qG=s_)RDxa8ZG&fc_7gOcG`*F@oOt_r(k;yxG`4p#2%3tmVG zy|He5lSy2}#oFY!gaZb-+~pmmvBKvrdImJ%f_B*2g78V!0caN$U)dtA=j6&@1s>w z>&;aNOmhcg8k61$dr*ze+;hY8<%}o8|LKGoDqF5abM2=dvFwrDR`K+ z=>f%Kk6)JijhlreAJ9^3KjcL1(BDHXHtE*a&dfDt>77})n_ZOBt!+sWQ`b{^IvaV?o;Rt0bI9`3h}WL(^tNAr&=l5QV5n{<%LdshGo z-nx^FF>8DGDFbDg2Opy;TEQf0Ppz|d+i;q^j??QH#=0VLe#Q0g`>MU~USGd&IA+=7 zzd5uPXU*Exg_lHsB(47e@BZ06TJqfP!Cns8y7$`6ZWDta!^-fS1Wb1hC$BbmKh_Y z#-6}X>o8mo?rioIfT~Pr{B4l~h&t0kas!^cMh~);F0YoW*|lo51MMYLPNaoIp68$f zp&_;<2PFkS#|tIIi{Ix(4M|dk zAAk(k)?3iDC^%QDQ$YpbK&Qb(#uNlp&f__&wicB&;#i`riN~*CH4Z8P#|$9+CWium zu-~O!9EPINj3o?P#bghxjA(;ml*88GM5wW03=;*i6^?ZgZUezo7vR&g{Y3Vf{8f`Z zPvI!%f+1Tu(;8gI!k&Ksxf#9u1P5i4CpGY9CVB-XQefCfaQe(qYw{!OXpS&W9jRG z3o?g2>68@1_#LjT&#;@D|D4Yv7+Ok;Nvk3cDqSxPFf|4qHERs zi$jPa$ZLU^=XXOQ>`F#t*op)i0Frq7(QG+)Yy_4zH0;HcoW(Beo3sWBee+HlNXZ7t zJNr5zA!xX^flSAIhsM1-{w;q;M zsKW;kSB~@5zmYS+*i^L{YSw~R22%!sk7<$jK+NVMu+!UuK#FXm{i>}e9fv_=!Fg!; zK=YMK+@uNtSTcKHFkby2A~83u*8ma~NfSXTJV^`B+yK8?-ui*ej+lWKY}*4Qk;B+1 zXmJ>5qWMrxnJigYgSTAM0S}c7dn0Ot_eL124y$ALwdrfIR4QwqTXrJ_g(N*k7 zcrWy=5rZUaV!(h#V&Pik<6bP&K)I21w;aQi8U+vgQZ^MV$0SG!#EBZgnV`=gP#Ol- zV^*1aVBA;ou*<=FJ+H?OfeWKZqR_NFACf5E3bxDqMw$*g z7F^BPe$0|m%K)y&SC7#QsREFPx;_#nBj3(5Hh6&BAJ;}R1)G5(ZgGa&z_S8XaQ`0ckO$kw zBoo{-5W5hVPnN-stkl4f(8~g8gql1=d)chPQPNP$Y-(8Jn*1%~)9b;F*wN6FV0*!t zr`zy*2GvT~4vYq!HlsI=XDZI6f4O_{mdQ~Ky|hU}g?0>wrA;Sds{^oolfR zz7IN%ACEs`v@+U~xJ&ees)wT7I~Q)VbnQ+PdWW!X~lI;~G_K;shc zk@SY0VUO=>bn1)I{A+O=O8KXK9rIk?MPT-Kn@OY2+bnn)#z_^G&mMgY4Y~SAo0J#Qma(?oPa|LOiN(eDZy!B`n!Y%8W+0QM`0<0mNJ{F!mX0g4nGLY&`@?=sJQu|p zc|!b19)7}$1@@cf3%(u+H5-W=buw$(yu@RF#r=>~Zh6Vo9BDljOJnhq_y1Jl{a;t& zN&HHk;iV1Nhw!tXA!}LM)aR$S!VUCECx@T&KeD&ET+N+*JrvQc2r0>V<4k&*aAoLP zC~6a;2S`oM(A!W1)6L@cyN=P<6HmWXQSw9r_o-3&me5Wv?7l5W+tt=U{ju~=V0AyN4>VHBN&qAW8aQS_pt;Hl~#JGyy8^(On`U=JqP8Zt_m_mTRJWZWRUEn0(3F*}ykFJVcBpmsrmPVHychRclDF z*Rue~$WykKq4LskX082pg(JH&FKo0*QF}jd%Y~=Mr6|Cq&KW?L(9{4AM+N!L!V1+v z0{(z~NS)SK7T^bY%B~BbbJ9new^nHd}BR`mR=^rbasFLqElE1E^ zYsb9-%&s>l{oiw|@+Dqyd=NHlje=b$CJ9;u2^cy;+mWJtx;~}QP5$#%V;+s^YbHa< zVc^5iDCBR}!#cNo=b{KD5|usic&w*kIc@8_r}{R(eJ6?Shj=_un#}6DTLNP$Wg)sa zhn17>Lc{Po;dF{#cn2O$!3uv5u<&#k3UzdFDoE5iWUs$DxO&aeeX38j7gW-j7`%L2 zsfN{|+98*)0%D=^>6uy21&xdMq{Sob?f4&@J+L|9j=dM9m2ccx|Ld$4Zli0rElrTQxsX;wi0Yj0N#UVpJj2FnPZjR)%@9<}JTcFc zaOc+N>Z0#sW4L2DmzM0)XUy6yUA&ayyE2rOkbOliL#;J)+^j9H(mvG~inZ%wy!H$4 zp19%0e?KAoo6y@m4d(SX#JP-4P?6Lk*IyI53F&URZub16Ru}x%H1kBWyG?k_=v%8K z%idB)0i1~00NWqJt)BpX>5|%Or!5QBa*kC$H&nP@v!;30`tkG(ECLS}RjLth3r-Eo z*8cLyFRQuO+`4!`>j=DQE`r_vVQ^7ytW)5hK1#tS5I~%Ne3ZgJpLm$^3o*a?1h_0W z(!%j}H)!5U-v~&v-2|qAw*g`bWZzFDCUCS~2Y+8o;GXl_L&FNXX^NsOebZ0##<)Ac zb^h+SLkAo`a5F(2*dGAp9Im_!t0JcIf(U6vz3qPGXxhU{h#}M!BD_Gbx*HINn6y|U zB!K1HB1#Pb5@|jNJ{aN^_}NWwSOAaw_MF5szhLDl8MSi2}!$2-N<&KYm}wXzL37_MoqyOyH;m0YHyQt#xF1gMX}L zX@Z0j`ZF-H{8qNO8-WiR$#R7j+eizJwg||Z{>?!E`6+~YBNpzZf+~Q3Saa#sj)Cz9 zirjB2AS>Jnvr{bGvu~sU91I-?`W<$8TNTLRAl_a%p$$tZV?~re%r)NtZFuRjT4SSV zl`0D=NN`85mj&k!m?OVEx+U-TP5Ff@c$5dyb=htxfE`Xn22@#X7dWU3fW5U}FbyY- zJc7sAQzC4+PN-!QmcA1l0iYG&h?o-+paHO~+FFjGDW*u}Cs2iu6o>GG5XHnXvDGRV z$->ZZYXgpsdIuI|W{(1vVf|y5uN1&FA4Po*nVs)d3DD7VAXO2H%HhHJSYG~J{SX;v;{3&%jjSYqqM>hgzc{Fa30befeo@YczFj4Q zu$H!I0o079jb<24L?vLM^aDA;S!B8TD zWj*4)lX(uz5)cb&b<AXl&s!PFg5eaBkpu}-2hd@? zp+u&@%K3x4y5?4Iwu2|3o_8TOyB#t1jA-z7%@W;!Ug!X>^E@NDnl!(KWdydatQT9& z!3m3)t(5qjE61_L7czi7P7aS_jx>q-{x>gqLhy7+kc)OBDK639S&d z(`*7XlIKQP{5S?oyn)^7&CV;Egofn)mD9Jd%Mh5X=A%@=fq_Z;T7QWQHBI?|J^*c} zt)X<))_1AQ3J8=lD_O$vUaLeNPpm?heS1I!7TBR>Qgk#pi0oh$4=8ZC3Ci&&skey)J#3v%H=D>pgBbexh2MbdP*MO#rf-TcKjstb#U|&pZZ(bCM z1aG#LWehI!MKknm4FM%=vaADnlH`@}uQd#2eJiF8$K*S>lA^f>Y#i2|3ab@8WksP7 zKMub_R@_cfy2veXr;`;}ghc>nvS|#ZvhI_Fz}a6SY#}>hHMFcgfCeARWDSn&d_et# zSm1!rq6!Xd)6m7%K0|asnT=G{9iW-9?#G)V9|61mWnZNQHG`V?f0G_eabS*;a)DcQ z29-4KOAU$3>dxE1dTK-ty~v@uL-8TUccs)5RY1p1Vlif^XvMkgr4*P?u{Y4SBRH?-r zVrB@8=><75#=TqfDM`4tg!Po}V59HBg(+|Ub zH)i_7oT5{bV2URwa&?`wGLS{i%VAC_93sN4g#Ha=)=1Zd1|)EB17VC-9~LUh&xOGx zDjg6N?<`ANec@WA?BomX%DBeOS)X72*7dyk!e3k6x9~ghI1a!uyD`xoZ)&BYWTr2j zfDjx|&=`C=l)GvdmN?|P^?Xxa{-FOuktLJq|BKkQP4TDg$30IyNc?1wcGJV;?+b?0 z4*3NwDRMVCEKkENQ}Hc=Moc|1CAT%r%V+ZAC+3fL?%EM28H{<>xuP&0a)v`#v(Vm| zAV#-lC@w^+=L#rt^eY`maJWMscW&aV6s)Y^N~n@3`z0Z%8K(MVB%iP(T%Y^84yP1B zT_q&{dU%;$Js)PfchfI*%@u2ER1D{RF8UdFFBWeSzWBhOoRIOM+xisi$lRDOuPFZV zPiv;G%^zaN=%F30Lll`xJJ<&Hnd%b~EYSd<5?UT=7P{?R@A}g=Ozs_CkgAtk$owBGUGtz$zgw^dOh!HjRSQ%E*yzA9o(=n zZq2sS%-RA^$a~-$h8G?e8kbr&8l)9HidMPRe)8CUi+jI(wo%XRv#P8})8o5pe7MK5 zde~jD|J0lJryGX{aAsy#QmBZN`lG;oi~@H7($X}XSBo7lQZPAi&lyNZiDl0>BxnVn z8w@#fU(ILUwqpyFx0gKDygVsgT|!?#w5kTh2om}9zdR#UKlLSct1rX~bL!W>*NQmP z(%P;x>rLUFm#J$WPl=m&L}lNW%QH`+ZnO_-`$Nv?VJCD~9=UPcs?*NqhT?Cv+LY@` zU!f;?1+7J^l0GN$mJn%s6Mw}>e|Xbzq9MP2-ub~RPEmdH4EHVhM ztSNo@<*cca`Kv{Pxdpy-^{#I!w8s;gEZZp&+}Xr0Zru0&i-g=D;6IRf7&eQt9A@0g zn|VA>Bj!rf+by9J`X2mCBVpb4B6pkOM&zVtsP$J>gSUYjoivSKd#_rziEO|3$L*$B z^)tagltlxnKEBJ9$86Ey#r1`LdN}diACE5_H%R{GcwwSMbJuCV4Qu?ay8ml{weLrO z^?#0D`d{OyKLV^j0<1p*tUm&*KLV^j0<1p*tp6#%x^O&SaUU75)rf_BV{oTyrtKX~ zr0Fk(sPIIle2J!~BOkB=`l&^)`;-|T;CWlObLBqui0D{@E++X!>LU;L0*W)+asA8` zS|okw8zSAa$F)F2zk3H@nP>yPrI%VuUhZDO9g?S^ zT~^lq;7C^$2^EOH^uTLRPNDIViD~{`o1~RB#68HPGCPI!DqjNFpx>-l2ACCEiVQV^ zYc3ks&9qbI!8^bwyufT+kXINa)%<< z^os`w%aj0DxCoYb@PGq&;6-1NVSQMV`)n&{H?o^s#u@=XU)}vh5a0?k@LQFXNXpPR zx^z#V*c_q)ir2w;ro#UvyCk=*8gLK~oVs^D^q?qn#C%R$=8W^d1T=qPUSkbR5Cfue zOvI9I*zEcjN3tXv^0yv<+uwB0jBrAob|(wli_l@ddmFdRQ|T)doKmUE=$bHune)dZQ`h-Q(HGm6; z&?w+yCSq|CGYXvWZKPS`^2xZox`50M7=r{-Ymj9Yegg1 zazmcalMfZYUU}_d|I4raJ)uQH>)}`-{VIMbv#W8=sjO2ct2Fd?{Eb&UJZlo!(G~3!WawwOsm^@DdH8ZY;q;Jy z+EH^Yf7Lp#@TSWQNTt7#9|-T}09WVGee%{U?`&tueVx&6OMA1NxYo3tgQq<B*xb6HHkzYXVk7dzBQjgQScjO&X7yf$FzmcO6A zIaTFO_v>9R+JaiVD$Ep=v`Q$~jaS_9T=;qe_TcbVcJQ}vO9#KHZi`<1CVSGnb-K11 zHOx6yvFYp+@*)4*Epo-2E;iGDCVoU1f4z8Fcb@7^%*)4hxzCjL-~P}%5*56wcN-FD zC#DHwDxjsQ=j>*>IOyw_x4b^9gNIiv*=@8~&-Qg%*&@HtSv#BuKX-rb{BkLN7XyMX zxi^!FbvK&<;8OrdZZpo!-SGRD)1M-+2v6V4;q2N%UEWsv-SOLspGB9n_qFVd`{}uL zczE3wJMSyMpB=tw{=pUdcri=qbMbO{GDE9fZ-4iT8^xC8q1v~O<+tA59opt7fUZiSiGUO4fKup_k~O{68Kw}Z_!WxvS|09bH<2IlS^F}drbp+l0EID zbVWqQN45SZU#m4fc;vr6N^v=(!cVBHDK_*qu^03@eE8~~+HCpT@Z-F@Mo9xJr(9Oq zdOhjyXZ%M`;&mRd-TUjLt`~NljbhjduC*MNhWjsjbW!cXLhUn?laForH6!NhZ>Y}W zB-~U`dA+>4&ijK}dEWlP^ z+C)R*mF#h#AyRQtD_OMcQ}=L#H12lUn-Q1Lb0@Znp-7pd{sl^tcR%`9e%k-d|9@i4 z-X(<|%d;Pw79FaZ;BU~uT5LR#u|l4FuZAZMPId6Tx>YmfqUPrCM;A=D-TOYFVfXX5 zTq|lSu(>{OlSKlmd$T2(Sb-zNxMK-E_b0d&K}=NGi+_m&Fhh&d%M z*dd+5MQRmO({Ef+7>@fw)vwT*J1=3l6f?8{q?zE6mW7bioYW<4rj;U_Z% zbfpkc2trSyp?2q+l$#F3)gB)-P&X!&|ZiIFo6FVav_wk4g)yI%?m3bGHY!--l*Ni2qD6k|LV10 z{2RATzKjO(00rCL-OyMw^F>8g1dO z0!!Q-Vq4cCh%j~>{y(qjVygqv%`hY$@2h?^Pe?P$Y|U`ei@E zDkbkaJ>KA1Yhnsjh`pL(Lx9;@f^Av|i3-&_AVu|BHUhmm>A;Y2z?&-NdqR{{;~^U& zU;D{0-BDd8uyfl(;%=;yCGqS7+<@yn7Ti+yXejc}cjENX4iEQ)UIbDI(a9rfhO2zem`KhY%CVfFUN`nhDm`LX8^8WZ1+P)DEFB z8jVN?Q|v{QD7hj->tMd2#01~1J-LuPC6kF zH-n67FpqTe475a6o}j=*~9&%kNmr;+U@ zRQ$d4?=)<+?+6q_piuKCE>W}^Uf}ju=1T~bYCFSM*kyz%o3Q{MHAYJNf#45{qrpj) z`c{9|7pt*z)6G(0w!3m*SzbVXu@z%KJT!vGl>N+sT%H67oDGoNndQSx_fp1;$1@|w z;IbL2yDk>edEhif`u5T4M0%rPyHf&qr8DqKzh!K0!lSqlZM7O96C>E;4`<|8S`$U3 z16QKo`(gEa$BV^xLrnMo=Ck?lg~f45BulI**%NYFZr?>Mp-5)w( z;4T@ky#+-TJIHdB$8e=cZdLL0}tRsc2C;tuYI+p7{31&A|V*8;QVu>P2+f*+4r3oH?-whd7 zhRCy7LXj|;uz=29qwATmdCc&=0TN)1yAMQ#=jky{!VA5E=3~tui>{^O7VxJJOiO;b zl8B7H4G%P1iS#PFfJm5^Na_M^Fvx^S6zOJ**8Iv4qPTW#e9LO_2V!?xDJJcIfOeH< z*rNm6Mg6ixUm)80Yi98VcvEdbKT+_NB3KqWcxs>+)u?pKt^5UDatQ9!poaku*%J#bmNQH5HneB(#FIi z>ma=z@D%e_=KB!>UMvXhc?j7MU1ANui*mTbGm2q?KFOn19auX{+M`8;_&ubS!y8h1 z=KtJJYr@0nQ(-5pYS3PNMR3KffqW{KIuCAkCuqN1M}a3Er>9Jmu7Sl9+8RRv%MPKI zJa9ECa<`iYv{;Z|f|)aO9Oip90qn8g5*k{E*^*08UUyN?O5y zwRr?t2VKJtj1Iw~n*D_ieV>p{7J0qqWfDI_SBqfQ_11i`i{!84Y&@|w88Rx25UIrw z73c^eaDYWF!YbE%Ny-H?_+mZU>k6x4?wkT-22ofD(hoTjMor$c+6iTeek8IO>G=rz zIYSUbY@^Ht=iV94qiN+Hu?nnoE=PXVKoLri&=Q(t0>cb$iyuv{wnV=T>Q|bO;hzDE zyWR5+X0RH|PCe&uWXL8y+LK?^bT2`Nq*zrW8iaMEokE9Im?XIMZk)01Gy#=9un8pP zRI;jU9vVs?81002)R9!Zj>A{sG#2q_(ryY7Vo@zlfnR}Ik6|UyRFHUzouo>1TLD(e zj)KLD&3+pV%eJluot+QmGp*DLHV9Qnl*rlwmpy@Y9U0i?5A$pa>?C4y#~(fC9c7D! zgox-;8_VLQ6XNTv3YQcKej%z$irx|F7AOH6msS`?;#(@A`e#L za5m(sS)>70X;B%7^b8?US#uYm!5~BF6ry>5B4Oc$HiLvaqvIJ)8L-Bk{xNlauGa@3 z%TqRs>{_)~7(iH{VgC>(-&3twWJ62_GeN5F$mig(i7e>=2)_2 z3%|jJ={2A4hisS>OMbsZlRFFPX@TXj(9xq2yX|2SdbhxmC0S*iQ=&ztL88#-2{lN^ zb#W$9GK@$k#~GHs^=GGiUMSVc_YisoJrY37ifDN`T^Grvz* zYbEYRo1Xhys|lQJ%=z?KXh?YRgZvfkvW_zEPOQz8Woi%Sg0aIqrTu*Zc&m-Rbwqh0 zS00@xPy}=~4wm^0CQ5Lq8PZi09!1MRctErH+n!d5Jo`YGnEeG&lmk}|Ir#h%!N00c zcc_+a^If>)fT*+a@%g8TUX=H6ln<(%(a&Gv&gWi(4vdAGunSv&q0hz-vcGzO1`i=( zRnMlT4sAY*zs;MZ=y#q`o0s2P$a&(8F`a)Fe9Q7l{i@1|y5RO@Q?kq`D>wMSjb{e6 zPQE>*H`o1~o!hse_E-jCTV8A0wr29Yhuc*qQ!0wp#Z7Qz?8{k0axGC7g}IFq5`T*_ z(CG?5Y)zwE==mnEkMVQt)A|nIWvz;KWP?)B=+k8{_B~&I#BlTQtutETd*|L9Fc_TE zIrF(uKtPo!$rA=!8(Y6RUECAd!v8JkL}B>y#C>X~-p*D$e2yJvylSOP@iN@kTW;{v zCeexfIY|3{+=x#&xY4DXPTI`RD@b^K-Obci`Kj|)n*TT5A>)qPp|DwJ>pylk<&6x> zLNDY!c^LA{TgA%sg3{UIWzk>VY41z-om>$;)mY=k!jMuOTb&WTR>eC7@B+_2V(3i$U;EKfDQ|+pskqsu7Z$BZ6(5qB_~w@xFD(kQy=a+e>9p?aNOj~yl@k$$ z6Q8;Ml>BwDsp@OwrE7oQTfoBd?s)hN7$+qaUlOCT1J1r5DjfEOXa(QPvFv6%UH56B z_CU;^r&YT5`_hLq3WbVcqBlx~n9n{lHHVf7T57C3JZ%?wO>yFip5c zPhEQ9LULDvZl~VGVRm5+ZjIij2DQcMd8*f2oM~P-{j-nDalhiH!pxV(l!n#k`poE8 z8;9TL?VYjwTC&T=_Df%no8I^EeqLj_{$=Br&ky2tpB5+dw0??g34OyXOR%}IeNDZG z-KOM2$y}ZEUysIZ)G`XNs?Iv~?xBaKJY!YB*@d^Z9sRng!)}9XGDrP$i%yKY!@1w? zXQ6J7&2L1W*q;^oY}1$2+~WM=@S+^y;a@iD%@3L&{e9OT^+}&%w30%#7yR#BAf+T| z%;h;MD*3Z>2#AKR=Z4^MJb%|%6(C+m){Q!FQ7@ZUxWnf%c^oMbBejdKWJ|Q;SwsIPB;;9vNpy-K zY|8FNQcf}a;FGs5z$=_brF)mml>zn4IiB%ilCG%LkXMQOif0hznRNMV3mSw7tCxx4 zvrYz7`QjXGA;Pcxi$1Ie$$wpEt$Zs9bLCQwv>QDM=LkPN~)q9$dUMd-{ zyC;NF&!$kU2XNo684e~qW}0Naz1SA5z_b_ouYX{?qW0{>?-PK1_XF`qs83k~T@1yQ zjAUY4TE2XP9}UVm^-m$glj>l*ccz&fs^$;08?neVb{)Hd!PJU+OwAvUR3{wKtXZlk5#Fm;_;Lfw~haC1)6 zNM3aF{i*WsS64oj9-05qWgv?)iFl_@ZOTEFKYn_1qP9EXP(l9t(+j2>jjRqeGazvy3L2Xh=j@+_FloPh{Fkm&E@5?2i{~BFtQ;ZI!m7 z9e%V@q-9b$v9d8&&0X@aW##&U%$$L~tE_eFUyXF%X;3WTw#=_kUnLw4x&L+kA%oi= z%QfeIm~#5G%S+DUE6x`MmV~L3EAf{h#Nc)AiszHNRRWU`pupo0H{IN3#4Zf44E}rV zS>KBdey=!A4ZMr$!Lox+?&`}P)hPzGhn&ey&RaL5#Nyj;&nq~7iDhW+uD1caEK4)` z>|N_xoXy=<82-Aj1zQ$w>&b&WPenLJ&CV!L&lRVc-1%5! zR4IST99~S+IlG_E%fBa5C{t`X+xgO%S}(E@;P&n(+9$s`zdz5$aBuLEOYRv^i3VJw zrylkV{aP3_d~xHMmW@jX=kC0|Xu^Ayic7j*P$p%-j$sM+G#<`&3Q2Vp-r_31avBj? z)K^Y1b-Q!(1)#ursovqqI(-)SlP53UI}PW%^n}sFoEIeSuFF-6IPqa$@c!$ZGx4=Q z-~V-{{TB0~sV|l&JJ%JOAEU0%Y&Mv&x7?`5XLdpGfhhWX#?H}`*e|~VV#%!NU_CYa zbn#5zgC7pRIpb(k{Hdd=`i@3Vz(J!I>q39O*~jMKkz(PL-4+)2=N}05J9TjYu;h^` zO2XU4S(kw0Y~+IBhwQ?B@$M)FXH&k%z-HG?mATe}Vzxhb8pBJ2{%L*4?`a-hTW%h% zlDy=oz$JU?l=!8`qp(SGo8B||LQ>I9;aTpJGaoKcP9K2Tt!t!ysm0I#ioLjz7X0P7 z-j>^Ge>0;v3atI+Dq9xVzrCX%PxEFf`93wPJyG-UNT{@Z=>?6b*DJSHoXSIUr#|-P ziPw82H9xeXXWhE7TXyx?>~uyN?N}vtbM&8W`hi1G`SR{r?f?RT3iM z)V^G5iy1FAFMiIaU7t_Q__CwDX<5sj@JL>9Gy8fWEvZ|o*rz76_^{_uUR_qW-_9Vl z-FC}AHV!O2y>im>A%h6|l{>>`gj|u;@wR1bDj&TuOE-BJaV7-J;?ZG<-?aw3WDQId zqVfPUkZSpYG-AhQxG33JbOUWFTBT49>S`7Ry1Q~qSdyQ6u;HmM2+KoRJW~y^FEhR) z6q^Pq1{eQ5iBC>3h_9-VRJ6blBIj=eG(2*%vK-wGrbE_|JSJPRL{3LO28x8N1+BK{0Q0 zK+8QPvp}N{Pk9U~(}pwNsBNSMgC_ny;n3oG5Z_wUx)Q~&(_8?;cT1k}`(j-ZhM8!l1F;*~Vpw;?9j;xU)-Spu5goIUS z?-7c0&q+Z(9)p0vRs;tuIUxxtW6Cea6EPYp_`Feu*xDqm@j3?=t3qs=6^`{z{2flS znVr7^xrm5707A6WA5w*Dim~)ajW%|-R0Trs9jQPeTZ|5yKJ-u^%=ESpC2L7T%@G-M z=x{8w6tE=iH(MkO5wPFx!p2P!)CGpfSdt;r0*;EQY6ID0K~ovdVm74LNSAG{%@_1Q zEeP7zx!zcZ-j2#nG7f{~)jtbup2~qNwDlZyw2IY6ktvWDu!S{VhG7d-F4yzXb}C+zdLhjwvwg(WAfT& za>r%>sy{kh3JV082tnS4tTah%&e%jg2fD}P!+iwYGg!HF?WNqVQ;ak4>i@Q-T{7PX zkIkYH&mGZjqjL-!S@CSh%{X5tDFWZd$X<*M^Y3i27RhJOp%N>BVF=EUBPL(06A6lV zxlbu&cmd>mymQIqjys%@C9H>U{)XTEHP4wnG@l038N0E_3lxuX0vF;uCe`jX0#US# zQie!{dEnRurqK9lP?Bc7%n`Ab&JY9>J6e~)guyoh11|LGD8Y$U9nurXA+Gyn{fF^F zxE&b(pU!s27$CO5V}yi36Vjo44JlVqjh#dZnB2(`ZsU&rP8|X19zyJn7pihq(2fT{ zN=)*u769q9*=|TmI}YxgT{;8)Ge&-4H#<**%o#qjwin@HcmM-**)b7Cs#eDUk99fL z-YJWR+p}Mrs|2TS%+?|f4Pv-kLCBvorAzZE13P-LUKjYD`OSDZQ3JbhkT6HpDDpee zd}6m#ygd9Yc!%q1#VD~G3y1cJE?^(N!=Ppk?nLdOn6DHN&mFtOVUXSnB)q<<3<^m0 z_z<8=CMDr9mH<@RPWp9hcy<7p?c@r#MluZuvCHB6@`Wo?gh%C|cQiIoCc<;Z;J3}9 zlMdz>{6FVV(sKmH^|hCNHXxI4RhjZYa5QVau*q~lvMOveSu+ymqp5KKZh9dQLpSt; z`!||OMK*caOKXF(r;6Wq(F>ykDehS^aT792wK1UYb|QI-j(`YEzMnRJf?vj8U; zlgOu44c>6f(oLYdg7=+_ZTeI0()E49ep1VinJQ=udaSC?P=2)^6W#72sj%2$SK>uA z982fS8A3P~mC~}3EplwdLC-$= z8<85>(tzA+f1x>?D@&GKwc#4}3FKD)yTJ@}#upEq0dMe}N0oLf6Csf);&!kam~fw) z^TAo}nwm6z1?Txj@nZ_45x%+Jk}t;WOrXo>PEHV*eJBu~D}<5xPl^OKM3qn9%o?wL z^Q<@n2$2xk(N3OW7MWqI0vBz?2&mv@jv^6VWC`swHPCrzE0pJio5GycL)urwRJ7Vbz>@p32Mk#4fJL>?L+bF+_b+Dm?_JtXlLH5L7`yXA8?H2$y(X$+X*lEeHww}CW zmz0UPdHvU6QOPQWqZc_HZdn+9V+L2Ik_1A=F4KAG*cpa-j(Au+;2ys<5zzsEftaxH zhXrri3fIeGFZCr?avL(^4uS%DuWbaPYIz!uCij9}ykATH*exzm9tKHkxlYqkgmCl# zyAY*^$q=}6cC|=PToVyfZ9^uQRv#3k$^Fv?47`Rx8boK^N1Jrna;@le9E^hK$L%z! zoYvvK)0ENv7QLn14{?vl%vEdDwrA_zm5yr*0W%}QF0!X;i3ma zK$PBu4y&T_l?H6GQ>{_>^>2fBJ3e7j(5s0fEn7o-aApqCM?)t zNRO1(?Lb$@I#Qj{rrRtc#%!lQCrz?sBQy9Pw!H}PV}J;ae}d!xPx4+&1v0R^SRHNJ zYYECuk6O+Y3kAyZFgpx3?GC7r=v{(A;su%5=axK-W`DLJb@5f?&l&lw0go0a-j7DR z0uHqp;!zZEMw?H-{_d)FFdS#lE>A+Fyyk;H0O#yre=stjNhT#fvO%Q#V@ardV68hk zJOQ$j%~SDBV6W)%5c$=6u;16x7;tf;!W`k#Q{f+y_ByuEn|8XIiU08I>D$e0Lx5Fn z2HFG~pvJ?7bRnwk1<+_Ph;di(5nG)>;AkTzs$(o8B<4qu@g!b}FEcrxtq!Kc04LGtHZ%7mBBm=CC=v*FK zDnq0{HQo>>cN04s2qn6Z{c0Dk6cODmg6K#BSL2<<`Usv?>!)TK|F*Z?<)1 zpJLCwT$DL~0ABkB6cwS>DsYz=qbdC0aYRpL4X1H%seyL!Jb2_*kgU>v z$XV-ZN@GxAoxONk^2>?v=@jc0XvZ)eU7{$k9Q*^DjCCAuM0+QJSV_uIyn+na6~f2q zu)Mo+Y2)Fmw$L?$mAp`mK?T3`;2*6s;8(|lM$_OVblmMihZh9E6tWz}fgoK>%AnSQ z1uLZb37y{oOaC`jj!9MN>PW{!aXe8#CBiIxMi-U?Ot@%QTq+JWZ1hteUD}ID^|ZNQ zDxIi9dS@Jkx!Z+0T8Y3mU@MLC;Rf)u@K8(?KA1s3spo|G7fAVNr-^mz98xM^oT_RosT-vOE*a{ed&_uz6a<^$ce) zd!tSG9H|(@`>(N0rBosNjq0TrDAdhL_go_Z@n2XJAo~PBJd#B+Rdj(kDj6ZQ@GSvG zY&SNBpYijAWPSt+E|@j2y@CC}z3O4zo&}z9JDBf*VEudu|2_d05jb&mVV`Qy%}g+D zqElQ!b>+bMx?)9|z)*-sml9!;dOsQ-r;EsDr4g~yyW)kK1Z8kdGOmj9(O7f;RVWlT z(&X1pfPa)}#%JMiOI*7Zi0hG0i^m+gO$m(`(}@;$dfR9x!gis%-1QpLd-w^l*S_%h zgHO%)M)7&Q>~DGj4o)}cysBn#?>sXw<26Y+KcmghkK+lckZc*l3Py&yeP9*eEEtMV z8$n|uGB%`LcbC``ar0B_j5U3kFEIs?WtRT_0w2CYIa3!=ijDlBky`0UY!MchE_@+URVGxW|!y!f126D?hj$$ zaWOLwBz%dTf94Wa=)LO1vU&R>OrukC3JB{u<0ZJCaB+)bXs*ZcP=$ue$=uOd`?+{Sm3{wE?| zsYETI74TPcg)}GB;NfExf7Ra~)~~8FcTA1y&bMaINI2I0>e}HCdpGoF$-BM%M8-9T zl3lJWi|O69jH5PZawzTYQTif$e$&5DmaIt)f_LTMXoG6a63bBlBU;Ttoe^%gW1P3Fglg0UvsEILD|?o zIiEIYd@rfcr-DLRF7Pi{5!RmA;pMcFntfbcRTXo^iuFo znYRm!{@TZV{&sESGnbpZ`$_fwdb#v3eu|Xfedez{M6QnxIGbcL7#{lD-sMtzw=b>d z-@>sR{_FQE{&scU)YFpBpbD9m4Myt#$~_S_-^n0DSKsn^ob8K1k@4*e&3K-Ry3Z`? z8Kx6va*)?mJ&=CkPQWg&HMoVKUb;t`;PyB-eBP>cdmjt3{bstX|3DA9qf-2|upq!T z((CNac6hr zT91XKH@f>qT_@BvK1-lr1C^+YI3pmRpsKHU8mO_#9dNzC(>KVXUIQUG7G3^9z2qLk zY!{7Z2OY6MW>y((hpC+abxf}XomlF?0%_fGw+9;ny)xsF|1a?9r(l1wyHRjCXrb`v z{oY(@FCv6(MvJ4%E!(q*jo=Rl_%8(i z`{I81wrwX7x}F2P>Q?I!X%|ZxHa0U6!|$%`ND?RWIZyq zL2*8yLzMgB+(|I`9q%CLL6L}1f?}|N%`ltcx$&U(6AIc;$w~)h`8CjGHA!UaAG5u5 zqGTORx6avsHsVcC-}Tb_sW_63@+o*M7f5x%r+T-LC3GZA91w_lq9R-Uv4>o)bLSIC zqnUwX@GL^H7CbQkP!55ubrl)*3n+u4roy=pNd>q@EljPjUn9fJMw^$)hsW;Als^2LJa_I10uuXPiNMO{C3g)F`&4 z@i@5dV3g;7fWlvq1YiKJaEIqTgG~#{_1}P2@2UsC2y|&=P8PlyXnN_g3vU$vF$*Zl z2ww)Ocj8mnx4rt%&{7Kw+Lz>|8&1OykAtG;v4zLBf-64%4l;{sFIhK!MSb$vwfGO{ zWhj|ra@v#z=PV!FFF^4aMKFpAzz|4|FcVY~Mn>SM9+OuR!As2B0JIyEFaI2&Lurri z)Zf%+-Qd5QJ|6G=$V-}JC0wFWv*v!kjlUw?1Pei>++SURLinHeLQhXdg`#`iIj!{8Z^`P~z-{4!!yS_9H); zm-Y!NAj9%lZ@R|r9_O@?$y6e!@@Jiq^>SoK6A)mpV9f#}v=LUzYtTbO&q69=**Rd!4Scms>xFRuV7vEu=vBS`I0O6t0nz(6x1vr)JE8&&_5qma% z8g5xF)ONoIMto?o^hKXrXA^tKy0Aj*Qw<)9k zI4I+p^c}OtYy_7KOIE!bYNV-J0B2r=beB=6u!#@AthKe+0D<(XMX!%FfnT`zE^Me1 zleli-34J}3{o(bSXQEx*qmJQN7{9JKc*u5|Ne zpCGs)W0K{k<2L9^>RVUjpcJVe4+m#nMFzI)1@%$T4;A1Dw6E7CQ~<|+0uB2zO7MfI zka)Z%QY1&K%Eu|Dx5cKyn~YV44~-~M*+r4jS5}E65v3p<*+6{pVi(*$mvsM)Xq8I| zsB=BIw9<(WivJ5sz7_r(+}_GSID3vD5k!-ma*J1)0W9uyY(o~92sd!Jic$LQZ21)y z$eY~lJPwoqPlEd;w}h^Ck!fOB=Vh*?blD^Xs96Fag>5Iv>_C^s6M;((7wcecOrrUM zIHCuI@X=HUc!@Ds3f*++62l@hqQVyy#eJoN0a&djjvY*q z*v)TX(~ypdkcn8{jfhU4<6L14Yym~ptO3)l^-22=0D94MWS~d-)zyq&>PJ>)qwsaR zLM@nfCLZA`b|);(gY9$l4_FZ2EX8pKvlGytz|PdT!xEfABZvc9{~@vYA#2=f{N8RV zeQ-4dvQda*^KdZ2#%2n%8h_Z{?2wY9_zxBwf|Q*FJc`5+qV&zqgA&zDPmt|DjSv+l zF;QGb)7Th#)=k*j&%*B$J{o{Qba(8MdK#REF-!5Y?01}E_@dByN9P#90UO;mhbjH+ z4Nn}fMc{7O8EM11r{fWa<#56}GEY&4UiH8ZcVwW@M&hBbHGx@6RBPr2i{YdW!EE{h zr$N%Kp&YK~FfUd75(E}f{*S5iF2ckRkNpA?hD$*1*dnAOOSUW&1iEPV*jl9#BOFN)=PB(W76E34Ddz!0LjS9 zVXkz)&XRFQ0eZ73-VER(J+^cl7<`|YN<4*>n^moF$78vdQBcloDWBYc+D2yjK{RXz zm>17gDBz%s1%hjpAQJ7?d9bdxF(OE3t0iIK4X7^cm&GjidS0+B2dR`U>l`ny`2_9` z@AmIAqH8Emy9u*>8ttRt6yJXpTFJbO^*ZE&Iofew$i$+iAaYBa#qiCTVqhfZOqP}fZIRuJjf518xGExWl$t#c29jF{m)u;o-(D?HoLW4vt8#k|GhS34sSZ+<_~<47?umPGPgr z4hxbc^~eKMbWfWL)9X0a2%nt@bTBb?!|_8kDmBCkHL1)>L#zk~)~kd&GywUow$vbO zz!oY+va<%bd>3jobz4d~!- zN*}=|Yd98LOr%{Nbbc8Q!7*g)^ks9<8XCs%ZtUA8;8W_EatF565f$(Y_mi@b=|gCu z4!!K3Mm2N)LsqiqHSoE8!5Ay(#-s+_+!?T7hs7Z<-xV;Ubemyl()1In(u5?!p}wR_ zRJ>WT30yEIGXmiH$Fbq_O&~IAJgmtysHpfu@Gf9Z6QK``C&L|f06E2=fQt+bwbHuE zgSa!mHC{UH7Ms=l3mEuL!bC7k0RAPg^h`!C*7fkmJ-?8zyNq4Rl}*Yg zn0`*sCK?L_qT@?=^8K-gGJ;DLg^2uF0&9tfG;fX1o@^JX2B%Sy`wBv?&kSJc?FIUkt5WL3S2TfULSaLteCtGT)3?PJ7 zC3lz#R!*`@8X4V;k|I(;5vht($w0;p8WY?DFu_bKX`=}RB8c{0gx&9Vv=O`e`3L!; zWH0q$J_3#%9?O{ynZ=>7}s22IXBkyFS(r=uOoK)*#Ut``}~cue|&T)^JbAY;}7 zfxhWdYA1B1%7nB%w6C-TUqFhX;gXHe>xm|thW5GDj~YK};K<9g1|L5A_y3+o;aB3+ zL9^3n03xJTC$Lnoj=P|mn$%GFyjaE_KzbloYQlS%l%83Ir(~reHdF!kcV`M^KGFof zA=#&XhW!%707ZgQqn=BP#Moaefw5*MG6~v}W6+Gt9P7Bz3|;s<<@0hWp;(8Bz)=2M z0o=te_Y(>8S;6w4FYt%1Ib#lqs&sgp@z8d9^y-sfo0#HoM1V4;Lr3vvv?>Pp%|}29 z)$r14;Os>}jxHG?uCh^wZ$@bWy?MVo9Qkq+u^SqR{JHO0zoG!EPi+4)Lg`C!*WZyZ z^lI#^ug+G!;l?c~I!1U>PHF26{r$jUhn4xQSe~KLRk!$3R4fKjab-1F4Rb98EW%=H z%n+RIU0ZdkH#WVHA<2eGgrYTD&{@Hq`}NMUx>aclo%fdi{abPK?k$HdZ|Ku=RG)t4rg!;o5LfeNO)6JSWx1^)I3BCZ2A66+zI-h4Wrc7D)+=35FDQ87nmS7pE0<5_n-$bYQH|fYFaO>AkD%V-->^7xDMKSFM;*{^0H!{ZECuLXF+R!203gW$o&V@Jju=+r#_VF2%qRmIyc z3-Yd%B;`ymn{{_cn$U5`)<;t<%l7*ODs^p!)tSoY2b`DknW4^0YYZOrWvxECJE2i! z_etC06WeG#PEJ^P!7PeN4a-5lXy|j&$ES`Z)BlX#YPxCaBX2vf4e^Q^`A3m4j$-+)R&wk7L5dN zuFvP@($3c}=FI-|(zi1v#`0_K(1<##=_}%5E!o!^%3F_ywak9*y?kLwKjXLRP24$? z+*b3s*;5Qn#pQS1U!-IOKKUdWQG9Gz@>A!>FNr1g_J!&J!%E&G&cR;048a5R^*{Hu zW6l3q^D%KincwVN?VJ`WFD^AE&EeGfl=ZjvEc|Vic2QQxst-03qc3O`UBc+fzJtU* zI*%#;4aAS=R?olot+MUJqd!5KbsgH3a=#X&Qv%SYVOao~JC4bHGgLMrp@4z{VbcfJ zUXj9>9gZ{Z%ml5i7zU=NDk5^T1^Z%PZWG!&%NxJ>)UhnwOdzCCtCjrc!>RxG)eol_ zS|B6)L7txnIXslu#*!>PN0kx*Ac-7adQj*Cn|086`C?_FbvsW{qGkY6Djp03)p`y7EWM7Y4H{r!;i)TyXXySSdG~~wF;&hO4nrZR?4^(vUz7VX505Y_G1cbZD zFlF4)2cX%gNOsy*#ei9Zcn~b7Id%>00XDUuAAPG#6NDLP0bA%FeC+#=zEwZ^R{iK( z^`mdqkG@sUQPTU&%_JMK&qOz>h)m8P9f9wm`7V`+(W8RZ-4P}(B}z6RvaOoq#Dt(s z2yMy-fB30Zy)me(sxYB4@eN##g8sI=?YT%bZ%Aeaj{piT$o z0qc4gd|SHefF-X~ipX_LPm>V+nEc5OqcGDLg%c0Epp8VZm`gMtlgUy*eXCL#V5dg4bP_LB zgCXk@Y1hIp8*2b!RHOw7o425;l$kqAHrb6L-8a;A0IFZuiHfOQTgn^{SE^e4&ZjxlzwPOQw9ECzoxfGl4OLCUHB^!|R7RY`;!WXZOp z)y_bIeGc&8ohiTK09%jKX38Agk6YeYup^0&dn)to@jx<{_gEv~)=6))$|w>o1m@CH zG6-P1L;Qajf3dkLgIiW6rOI_Qxd2jB7m2|~7y&9{M^y5QGB&Ia@u2%zc7-NnsY+YF zY(^`pVM_vmmjUH&expo8=bp}&C{vjPg#0uWuE0nv$%UQm=R?FM&;zi+E%3R=7a`r= z%9lcz)5=)V&NQ^!JVgux`j|XS8OT@MUd*@TmqNd4h>ch)k5m2N*4ax|*o{TN+;}}4 zDFrFYhNV2c65vJ6P0*czENL;UP?TsB;K)3Rt0b62ErWs8PlUKhp5psJ^d;o_fI>*dT zgI^9?)%TJ=9+7g&_{9@;FQ%uFy$&h|E}tX=rQnYry-1P&WRcj;#bcoUbyzWvOb6cI zHQuN_aV$j$E+6|Wo=SmG!&o%RJ}=RsJL}1J7y(M`RD2S75L3`5HMV@k&74aXrT9U* z5bdj~5}U!wZULNSK4_75J>7UNoTGh$c=tBV=WK3AG{Az&J;+MMF8 zz{pYv^WTC1pY?S)i#D+NcgpP1LPbxtapOCH>k9d8RN2BT6gJJs1u*Nd_D=aZXqb1l z!3@rl)2nn+8BazxDtjUwAE23u3M7=(OnsUIi2=r1@KSH$iLmIL@dmRz2IZFVl@uu~ zTi#>txUrqRB;dQu9!j;Qn1C%X4Wez}fG&h}JTeRZVP`^q4wilWEmOFL+td<8fkX`5 zI}72}W8ikTq?07|(d>4RI`G-#T~6c0hO*QLK;-Cerj*`;daP{$;}t;w8rd-xBTm** zp;;Xsl8NhJz|cKfx_F`%?Nvwv#5Ia0zBL+Jz+^wM z7aaLzPdL!F+XY&{2?V05rwx`MFB5vSAf~G}i0P1+v9?edu7(2a&ZGN45#h!y16i-W z6#j(sE8W;YgX>ql{Tc zDnCz`FN`G%N%c>$hNnCt!P32Az$r9c%dnyMsK~*(cs*M6CKYX7SPJJSYe8NL#73QU z|6vkPD5FV~{MF&TmSCcbwLNqwzSRaHV%h(BiPkt{HpYw45RhJF_2M3stXWKkS6|V6 z0b--e(5}#wcDiJ_F~m055g^4)&Fx8zFh*!dn;k^w(-YRqK!o~e;(s}f*vsqxq=S`?T>@e9FEtd_0MwatN?B47h|QWWw~-)bCVt=D z9@wXlz-h7|Omu~S zGY3fm^NFIt_cSD9qwr%8uMv3tb|*Oc8^M;55`NU}~rMGB!Q z*|`$`CmG`?S;$%532OH88h4E%yg0|MyZ0etQE(aM$9 z{Bk-z1LmWy+y;^eMC4r9K#eD8v*q^*?sjQl4Xtd|fGvKH+&(_$$VSkwNIROa#RZ35 z5AokqFNUqsoI3JPPpH^ro~yKfCV783z}?_x3~dy)7lB;Z0M|})rT7+6P>TGMuj=ru zi?Ik55Z8w?7~XQ!4k@P(EETH}&&ahNwAu@DD5#Vu^@0q*2RJC)Wt1yePaqfa)RuDx zcArLi4S~AF!Lkipo=%MnWd10*i5FjuS-a$B z@k+Ex!bY3CAP^DyRJesO1(VJh7!Wkw^2-$^6oY>0H&is&&R+|ydWZD9Z6amPQ8VH& zOaUzG&C;szVlcNL-ENB5l6VO+C|Mm^VoJ2`zyfAN093W!%#F^20O-x$Lr6z#3vA^v zcya9nd#ED<%e3h;)Fsej2=l#cc@U|hcic*W_$kD~{2kC<(WPJlbYqH!uZXN0pCt5= z2at8|F_57bXh4@uaYDP4DA4d%0g7N1$ih3VQo3Zi8#X-s1uV6;t=OG`E%#g!gzLgv z48qCGV@b7ps4u~v-Pi>pM3D$rO8?iO3kH&>ik}1%Bf~DX^^l+wi1t;ye((t;%x0NE zkO}4(ltbvCRq|}KX*;Z^-U-;KfsJm+5EN{H<)0?BCd~T0h!XJD?^K3G7MqMW~+a2eExGYZ+Rt2j#%gopOGx=;z_q^tk;H&(OmyIZzv}y zdI?HX5m2hsC~mrl0)m1NrHFtSm0o12C?G8q0YxPO(tAf*lqw>x1 zAXCh`2jpzu9Rfcr20yOfb~}We`ppf8D-tH5)+a^U%2Y|E*IFr>$u_OmuPYj^iSNzx z?LT+dk}_cTEg!$mnNFBlM=#$@;|1vvx?l`Xg&!sL^`6Uj>ZNdf_evf#u<1;G*}1GF zTZiIs!tQg8+0-e@%Zp^+J7;rYUhcBn=e0y~7Ew9l{or*~rgv`xlmgioL3zo9nZ|F3+M@l2mX3f~bkGJa+DMR_msczN{(#-uvEw7hHTB9|FmXzys^oWx zNTqDTkX=;d#-q+zd%nP(eUE>*&P*BWQ7$Zw$$PRjr&bn*E2wi9-<1@<(q3pcvA~La z$r)bQSb76FSn1zQZw(+Mfr22jQapHFO-F0aOveiuv&=1#d=Sw)9*)7UqckSH1lm2d zu>u=by=JOhcW<9N#}r5mowU=cuxoLeyHGW>Pi)??FDdU`fz<^8*LsZb*)fm3<*}4= zB$j4xPhA(W42Aw)YE*s5^RM?peCl{=9vXa2a67C0Ph0n+y9E81L|ujY_OKs1qAr~Y zecv`X{TK1ik%I*$LHY)Gla5TWS^HB0#g-@ca9wv}*wVBI%>N7I&m)kL9pciy;56Ze z6<;{|sWRx$u{G_xAq=R>a6^t)tBGK-?J>TvnYxyHf1A<`#R0(b?X+$V(t__ zdQri>kEr-|)5z&Y#0i7AxhvO3GE_2ok~;%*za5YB|MCg`V)*~=Pnq>7+nnZmPigY& z_hfPX#pVFPH`hAvF5huVdj#^wDx>ksH;sFy5!Z-vdy0dguWsA-w9y5q>1d!_0g=Xu zriCj#ivKSs_g_v9OR9r#1Q(3{yU^=PeVT<{zLMz419CMq7Sx9t=m~q>zag1r8Y3*s zB(G%GcR8qGs=#eBil)U1{>QDePy(202D&t~9Yl9_AYntQb7&iQ7=P-``Y$K9B(Dpu zc3&2C>wh`9|8jEw<>da$$^Dm;Q;P>(;)Y&!OB>=ukI_4J>7a4{<>U^6V(rCl?ifP; z%gIS}!;DR^Yja{yR6+MBC@KCgCx>)vK)6fG$ojvW+da$$-$tB|8jEw z<>da$$>l(J=l@9A{g;#bFDLhZYpVJ$C-+}Y?*Gp@xy#UTYnuy+HF~!5X*#r+tC!pT z&V9Bt8vSJrl8NF`WW>N3Ix$-aFj_%tXV!`?m9+p>ja}ah6SHnLAnh@qzO`<)y)(#$O?pcLRedH$1jFzXi6o<#r)5|h68At(%n=aeMp5y zb(|nn@)F)vD1LE);>UXis!-5WP8$Nf#^voLT#h(B*01G9 zU`B|2HOT4?{CWavFEkutH~6X*TMWS?gR}w6aWOSzj+>v1^&i zG~>yR({0Is3K?}OK*a8%J+&Rg6Ppj#k80mBxlwT^nshn#)o|9UoyxCL@r;o7MOu)V zVPsM$&#`%(a}GU2g?wj98vEDuj}g?)jW-5Kdn1yX!q)NZV8sj8L?+wa(rJ@7 z{g(_h+RRxD&M<75GNK8)Hkh@0T6th?(gsb=wjB+)UrrZ(Ft1T#|JA1(J7F`<)`rxbp7rH(&F4R=V7~sX=V_HseV~>d&+yvx4*jhlJm- zRdrC{L&vFjyi%tqDrbfzOy4*7n!RF@I{zjjzi%{Wz67ZW+NIaFBC5jraZ@=axqbeb zx6fI2o^=-9D3V82Z{=V?X@98oy>7kvXSh&}UA#%5X3|g_wk}LZ-OB_t?bDsQ3`iZp zADLxD)1E~<%g*nXjiPMhuq0ciF3jggmUm#VlKqal0fQ*g&bUZJ+(T<87p{?$r&F)} zT;3VmMw4>IUhA;Gn=v@k{4vxV=eV7zdf0Nj%wz;Z3GO1SR1$$)%Wspn(bP@1(FnJI zcb;F&?r8VYrZk?kEWY+N&S=d%<`={0(vs4+ZjcwJ|9S?;eA$nemB{@E#WL~}U8TM2 zhknx3>fvgsgk^hYWhHXZsHt!*XL&+mh7@Z{li}IU%g@=lABvn9iD-M$fZ^ABdDO?* zUS?rwwyZfWIg5cDLE2SqEbgCBklSfhRCGY4QrduDNLpY?Nk_64bD&H;N&P*Sz2UW> z+K7EiBl_c^0ahg*dp}&)&!|%%aanD**{d1-S*w0lZPO3ykr{Pa zYTa1=$&(@z1L#qd-#8gb!&Ib+m{vX7rzzI)HBID@yhVX*72%+wy4%RmksCUx4FX+- zt%_n-B?7GgfigkdvPChhM9;H9Ey}EL>8J9uxC*aD@oMpdwo%ckrnb4?a%`d`-&>t8 z=zN&*X-=1HLt?C!uM3je)TSDm1gQVq7n+;AYj<7t3X2%ij*F4y(lTS^HC}`tV;(Ck zP1h-^i-WN)Oc@nfSkdYx{$Oe0Q`N)!U)GT$M*QYEcXruVf2Cc&_|~WCOnX<{Hxez) zY;_eoZ>^*15cP}UprUNTppKnWTHogfjP_wN!Y3ce>#s1QTs<_45183zpFg1*!hiT( zx&-s3(U3^a(t`IZOV;OA9o8z)i>q%7=NwW$?=JS!IcVCeoC{Ij8%_sn~$zV08IrkQ6HTT+S_%pz17Jb}%( z4|F)Kws}cTmaO?Z5!g`7c9L}Pt;PbK6mvg%7 zg5rLebx#0FCdG`SqQk$hhfElul&IkqGYTwAd?vqQiw&cSMuwW!qxR>slG>%&56GA45xyO)IypBLDV&`-v^v@^Ddarx_O{5ZcNvsXmDSC_I;5c=-IcbCd&hu16i;#UZy9kUOH-*^}VOYp1@ zOaAj!vYTZAe}Hfs%JWziRh)*{$-Dj`@n)M}W15e(6$o#*F?S=TO8Dn{X3e6H{!81V z_vpFau(AyD7Gb`uZcJ{j!!JGj#c%|f@qvQ256u{Zn#Jy_RWx(=XJe}m(I{Vw!c760 zUZv_tdo0_nBcT#y$W^}X8smHKMh1k5F4dbD#uEKak=_g<$PZu6gxa&X zUi{x`C2l}b9n537Oj0mMf8Nk&1e~##qKvf4`*0AgzsK$HCuV_}#(^x`q*d&K4Ly%V zdM=@;oF}9Fkuk?ksJ`YGrv*t94Sq4WU`DC?YiLXK0>~&Dm~#M@&PMg5SLFR-U?Gf2 z#{*Tcf=#EYul%=F!?QsoG?8lQaG896Xqb9T7eKjG@emg8;s3>8ovaAdDp2|vwbDf| zFIP+We_1xg1{28q>+N#47O%iSTEZ&n4*<0Bf55ASa^yp3K>FIa7-+qyO>Y&_^20MB z#AbkZVJHUkAU+Mf4a`SJJneH4W@E?i8d6>_2_S_XbpXV7os0tF{s5*iQwiM=&n8q? zZqO3X;+_(cCT~;d#VfBzvNqO%={R%pQS02$II$Z}DPHyN-xeS0({_lH2w!&?(5wF| z339A7L8M*<`VpUH(#ODHg78aMoWwVXSfB#_^sE;c80rH@cS{6EWw$dTT2o${YX4jD z>o=n{RFy?9`Yd|eLQeS&bR7G)8Er^SGnuy7O?`Y9tog$i0iXT_Z411wBVj`+4UqF# z`CFm%T8_Bbwt|H7{~38U_3xOq&nfEQX~4l%ThdUQ9xKd1fc2+IAdd>s8)rL^eF(9t z7O;={k;w-gG0bp~w}`(O)&TSPK{AaU1|azc5oR&;D6@_ZcL>2{ZUgRy9p6%kv04>Is}19Zl%ciaOYzl$TliknT~0|B7!P^Y6-Q zj*dYu{J35_G8Wg1^q9gdtrX?sNWB_Ko%+lger2P2BJ5TbWNCH@G?VIiUWSJTjp8-JX0Ii1e8*Wfoka(5K5uUqX1UahfJxoO+odnsuN+8 zi7q;mJ}in;{17N9o~Z>jp~V`34#txO*Dt=f3;iJCm8f+_0K=@A0l*8^lg+c6aOm2g z0W#TOR@ZdV-)A-Y)Ms~*Rd;RN`cY@h z>X`<(=?3i)Ajo61)3D1R9IaV}1`cx;5Txd9-DFSb#rPZcEK&vEJ?I7B=#gip@}9s0 z*Nh2{VmH~~0n69oqH27XLG=Xoc)~(h2K=Tqdc;BeI%Xe0Bm)dp<$Yw*yub@&+8?`^ zueZ{8m`Ma`cFi(hH$47>Elef}hqBt}a)4FS0^RWYJX7WAoD-x@t6V}Re;QRt{X3`1 z3%$f5jrP{3W8eiAih4r$A@nP#uO1+&XNkXOak{{^sE_Mt!C`cqHud8$aL)qd*r7Lc zT`=SeGGQBPLtbmJsO|-=qU}snuNb+Hrjb-d*jNDAznWAdWa<3!!Y2DT^kP`1{bjnF zh!&pv-v+2x%`TIK^NO;dUF-l}iV9e4diuZXtIJ8dXrDwuBF87WVrd%PL4=vjOTgkE z5`WiNdyFzuADh6-t83wF)al@N4lB5L>IFdZ3T{Vw#DMHI2XWumXaIBMgUqDkHv}ht zBeCTVtuj`?23_J;AHh`+M(`UmbR^((@fvtT)Xd@C3%cEuK+I0Ki9f;5n*0U0*6isH~6G>8ZPoil(q0rP{P7hZ#~e9=j~ zj(L3_^la6X1GSx#?lXaQnt&B+8GhR#7~jSW?F)yMIf25!_FMKa-~|m7#y^bS_{9KS zNyn!Vf7Fr?y}>S960USLS@Aj?s`@8nCUX>#E!IC-Wl`P? z#zRMxBJ`}Sh{IfvAbRJk2b^;2cw7N}oERV+Tf?bnnk9hD2_?KhFW3xiD0VwBjnLTE zC4bp3+zCQkeTS{r6`+4 z>o+39+rfNvWMzZ!r3>+aK35xLl>-Mi?ceg3wW*{xW*t z=a4Nc1d z=>Z9M?<6)500=4IxzJ6W-5t=rbO~m{0=d=bki2PHNC070@B!#x&Q^8<+IIS!L`jps zAaC0t+BvYwX_^vnVy%#00Qfeym@lPkT-$ zB~b%pp(R{)7)6N?6`>UmK=*Y%eaP61q75*9;{vT-hrElfl|eLR%3?NjMDJ`w_>!{; zqwqSRp^G@sy3b%X1)OWFKTZ$0{2koztt7ZPZ@s?`cIzs?bQ~$YKtbZfJni6n|9AA+ zF6`fMYY%QJWH<2sq{XS+`2Hz$d|zx3sV}k_T9p9#631kH2cRK6b>W@f zh*Q}F@BD4ixNl-3N<0`%pOs*5QNaz)S_GhAe+I*DN=3f{PW($v2Hf{H_>WehH-J?6 zPZl^2t9yagwGO>o#L(14v9wQsmheIvYlD~`e1{snMaU{RhJFmzg^?m?7>qD5b%7qe z3r!GHg{-o}SJnJW7okdh;yGak^z>w5DuxLeOC!TD-2?DrtFh9LDcWsEG<~Y-(vw|( z={`;e_XoPayV0}abjv9g@YuDw{RuO`fs>5J7e;YO>xYfVR}lb={|z0|_yJyq8P2Bl z7@j0aQ^oi~5FWiDH-(4N#y|Eg$LFIneL881x()Ew7bw?3@>_pGul%H|_|>ggDrbbQ%|=$s35p{c0OQU74m%4U`7>m#ky5I= zSKu}KMHnt@Zs95pkq5Y&TN;4S)=BWgEEyrqlM5Rtu-w%A#FK zSkmx>m%?zm&;r9U>8hZ_4C(oT-#C^6Xt0{hIP?sWuB5~C!FsGENZG7{+Urh1rX&vk zt^3%z5^U7%FwU}OiU1Ju^qGoFXmt=>Yy@z)3Uqynk|wQvX+mt>AkZag%4vzJ6gpQATWeUAy05m=;gWtF;5(l8hWaL{VZV@CMpu-E& zXFm$cf|@-DRHBlB3I;H4Cp>hPACqtT%bKIt?}6qv8Ho44LnM7`vQ}b%^Ku?GtV`<< zn*k$aKQhw>GC@7s_s=cM@(2^kXkDW#s|G~EUXY)0LLe*tJax_aud7|CtzaP1`kBf2 zH6~0IKdCUGGk5GAPHpcHAQfT%vZX9 z8n;0cI7NHO?+SSl#%F+2Q1wUjS);#T)|O-a31l`}zoPi(e@8p>`_j}cffl1^T`(I8 zvvj2l?iQ1a$T$3H;Q>t%0h*A4Bqo@QhbXU8NTAV~7N`%3fVxhoS2wQ=a=;Ur@U*8L zp10}z6_O;C?i+4{7kppvpoI)XJwiP=1H(EuXz7UmA5mzp{0X`?Kk74h zH%;mWUcxk%^<(28T>jK`{0K$U81h4diljV04{e)=JYi2}tAq_j1GG;PnYdm(6AXvT zNYzy40#l<701Ebi3VrX7c?MGKvJ@WNffG}IS)0sQ1SVjfY@B+8(?|cQ@0j^1L`hpf z25z9J`wV*PC^#6icm$zx+u0y+ZoVrrxT>F`^cY0wPl%{wPC!(E#d_3*610t01}&#r zomjBhmFAz3@L#0YRDPxV1>DWM@+tE(ssa$5}UNjf>WgHZj8;RKgxPcBk_0<8LM zK(INkFO{_}tPJL8R)a1z1~2?)VAxIO-_bWU(xmtwOC3(4!CU$R8mwO0V%NHt#-IWd z*$6^%<58f;(aZW>7;kW4AGCrLK~dR7^dS+5i^fnPa?`4Noj#Q)v`!UvH;F*|YYKhn zJ+N-kd;vZ(`2a{+9J@(G$x{tNhAA$D_L7R^tJ2K)xkYkOVh#WJ%IStbi>bv1;Q zLD=|(RJw=@K?NYQFewMHH+zpNor8NpVUS1H28I;i9Vn4u(c3Qz2 z{cLw!14MnCd-v~?j*ZUx+hR8jBfdyWp2LxhVv#>J6&v8$&|~jyVe}E~#O?}34c;{| z9Gckzbg5f&Vi#NK4CfzPfC6X(-M@7WhXd~ZDOUwrSt2~BQ9BK(mso_r1u}pLCh(;E zh7F&qQ&sw(e|=`7gxO_n?n?p#5ao-Eog?9>aC4LGda7{t(KEEF6JV3-sE-V-A5gRa z%?IPj+7Y^5J^K!2j)72r#6da$NnMdYs5wUTPc3B@}0{t2+eG#5!&I3_d3u{5h@A#shHXn5QvbYXkO<9_yXD+AQkAn$I{eGp+w}zF4_yN zZx9W}ajsDj9eS9vom>RJVF1qLA#lY%2@lmrlYV2ozt$s90-8B6!4t48RXByIPe2Uq z4X7DfIt4M#GPwKJMm-AbBE;tf+zdcGY>gwiPy&?q11~~8!olz$*#<-lM+EArZyM#5 zEo$kaBL=2&!yBK_P6CVJOcz}&gRE5&ilx&w9CCIk7>wD^UyI4>@XW6;B3a3<#}#_lgNZO#$>}5Rq`uXfX3&5 z32um?m$kdFkI`dJ00Xg#qV6`(r4M8-zy#AVdizz~;ER^fs7?bIm(1Uic@t!KmN(_O zUK!j{F0ujeWmGOBF94FD0^r1Fno9hfxbBjaFNq!;sV;|DzPb%zrgsRu3sH3RGhJ;sLTf2o8-tzAb=7{f{f*J>&5eC<-%Z9WDSXQt}jmt=>W2=+iS=$57sc0brum zO8j5eV*NqnQ*@VJfdV}aoJEHTn|z`M8y1+T!K{$1fe4ij{bkJ(Zi)#EVq{7qXBf54 z>IwXD^9Rs1%<|p=FALJE`z^lF4*dxYd^q$Qfg+Z(h0F-&G6FOwhmP(L9kmFc?HAwJ zJia00e>^k(=Yjt<%r)~ck?k|GkK(vkri>!#VJhA+wGAYd%kqG8`{ld}+?5Nz81^vD@HYi>OZiz=EyXK5X}(~V zK}s4HeoDB*%-lQ0E7=ybbp4W8`n|ac50A7HzM4m0@3vHu=jPt${lx6KDuWyIXY_Z> zC(M==9rbH1_61DZ)zN`=OhbOsGwb3DKLWY^DBqdCmN7@1+qF&ZQs<$jD65E=67@(KWHd5poXazpryQcztoVnJ&@Z>I z5%M##xgYO=>;`h~IBxYq`>mYldS!lBs{L)JFpXafu>9>~FG3tD)Nyj~#APS&JsG2>lR z4mR=o`jCy|=?j8gl|vQ{OqEwZ9b!sqICX^bDH*esa;K$2;2M7RpAI%XR*apDdt`)* zb@s4lU|V(kQ9pJLrB6~1>#`MfTpY(&ep>HIf&;r3?#9!ZRE?lMKj2jF1kTV});lxypI;i-FyQSFiK}sJbegAnlO!s+Z6vZ~1R2X%yn^X9Ol&QfrYUWZC zq@zoo?O{BLlaLP6V6o&2&p#pP%g6b3kuY~SiQJmb*QO{rYJ=&0rx`2}%2T3tdCvFTf? z9>bH@R+6UCx%*$Ind!K=khto8_Fr@m2ud;e5qze1sJDd4Xw^5bRrv&Jht7M9ZFs>q znFgnkb@L9LqE~E8Zd+yF+>Lj3k%;J(wdSZn`{DCnqL?W*sdw7$h`U%MOhK8OyloJZ%ky1&ztMGUZ56k0`*!^1(W#RB8R?;FEUNirTs235 z$UPP{hS8zy4`tL4$3_(egJQVub;I7H`}n3o2Oit10rx#`mr6>i8L(3)d5}G-203y% z=Wn$ScUXsC?LMrtMab<6%a&lZhx5bwv_WQ1j#W{s};iIy+nBJa`{*ozu zBa8=3Xr`MXAgz7Qx1;mWdEmWSKvZPb42uUfV$(|vVSM3(-BI;#l z-#N8BH9r<~@8;77Cs?P1w$|M*<7TzuvkuI%(p@*|M;T}RVnCxFefMUb^-esW)PJoG z?r_HD{@0}%Y7*8*WKEaivDzrpy{gofo-rTmJt~fi_n$@s)4U@zz4yk!{ckNbB!9o7 zh#Flu4B;TV(~}$fJVxy{PuvwE9OIkKQGJ+`z3z9;grVrdwO;hx!Ba7cIg3etlwDb_ zTB|F!PU}8WdP!n^sby}sB>b>6@KEN1$6vSb^F_?sASXAyXRfYLiQSE_+>u$21RH(D zLi|C`NBeLv$Gs$iaJ*`tT+#gTcC-l@hncQ9)EiMw;3{S~r8Z;|=-&2LO>~i{xpytjbY{bon%oLA}b}_U$b^rXd$!nMxzA_Q|EqFq|sNVb` zobE=qOM<88Vq>>|0g7pw*&)Hsxg_2uv`^bc;nal4k1x5qSM6_BRc!ep%-3OdjJy_4 zcB!eW%)Nf&203{8T9jt)lL()L!&}BLhFRMR2)n#4ep+nC{OU>kbUtTZV#SzI7m1CK zA3?odYm3jx49dVXdw7r->$=(WWu^q|FAbe~5Zp!UD2bZI#@n{5icVCEqjUux2<&c5 z>09(aomNA*Ws>97;vR(eFKA>oB-@OV@j89E3m4mCRvAOuzNLPdW;m&LcBor|g^%Tj z;(5|f<5tgG8I#!*Ns?Loj`DY9(N4>(p{IpqWWxEXJwpxsz znX-qr-Z*=3684$c`MXH`8lREFDEdWjxA%glgf#PR+un$n_#{oypLbZXo?S+EV-Z1x z4|2S}Zriuyog8cI!(m z$e-u-GOz!!wfUH}1Jip-PmNhynSG||9pi%4gyD<}7fSL23o@Q}uDlJyoYr$zYyJB5 zLkQahf0%-0>&gvfTBGy#yW;7FG?%r!hFQeIlt682~9eJ%Vl za_dqX+TtDm`BGUK)B(yPd%2)Ev66Qm6|UV3w%_z$#`qH0^0WMnx{<};&kvkF^!^iP zf9cAPV*`hO8b3py2|Gi}3*_f1%f6Yu7*#7OUK_paE`+yuM9tW$(OZz7^IZPIiC+F< zxlbvx>sK-k7QNoYxm*C5c`T`lC6Wf z;)Tt#($m+^^C!+`N80Q>;@QX2m%ZbWE|Zc05 z$G2?qO;?A?k|KYx73%4k1AQji_Si8KW)V^T#*>+|-@I)jl|1%!`TAF!G$9|ZqVaT= zsV10BU7mK)v~gm`p2Wv~ESYJFmB1lmH0RY}P7jMq_D@-@wqO<;!G^bHrYgQ?ED zK53UjQlH})2FrcYSSUMh05i3bnOt(?p~?44T4!n}td`bpo#*-3%#n^i;MLl8eX_{C z>-lhyUA4OuXP~^fX_~slME#j3{AV&+1G6QXj(r)HkhyexBNK((F1=gGR+vI*UN|F) zz!sWy%W{0-6yx*DzOVZEBw=63yv;;fH#v3Ct7lrJ@=HxH@B+{8#oD<&rCSb)mQNvq z62Hm(wG_XPV%Fj0s%XKRHau{ls<+5zPH!%M^G$^(Zk-_>XC?A<&?Fof7mm_QvnsVSA4c)f7RG_mi6%d4BH3o^}7n_Cnt9ng6TNs zI?tj2;8VtksHQ_;4o-NvScA=CLhNzvy^thv z@bOdKCfl7WQ<64mq-}L^wKj$>bS~aEz56$p4j)jQ!WRC zE)5+zSvbtRfi{;kJ?zyMZMF8emhj=unk-wc$&_S55T&)Zj=e+W)xNwR5iBkT8oi&M z-ezg-RW)k%(PH?Kel;)OV%bg;4!PXL!7SGI7muE|;nY+u5$n(4iwSu9b`-ee7sEvF zW(aI>qSt!XB=*jdu3!}0WM5fJdD(L(1teOQ-D-R&_Q)I?FtMUSvihSWkcD#@{kI~l zbT0LWupe;m+c<107QT6*Axkvh8MEIL!$e(u>m(}EenneEAK@&sZQzn_VyXPfoi?X% zUb)j_WT>_@i`O-GK_$FW)>yIdPVM}4=?t;izSC#-2pFzOXnc4ZY{c#0&&tNkWgOjZ z&-!#c%E1?c73K)@l=1WOl_Xr58`D79(`yN)mxfM$8soK}mZkbqqy^h=6a`aUt!)%R zHTF8M54@cKHnJ=BCH~03RVP#SWZfx}$NGu&I=4qQjdD%Sj|N?@LW!1r*>m+5L*$o$ z(jWWlI1)yXVC7>Z)y{&)WV=z(V;edbKc9-u?fbl)_321dlfwjCzq#Jmts&peZO>}d zo_=L#^1XJ@PcET(r_LuruErtTzy)xi><$tt%B#^+s z5wpJ5#y6MJ=Ut%I$!)T_wS3zRGBK8{UJGH^0y1`%m;HTA*EEm(^fcGYkON+>aaM+g zdV3?APP=mkRAbo0Jq3vYjVISCjaL&sNWW!cl@AU`)O5_^=h&X3EHCj~g@K2Ctljm7 zLitpNXUIpq!}AV;IhD~cxKUi0&vn%)@0rObF8v~E|IM%?Nc{3xo2ge#3DYXx$^wm} zcnBthJis38m?QD7_V<9En|I4x7`3j&l8rX%eDWuyG^OPVY;M^^Yd^UwYCkyL+f)Da z!-kN@ElX#E2yZ>|E zPp0BsQjZM1e{a$Bt%z5RJEP5>1U!noJT)Wt@ftdRZc#uazlh>7ah5&7cU80{V>vBD z28|-GoVxc;Ao?IUf8V{P(38|W(`r1=sdO68w6aKtqaF2>4QH55N%`~I?}E8l`Lko5 z)uxsP*Z;vEmD|S6{Wv;lZp%nY8Dlazpo-0zc8s;ixx}k0BIDNed7!D3X``#Jj;7>4xXvo#R|^{M2+t?fGGeSFxhm4) z=qBtTjv_A&Bt4l+5P`r#YjKsh40U&!yY-xGifh!!z<4>Z+jcX%jg0c(aM#{@;qo^^ zx=>w^dF%Z`{!pqoMxx4y2ULyx-fN9-5+|Npl7L0}3r>f7On;rGG;oi1C8*5l=l5bG1#zJl0e8gN?l4K-i#(>2>l8 z@rj##T4|M`$IaNsd~fcqlWP=;C5^W0l8&qdZZHr8bB7-dv2k zeT6@jgH<9nuW1Y4wHxxe2J{{7lAXOUQW`K(7G4*l=#ljDTN}@%A;J23G-+W*w-W)* zwu^pVv$BTsbbH`(zvf3ofx`XkI4{weVv_9KmUvf-n&|NW<*1Zq)&MK%f$`YAbz^BY zM-D6Q<*1TeH#(#2Jhz@xD#v2}bM(icFY%GdxsEdaQI64ISFg`0HtrVvCc2EZ&m!-; zT80$gW7vjOy8lR@`M0HdDtMbA)!∈nY2B*&|}Zi!LcY1zYFgS=GJq0bZZBs6s43 ze}t;Xc>EqL*T?7j&aO^_hMOnWE2wXvQ=~nrhw|4b{Ip}8QqAI@cg-3}n2ayf8FsaM zrmHs}^n2A8Y!G&Sv=qlix!B=}8fD_(s^TpC7(30Xr!Cm!eS0m-UOv~}sE@KQy@!w2 zC_8Dzc>h{r!O%ZqS9^XoWc8G)RJ7f7tfv9rYI7Z%!|nmbA#8=yg+hO(}l;qN-eL8(>OE*Po)VPu(A^vV;9y z;F(2R7hmm|gCTUh=X;S>>N!eU!eaBB&WP?IS0jTi&MM=!iS}9R4&zE%O}t&PIiEsr z172uER)UH2MZM`m2$Q|19C^Tk_?;<#1S%1y> zx^VE!kIJvfTHgKU8D!LGWCF2tQZRo}EysGK!6&@F8!INtDtq~R zg?sp#?ZJYS48@T0x9A97Yr9QmSKH>x{u?MB@{&Sv!r>3``bA&vyFe-$hZx&0%u0>~ zsjPaG;(1)>OjP=?nbn15~jaCK2I{~|C*1LwYzBy5Wjb`&NTzb7XdwwRMWh&<*CI)$5-xi;C? zzu>mqHVAcinDO(~SZ~4wnc7N{P6c^H&?hfRBZjrR0AaH2l`c%Ul{~rOFn~JKtFl<1 z9kRdqgirs9XUyv)pZ5!{qMjk|_Fh_h+Fj3mDR%Q9*~PFRyReirffIgO$mi5+8OlojY|P; zVgbq14z@@cYtG&0b0a&?2!y!>p2=%GXJGY0asM9fq!$ERMpJ&hu)!u~rVkHv9PSb^ zq^lKC=+`?sx|;sE7zn7a{uOS!-t)DtxTC*Rj0yY3(Kj0!Ovr}NN4x5yqn<9r&xz%q zO6-t1g-3~(6D}Zi6%J2TMe(z$BMnSqzZfnR!D}4Lt@ytBN{#MHasPIu<}#5xOya6! zeJs)5Siz_$ddi+vbnD`Dt0af>1F18^!&`N?vDe+uvqj|#g;RY;d5kpLvz!>2gt)NF z4POMapK8AtKXb}tJm@~#nDu@3lZ6jr7!6K{zONY5?Yx6D7xY=>Kv7i=$`|^aWAk7K ze8C&r>>sA3^wE|i&YyI^w)5%Hbq%x6GFM?qJH>_AVACu7tYq4GY}V;tXUcTqGbSj2 z^pH(IvC6_}f0T9d4MsacejQh{;J4d6eFi_g8cPNCrTgDMsq2H}3qMmnF80RmmSS|CiIe9!xVbGYITN&^3*stkpCcdsj!<@#bkC}fG#|8enC8Uc6y2OWfS2(9o0l?a-J>gW_@DyJep}k1?ke@< zQ>>gpKCcA|qgZGC{z<$@DtH~y#K84X@*3eV!G;m*Q*jno88(@PBoC=?yLO|_Ilzuf zW0RpAB5ZYWk(+^^UdS2r6YZ5XR(CzCDowg1zs?^G+7`Wk=AlXbBVse}4W+U@b_XGP z`Qyb-7T2Q59c=X5m*(PPRKWAPE}7VEzcUw4k9io{e*;(Qp+lp)Y+!|wtM(^esl3Im zA~&Uim714P3B>$p164y+hL;x_umTo|Rc|e=n;@CmJK)&27}>?kT2K(G*rQ(^BZku` zzf*ry!0tNVZB?f&-4E&w^`EriPtKxKM+W+mcwAcd<5!O_Qkw$oK0whkuksr^5gn$F z9dnDpL$0`G&z~1DJ-Dj0xQZ}EH{$0c>Hp0^rN24I+kYXeLMkzQaiYrXbV+;IYL(tc zACbI~^$(qTy>hZR8JVZY+LLd-pF3Z5n4&m2K4Y4D3}5reK{xiP(Z z2TnZ7Y2Ylqb;(u#?M=(}+*$DC7U-tn0Pb`i)sLcZD+$wMLSCy2HO6dbJHrHi+Fknw z{IXYFw5j;2;NpDHDj~;ptqxSNU6IH2)!*?BouID{*p^|VWU>np`_$7kVTRKuD6=Nn zc#5@lekIQToOz&#%q+|H#h_0U{z(ax%bgUR*y$p9mnWX*6Lfjs2>y6hGIm)&R`2e& z2Xj6yA*=%T4Y;jiM+5ja5_ya}h)H3JGio4=6-MUN6sQVy6^aF=fu}X~^@{{{>Lq0m z?rTtNN_4>vD`(a#BxI9@aH3hF{hCLByTj5IeqzmHhfx6sUAwldX6+|?S4pbh&Aa3@ zAeUhtRKF$u&>@3t;rGI^>DcE(>`sIi;ZxlyBOW{oRqoGp6xo6@>qLhy9(pntiH-<9 z-B30s*Yx0`_8woug0oX&!3StnX6*LohEP1NvjgiD$Qx?XPM7%sdS1pY$rhiz;Nz5` zGQP1^XQo(O`Y|*i+OT8pv$L=O32R#TgyfAOsRvBtWG_}kN{Ku&Bx*;}CaRA|-K-K( zMOxAb>fl-b`LnZ5q6!zoJhc7H&i1*5I3Ay! z?q`shh~75s3T|87yn4(GDo5Pc^Sozw^l#PX_$Bl;ct+b(ldpnb#<15^cU5?CHMh{t zgE+){gYhhD7X#h)8`aae65!=6{4=w(dWf^Y1L3mu;#nm4EDzY{7r*x?&Ctf+bWPiQ zPV!?;stj+Jv&gsRf6LiTimHLE{dRIiS1qy9eLO3!e~RWlH0kac6=V7-+~!4Pu*3%z zrN!@c92UQww>r~h;}|Em&BJ7m%k8tL?kR!+YJZBQt5*n&K=#}HpCDkb*rvI8i0o|2 z%OgthAl9~zyw2qJhR6aVKLZDWIHdSkB#Q(y*H~=^PqjEc;`(&O_R36TmW!28Yuo)>Y8r3*UF_@}7}8(tvqCLC27w0FNbP%!o}`tLOy>(o;g=V2PsBZSM^V1CqwVJT zFVhQ8H(NY7>nF6J@Z;n6BD7dbO+7zjlU)SKcTO~IQvOnogY{yc;nM|;T%Akv?bT6T z8xK4T#bQTXzfI5bsN@zlmc9&=RPA}B|2yoa6Z$#Trj92m$F%S-x{Si{kIB zZWLtV-%n$D+Xi36Tx(TH*DzvYQ*spu9PZW}M*MrDf(ioe=z2R1F;C_6l-I1RmfyMC zDfG?j#uXnqPwx}L>|1taa5op95~H(lVy`Ik*>>dC(7wry=LIYH;4-%z1Ni}`^fHsM zFK<5F-B>Pw&mQuz?BHB4b0Stbx2=z3=FUnIoactXk!o~j@~sOJ*C*wY<@!nB*Re{f^1Qc9-AY?Ju`hV$M~ctRU0b&F z@41mwjX3^{bG!Ta|FVSEsXRDVi}|qB6b4>OP+v zZEL*m{T-KA{q-j$M;>2hd#d|whn;H!G5Ez|S92xP==&}%KUb;#%N$b2mv7VKKl@*EkJGzy^XFDy?Cv$8 zDgAt_e~d1<_lG}76#gFuTKdgEPX98{;vULOnB)G?p$9XX`Q|03G4 zSF!MB6KC(0$M;=7%Oy37jjY^2Q#MTtO`H{%>VT71-`G5|w+ET0x?|Z~1_I*_jnt@9Ls#iL0cLJ=05gRc6n*;wDZK7-@%R=7c&kr^@D4Gc6p2rzd>78`fLH$ zl;cdb-`6xNC&B!Nm!aX#WHMKd5BEw9W)H138Xcf`-2w9DH|i1uU#{J^6FH{CQe~1* zI-r*Ptk7cfhIYvA+t(R3jyupYOf68Tzc#Hq{Fs0FNEXhRwJ6PWGU`6YX7FfHhgkZKz(`pkxqW)_ z@#*77IgC_|n&#r2+a5CUwmquOcD1rhsnZp3n;V){7P=JD+_!T2eXb$C#Z}9D{Fjdq^Lmzf(|*gk~QT{@<`pB+UiE{K-nIry^SZ;ER~P8 zu?vlFb7q~*sdad~N9jpsQZ?kec6yK6IP#z?EBHvN)bex}7jzHFWVT3?qw92|RO{1k z=Hbtqw*CwZB-kj=Dku5a{5Jm@RxrS_y+5iQhQQ&CI#jp!Tp%Rfs_*>HP-`c9)$pP^ zMQ3l8fOr)0sTDsq0Q#`nCd@g|WFy?v2&#~DN2s<7y1WOYiLMQB6C}R9!F0q=U5v=>l&5+N2`{K0b zobW)<$m#hty5(nkzX+Xk>4{sycbh!eTkf^*c?D&{@Y}7Lu0b+kOb@9#Ohz`jZ7_>? z*Pok;x~p0Ipy_z;4U~eWldEItAqT9|>*c*EvLitjnCwo+XMp0=B~#cfBYA4_sruDu zjjub;UA?-R&E&g{V`pX^sr_QbVnt4tjk|J2>UCq=12&N=3W#8VT*A^-PyE^Udj;M! zi2X1);^i9OtGoURjC?{K&OWkk2X^xa*{fZCo53+V)CmP-U0Hpd?m(Rx@6g z9#T5VIB5?m`^&Kk-`TajCGQ9e{9hDwH_*u}Qw|iB?pX@sD3jMOhEE&85l#t}-3Oge_MV)_ivK@ceN|jk?Her!ibx~flF}UlGAdFcQc8z30}Lb5tsq?j0s<0B$IwHE zG)OlLFu>4A%n-vU@tw{0{m;2L7u+xxd;j*{>xuQOXTAFeqH=_{`!s$MWaM<`(0M>v zz<#j)@X5c}y}p&v3+d}D&!R)?a$QM9&FKnq{C+pJx||cS|5pY!Xxv<%9A#V%Tz?2` z7k03mrr+==u8+~T;gDY{_~r{BFMt+u@{f?funM7&R54!y47lQ>cA$0m$y0_;-M-(gKb zurJlfK4hqm5^3JEQ*Nx%7-k#^bdC%g*iuBqflzaBJp3`a7TXL&xMH@8C|P&WR}pnM ziB!1&r5$gWMPTI{l z_?}7`ZWP(KNjRSW)zL&kRrZ~GID=JZ#fllOx_DQK5gi-}J09-C5 zK{wlt4Ux73sc3z3ae#3R2d&wC@6q-X^gC01|60FE%;cy6;*CInLd1Du4`? zW%5{Cmu^mGus~fzXq7OECsDq#bUQ?HpbR0}3vt#PKhtv6#>0JdN&O>S_nY#wTCf{& z6yvrJFd3s!H&->~ekj+OxA^+n;XGpI-9LCI2VM)1`Be`sZ_^&S~o)EJH+1(NX(|o zrj1GbfIN%G$U|{)f*qjf<~?t>YqQ}nuCuywX+U6n(CvEjsIOb+jM4q;YLV9u#?}U0 zmDqk;FyA+3JWD_Gh^MK`{H4G7yxqzhvafnC1aGhtl|XhqX`&qiI7mSw0WaaF= zwc(@zL{__Tf_`tCMj0?;qH8PG3=F<`+e^zs4FNzIxv_fthD5A5K~eONQ3Ob0gexP? z%FH!912yO`=n%*yb=4J*sE@dXC4 zwV968{~K6e&7f9tM})WcEdg#`M#dX(PxKdtN7tD4-Oz-L4Pxv&S0jFwJ)$vxWxM6x zGL?JN)4R`W`xDYRl{<(J5?bidanSpUSifOC*7!*{tJH?Mcm?F5?iSGfvF}ck%gbhF z3l$L*Nv^4=1qbJ^L%!JtT&BkJ^_P@6{M;Y3%MA?9k=ZW6Z~m=mSDw2i1@-=AL1?vq zy_pC5&C(r9O(+8$RhZWrFrz!~=SH)b}c}O z)>MKU z0_qPBEpoK^{LSbZ{!=w!7~uG`%I{Tetu*px7GC#ekS7O1{lPb1W~ZksNsI8tmwo)h`eJ)}86_!1EnkE&>(w^0XUv9>i+ zaBU)7@{?I6-V1#Tu%4O&OSID4TJ|qxR4HTJR6iB*=Y&}vu5!=GFkzb6Xl&)WE2i!oP5W-EQ|ytmlj0(84+A9T5j7~^so*L`1WDktvku0|aav%AV+d!Q-e(x|q3lj~x zyQ9Q1>zP3AY+{#M6fo~(AeeH(7hx&A6iVe8Xqlw?2gW^~`^diA0Sk`Wim9(@}4;(A4S z_H^BzoMYDGk5INX{kwUV_X-ZPX|saC3K#QNH=`zVn+uNJ4Chynb}pZ5E-5X-uhR$D zw$N7KeIesyu}`O@G6xR#uYn&)B2Q{=2E-C~A49H)D^Aub`zc5Rbi%tHOZZ26YQ{*n zq`hjY%jV};^UkAJVbq&HKhQ!`^a|_uPZ^tau0m|I&(ofFgg>h$R#N;^{8P=0L!? zuQ@ofUCB8-c|-z`Mr~9-8oN>Y+Mxj}neCYT>M7|2BAfBjI*^Y($d(;l?vRmn zhz>S_`JZ&OB_utL*VnoFe7bCK?A+1;yt)jOP16SC#fnfci64Na1^QPrB8nH4Kr@tK zUYZ$S06BmCmR$G(U*G39HcJ~=O}7|le;$IG)2PXC7oScMambdcP5z}W!^R5z%tbc@ zNHqFK%mGQDpgB&oPZI2%eIIkDq)@|wY@{OZ`)-oOgU@v_+_Z2kH~J`;lH20 z(wliyMTf1q{9gsz926*FL(}K->&IzW`)k5)fU9kZl-32;?m3;oY*K(a?!)ZtW~}aw z6wu0>rQx#WyyCn!hn5%JUIcbv54lt+4=m+L;xE@q5)>!=+BN3RoQC)Q7AA4z{on1r zN=9Qq9)U2A=vEc25bB$KY-tugxkf73Y$;B~qx&%y;>9f{#~}B(%@W85tcj_?w*Ggf zQh#2m<33_lz6^6-Pu2Gwi`_`F_0%r7!07og`y6V;p!z9^)wsw2;ga#& z0~Gh!EP$sGQ&E{WW+en=opr68;U-BLlpKWTpcf?c!lYVzYatx z@563ZhY<;xb+_>GvWrG-nQCnIXX1ybX%IipA!%ftp!`Wn?eEtC1Tx7iIIxFu@zB*e z6xc&qkKa^mdhKMeBC!n!?-GJ_HEk}qjlfCj*bZtXj%UZJ6XHx+4FcVSz|-_Qh0vqI z;;Yw|9Zb^H=IUY|3-D#w&D1qP3Ortm^hsHzt+Hj|3UNgJesi&3H3L`U0NGqX>TkE( zn^()Jf{z8{zF-z z$@Kt}dDgTc<)tcsh37X|Fx?P)M0BHJf_CN9*>%L&M?qSpi=Q`4mHQd_uCDkqBgWim zGQF>l{1(OV;|<>*E{;AJ2aHYQ)ZVn#%36}auOu~cOs_kW4KmKPlkU1cFQog`|8Dg4 z3sT=VAhFY}gny;Z)ywIULH&Qt&PCn$fPg7Ax}^$?B?D6VxNlw(OrtnxpxF!ND?GCT ztkjIT@ed6kQtGuC04YGQ)4mim#xSDy9LY4R$X{uSR4X2YLV%G*&EweFjV=DxrEhrU zw1YoMVew+lfKL&PT14wh1X)7Z+0p$yafF(`{0?SuKSb7B{ak8FmDq;nE6F#=HX|bt zM}xf2t51}+bDY>~lyXYVh%4H;eXhaJgsd|4>Mu&gh;F_v^Pqvhfu~-Bpq>QwfqG1& zHIZKZA028yo|_QtZmt#ua!erg0reXM(a+x3scFf18Tdj&savXxRO$sMl%Iu;Q}2EL z$Epxt+8-+n&g1ARE`_C{mcy-K=@3JMB);GvZ97DV4WVDRWG~F zcyn(rc8}U6ExYq@!98?Hvbjn{P>ICNh(SmK5QtBB>27p7HgQgcP7nrqc!?zv=ar<0xHED~y0d}{B|F^s4 zNr6%B1^jsflu`ar0;kmD1!P~dSAs9m-@t?7GYFMwb+dY8w;^lLL3J5S)+5}+;^ehaatZlefu=a1S{;k@@>CPRyBElsh zhQ~UbOL~LLHsC$}!p=a09L_&GSppC!x6ttR#c%<8VH$DAG6j(2j~{_5OwaNLoCVxa zcMN;~ah+TF!&gO+u7_Q~KGD8_WmHbxaezDq3Hz=T=j`TO2vAJ#%`{8yR`6sf=)X_o zRv_1%b|E*S-YC`&0fge-z0MuCaiz?HmG_(x*@>QS(lAG&1k^OL zT>j~2r1dME&72wufxR)A^z;3uHMSp9WMPWvlm!CBAZ;m4*sB7_G5;ejAapqF0{u)G+er)0i39g0sGZwO2d1nIKvlN{59Lv2nbS93ICz= zEP4efhWGQ5)Aurb=e^9zB*W~Kq* zuUt$`<~n72F@@`e@M0~Y#aRPO(FV$0Sbpz#1)%)pFWJ%?(@TKJcg9cGl#gT7Y zz(O)`2TT@efa10YNDj(wB(Cu))3BPNxlBLX;Og0A)~->&y*+@(kopeLxvYI01$Iwo zVLpP`+z!7P%OUSI89oB;b$V7ew5hAK83@9-@iPXmC+@HD)_*u1{+Dm}3o5wa+(oplFIxntVJ^?f@xaV_^@Bh0 zfGv|-<<2X0lRFlQvmTG665ysHSV!^1?s};tn5uWnT%JbC#g6rLKveyed5eXM@S1FhkkZbLKK~VT9s1EG zoy_eI9DsuUT)HI?Go%~wGl+2}7k!oo2=|L*l7uVHoQS+W6!gxKV3 zdv@c>28D}-WM`mSGhSFmC<9>-v$z~)ybh!^7XE>;zaW^z7_bZNan?u&`0`%{Q#M9+ zibyL2r;|$n-OawBHG6`gj2|e5zQ@lsVojUMF^w29ccWyGu79w6)bzc+qT{d4tw)Ptxym`VD-9|B4B97q0u84RSomMmhi-sVIuD z$pUk=HxV2_k=5o6?B`qy$tDDiK;71~@B8>&B7{yVs`CdSq|mTshR>G;A6@YjKWN#S zUQaMd_eWQry5~E&J%xHh?dbARqP&}%ZT{4{%14NXyE>`5*|}6BqF|-OU zGvU5QVL1rWQr}qD5YC(8Es&sO>!9#XL+8n;sW4pb#Tl@wI%;R;m( zsyp9brD>2?^DOuukj8E#_+LFb9V#%=oio2Ysc42cIs4p!; z>*!N}a`A45T{vn?cfw;(WKzwBBZ+TuBF!l~iydZ$>F-^ZTsws2DwiWHRSNgUM~4ET zc5dz)n(V0tkEkEc7jAkhWD@Yl=j&~yxe00ghlX3h3-@0&)z$;v@Sp@Fa?v}PaT->Y z8Go~HoWTrWIa5oM0JyWQ5j#mCfL@pxFFPgtiInOE-o*6MGGA&Qt2x-F>h?<q}+C;pjRiw?v!f`f3$y9@;bK z-3lPH#NmQ{*DnyLE`jh65J-b=Oa#iyKL-D9M7BxaFj>5s;aLF7h5I$OMF%9Zi-ms^ z8NBuWg>pyKHP_SCi}?U9yAsJ4NeClcAIai8LQ3eDa4L_rs*p2|6k#VjhjOHYuli}$nk821kwe|RHhp77f!W(5Ii`_=|jB%y^) zY02ix0YKk3cOTd$md|Pw3iN3x+GDSg$tg1_b=owY87o~YSHmze4gyN1gM$WNaUfk0H*VfgZ*%6w0siB4Swx-k2M6%Y_83%T zz;w$on`O;?ii{Y6K3ME=OZ(xI?Zm8@u^1#nEqW`hGIJKfuG{QvR55HXZSXpA;hWMV z&0WiS9|j^RqFLv%8`{rz5V+=g5y=hYfFNrefT72x)XOHutzeFJpM!u3>ULc3w_vKv zp!zvdm{2f)3G4saV0iek9}rtr_)zFzn0%ln;d_(V*-j4)ItuuR@Z?YIclETPThE)r zYDQ%aA5^`Lj_FxpR5S%PHSX~iuiR67IX6;jVoWBpd;sMU)8LFMy6PFF)g=i;DZP~p z8@g@#zuXk&0B|pV1KXB>{6no6Ok=3AIeY`Yxkvq%{xe5+uZL3ENHDjvD{X*okVR9v zHF}FA>)A3YUHO*HI}XBrPE1~cKaFTu+2gB z+@$9r;&OuNtj}UY2m9`LQ#e)9UX`_q7voyiuEN689j?B=_aubYRD5JBo=gyV3V)fy zQ!>cj@%Gs|gF-Pu9K3dBKZximPj~Vx24)R;bDAZ>&zI93?#SErlyIukZu1Xc*dTG+ z2d<9~Xd}=aI(4{ov~0iL63+Am1~!|duTwp>F$4Ad?JL66YxjKFYyY=^Zx|a*Cn42L znf*d57=6CV9-;WiZjFLrry1UhiuqDEC+z9m;_U9#ZfkwGrJ~E7m^xp2*X)3hlFZA5 z7B+V&0Ae!%H%CNX3YOdzxwnG*bxa{KsT%5?*-j4?ezatC*`3;%OU{Q4o>;AF#e`?B zVkcDEX5;Pt!TXf?5}myBZ1gN0`)ub@E3WTl;08iD$?T2xLXloXPquhR!jl=8$5GWT z^`cW3JN;m#OrF;mL;M-_vu8hO)6QGzB_LcReTLoa_jk{kMB^(@+jzl>5*Zu~)0dJ( zI2fEcUHNDwhz+w&#Stlogr)m(+ugBT3ubV#pr7^tM#LyI3;M5f!OX`vv7N!P2p$;9Gin8Df^@NYV}88 zzM7O%!JBJ$4hI3-yX2D^i&Kimfh7S?8_~g+JQ*fCOrp_KI>~w}?WVgKsAI42pRNgm zb|;fYOe!g9RQnHM6DxO4S16eecu#lRxo4!VC{(`s*v}bFpIW(;PW^uY;pcGU zmDLe^$E0Rj6$d!AV+#7xDm8L<#g0%6Cy%-PFJNhrB%AWas@X$i0%WOOWyUl@5>jahyKY!9jlkh>*EZy((OG8&1w zG$b%U+I_tx(5X|nF8z{LeosEE>DXOMWJ6(Qx%5MMAo4g4;N`C(>Xyr{U?v+_LfNOg#OFZ3Lnk<}=|X^7&Zyye~0 zda)j9(}dd;lx9QRiObEoELD*jGgMeir5-T2^0+cTT=Z4>6T#WKz3$o8`(r1YB6ZhwU&>z-EbLl{u4wc3OXh|!rb9i> zpOg=Me)f6Zo~&Evb|4sFWpVZ}CB`$7w)bP&v)4mq${10T=+XV=m%Bm~ez}nwaRcJ5 z&y%a4yl2R$E@%iZy87yAvlapLpQp^M&t!ldZ&Gh?3l!K0Is< zjZRuYDP^LI)+jO#__A))%Y_aq@kA4uajYBd^d?SIt9 z0f%#S_sJS0{YEUEINKO%Q-PZUQ*)S>OatSRG>t@-ZSKl^HhI<=d!NoFg^+-2jl9W? zVt;!*&Sdk{lBU0C=ksona>%jig)-J(uY9sPPLq+~*2IsT6dK!V>FJ=6Aa-<5va%nwSb0sloM|bj&H@ z2k-V<Nt#sOnKItP}4Q zj9)-c`GNbzCdVz!4hQv1QNUaidf#MltxTJ0PuLrq1=2wGF4^;vcFrnnf9aa%*is)S z_T>tPt%Ur8M-%{FqhR#0)SbRm$lKwa{Dl(sHkfKva}RW@csX!O5i@w}j=~A=mc5-K zKSEt`tW%U_MQz<*nE6F!ZsU-j)tSU1)-UOT4%tXM^Q)kXKZg$%+}=(iSnlm zxnzNQ>{LS-0^OPRnNm%bAmN6Fn4T(Jes8`BBJc-8c9$lFBpLsZa>F2GjI-k_#q##0 zC%XNyEQ+_xD)&+WZJ)-Q2Es1KP3~maCRv((f*a+&ao^&XrFcIkGK1hsaJG$B6kP>T z__(8fb$-VMtF*^YnHw}U*Ptz6-YoR~GX=ei=28#$HnJ99^ttuDo)t}~EC-xZG`Xq_!!2U(Ng@vVXZzqs{Ls#`Ssu%3Ohoj2+(Qh{kKWcxHl={RyHMKJcU< z0lzbHGB{p}5`jVaGT*c$ku1pcUkrP4(BgCZg zEsaS98&$mb9xNW#sOlJ&FOg#Wax^wxe;A0s+eAztx&WJUlglS_o}#plL7dg-g0KQO zymZ0ma7rbfkqO+Ny(VgH&BuI;kzDP|Py7*fR?qIW1X@Q#i*rK|Y5TO)Of?BRaGD(j zT!p5FA-%VU`cEw3r$6aGPwozmsuKpYDhd*XUCOTh76x@Qy{dI^wjxDDL@KHkF2AaN zUSnk38b_n2`U}N(@>P5d^3|r~zR#jo@cru{Hu7oYlA|o$JM}kpBeKJ__3@_QgKW#1 zB{Q`Lk^O=aR+m4G?-G6XV~@%~r#mC%(8zT1(26}1*7h{XR(b7M&dEbjd(IVl#%QCB zL>r!Ujy1`LE`f*y)Kzv0sxl;-Y;y5c;4|#;-v>oTBQ2I4^i=(Vbm4BE3=(~%8>1%> zJh4aI_wc%E&^e#3xr4?^P?7unyzoyVnTOZf4U;(p_xgisLMjW4yu}xkvT%QDPYUCv~IFMCpNwkn!~WY3NQe zSoeBFzPAEix@YkqMk`4(@Fnj0s%|kdUn3<}a_pA)lib3tkLMvdlCC4~*-4}{*>TSR zlcUgXeyBt@^$>V%i~<*`-<%})6=tu$B^hadMwd?Y`PkadhWW(@uaqZWT=DidLL{|uqThG^2FEB0NhN%m@X_wo>Ey%} z=~-*$$+579y2@Xq26ss@jSbZF01EYz$GUzffQ!m=4;ERtfutq%DT3%a^pYqLoGw#1V zY;Yj;jCfsA4O=Pk$S7|AyI0aQUIu$u0NMIj3?i=ZyXYs6%ubZ)X4+Grz)90(YRKmP z%$P{MX=7|_i42JPP-F9G1R5FO`{UAM`t+-ZxkfqkNa_UYDIHe}t~Omney8@`fP$6! zDw+~Aw58%288~yof_Th*ps28w2u0ao)DR3Go>@d~4$d$$QPf{rwunm*Q5lb1HeD)2 z7u2+Mi?|2ech4PL|A-PczNW@y8nj~cayvpaT;V>2{$HZ>$R<*)n6LU6-aMhe*VMUf z8BfnfgA2r1{C<`5qOR@)mEmmaf2FT4>z6f!7*W(SEj26sI?@Bik9+gA_8&ZQLvQef zx=+rt$?FF`n%C6s&TFQoF>-mWGp^DxZA#9?b}6Zv>KpYL94KnSSeC|~P^Y-wl6E{aSL5hW61Mt`od&Nf+>> zF%rkzhe!*nyPyM(LZSl1JI3G;&8v-=Bo&1EP{UhYj;<7&>IPf9_rY}b6WnNuZvM-s z1wKK)_B0t(({dZaq{&`wjqpSxL;C9UsfD~mD4OPwSdytum$YiN8wr$l{je>D|~8X5_HjUftC6h&!AFr7!i z3(#K-WlgpciWf{R)V$K@lEmXO_N4DT%2O4hKf-SiF!_PYawv2RCcGs6?vtQ}Zfu{d z6o#H@lj34}su8!1xtj1trqXOgGn=|^dDp$Ss!o2w{5LgX9YV3HREFI>Ba`Ychi#Yy z<)PfjHkfoWBxY-!G6z*T)V-q^KK#lYGby+|6A=~ckVDTZp!EQf*BW)G7S(DiJw(i@ z!QpF@aexTsF%cX3AW;yCM|`Kmbjio22Xtp&Xup+SdM=^^9=DIifehjirT&ECS7`Z3t*m_lzH?{&}KD;QB|6 zfyIEn`vBBKWv1m&>I9f-KnlOFF;98>q9|x8id_$%d~;rDJOsWdo*xu{y&psBr%$}uiapm?S8V$6rRKJ7Tdrcj*Ie>UtVXT+ zrJXy|@-CAd3=ZE!=H%}hq+tOOHa{pcn#pcN%d6Pxcg^{9Nx4n19y&^^H z=EknB3nD+@pBLvNj(O}vl6yk$k)Oy~ zs$&^uqDk@?PIQgeEo51nI=S-3Jt?StDp7B^7lp?2dl+w=Ie138fZ}O0IC}86=hRU(cmK70f)jBVy+Cf7-2MZg4>ZuJL8#k zJ$6C5_jqq}Spi=Hl%W4u^lk~5sV^ef&EY<{Mg^wjk3X3?*b?r})a!~;`MmUeB-{Yx zp!a==2+e)SP^IuyWD>vcA3S?7BI2hg zIWAcn-Ipd-JM&yV2F$cutMRrz`zHdb!{ql>R;xWqvmhA z0@xoY)cXnvPp+M(TRIafR|(;n(Mlr(0lBcjR}uPk(f`4rDAH9wrW7z$_Hf0LA(N57nI>^kQMxtxU{z%|XJYfr`mNWahmrUx=uCQu|4&fLaJB%T^aw`EVM zs`LgD`K^=`4-ZgX+}bw=EN0bRW|4@gmy;sv==cKBFzzYUW*Fryjl+Oll3Tei3~lZ8 zFUG~hO>@YZQNf=sA;mHc-Y8MVry|MT-n6hY#fjz2sCYe)~ zwXuO84f`!f!?nqlcjTjYc>ik2nqXcUPV9~kGT})rO1Gr^h-^1>&qc&kQJp&ywBq#9 zb12cU!@8Ln?U2(L`W`H!R5iJ!iy50|#qmeFzKB(okX7WQ`u${z5PG7Fnb zu4}Z;TFItil~|`YTKqEupDdSCn+x$SZoKD^V0@QYF_OE@Zn<~g%yjo$0%01{QjD^X zUK-${ZX_&q1$pxkJg&7A-SIo#1=SJY{8oDC4P<3aYAv;MMdO4rq`@Fx&KMBaa3^jEcrK0({G-W8$2b4P}S(Peh@RW2g(vK z8K35~qG#R^c>{Q@MCjDtm%DMMyi$5c2zIVCm-FhF4T0YsbhQ~5KQ&4@P6WMB-bn?P zPeT+HN*13M`@A#J62+Fclc)7mh;UMt+t@mFQSOZ{4k$#g+ORC)s`GGA9UT1{gXaOX z+s`Wp^0;=<0$22+v8v&Oj*qwo@d$<_zO{W%`xicQApiB$T!uw5fQYd3NT^hnVK?$Q zpk1~>`lQr}yS;m^s_^v}%S$R{k;!)!J0mUTj8*Qc)Zcr? zPBZY;GAf0Rr}<%@GDDI?B`52aQ2p#9JT_!1Fl(9?EC37Ql14k?wOpyWHw!YTPdBr|+97~VWL z;i;vboR7Le*yW&K(##|rJyj*tg@lJA>=;!b_wS6;t+49;hn^qdT}o%8GF zD0?Zv*5a*+T@)Gf_aqxhNu_;`x^u{PgJf}*m4O|dOuS{~%Dx3%_06`3f>v?!Wkp>L zvfoli+({;lL!_Uh>6v9&@ccj_0TQVlx3778*i6m!yXOpKP#PXzJsvA@-O^z6bVN-J z#IJGR?ffEhOq&)P+X7IC8`YN7mViwwh&Dd+7HYj)-k()~*;wRIbR#t2)17z82Z%h% zJo54la?!QNah1{6G`Q<6QIh$+jJViTzwZs`D{OJ0X(%*`BRymF*PK|zsiQLaGg8}F zZws!a$YOY_#oRk;iuwXWau zEiRul)rEJN${o45!q%FAcq8Ahe1Bgo?R5t6%f2D_T zO#kW|wZnhYWfr;URD8SYM^i%d#14`J2S=HEzrd`7OfF19=yjSKJAfu!sCuF7sq;O8 zZ5MH9tROE>`Z2M7cEq|t4$6`;z-(Hm4$7?V`Bb3WZta4dzWocZwes=~jX0Pv$BY!vdH5F);bUSk=Ar@chTKNnKKoDB*T zi4>clS3^%Dh3XsX^!^5?-N|CG5o87I7cP2xhzJg!!RF6lV^LTo@wxT~V0klO!%yUt z`LV>aR1@vES1D4H_bHCXQg?--bEJYF^%==XEaADW(0KG=I`%Knn8Si`55Y!{g`-z7 zB~RTQ3Tt{Dd$(1Hxq3KsxB9pEIVk0<@4CWZ&KV8eIixF&i0qt4@@Hd_(vBjE>}5`F zd2LJG`3g$RSXL_Wais!%_bez0!c^e}eDXOTs_V7}p+*x8_ zX*a%EYya;(qo)-$T@j;6Pd%k#ktR~nHTf=2?Y9}|gKkx{l{?RxjOG>kL?1F1wvILh zqyAVhe(efMm(w_ zyr7?bU8qvDx!;0+2hrmEfmvQ$HfNm-@*X;Fq_7C=M(B;C$-YKmkPNmbJ=acs5xxSn zhMWA2$J6)=*Au$)yTO#go~+)QwXKt)QXlP;gS#x+*>c|hI^Y%wm>(H_SrOq(UHtUt zpON<~>{9a{9W*|sz4F3y5wJAn$#R>77pLVk zb!iOq(bm8ieni#JwQ?0nCxn)}3MoEa*V02R!x>mzIi3lxr%H)L9%mh;TEfN50{T8E zP{bmcCp;-am2OS8PdK0ktl%HO*mD!s+5ErlL!S3`AYU~JX#cbhr{G_|Rbk_;!_?&v zT=LnijgYg4nG6;5IHmp+sqs;-K&7Gh~fR~-pl4=+$6X%~unJ7_1(;t_WruIWqV z(uG~adN1Z7HSXi*Kjbo9_4!X8cB7Zby_GSZ^?B%(euMV=!IBmklfw1YxE`Nh1`)#~ zk_F{SLyg=nJ-L?1cWrLwN(rkiBScs`?b}Y*_h;$^%NCuBk^L{4p_I(;WnaiD<`WtI zWYb>$(^};=;sYGq+|C5LORt8+&bUwpTV#n z^1co}3a;IbY_;;nygKS`?uazlJq=VjJOdYC-n8MGc?X3vHG)c5ll1!b+?1?q~&Zgk8H^BNIdynC;5mF|J!RiCGLq!UCiWSUp-Uc zw|2lelxjCM^}Y|?rs5(OXFs-n+JZyRl1~E4eS2~90OWH;gzi{<9MRP%73mV7k7|2G zCNXc)>s;z|tmXQP-jP>?p2Oqk>fBcZz>v0c;}VPaGR)zdGcyfQSrO3*QGC%z5;+Gp zyBKgkNsh1yrHl)t3-X8a!=qp}upj7B)ch6Fd%UQl2}2h46I0L|cd_E=q8Qigx0HW} zP&n)jnHxiIA0tD<*kpiTa*rHf3n#$F5(TAnY5=|&kA!=@sLY3o$^{F!`kDRg)3&OU)>`Lns(QnU zc#Q72)^hh;Rv=5K!dh;~&dQ8a&x>)Uwi; zo-bgZginWaeImN;8(YvF@Zrwb3%nkjTA}6Tlkp(V#lcETp9}TcS|ga+B@e(E(Wgzc z4RJl6ttATQx0bm`dX`_m7INoRfA=&xrMImwc{Oe3RFGJa-jAqMYao{j&J>l!u7e4V^wg$D>>)X3q#RF&G&3LbxZE!K!fP9RRzsw) zC7ik&FNbRFUQ;c|+sh`w2=^5fX}LQg+1o;OnyWFx+1$>x)DN50tr8bB+C_5CYv1NId?wN>G6^hC*-qN_Wu%TsQVzrpU7te3&iO zRM+8uM8;ZmyIx~*8MbbZU?k9{9O)m8YuP@!e6(u$F~c%}FI1x`Rhw!@{+lcXDPrrp zknYOxu^J<%#!GEMdG&}R)}Nt+mGT&aGMJNmf6SSdX;<@T`kF$Z{ix`DuuPCZtv_R- zAS6v3-jLN`^R$gCkuXyoKT6?)d}UNKTin{peIFDO6viae_IM;oE6+)WiR@D~!d%ML z)_K>ALU3D<-#17vy_1_t?SQdhxfj4#Hiwpeca^!L7YL!r9wp*XSEmwouFX@I*vna4 zQ&Uzrz9{o{HPP&-XN+_g0qV)2Rx39H*Sq_qb0uA`m|?KBg+@!Hiq_nVcpu06KiDAM z8jE!rhjZX`F$KoBOwD?8z#aoCzi8k*M&+~kdaABX-XU@QB+i+& zu)^cdk<{(kI}su+zAkg4KSsJV-WLsfA}0GxR7dS8!ntC9GqY-{;XrF7rkWHCJ|At{ z+omcO0V|QOSxO7gd`P965Jsw|zuNjFUYRgCt6T!#eGQg?J^Gmwl_B$yJf_klKe^Mc zw5ygkvwRCF<0@kRMIgk4*VF4|iB-s5QnXBggYPOR(mR_HJ<>K7O|NbgvV{At_(o`` zUaRWu7?-be8Ykx)vn26vv&$7Z5cZ!dk=3}*xMX$oP{i?~`3yO%gdyPTxh-)416Wp| zhryNg$+DT~rvO&+m>-v~Ym+p`!W)uz+%>`E4GvK2Dq{_IH&CYVO#U(PEyXdmr)p7m z|GZz|V9FttVs-CEvSVhGSDDrI)iU~s>5b-E<*pg*8m$CIb5)!Y_|h2S{tsJc8P|mS zet!@Vl#OUrGFnWa28wgB6zQ6sS{~zq( z9&NAtzV7Rs^FCRKVtQz2+6&073NCZ!u zj2|MPZwNAXqE>PBMl*>pD|fuoc>fK$`e?~N?`{wE>f2-#eO5vGr!M4lU#%Rltc14ClgjT3b5If{}TCy+L?s!V_oKTA?EicH#R>0)Mju^zrQ~> zJl1yk%>S$R9+f=G;46tTSilhEE8V@H!NZ$bvaxhzUcWoZ^D!B)nak{U~X({ z7X@r-wgcX9`8^4x!%sz%O2%vOl`dP0=G#vto0i24`N1w;3OdsznKX7-S7cLbvs`Sz zTd#7O;o=>jZT!uAO9b_gEh+do!6WBnf2;Qvn3;ipjD%E!9KIY+ly|QUs1E-Y3sff2 zUlI@fo_oMDH_CmUsVFSB9DsfB8x(!*gRl62>^@atE1mKr$O8s5X-R5%Zcsma82T-7 zQc;up)Z}^al%FB~PSC86xnrosrK0~wpr2qhq zt**`y=>=x+so>9+#I3!DL(+t8R1(E*g5@UVxc=L3KA?UQTSV!;LmAgiwg@&7MLY}N znIam@&QV{rfLOR?9?A6_(w5o^Od0q`0b<55SY%2?X*A{OA;pmR^Krz!W_T6?g*?8 z4>Qyo#cnFJNAYGvkUo<6cy|#PX>!kar?}Ljo;!9%XOsEn znMm=8nYjM|(*X}m3DA;i0&Xo7tg#ebH@P#|a+M%E-bBa2j^0hUNbaLN^MWfXFaV`Yd zxU_0KH8bTts}!srJ(mB##ocv>&3R!irXxgPVk6U!PYWm>aB$-B0+Cjx#*`_WDo0B&XU9$1bQ&yj#pI5cRJo zvIcA$TI;&dR~zoNH5L4w`+@+Lx@|^U?E1hM_pIH_B!o~j$Pi+{I2Ui7EXB5t+ffH5pwap<`0 zXK^PYPm}p3{tZ*wkL290r*%Xe+|P3gVdVz^To2skm11Gp_4Z}KreVU1JS}Yt+-<_u z&)mZW&e`)>S{0P-6ct{Q5?vkFI$QtCJCTq%r`AwCfY+*yrs*$j5(>`*i%_Vs&C_IjZb*>4 zxEOse%trKJ_wCXZ)#~Li@?P9Z?Jo$%ApyW!QaTf5MXW@%Ig;P&`XetWiA2`_OVxmX z6o0V=$t^|UlQQIo9Vz!+RXFeG%d(wa(x&=?*TbP|x?bMp=3d92WA_cE>*LdnBbIFrTFZJ>q&mX~) zP3+O15m@oG;1H_#IuHM``3VE7562WwEH|wTTz&Yy{dmk)#Vu;Sq{~eJ%iFQ?GwH@R zdQH^hUmzYvzPPr{@In(=vXI_PA_ng8^ zuyTh~prOz(^VaTy!hw0WAS9%LHH$8U3PxJGrZ^!^E{(a zG6Re|%e5-XX!$JAwy~H?@O}F@9Kuw{(Bf&g3&ayQsBEmh?xo^061TKu-oJnBCuiBH zG-b8AjEVvk?9@E*tzb@;ZiOuj$mUw}qiZEtc1>$;=u~`UaT^>u@wizjb4?|QnUS(z z^GOh4gj6VBUk}9{6H^{Kl*({fz4=VAvmL}`)pJXY=gh1B6`9!oLFw=(kf79o;CVeU zrXGSI+3iX0ztO`wN1cR?)%H0%+RK%M`-ObUNEr0hngFF|au3h#D{!#+tUo2P-<@jt zyFBD+aoFKo>VE|Nvfkd?i%7b6pXz`Hhj+JM5dJfc+{1<7l^7&W62WVB@iVf2L2gz0K??_ z&mRMi!ynweQ%~?`<6_!e8)0ww6=Wf{7kD2~P)JWLEU->9#`j+W?J+Y;`j0WouZVY* zHn@^)hO(=JGCvi@AhI9$-}QC(v-y(jO_#ce7uRL*+y9tnc$6sOq55th5({h&XK?*HU#s1T8V?^gqSP;cE%u#NtMB7_~g;af2R8%0-fqU}on}Mdo z_xb8Wa9=XW*b~n#J7i3v9pQL489X;g{y~RCd^ll%n6%;IqspC7y8cfB!%3|{a%%Kg zhU3=nf%w3CsXe{GlNfFVyFHzqFUfC7C~oC(0WCcVDE%b2PXZfdKML+NN>|@>#OJn- zIr8U1+sHgcWZszT212a{*?DAZ@n(7!#4~J(Y17;}*r}T>(=y2&OV9dz-WCeXf_;e= z7e_RIB=v1q{+fjGdmA=`0+`+DF2Ihdi17T5Wi!Z0$G4n?qv6Bz`6>PaQzlw^P>Ban zM2Yq_ZR+zO{{sGnvj7R^(5UmB$((z!7OaxBE9>&LQfnSZ<`fy?+~-Dvv_v^N>~cy| zxPo+%aQc1@;)Cx2K2PKe0lI4!YPDLaZQ79OSHlzeO)_FD^A#ibBmZms9N>Hz^nu(9 zUwlGwGjMzAG<2t4`X~1~k9xLVsAs{mWI-I!1ZBCOKje!|ugRMQwE48qTn5JvQ*mmd zXV^ehA$eP5s*@)DBd>zhgfuI(Xy z06Xv0Q{bBP)mDi|lEiG=%xlWwp!}lA%1hDc$(K}PymT$`MU-2+*=hAaTyL zL(FfUgOFO~ev`j*3+MK!l5~T`o94w*j2VdOmw#+Qo20{7yA7_@wf?}crx?eP#HsyL z)Vg_J1;7@3VuuI`-i5acUtj23Y_h+mPewYSR$w%!%pW#8ST@5+?-Mk4kd=7Js zsTXG(cZ+RY3$Mgm#jR``h#)^O4*?6tbWN>*dgR?_i2qe~ig!qU}HtPx} zEO;@bE?E^(3XdP9p{Z7HhU7Ly7oo^Yy(QN9qi_~$ZC}1@MLSS$?$8I+h~yWPl zfthC=a6nC=aaM(_-f|NpKio~(eIWspU0gFN&|J2eJVC_^O@RrJMV5`hNrnntFCq`3kTQ1U;R`6!Uw{sB3n2;fmB> zoyHQ!3o!GVoKvbB(}L1e*#B_GQC4_O&> zwjC~ZE;5i>P=&d(KCc&B%lOltYo|VOQ+BaNjSmDE`g_pSk-ra%MV8t62xi)H{-iN* zIx2pemIJ4wIe0WP2@=X(qKaqQ~2G;4svVTHG^|LAb9*e8I9%)}-M9=?~;!fIR0T1~HWSx&?wYs9a} z@^G0aO06ZH{Ffu%pfSQ+o8M*6lz1}OD{Y=FMlsnQ$exqeHDc%tXA$qvAydLcX#JOy zE3*I2IzgNOSLEho$659c8mjY?v@?P_BJ5Ch9&CssDF!(YD2Z^$88EdL`l6BeKlOlE z{Sg`ejE~qL^mDdqAIfqs`5DK=gX--W;$PiTxS%q(ieU@*0G_yj`nGSo;14mN8gTWk z`E|}OFF83nsCR^qJl2n2LJ8A$LdkTaudT4`u0MXUKKc@{)RChn7R>RP*o#}rbs^CX z5cyN8sp(4-aj&tK<)dHW&Y>^4DDG5{S7N}yznou?$UxSYdTA24U?WMK1K~eKkb0h52Xi1qM+LWWnhvQWxKKL&< z;sYfksV%hzfHq8R+;=G}9h6#T#Zj0)rN*BGasCb$E_bhq1Po5VC*93^wGKUeJi>cokOMzsur^|c z3ZnhRMSrizLN*vfBsTglL~VXyA*nRX^;2_d_A3$i8<*gBTWy%=i;6W+^vfmDokhnU zPXm46s#kz}!fBltO809Kb@hK=nj3QUTAoY1OWI-(h`U6$)(b&Y#I{5E2K9eva7KpI z;`+p5kbSmh2L+=v*O><*+e$xUUfjG;+9FT^*<;T#iVm4Ll`{LHOks_ocA@-cGy>Hd zy~R&$nVyt$n-ki$Jf%qXtlFZJQI#LuqTbXf0hJ7(?%Vwjc{epm$1m5$I7-F2wGou1 zp>a&Q1a>KiSjAp~F6`#kd+(&QPo7}ua(5-&``KC9+IRjvEgNaV8$6B4GhdDM4o>$z z&__`7?QKh6N4CUU;2H&+%Wye;#peUa57yfFf4+{xLdL20_w-jklKCmc88+0k1UCph zq)wW#6+1R@cbb);+aY}EpZP@Trl`fz&?baq9nu@sA|Jmp#_ifsHN7 z>&^~?`0vi5Gw+t^?Lw{4!s%J&d(6+s4@l0V-O10oKc}xR(vKcG8W9fA>P{07Z=vW0 zn3UjsT%?C6{{?sI{`5!gQ=G_O8^aABWSTal%D#I&&QXq3Ajq_wNd!xwZ2HvW!sxM- zG5!=Rdu`Bv_7S+@qtPEh3Bxn&HGLD8+$n<}VjezV?F>g5DgfVLWS3Wpv0Am>DrxRJ zp#W{@A6b=w_>7|Duv0Y2$Bek8&4~z0d-a{41FCdGTU2)}96ibS{Ia{8JSu;xMvWs; zW~4PJYiJ4zv>f5%f5%9+pE11T^=OuWtJ0kUkI9l>zz1&rIs}^hLb|(F9!^yNL(@*X zjhGBk<*c+k&lFPv8~Df?cG)>Is&GR3c*j$U)WS$N&C(eRP;Kg-A}6M08?>*~-rDu` zOuSrDC&|8-Tex!v$j{}CHC}VEdEz+VQlIc>*N} zcBt%UeD;v_a=$^fT62I0AVOSijhC+lL@ZaCCDog#Tze&=47^M%yoL@7x-#%YIVxq+Xw3fKB9D_uf zd76s?9T~eB_@`gaDVc|0#&e&iFIbdn3)ab6$bLQ_=uHn>txI$+%4Ev^{>es^YlqqzvX zm+dY8EIX3~)he3Mcr;gjqi>H$!f5`t6Yfg3goEOW37dD@Hz6_wP%W z9*ZD%k4Cn8sv9C@sc2iPt8g|(^9XvdD?@il=>WRZ{Dkhkyi2*a&`EKS4UEB$`m>0d zjqUr)U+QcLk8GXaYc`C!WpX9LGcJ=E>(zX(dz_erYbKfe6LeU}+e`XB5zh>$ z$93F5?gSjMoSW{(%}AJw7(bR`dG)T6T&zn&S1JB!%~Acg%!qcrs@X8=BTjCE$2fRj zIE^e7)vpW}8gmzgTXoP8v_YzD+vJa2I+7&)m}8 zVd{vK3tYZ|xQo0Lq>=i;wydm3LPEs-mL&Ji1hcMG*vFy7*fGU2XCwxn=j zKH6kvjFHq%-VY-Gf8xlS>i}$Ep1b4DDd~t0#UQeqssWLUeC5#EW}Hn!J9#XsS1mZC z-s!g(^>C}%-2!CV+Y#6K160w6Jw#qJetJb#;zoSp0VVlXk$X`CYTS5w&;CsvUNf;!!F3YM621-)_So#K|}%7AdyA> zQYQoRplj8RO)$$*2wQye^F;s^O19Qyitc@nd6>4eZkUxiUU#iK#K>*EG!io!{@Wj%t{L__*uCwG7;v~}kY$LDMFlzT%H%=L34bW(bUnwAE ze2c0D%`H2jrFgwO4DeCZsW&_n zLof7+9R!mi(F()tlD@hE09Iui8gNM4qW=`$i|+u6x?eiz?!ZhpGnT<5#Jp%9Ou6x` zu&!v;%?lUn4AzsV#WTiMA8k={0iqTLCw6oZ08W^s6>o0~)5}+1s;$M4S1Aqz|6S-s zN^_pJ)ocI;)ShA}yHtA;yutX1L+f(LB*%A4E?qitGh7H`>u>7V9E~R>4Cpx_3 zs8w#>6`twJ`Lv}uq|>ENAo;OaOz~0Sg*x_2V zm8?IrEVCD|@9lA*#~eRRP1V7?-KqF>=0|&Yy1``oc^HqSTG_2E&h6M3zF;^d1at3F zABGNoQuU)kE%731+(YL@n zs~l>aDx}eso=iYBlg0c#f}BlNXrN=cH)@j#qaGt6p8G$7TTaxn4pLyLhPru#$F(d$ z>tqf3pHaFN-$d*oRsV(?YWF$_2W{LuRHKGb>}%G#G6rR5AM%K}jvkQ$E zHrhQPq1CO#W$*UkV@{Z~HC*+e&6+iT>^W?ravL)UAFuR?6YNVD%~kpGub-*6yrg zT)0KFnNCSTh&L=9LN3~*+#*Hm09E5(8NkC*)T6^>7Qyd!^GODLR$W=cs&`xjAcHsA zsMLI4R7{k_)8Kc#!^V#c`2}A=yyP;V&-YvY5e)~1w*;gmIM3F4R4iUG68hsg1Vf!C zWoO^B_7{^FwO=J|>Q7D_Boe%vegyB`B6rKc?e?4GrhctKx!g0u+96s{?`Fk2yLD8M*?T#-3byXwM_c*f~ez`2+DW83`ZA<-wh+<5| z7Jj`P57w-Q^ibnQtTAGRNyVPPcN%4D!#QFqlzcS7)*=0=b0VLg>TJNweEsloA5YHj z$y%J7ObT8ge4OIuI`O*S%re0N#PHs}?!lRpZD9^cKCWk%B1i)-idBPTfu8DC^Cu^J zOJLcuW8^2SGzi4U)F0WGCnT z6-Y`ezosPJXckfi{5x?Va046SJ(W3z|GxQ~-;aWTcI5(8)g)+i-D+~AP};2Y zSx&+Sn~$=L8|44nJpks$PJib*Ij@1JKh`Y&1xIzf@Gi&OsLc5mN^=FW?aQ^9MYq3N z87~ODY$o3`#Jg4I>w28<*N?7`S{j-QW=-7GB?nKh$m=!~XoNRXDKos?v=|=O`_Pz9 zo@sAjcBLMnBn}OGYVB6&h1|ifk|9@Z4V@pC&7dPB|9FLnZtN$$rHKy0g5EyBiS*)i zKO6@dzi>76SwEs46BvRVb<-M9jnMbeXY7x8Gb=~%O$+;U)=xwR;a%maOe12uDTb?} zcPvF~zYl66kSCbrR{hRo?#=)_KTx6R zA**nD^%bW3Xw6LJFgb@^SdTDg>|q3ZYHcJO6F#s>^A+r;9(CusqfU2dntkjY~9ZvD27O=w>c(!T(bw)j^jA**}E_2AdNaJ*Gp<9$DrZA_L)va@Pj zeLj0@I>V3KhmdcQPoT+NV>`b)ZI>&N*8Q2MZH1LkyiYR_%yCq=K}Tz1bHE zI=h3tIl_=ABcEB^%S&Ud{2(OXdd8^JfNJHK4yDU+lcHnCW0$;T3v{xINg1#GPvCXq zu+MY$k^br)vWg+qmkjuAgUzWQy4FC+@jkT>lObB@_W3g~4F;Xsu(AE~q;4*m9B-c2 z^$*0=R&C(Zk_-iK*NQdqG}lU3Q@DJXfNj?x^~A$bdJ@6^zFTE|>7*zn>hh)k4&m2as~>@4OQ(x@vW?&aY!`S|HgshY0edLCz<$xTShGxqGP|IKoQ1Zwr&LMj;*|iNcq0le_G#4{td54jdtf@q&4(fGaZ!p5)2rV^ zZKImM&sf-Sf+gl<@P|P-)fvoy=-663N3*>R3NVjp+yVyAuD6R&ly=g~96arv;P)9@ zdB!8dVQ+#n#avJHFSuHiNB^)ojw7nVu?;k@*Dbhn3_`P@%7xND?H^t9w}k$wO(U~j|7Bqi`}_FzRPin^ zpKp)}1+i=~eCRvo_t5d3gGlz6(8sGOZH)FSh(5L)A`ZcfAvh|>Y$fglS@WmkIg)1l zn*OUMuO7@RGx6SVQY{h6&zc6aVBbKB+&5)I!w0Q}5m>Jr5A?xfkD?v`L&w*k7H55J za|c&iDGh>cZb2EAY4zT7GF(WXI)m8NL`YU^V@pHES%63(l^YTsIro?@aBn0~Y$q{qn3i*TX5|dG`Ej%&AB7hpi}Bdk5lT%`Guy)&ctJ zc}68l_uCiy zpcGdbRCE~5DVuQjq5`Kr=)0wB=dotBEMc3Y_nwwJB}+^I4-O`)JEU&+HFy_6?u~kK zD1iG~4NpO+Vo*cSReKB)pEG3~ah4Jkc(2kBteC4hN%i^9yUQO!e($>#x40N_V=XB` z2F+L^*Z)GxXVc9b%Z6#l~F8p4g`41@Huu?HRu|c@JnhDv5*+-8V?t`@7A*EH+1Why=Q%pgOotn z{Uz*dq0KT=hii`EZQzyv468h8|M;68>>MnU27-X?OTQyGe z$I}mjX5-o{j`mc!2pZ_xM;}>{DU*?FKR~|kf&spvJg;UW+~x4o{df03-quufKoTk> zFPjFD-jklj1HM1SOn$ToPb?(Aqw@-5acAv`imTi?RU2zL^zye2`H@Ge#}cC@HvNZB zl=M>1b4hpY8&W;3_V+o?nL>9lkEo@1h@_AUY1nLz3xCn zPH&XHB|gV#gI~z^r7^kObHf%?0)ngDEj%PGU;jwoKwwwma&4Wczo4@UodO$^o?fi{ zIgY}G@ZvJJB?f`!d-zgiZ}Pv6gUh11$tL7~;>>HjVio{AANz`+{KG+28QI){N|gD6 zg}185Qn>d+_QRj1?yJk!HY{DFQ@Bn!ZB|b8YZ1_~+Z=aLM$n%;h@$WdZt^K*3#@$n z9@Z(d3dCk)^Z4*4Td6}E?aj72>L1QsI>w(v<%3Vc0jNJDzmAA6{1QR95jJ7Xi$ONx z{oV#UwetOPjhg%h{9#lL?Qq?oSLS3jb6S>Je6E&JRMzhO_Y61~f(h-(HfYU0r@~Zc z?Zzk(^y5&8;`+N^Nb$e{a2P}Cko^i4T9eqo|Di?AhQKj&;Mz!EDx4e_{SI?A8T6Kr zBDP5Bs=Jb*&Sddc123STADO<^D$f5ns0oez+8{^#oTp@DAJ3v&Q)>A85Sj@w<&yF7m^L zA?f$@QEFm>GtsFwx^Ev0Ft=+=}u>n6*&IK1t0cp2d{Yc_Cj{QC6 zI9ZAVj!w7(IGVuE(50vO=Rnt^&A*#l{Ybwx>$T8SV90eyTWs5hetO-n*$Owp`3Vp9 zP18Qx&;BZ+q|(L-ZJ!gbj^2}Fh9h@W9mQCY3r5ZJwwE8qw`re~??&i|UD{{bDB^N*CR@i7AD_4}- zV>mVvtMZAJ!sb-s6Z87(55TyGGU)Z5&jN}bqjWy&Z+!I$K!|((ci5&2Re({R2{7Ld zr7s0ENJw;i0#tfwZ*a1guMy$<(Kz{gq~b=>87wV2Om$gSg06OCa0NXVP&q(mCi9}#X8|&q%ZT?u>0s;5ZV=WJ?QJSmP-o>10z*rI4m$$0Vb z<-y2pvAM%a>7!vu8{1iui7iIif4*F7M>qHUb5|S6{kfs}U9iSx?7waZyO-0~R~HXE zk_#0)o;WBz;w2c9t+>^tVA7lg3oieSt%xhMLPU*QIS;Zf{c3H#s4e#==Wd5g1}f_P ziJ)Ek(nw~8FRTr?&bP-JD$>1NMreXM-iAQf0LLQkeB7;z$yABMH(%{;{Ro%^U(!A% z;(7^IiyOFSz@C6{QgqnxR~uh0*$*7&)lf?H~Ac>>0M%Q&Nrj(9tFg7s({@9$zfIOSW=EtoTDW5xr5xFI< z+108I&aQ^$g0^grodz6)_W_>l1jabiO8r`}6s{Jn{`j~rHezB#CN%o`| zLvhYT=cxG64&w46-G2I|sq?KG9?k%R+=>M*Tg;1kcsl5aBJ?XY0>VFXUhkm4#AIv0 zY@e|NdVi@S=y%u$3t(&_?|gQ)5;!?9`}^0h9kMpDmKE@;j%dqj-oZZ4(^5XKHIKS^ zdGc;%D6?r99{JE+wlfuWX@w<8I#&VK=(}Z0>Z_K@HTFH|RAW^5{9tk_+kV+Cf}ZlZ zk~%Y}Qy(J{?**H(v-d2w_YxQ9cd*g+AubLJE zoF4ZA-ocFnY_hf2^FyCbR#pUSsXv2=&~LKL%H(50M+R*kfK~CaJR7$lrcYBXte+bV zDqT%JeNJC>qt&Xax_m_?I2 zuO52k5hei=zss9hO*S?4SglbK)c^QJG=;Fo@M&P-$%TVKaMb7by3W_;qTiwF&B~;8 zwyC}~v4}yyL`2(%_7AV2Mfm;QkYEW0K5WVwmV@pbJG)YSB*r4M!Pn-{P#_hw%EBMa ze&+D!b*K0&6-y6wH`h^^RL)L7YZ_;4325N;+-?_sjWUI(cXdgh`EVg4{`I0XWjB>N zSU|uhW31i+C*tf`aVI$^cIrL+BcrAm0E5dN^LM-d>9kiVPLz)*{YIdu>OwSmB|%vq z{XYWdd@U-v6|Tpnx$8_XfvSMhAV$5v$%1SXkjk4x2klkST{X_a08U*LnOYMY%-eu)YzrZ$zwmQp!C}ZD$5R7++P$hB*DH7p7mOnzKVrI zr|%&rDIe_pELgD=XKDbXU;;GHiyA}7fMotr+y?Jq&sk&$?ca967HZ1cx(e9bjkplm zJN;TE75o@ta4hB=Kjr1%p;1pj0JL_pr)=7jzK;}Li@8=q1@SyDGqjjaiZ&i;Da*-E zJl;=lAUUqJ*KJ;IS%Xl#oJQTx2doLe_5h*=>yNaU`MA0I5hOcewfj9uV7_v^@ua5( zGu&C$Ck09~1Bxk;){VwyG7i%^@a(T~_dci53DdD4`1N}$;#2&c;9vO!7zF>Quo){K zzo=TpxdBZ*&-s&I+}aDCOPRAvmu!#jeQ1>J1%iUC@wk?uI3+bmwJRze%bVaKdME45 z8RcJ*1zw9oP@mI&(Mu^*P|u6KxW?L|?8;S2J zPm0WkNcN8KU#VSPs1Nr%IK)c>6h0>imI|{CZE{mQr#XILMb<3fxSV{REH8s7SbOr1 z&KAvEaQ{zriDkJdk+s1Etwz1KOew&RCL`ROIMrW7L+UR7ILWHdDcy*SW`9F&joMS$ zQh-Ct9Yk5-622uC=?)}rdvZRpybS^M%x0AKNhD3Y!lu|@F&pn01Vooq=XHzgKKwiM8 zj`kI|0^dgkFXTxW^T2Le+$Y8qtk9cQq<8IxH-Ge$la3JaIB~#Q+i-pJM z+nw(A-I-|p;(vMXnwIE{6+_Rl< z#y&Kg&4YaDp=NEk)_jY|SZ&F`3-YFaS-R#=URj$ERO^fu`PctY;oF{K>-}VK?G)=E zDheLX88hd&cN%_UmbnsC7qT0_wzdPi`{aphKx7|G3#fa@d46O)5^#6;=0`VK+F$pd zhE4_F4+4xttW zw~4c_cf(WmC;k=sRBjw|Qg$Le#Jp8Pg3$^Bt9$5YAD{wcZIdORvPUUPRF>akyx(H$ z<5if@(P+}4@}6Q`*tCL-7{ClLW~lR_kcqC%_lKZu@;QG3K=L8B7p$0xXLdc2t!Hv$ z+@$MVF7*^XIIZ~|PPVf0BEVmd!ewseNd-#&v6sBW7kp!j3bdVI3C{|x=8!9GKMNh+(v8~GU=FZ-GXB`X zCdYLx_3^N@Wm>EXTcuke6GF3AB5oS)$(6*O?|x5vJ0S-*yMv)npNbL@4Q&K_I^T7L z0^L)wn<)oj^PJp38=7BlgJ&i1C>7BhyZiBty5Fs4S}PWek}WRuk4--yD32H0NGfo* z+dXM_-n*V5Z$rKNpe~mKU>GGy z#gn!d#8t?40kTV_SntG|tA8S6Sc4dtCf?-K?UYjcUjEIT_CC9a*7-iMM-)o}M|mE` z(k#qBMB2!yKmIo$LkPhz&P(r3u$+R$e!M8MJ~U+wC_AVP zsGJC*PEyut^Mw1-uuF)1`7A6#=fx&kvH!b1eyh0~f;qd@>4YuGa=hHtPycezMV;e< zoD<`T`J57_^ZofFMgD9%-8%bg@GMwct-Ad9(<)YWvyc0<& zvudx={5XH-fu6746QJa4H0JFHgySR+=_xwjK>j+VdjV-sMv(?p9p5BC8Hh zl-s25!fI92{7MH6Zy6$>3w@1it89l7>{b6N>w>D-+8o&W;nR79jywjduuHMu_iT$Q z;kF;{X*#?U7_Fb#Wdq#9IjYTCzyHizUXs^ofTF~(bt7ms4R*I~o zbj{V2&PB-#C_(d|`S3`#8T-qxq22y(Dm+S|a?zIXk!s+rdLrl3Zv19-+W|{l79&2mi&L8n1B`7!E)R446VsepXp{}H^7J2!~q zFn!b9o~kn#cc>S{M0!@$4P+#U9q`+XQ1ni;kWZ2c=K^`{4tz>W;2NYTnPBLS{JwGs z)pT^~ai$|_Lp)^;E*9&NwA0=7@;TWeyL;6wilKy5k#$xt=i<93t~!9z4kpjIp)!Ar zqpKepXc1HlK+dq?l;Xr-}b` zV*8+A@+ax9_sP$lQ=wNln{tDaLpqm0c<*GkujTr96!#Dh2pQy*!YQl$cv#+7I+vgw zi*3D=?3O$-{iKiI;h*$0pLvL7qr+Q6t0bC>U!7F#m#wq~l3j9)u++=U#;0~mgDf_u zN6^N@(N%qd`L$z`m=hZLRn*G~B4JCV%>BngZDGv!{+`*EQC=WL-A^}Z{2l6 zX7yK-X^I<3p+f1wacrsiC3(^d{k-_sxT_X?=1$sZ*318#(5-_Z|F^X%#N!Hh5YfbM zO64uP*Ysw`AxYZ%vz@)G-IH2G1mTrj=Z=+kUlpInYU>_yr9^~=!O(dN%pyp4D%~_Fl$q*^$lBf1F?Hs>|_QO|^%L7WLgFk-bH_A90 ztA@6@GpOqwX8^rBMJ?l!pV)fia6ObhS#F9(5~66|zU01kJdNAT$+KeWIw?Z!u|&g?(6O_Lhl!&zd|r zpHcd==f=;qLgzXDfbH25G3U%Up@ASS*8dT}i{P1dxKz>rb;b>x^9&%QtSeQAC+cLJ zg~jaO=ZVIWCr1c+{1kp2H)oHP80nIK-Mw_D8q5ww0o?J@S_11j-}zufnqfvcjuxLoGoj>~u+6bu_T1RNV1i9*KqZI7Vu$SrvQ4^Sp92(=jd)m&@MO zKv&Mb`Hq!616x(%)6AxU$F(@M$DS%vt|-)&Gt?n@g86HpMvV8j;lM2ZT!OPO-aCus zZjQUR@w#zq+Q=GNPerGu#?EEW-?u-UAk(hnCEumA?B5QJ5rSK9Ml^Q4AHb7f6hcF+ z1`u%sTg{Nub)i=iz&)m5(-6wMqL*4ho-{rYz5GL=p8j7on*jzsNFfAl$3Cjv`6A96 zv$1}N3T-W)rw9C?n}AC}(s#sv9w<0!WGVYrD5|p+gWS{n+H0N166vwmIJh8MX8P(aq}yl2Gh|=5iSO9WUmpBI^8#r{vHUd4@**-Bey( zAKuhU6CEe$|wmu0I6 zs0qsp6jw3CGLL=0eNgqx@>C`tCXtq z*qITg0$6i)5EiOweU&*QSeL&u(RHw|VFN{n1#I1|`QFxNCLvl4PJuj@>Ab7SJoXt= z1Wq95L6mCF$>pxAinQqe2nk~LmH(U1e6YuZbpvomKrb`q-z7gk)Q9Lzu@_SUwQH3hTYe7p6~Z@l$0*)NK!Dp zcxASn@0EQ)b+3rD8L(3M`$+J9*6kCDD`ErxL4?B}9gpnj0|sgo-9DMH0KQ7_ei^M3 zN4?q3(=|oUTF?&3O|oUMU$FE7SDi%E*@Ijl(eEDrmqVLj~o7F1Zo~iPYX;FDew)d82zvJ4oo+_dORAQ+dGty(M39gulft+%XWtBtlI z*PFJC|4BHT-e&D(cui@t+fwu|5ZYj(5RZO%{M+k)LEGoOa6W@e6g_-gB|wteAP8Gln|;wRaWV8 zH&>JU4Bg<-i84(Kw0S98_K~-Vnmx^D`t$QE^b7fTQyGeo>*{W(u>pIVu`Ilm&PdQ3 ze;fKCSC>rV9m5!zgOR2D*-uhTJzTR=l&&tSZ`-?v^lvCJDsF$tpncVWN)U8vW|i`m zaaVb|YCwGGPySkg9BR7^&6FSsyI@DmL^Jo5n7>wq{|AT`HEE|>B3o1bU{)Lr6mI!< ztele2KJlv6|6Xde5lr>(jLek`IAGlIwE8qJ^dtM;QB4a(UxfyX>r1wo`-m{cPw5&!VT#~fYM zsKB)t0)&o~n4sMd@;M$`?OTf;`~yE7Z{6kR#(O#+4^yJ_=|J3`z4yx9M)M);mSCq{ z}S>IT5jkN1<)PnG4UVfcQJGh^V8w8SuX{5vFNSAA!F zCTxBZ32MnB&gX)FQ}-ZghK>%ov0r1-Uh7fVxf5+tZi06eQH#MYn42n~+Rd8$yileJ z7o04-E4NakOLN8jEj7k1Pj;si^+Lw7KUp{5VV_Pq6a9uSFUQ=>RC59toY8Cdvqk~lMPv)Ek}39f><(%Mpe8iObfgx z)Su9nGQ!vBJ4Q+gI7sLrc`#p;XL{gA;N%e(Yzq>PRq$Vy?sszJGtWizNs+~TbVyx1 zP`yeMXE`9QEAC8MNy-G=(7jij4VT{}CY3V+=7SdqELpL{?~UF>Y~?+?@S9`Fh707DWB)e_>s}qHy=n)g!f?pnVE8yVI zJ2J-Tqx#AB7kX{^8g4gKK<7*|b%W*p$Pvjx61m4zU%}_0{TjZ%4&f%@Zr8lQy!K1h zl)pVb-PU4x7fU(iQyA-@Mu|uK=(Y)sP{Q4I`GfSGi7RbtZffdo2sk}EeJ~JHF9JrzX{^{%HDC*W zpZx(H!N__Ju(K5G-y{G}hsMLLdg7XAn&DH_@N0fqaG$gnwsG{IqL6mBcM z6wWqxbAYBO6(7SVQ{Fg!;vI7rD3YKyZk6C=%~ec`*-0|vxNNj-J6@w2MTP%7>LKdp zPyv>p1kw6j3z@?+(ZA4OO^eQ>67hstMRJD(DXmQBc|wwu6$LO0uFk#gVd}BGY`Ss! zpt*RKoh``i++^?{x$E8M(c{bT$0XKQXhNqCPo^-LS@L*$?dGm=X{Boc>E9kAC55;; zQ5R8FX#PlF%Z>Kx!&%%FWG=<-1D=XbWO=P2JWkkQ&4EpURFN zp<7Cn)j>#T_jDu9HlrXXojIXrR`lBWu$!9=5*cy=$CLowmx?rmO#^sK8z~z^vc8k}b9jJCCQzd5n_-8A(Gk1D2BC8K>GI)gk z)yRqLFeX(HcKBBRLr)nJ=hr7c`0yl+8!vEl+8g$z61ulZtrcFbZ$^1QbxY8YV$*mv z*umVNp4Ug0C)9rC#x)LZuud1oV8<|&+97^`I$HHs zHBZz(69E_eE_>0aJgn-(@nllb^^RL`zOT}(FmApRSt3j50d z`AAz+MFdSBHHylp}`?3Vj>>Ii_Gv^;R(;0UV#LCP}e+{%CCmITJ{@9T^Htn_$Iy5jT( zFb#wEGvffLo*mrSng=VSi5}9SJG!#Fvv|{N73Kc2n?YCB#EXpTU;ep;jkqwUOVnQ4 zYr5k4_56^L0-ffLj;MX0sbl+B;UUq~DDVKGkb$bI8ZIMn1TvF^#<{!@D_PC^(dwS2zgmgL{J+Q3vD)Iu(h0udjjOL!4~YFKAb1cL-TY!h zdVq%h7Q;@8#lFI%L!y03DVq~4$FZ1QpWCNPkOwV4Z&UhB9#U2txWgTFfXoUDQY(b7 z5oqPemxJfOhXmZwFtdq|jFy7|&a;9B6~rxRsyI`ESF-;*3a zs|{P#k1dJRTq=nPi3M$)ep~yYD;L`v5Hx<8fvbi(T(k%KP&&Ur4w^}IXO#yTs`zqR zMWDgQ(Ih&(9}=}&v}aF(|`ixX6(;e$T91^Sam80^RYh@i%MP zC7%(7-%V?`ZdD+L_ZsXRal;>aUg81>g0~c2xaJEX#UmXmP!~gVeA#CuCs#@yh3I0e zcj~ITD#wcW44)Eo7{@QAU1~b|Oo~kn`F@}g$VAk-Bs|=Zi@1FgLL?o&C}Fq`XmLGt8CcD9 z4#G@#$V9dX)e0?!WbFS4thAmGO=HJ?niIA#Ym!R&Xz`kBuEg$P%H|zPurJ%X6p`Ey zCvL^gisSn@cgAiP?9@R!{_|?E$NdSvm#PJafG$N!%nR z{C5flK_4dWn=O-pJd^G9=-Bs$4ZlUhD_x^*HnkAFz73G%(Ky*x!U8bI#JrX;eB00I zii{G2{}y-A6D{%IZp90}$@LRAK(k`<>f~l*eG0?fOP1HY9GKZi=9Pa&OYS|}uNP{d zVm`7PDn}g)kYtkDME~jy&b?8{=Kc4Cud4wTtL}?@ZMX4D4MEOvTFGCZ_~RHgKE?i= zcT~UN$lEsb{wZ*vXr&}+phpFGfbKwfx7_^Aod*8{P`Gp`L_=8%T{2tn9jaZVnVS5) z7<`Jdf=ALhzq!bG;IQwtu@f@JW9tD5Fg_v`zB~lMx;Yw~=SAhD`)>|^GEpaM)X%eh zGoR$tN-27GwO=*VRxjip+G$DMUq=KMxY`N*0@dA0rUh%6BZ-^se+ZUBsHI2X*m=t- z)3E}3Q7Z8B$=(YU{eOMdS2ynwGcnCQOs-eQ((k%}C1W4PC}2;1dD}2MHd2;(0VAg* z<@Vbr-`n9G7#PiX3l0P)}@Zo%2Gk z3yA}_&x^K=9*ftGW>GE&S;ieUEiM~)3;gT*sobHrc+LCI&KfPd*VK(}u4}UfnMonR z)H{?H14n2NQCpp_AnB?V{MdwvCyHRz!YT75c6oyWRKQ4EGyYQ2Q)4gEHb}N1+7dYu z#@&qyEC;KZ2~WwwT05@Go9w@?HI8PcZfI~cs&K3ten*7QD8|Otbu;(v6vWN1fqhhw zHp?tXOtos)2CkeNmpu2Pb_X1n%xx+ulSf-s(+UU6Z9IT3gIeXvg9!|B#;%(L1cCTA z)FH`HcbOG@I^+SN{DaAdgFdGlY>x#`^r(TstPs{E*%#5lcH!j4g#``zLn9e$iG;5MNf!N5YD|!w}}4*2cCU z#qAI`nm?He;u!7%q{C%^4tE0~lXO)726GRhAnbt|2{g{pS@Knfyu{#X1-k58OqV;b zQ2NJO8A@L}$mNLr4q3Sqz1xfu<-vTznXdC{#;KhDo3R8(B)rMWQime*pq7x(^6E18 z87=bJi~&NSPdEBGdO`Tnx#MFLzumi8s3o61oA`M{rK<_~+w&^cWYiapO*uSV&TV>L2wq?nBVyMb(^L zqR)Yyon2anizRLC64@+sW=c)1WT3A)0)~U^ANCqoyDFh~`vp#j_XFmCIw&_9id3qU zd_3WqG z4V!s?X=*J^L!7Ye&(*I4qy+OEX#Z5yY+YE8=G<|aQi4k>Cq!}b*JOas{b>c3+x;2? z(%J{1yW@mrFY%fKvte02vYAWIHe^CctX=${X$6o=<-cvqKwzYaGy%5zj;te*!WX*r zD6gHIJd1ZA8?9)~j4jp1LA8qe3y=gI@Y?YmJ4ly5_%{g(^7Sz;z;r zYOf?dYlbz}!-@OAUIsV>XOIE|p-B;TK1r-!<)a8CdYDwLzbzI%jJ> z>aOd4QoK4d%lrCTL7R|`*c1||T8eyQ8tkXTJ`jQrMZPgxwLsI>{=r}kb-AS}0++PY zvuVna2Y@s@CL`oj3DSRv$Y$VkOty}|^mIS+61-VT8CI@zCy`pX@nX zgFNp8ZJ3sN}0zH6sRjbn}4lZ(MOTxEzrn!y(QQEOWlK?QXT7LE!;IF_` zD_Ds9mH4q3_3NJw>^jCF{d6gWht4|Bt)4G1dIGC*Qxr{-7Dk^Q<1iAoiUZc6}sn z#9#VH19dy{vEZ^dUTi6CD_!5xs0(Y;HRkw48O4bdv>RLJtNEAg#amMO^i{j#Dgl^> z=o1(7^PqS0K?;ZhJ;Y5;g$2q+5AjrA+zaEE zQEXlBw?gAXx4kS-115`tqKRtny0hu^x9`zag)`njNf?9h=xJQ!PmTs710m`(H0~4r z>|&T4Y|Jm%_r$y;2CQn|2Il0EKf$KeYv#ak=dVpV^z38Q-zyLC-%lHEEihwznt5^L z4XzN&6C9)yh+9f!WE&amXg1HA<4!9!zRGmTaS7UHoL*z_^aRKdac`SMKo!d01ec-| zl;%A?$`rRZ&$Gm-PruG^&{M-o;;krdg1-4>1(fDr%*e0uEn3&^e6QE2p6~olX*^c{ zcmAeuely0EM1Q+I!e%I$$QcbR&yx22+gd;5Qv9I208wq_B~06^c6`QC@RIg0!H~GP z2F0z9C`bxY*>dbgzN^_yd~Zsf?-4CVWWC}0`^rUlP4u@4A?Pv+Xty5>`%Y-T=n?)e z8&a1Hm8;awo&)<2+V1lU9Pi7Ki})FHr$2J>T1f6k^U@0qCPo1yv39ylwv&fu@WAti zv2M-r>(oQiUsWzZ=c2q-e#BuHCT-4?%vcQKr$T*<&X`lOg7*SzD3cL$&~VKTvMvEOqxG(+Ix|#_*tZSY`Xn2o6EBP4h?)0q82?B} zG&Mc`Vu1>;R(q;ZX_%3%o{T-%&w)yiWpPB^HQQX$!(BLn9uHE1!4*gI7H^zw9=W(4 z7ha!#jrF8rSFqd8Dtx@b)wLwXjAMQ5-yxQn z9LjhQK$ zd%#-cCbS%v&Y0nkKOwQrk0b+BdR7Bv-DTATHZAL@h!d3vQvQQs==uSMp)h_TmxA4nV(W$Vx>K~rPRI&lM%pR`h zR+$h7&io=L?8l$Ea$S>J9H8j{V=THW!6Y)&8+2IxHE1XJ)wIHMjdJ+{uK>PZ@KvoS zAaA*UyCt?NIgJ#nQZ7TnbHJrX)CMg&wk(UevwB8g(b_RDSXb*+gz|s;)R!s%H^nL{ zSuk+WtDyI^qn~ViJ@x@@2c%kn(8~xi9_8~!TeL5T_Pjg?UB_1ujB$h)@)e7?U}-gn zO+fmja0`dQCsA{Ij|D-t8_bEa`o&{AczP%1r|*HDn~Izejk+HcMcI=c?!=X3 zvr7=}o2DHw!3VKz*gQWJJM`0WH#>j|zCVOD z-OS?!5WcvO5}cQ1n2Br9j%EMz)d<6GE@3`zZ#Vs6J_%AVMwYjD)fBiSU7fNvQgdiR zm-#F6iIV9}EOtjzxVyPkeeHZ&nnb3bV;CpuO|{KQ0qyC#ifz*^q)zUW)j|Ox4pQtw z#Rc09hWa}^>!^Oxtg32AQAg2htim4j9`l2=b}mT4a~GODh_8Ou>_9U@I4qKX@3G_! zh1b)uL!Mvq`ne+YA4f-8u10y1V3n8#sals-KK5V+d z)=r;N^u2)=Tb-st0Z5QcAl`|c)bw$?-It(-KaKbC{a`CR2Kb1d?4-&=j}M7*Udh1wv}L@ZWg5}Xk~zG)0{C~rx9{W9iy z7{WJDHnFQq+Z-a%jd)v+^4WZC@u(oN8}4ss(iDNIY?`(-F{Cn-_IM9x z!i6Ct0~Rk$tk4fXXn*^&2ol^OV6-qpMiuQ;eCkBU z`~_q>EdsrO1m7nzFZF{)Jh)if5aNi!G~k-#Tc4u|knjtRx2G<9 z`EN6pld~rDYDVOpwr0LwflYQ)nzOkFz|EcfB!k56Ts;tI2etC9UWRS{;-B2&?`JW2 zd(V4i!$S=4m_N)aG70_y$8XiPBMr`Xjs>5a25B@cY`(j!gD;Ay=E<9`Q_Czv9W;e* zTk09SaVhV$W{ON7)aUn+#Npea)XRCy;0BoWsikRTM(bqAl!I5iKNhYC>5mw@61}C( z7q#+|t}T9^u1hW6HY3cdC7H9$IXvVyv})rF>a`%OhK_oHISCqrpP#v7La>fMAH-ef zeO}!OjThCp*79i3ATFTFC6~mMVS5><>QeB?gz6RpDKY-RM!|Ls z&QgCj<6N@^i%NbDkTMq#Mm+kP?JwXHX5q8ua?FF!M02^D=)e*eYsUG%^d6WNYHY_$ z%sG7~+11o9CNdKTjY~cnEf404H~h&Pe^r-6j-F3Ct_$oMbj*4bM!z>Zs7KX>I4iyz$XIdJ(1C^epxk?i~Ro(@6&Cz^k z7y0P{E!m1$21#*TRwc8*(Dv*vK^R3~lVN!p*xxIG?n~#-$zR>w#crFwv28Cf!V8JME_O5H$Tyb4`vI52k=j-e>8ieJtwRGv0zdkq6c8d z%Cj-uv)dLmB(y}i_XSa52Bds9VMIn;XZ6yyjy56_}V~mL8FzlmPF1UY>w)GK$Vjiz1;OPpKqPE zY9n`fL*ulZcB;g(M-1nG0b}?dWE`AqTP{~EBrng46GRiZ0%NqT?HDU-!GL<4TsTor zjJ$%`Nty-f%YgS#`CH`Jb{+nv8CoDBu=uJY)rt#1J3^RZw}tsDE0B;OLmz=C(2`t-%I(-6|`&G{`vTLYP!o zSJL-S_(*2RY(6alR)iE8yn$EelXos$$IEa;+#4*or~P|tgoQ(e=s#iMprsaMddP4q z$7zwZDMejux3q7q)2mzg40h-wH0m(@D6(4Z%rS23;F5a!eZu={@Ftet$@crE!axe< zO-c`BsrdKbN9t{({{ZOho2CjC%=3uoF@KCr_4k_jdcSuuf7LgejCoIHA@eg?CAo{Q zAy{BR!{!bU*TI|ox!qF3 zgK7kpn9BVTZ#cPwRkSHyR=1?g5NgxvbMT5@;n=D!(?1Uw9*KEkKgmY_H4}qV?O@GO z3m0tE?@{i(Ya4y8r`udf8|qvFcx2?y?Rgt;6G#brp7Dj!%hJ{zx61P+zgwu4RcviZ zEP+;Miw!|ND+i0uDTK+XeZG)aT$uvok;_Z+Oh@vJD1GGfP%?1$`Qvpt)2`VPoaW!D zsj=AGC`y86)o?$6Su2x<>lHfYOY%Tg7sTCz6ffFGmI1Br z%k5T`Z*p`0hLSW}0k?}$n?vTwQP+VM7CO|EQ66L`7uCn_o2@_9JQqq+ObKs#F7N1Q z>l1E9hkGWr14F7s|9x~)Lj>OxR4TdfwK7p43A3)ugMaPtI*%E*8o6nRh7L;bq}2M6 zDoSq>1(6}&6>vw_hzZi5vqttP^YK7AVjW&BQtJw^Ha_14`xt$*SNdhOYxT0NkT@)P zpdhj}gv3;!I)vxsZX=R%XlTMzhd38DC(_wm)xqoFiIp(&d;rU?jPgLCiM+N#A{r7~ zcQ9$)>`f{y$1^X>rSKroPqPQl?uN#!_br*aq{&Ur zp5Xptx19JY)Va9@X3Q=R?3W!Wwh<>*isC4aao4T_3AlClZ9ad!4%2}}E9~^Nd7a7T z`TD4@DF5@Cg{-gGW`@+Otd=T!VLq@fiCyC_$QOD@|5&csW)GU<*-$4XbmH%NCOSyN zw9FYVnHTi6WOAL;*9l+{zOo9j2=2FL-Sr-M zpsiCv_VlgG?3g5pPU-3`V)3;2ZNl^EvuVn-Mz??Lw~{~eE^iW{Vu)VGrIGrBUaWHu zi%e}z5Xg97fzuTcEg6qFAdq&GINq z#4>)byR&}2`4&e1W6=)mkYxB~3aW02vCo#~iRmX#fP^d-^h^1AU>z;dO()vb@wsq9 zhK4Kn&kGJz-5pw8?EN#oiBOJaqUb$&%{AIn1U2giT?ak2NANespuqO3&cerN7S=g)7}2ns)Ne( zHL-H50Ti2iI@F2r*^H`3Y#R8pg~h@>&Zy`u)8BO~N3C|2Y>U9px; z5P=e_!(zy7x3kL;mU8 zF7?9v*h+B-%Q%M_hhxyd)bQ;)5!!?vDrDdtX9m^H^%kg#H?QapE@{BEnin3OZMEV-Oh0*Da;>svDF(uh~2k~^73%kJC)qK zynhcIMEvMBDk5?6mlWut)_#TPmdW&%3#dV}=Qmj7Y4`!-&gRR*o5CRQY%LqYI=$E> z&9&gr__Iv}=%%#8%4&ceayP8a$C3o|9LfsKA1|3V+5LIt5+c3$*VNYrA7#xQe{Vi~ z4$OPCv9D&~Z+b@P4`>%&Kl4keou@k^#1~s|QE1*<|2M>o9ss{E1jcvVtO1OQh8S*5k;t4j}r`z2EDmj%=~Q?)R0wl*RbKF9UpU-bvP(DK1k z16?v!bLvA(%enXc&-5#tnaG+@?qX;;MIgPCsfpp@wM8d&99Q-n{zo(Zy#(59DLTte zQtT#lRl|B!7bS)GXNgoT;h>9-!-4Yi?{%i2vJ9hCqYTcdyd-Hx(*d4k?3krKHqDkx zAunK}rSrbbR5t6b!=hI5tJV?y!!WT-__B;_{pgCY<(qu^w87M2MUe-fmqX3dv^+^? zAa6i3>N*V8&A9Ni8bBSxYSO0uk%e!5ltZVLHzS>%qW%>=15{yInxyys%-Cr5K>_<(6 z3$jq0f46Z=osCbi7GS|~!bbjr5TD`8GNrNiEQbC68-WGyBm6Htw7lgTa!G^CoyUUi<{N)v1@Qd z2|G}~UwcvC*kH9hjHeIllIgueQ_*K)>E2b#a{CtpKYvQC$@mX&<2bCGZ@n0MbA#W@ z7#Yxt=LZI_k)aGCBLYhjCf5UC~GE-5X_dZ;)xUeNmc)j9CQ(+|=x7Qn1>9b~P zL0?=rky9gI?V!k9>Bv-&j4mW<)exGrzkLu#-b&56>u;$(4`Nx7(NVR3gT)CBVx8uLw7hT!F)C|| zJ{2%LM}bpCf6{eiIigZ76d82qO#NZ?Y0_PeY=w`p)>V_D*Q(+RxW=rQY4D2Wxg z>Rngzumrqx!Fd0CMzIZX+7W1`uzXg%tRuo>X2#l*D6bc%B?FSODx^mv1<%FsLO9IL z!FdmsPrPRCDicqXH=>et+}^3k)nhQ3;KW)86}!vGJ^-`kfFiE{ z!0J)?;~W3pwL+jNt16en^StlE`u2Fgy&}f56yL8Yz4y$v46>;4S3FW$ar9MGX zej3!+a%x1)$C+~Qr>;;|VTVXzNLsA6s?@S(qrkhf=!X(Ul=?ItZn@YH_@r0ocO#P$5W|S?Q_A>P@tr~CiRs{eK9hvByAq}EIfVwuy zN{{5(=g&YJ_iq+ze>TLQ8CW=quVc9v?K<#Pw0<~9F#a!pK$=@#vZ`lT0C>@t#gDm*bx}P;Vm(wr3P}H`x@K??NoasPnoa5IIJa}GUOMSd zrXm4%^zq_sj}r69<$5PhNE)z-`=E_D&q4nqvJaW>r`MsozUAUn(*FSxI2YKSr@~{| z(jKWmh1yoLp6`|t7^ozN=Aro8By>SysMt#QI#^e?xoN@e{Jn1TlKY>QdLA~BA+l&#bV=zNEYLplxyetlRUAUH0VJt~pZXkiP zE8Z8m_5i@``~GZ_FkjvoycO3(yX{V(g<#WR2wOdZ@;p!M>h@+^kh?weHC?^0?hn(% zD~~nI50BXQLWgK$8&baLW7$!Mz>gXwCx7B_VC7UfO^Nd#ebMAs6-qobWZ~g^>1Y7h z?gRanh3ONEGZQ(|D8lB5S~_^KHrYL26r>}HD!#PrPl-3RaWOQyV%&7rX}?7%%GVa7 z!*M*t|NmDRuw>bE!^&#a%wl!jN(dOc6Kk~pL5QH9)-DWJKEpeX2lGHTkvh2&ygHca zQHsJG>Slt>xz$35B!;pQG2s&oS#FI)EsfFG{+{m)E4JJZHe^N0RjR-q8r_lXar9N{ zzuv~6c?62RJPrmpB(!?L(V7Q!-OnH77p^m<kU=zZRMjdt{NKNki5Fmbgp=g{TjRtR`o zeyDptt|rI3&m7S~68otq7S2@U?@_CTHU$dI4<(m_l}B`2443z4(XIA`HD;l=)b`2H z*N*sTZBuJq?F3Nf7t{(N32cJfoVwF;4!bY&P*C0)T^lm&TZ*)!QJ@ z_M?dv;$PJD<7>`r`uK?&)p31y1U&1q7UUS4FA;$E_an`%lI9)BHlMgS`u-+Goc*b# zK52@aYW7XMa-rR856+l>wi;3#>DFXBb?AQOK!`8`GM!O}D)yi{{!Ey*0S3PLq6G}} zQ)$%tk)~BoF1nG*lRz~g#S8H_>3R@cijIB2D0a2I`KRx)HJL@12=%ng!m5g8Prx!U z##Xl$mK@y=lg{QT4x<&2ZJltVk#gH*x<-!lGGm}Tl+aC=E)&((v{l{i@co9RI;b#g ziEgd9U(#X4kAr?%B9J2!)(a2$UIp7=&a0IX{})LEHS{S(Gr&;_nJRoOkgRLY;tsz(nIQH%5$h>N4R~5bw zl=x`hQDpS_Os0iQTo}G2PFFFF!3ISfhv`nDawSi%9u5F=E{s`)LJz}Q;a&%dJV&_S3=aPV^^ubISzVnVDS@ zPeM)#F%3dyfw^%561c-mc-;C=+9t-WrZi7}%D)C2e(mh>!sT(VJtfxeU4R+;8?=8l z`)^$g=@9xFonI2jnYdBLm4ns#d&P83gRp6g!Od96jwNkf$Xi$qZFoZnuK4tsz$Fp{ z_q&W5AdN}LYQAc8zux&~NWgq)lFwcLJ^N`z3&(omv_I3P?$Sg-6Hbj|w``ymqn!#; zdDD3+kbfrnI#2Uj6skpP5g6Io{^L#e4ZK(NKR|mr4|cGcA~V&4@~l`F_wFoG8pS(s z!v!+qX#N4^6`NYT8t`Ip)bPl-=?_ZdGP6>ytgzO6jT?C?D9;DJ+a09K3Wo*&-CB`- z!DY^OQK|BYo^vB*YZEX1a;C{-Q+oI8Y-vfE8l{)ugm*I`JRdtC+wYUdbXv0zC2VgnD14RbQ@{?}Tm`_f-V9_S@AwDLjmS*yztf zCb@fkXT)&<@!2^SH2IyC{I$Ez^{tmHeSa8ep5Sy?qlaITCU%T;9vHsXgakAVc zsHh#h$=6yHW@<8QFVYI@C27yh^Isqwzii2IxP&mwR)69bmC@uEMN!eTGB~u9V{&6& z77{z{ex;7?72Y^nq89&m2imJGLSuS=brH{MC$^}wKK@C~W$Y8~4eDiVlckQR5#5Yu zB0&DCs#`}V4=JaMXQu?CMH8lgt~bc1W2z)u25nP^gm`p3rWrJL5h8hfRE)yWI5&SH z;;-XpTksHF{lUNA3~~9bC64O$HL^VCji5+R!4Nx8ApT1d{dwrTXU7H$<<0K2{aYoe zt5BCi7$`8y(KL8oUS*U2H-^mVvE)h!j z;$2$<`G$G_%@psuRob_WT99-}h+8=>@6A-u-o5b2Z&b3`)9+|>eX%9$vuT@^@WAj= z$NEs4W5V7}-c9Y=nE(apJIS%S5@$eNLCIqU^AlBm*|vu086Vy?JxG3fLr%;0q4WYi z=Lq&AiZs&c)w6g_G?;)qeG-Sg70JKPdn=$d|f>z!}x@EaEvf^-zYpyLcayv zhTm&;yFHecTwWis)^{R*W$nlr^jf(1(+S48HCMfK$3fCK@3$weRSB&bi{Gjb>r!A8 zARA4gjMXSr8nGS6)pzF0{HJ7Ft!o)}Yt?ldYaF0}kRd!i0y)G>~ z>8>(MvlWfWA*Sa!QFae%`fr%)!{T{-c?bzldqT{b%; zr?T#5kjhI8YT`*t{`$uGH@SE{sP__wnCNqUb2(h@a_o~^iI6(ok^SW)yURq>6NB%J zo3TPz2pu{&<`?&=;JI^V2UGsczNmPm>i%;IDvmVI%1U7{0He2NN)yk$`M%uUF3BQ* z%|1=4d-o+4>BgXMAqfGB7KsM$maQ}g`wzlZtFSV!Oh@E0lgnLNTSZg|$wiCGLNHal z7{bB`Jl4tpOB%nPCc8=Ju6gP*?}sG#nTnVye{X;b^z!lD?Oqvcum!|PjlaAN$13N} zzSLde{A6V@ymXh8Qwr>WR9eWu!CCiK5PmWZQ*KbbrZE`*-SopB0dRI-zq>(`}# zpuXLU*d>h}K?>(=wFJ?~d09h{L+gUTg~!Lv*^I(CZc^nG;ZYjy?6x$8eB<@wVEVy) zf!`kT?4aoF%!-{y;M;5&lclpytEv|GjO04;qL(Fzv?^vkQi;!hOz?M9mafr#sSv>k zM*6{S_W8f}IW#+g%+%e<*qJBJc_maQuL7#l?1f4FsqOy*WCkHaX`n7eD4&}zu-&$X z2u5?D&P~f}V0L27O`SiXUxDK)p$YzrpZS6Pg{p(i0;XHSVZ$JrN~5y#I$Z-kYz;Nt01*jQ1PZ|^cGbzWe8YRjhYW@?8<`W zGDVWN-b=Tj1j_iAgl(%xmBIX1kGXEXoj4n*s6>dIIf$nx`j=H}8hw=70;dVY^L9+& z=XQo?%?M~mm+(Ob(Ve{AL+l!&5Z~W168%rtE=Vj8D04Vi^d&DzoWgTb{M%}8FTLvP z5H{x!nt6GA^xhbe1oQ@nm!KKp^8&`4OT={*wCm&QafglWKCF^pm|Q!yvMpL##CRwa zq={m$JIXYH@72^caz}0I!^B2?$8huwH5eLnUwt3Iy!2p*I?9DD_5TNm@Id?<%Fc=@ zTP#@+)3IKOs^SwbaH7uA@!{L>Av){lizjr|qI`?#ReiBiWUfO!?*{wiE0OeI{Sg6xu=ztBGXrl41E@HiC-ow52 z{K3plcB<;6;?-y|?@#Cc@GMogF}5${r-n4Ee|0DTCY&{BaHUhsgAs7Y>iqzn!&8@= zopaqmi}5#_X*-VHw6A*_)ARF`uvtay|B?3I(QL>6A8&M^X6?PHwpMK=cCD&XwfCNl zQAH55wKuhk+LTaxQv|hYub7Fw6N;$uy`S&zj&sks_uO;ty?=a;zZ1zjulMuyd_JDA zXsp+O+8wQZ|8k`%A_ub@ev%gb!m&(sG0z9B{SH6_XfKbI*7 zmoF6#Y(L|O(F?wEt@kPvEth}F{1eztYSvFQxROe~jkcOTJOVmaqcu1>KpQLEFe}J48Qf4~-F#XsOcSs7Tj#Z^4?dUg8#ng*MK~hy zZk)o1Ym#|Cf5xS*$xsEd9}+0r{`$?w6*bBq{G*Qq!XIFa@cHj|Njsn7KL7Il$1LIB zQMWSiB;iD(A!6%jGeUh!xz14Efxif}$xtX6Ag=ZJkS~gY1PJZoXL_|#PE)u$fBRW{@>{Z@W}(A>%IG820zTc zeHYq_K(~>{A=#q6wb^j#TEx9blHTsfe9{Q zN_Zz;dVlrVoT1L^aAP_1#dS(G-g0>Mb`XzC@M6$|d2?|Y20YY1a-t}P-O zb8*(6VeoF*%(>0WB(Peug63!@T5g6@l4*nTtGw`Grb{1IK3Y7O2>01!>Rdi5h;#1H z(kvzL?fBcN!|wr_Qt4wQ!NSF>wd4&7`Rrs%%Rhjyn0ti4Xg+m^d>|a>+r!F;eOrO% z8=6AFw0IUXmA$w>W`6jhNsfGtN0IaVI+p6po^Rn?o(5{LG3Y;5(%jdnhG0z0buZh` z9?Od-Mi{^PILKTt!>7(g7XQnttc(lDMY6t}f&s1r8?63HS8M?e7HyrP_4X1~vRxxl zKZE8WnaIu@`=c>3m;-5~*L zzd9n68Kl#$%!1f5XbnaZ=r(p?=c8_FXvt;trUg(F)gRiLB|D{y5*DOOWzzb=H~De#c-%=o zo3^}?LA+3lanyLvk@TN&-B~wrEqQ|&pcAp}n%}qC5Fjp#jcva&dAguJ{>(j_M@NGs zN0GGxMO@N_DUJ6?HCpCw@@N|=Eig5Fh=G|h{HQsoEC)wr^p3DpZGSGJfxf}yir?h`Q zexJKMJVTexgYA7EVM&jxXovELTd@+!6;H1w+)fWSjPZ6(sG7fdbJhaPV8FJ5OYQrY zn8?qjICWGFsk+xAjZ+n%T|25B`&gc5^OTO_s}T=LaX97q5PJS_u^hU8)}Lx};BV3B zShjfkbJ+s=`M*@k9e-nb11dsd&f>7MZN;B_PnR`JK>sX~?(`bIY@|+w$f?gYLT{AO zw?R(U*wvD%U1V-o4he6ML_BNZ9!;xA<4m^oX{g}h69tg@u>R|fgBV;pnjoeMrh*O7 zZJoIBMwzyoL&(0hg%3uRL^CuwmW*)N|ZA@EW!;z6(@Y>Lc^7aFY! z=EYK*I%lh^dynI<@)RyN)VV>;vXZ2$5nLX_wI4h_2G;!Y+!uzj_3c$Di#PpfdQ9Bn zCJ4Ub$`~= z1<$X}Z@Ky}EXb$MW0_b?-!#pBa<5amh8GjJs9dBg*hlAl$Vu2H3NW0T9o%0dgwa&v z>e#4USm~$T&Uf=((*85T`v`cBDt!(|J0LcX%t&nSwG)A^mNo>-%8g(;fC^W+VycLx znT=g20jegPl4Q@@MolD6Yu+tlMz4KtS4Ii1DpwoG8%YVY=vF;Duf>9bkpM(u6e;O0 z91>pt?GVpv!uG#=(niVN6B^k2wyA~{s<$okVrv}zbEy?(%J`8l1wz~ySlli{zxnx@ zu_}rmvyxBcD`N7ZONU$?ZFzFP(jK{%rAthFjn^wyi8%U9Z*~?Us=)a7oeDq=%jxqE zj=hl&F5Lf_6EF9VHo|Fkk;(bEs+h)l<^_8g9&^mPxKM;oFj>d5-~bep**<13Wns|! zhs)_J+XRg~za7^|4ed+|wY1!?$My`Iov&MkVk|g*V#dR2s?Y7hw4P`+%}0BrN@v<} zFhe3FKdRdfEc++D{7%kz`z^SxL7PGFvsWS1VX*(_Zta+FxpNRl+l-rAA7M^_-`p-4 zW{5-1_QmR#I4SXDOg-u^qh&O}dH^sIU!3;lrAsyzais&pc5{t={F3}!9Xtv;3XTqr z9%Ix{z28gkFATA~ksXQ~d;)U4J8JFee+CY8o3qD_X58J}z?+ajlB6h2D{2)?zXcw2a;e-&#%n3(QckCr?Rn%JG?9*kZA;(kMgE(-71`FvV{I zVbt1UzWM}A5mG5v8xSm;UO+ROn9HmP7ub*#OfTOrh`Gx6STD@;4ML($Grn{~J`WFi z;UdS~f@%KJxa10lh|`~sDI2t#zg>OIMO67XWH9sMaSSub!=XPK|H!(muzC4dCLQcW zN!gNX5O~U6un{MR_-Fl7TFk`Q36a>PJ`zcB1#hfdwIae({*5n*fNS;z6Um7})BgpM z{}L%J63+!NR^ssIM{bavr{&{2%C?*=2)=uk9yTBSK!I-3h9j&`u?9tzP)Wpvg&el4 z40WWbIsun&x)BHLED!v@rkL=jRFO@9f7HE%HgiYrkWtaoobyYaz9-Uy&>QT_0$7C_ zB-g+yX(O%?bt`w)pGPqbQ!Cpu)D@467ckgID2pY}8(KY>(63$vBB z(^nJLWP)G!)0G%}X~Hs4S>)FwBDv`3xc1@6dukgA_orN2_`gIX4XdDMXrBC#4*jC) zvI5JMz00|b``7Q^OdY##hP`r%ik>6?x`8r?TL8x5NU znT}CxTU-9(fexJo%bdVgWBoKh!u=2E`H6NT1~tjJGWxDAn&YgL>~-DGWV0|r7QG1q z&y6ARr!aCf-Q*$1thoL3F==l6uTftrKS-Sf%WMuPVSRpF9uG`cwI@&6m0-G}KK&2C)H^CH(_nPC&_UVv; z{qRPlx~-Evbn#su==FNiN5EEIlMj1_5kj*?oc}JK{1p7~My9T1`u*GP7EDlyWZogS z+O=ASY^n-(2p4A--iOy$UIQTEJ94P6CN^z`^$C!Z)1vE>db< zm<~AHu5-YeJ@k$tEudRP1y(n!CqzZ|b{)2=wM;JcP{VLTcikbx5gQ#)T4X?F!&?{Q%*FXGxh^JF!q>E6@i z6g#XJK^btygxJl`$H$j}NxUq{p(4nWf$Yn0FkdOO+o)youd^V$!Dj}>^swZ*JZq9&?a_hTUBX0tMBywt8?S|IV z8>KmKz7b8k*-tAHuI5VUot_|$jFCp4JPr;gdbI|`pRf;ZJ*ln_rP$1zh5KnU9FiUy z(Na@@bZwr$;*>ag1RQP?}{!e^8`{KHBSybsVJ;C*d67Yz&_LfQ`5k!=|**6Cqt))%lr|7E&|bgceu z^8Q1P)7iqb_Z~XG?TPz5Eh4XF_W!-DEjkc!ey2$(FkF@A8><%eNJi>*Cs!zK5VPr6 z%@;cNY0Oa>M_M|963|^!{W<0BRMweeg3;;^)f8`y-%_+ELX1%K2rd!YEo;#8%Zvkz zh*ShI+FS>h`WDMgWd`J^fD(3#X?64D_1mm$4KP~cYSVzPeT%u`JGlk$LBId|j^V~- zR*uuvV6rI#bt|f!Tl(H@m6LLRB6EZ^1xX0fz%!Hfi*y8kGpsfoUb_z&43h)Q5G*az zDs7@Gea?Y?m{W)}`eOxmru1iXDM#cZ?$W(`wZ~e4?-i)40h`;IPE&VYFVgkE>J^=? z5}aS*oCsm>bz}j-@*(7C+5mJ=M){3Q2lk?-xSwTz2vTgi5=$4Mnu*6gMk$VNVKpl$Z9hsa5ai9r8? zR^N+J{I-S0mb(ioMwlf;E*nPOcv#Z71PM-ZVU8nzn7SZ?bDm_uo!hE&nBLUTQ}tg2 zz?Wu7vt&LJRXp&@cb?90$aiU1vf*KRRjMP!><(_8IX^I~K?p@Q%L%tko(u3DkNK&mY{Y`E@IF&4yYjCZ`!SjQ8~uKUorDZ_ho> z+cwPIOaXB&+d1;+fQpZP4Llzlcy{g@9El8_G|}&JhHP*y^a?UQ$rFCwvlDbUYAeV^ z+Vioo1o#B^c;E>7gq?*gmR)qScG_FJ+L1i1EqR97&h+d=?ZwFnvmlVd{g@3Pw{e6& zZGw3qVpduKzG%yhH8$PLMj)+H_Ks~6$R(VvD5~P(-jYddk^)iENN*XHysuK zobQ~kVY2xzYg>*NOR)cd+L3IdTrQx+>)E~=ckFgf6^yT88mxsLCs}k=eh)nnyN*5v z+KV-ZvQPmAAK{$w{e)6hqp>{(@O-4rA0cWN6Y_}T4uK8gYrY)QfgB6WH}(;S8n*O_ z;|~Rt&#Z>~m^qk3R1+hESW6o*`RWaMfrdSd9VRo#-1zMhvG;48<47LiF^`(B$y=)Y zlfh)Sl?{bQAan<@r+d}ixW%)sE^Kuq1jv`^?9=(bEfJe*sx?({B$?ZWMBUj<_9`O3 zfA#=9IGqo+O(b2w1>aGw9WJuFYBl*>MKIxzs3L%KI%Q_A%sPts*WL(di>y zb9m`j1GUwe7P{kbtzF&E4%;_LFR*pCWzv4m&qt^SWwD{S&EqTyg7oo^neT+b_$r|m zGL5rf>q=xlj30 z)1WDunx&lh^XWS1WzCNoLCUE=ew&_@YD_XO*&l-J@}M^dTjWGAi}nU=#uu>4M)HQ= zp^$)mhI(uJpvh@6SITKj$#f|XmR?(&stfh_o}>7GYH(?5)x=)i4Cv>kvD;UKNgp9^}Qcm zb(V&_Y~3qx5Dv#U`o4!94ym3x-_xYng*;sHkD}L))cXH*M{+hzQ<+B|9)8wpNto(+ zlGIE;TkM^^*fOwiUzp^rv|g8NqbTgntoXI8fFODn)o4rGi0RXvwGS^eNZiV0xEBVJ zA>23#rjrbI$`zT~KtJrLU2wYNnQ;>nc9ux3#J#>Yqt#)s>qpouGL5WiK2uxT_T!6S zA_d8#Bj9M>E{s5Ac;Sq=A-U64;hFOixO18WHv>mj)IS0o3X?GURYI2YLMw{u)Qn|n705BRtzQRXtU>{10Ke2 z&imK7=q_`bC{qzmE_K_m>Hx)u^%Q zO;NhIqGQW2^7uPRitxLj(InH|RbVoeYvNVyoT|AncRDFTI*+-GQ%Y|^>{6adR^p%C zPx1O3M);ll4Hot%`AD(24gi?~Fmlc1;St!{ zT6U#y+?Tc+l`H?cS#;CQKEM?^^7|23^u>U-tSi8+R*hXBvpBn!khR#*Zpb@D{&9R- zH=Hat%P;LH`3HN#oOT1GIzFLnT)D7s}6VQ zRLIkyvAbuJbc2kBksFqvea0$@vtIFd0+sfN^9FTIGv1_1kLhcYJ)J2Ve^@ILd-Ht*wTu%7tPkUYwB!8E zzeq=XX4%eg8)1zu!|e-b6=d`2HHrp)HRZ|zf7P?Gbh=*hWu65R0KfohTMRQgh4bI2 zI0C8WFw}Vf+o7frSPtn04tLNji2|p5JzbE@o)S%Axwqp)z=k##SpxVYRjx?K*pBB& zt>cp0g7eva2}pV+nj|%zriBG5{j3&iEXUl9?Ok0q z9+aqbM~!Gb(bSi~FlbUi!F}u@m5;L?D&eK0>tXuq<8(Mf^y$6@8)mjCqeSi}X>ML5 z%2cDjkAH4y6@7>pC&-~rZT|N9fpFSpV)o?`&!^@)(b>O8ZwEDFWLyIRI(gr8VygZX zK~r{YYch5QR7c%j9J0M2Gp_qW1X{tZ&-<4lZiR37{Jb1%`cMNMt!;o5k|N8xYDzA( zeh*T1X7<81g~pbIO!dwbdmsI9RGO|g5jf2(XB$Rtm9?~nBr<4APmPzEUWu$YK;QXj z@^qO$vN1c-6@3p=#?-`ivBOMqG*jkLcNIlQr}X(If41nq(e8G&$;HVQR=*$*(w0t} zIfYLX%5rfP-n5;le7t_NC3!wA^sOu<(-&;Y0S4!9d_0~s^0NWc;DRE~j2h6FDFJ=z zlEV7b`xQX>OxPZa-HJ@jL3CN(SO8q@qOO!V;sQBb%I-sT1m)u|O~%xpkrl?HKxWBJ z%TNzRQRadO4i=a*Gx>zTDUytE+mcYmbuoi_^X-`phvRIoh9IS_QsTbN232@spp zG^-yKs`qWcvaF1o6MpF@E?O#2^EU+3nmeaU8>E%(GsehYsHQ@ESvuSKDT(FY%H9wFh6KBfKS z_wsrAesn00q!E&@JR-q29O`xn7#ZUmq&xZ4CthS^1hC5=BL=m#RVMoF+n+=HG4Z+vu~{Jqn7(UyO|$J4xZj@Z2#K(rt?t#i-|>L z;f>7XVPho|MDQO^Dq~=wYBEyE&X$Be>cOZdwbJ`79u0;AGvC2@UbI22M4IdRwT!v8 zQcK>$84h!|K-ObW9jzZFnucFLgGgZ$a$WO{+`2FX%y`|CT^14a5cg-Lp%o@txvFsy zUH#!)97{Sj_^(7{MDTkp7cBZ`H2rhVO_6n*=0jJMD60GZ0UdGiZu(;vx^26*N$<}= zLN8v}rO|9g5R4n4l2f}`_*!oZ4i9U(sQ2GljBh<{t%q_-d$|yMc{B@)y%4WUaxms5 z498;@eo6m(3kcw}=mU7iRf~SsRJ3MgtZi_C=`OrP*(sLd@o!FNwozyN!(sY}1-knq z-^mqm6{WaXJxsDCv6!P_b9+;p5l=_Tq#IX)ogatDz$5ehs!qa}J@ijHa!^8jmOwEY z5dJw(niKomHBBQ<1yl!;zw3M?tmmK?lKk_SfTWJHC}i}}_@sE~Mh&GoRIT^YzcDZC zNv&+V%3U}~D0i}nios%j2g)eTqDtZ2(0B68yGKryY$a)BxiiBYyj231K0SaPTf=&XR0x8K!v3 ze?;fd!NUxaudeubdYUrBkyb^R<;JG7Rwp+#zsM8X1QG=%A z0(;e5ppeA>{&i*V=FgRun2e3f2pCfpOb2LC(-LSZxZsN&)7Edn{57mKT~dLRWpRY5 zrkT5O>4$ytHqaN9e}GkBv!0qF3ri1?3%rGQ|E#9^)g;HBqd9eWEdDIUHM`DSgC#E3 zZ4;vDR{;4V(w@~@KK|fm^?eO2JR?>P-^nM4rcDI+mBWfOT(YuEyEU4|Iz8;~AI{QldvKnZZ4L;(haz!d z75{@wZ+GE{-nU!#cl}Q-kpWt!ClQ=JvyE_p!*eY;D3x;h>NB@$xp|@`#EG;BC&L>* zuS?I=B%&lT!*$Cq?!iBA-j^-7vhp>yo>m=MVda{Oc)rFn`o(YdID&}^-Urw(ntEon zUMa9d_Q{6|!^E)EZSbyon(-WBW$wqjjF5zzBt>U|qYbYxX}3Xe%ovWq-P;Fvi~6*Ugu?*T^k|6fm+GcF5rX@b4% z5BwNt*k?hAwNJ<`>DzSn|5F>#HATh0B?xY4uv7cWSBck>&*QN`FRy7hDo=kbczzOX z!5I$b*ogInlq@0pe&E~<8-GR`J**~H6b>kUB4z`!C+5uJ*-~T*kqy?vxdZE`Sb)*H zHBeSI=7BlL>7;DxPsfW9kEH`tOod zI&pyMC!%D|xQF+?W8!n1@2DpsCVv3ope};T(PgPHq{;={AUo?B5(t93{NH9__=FHh zwj1s?mbpy#lZO5lJd*>hoZ(!2MGi{>H-!N;Dc%RHuDUUxjUc8QHcWo6QKL9!Ank&o zQ6qfpb|!TQeEBg%^@=+=EAuqqvNE3%CJ)Ee{Q5VLj9Lk}qsX;6T`Bmi|JZNfo+|Of zgr<6JuToxkxpL!mEZL8<3mE97peSu z$Kws}{zvZkAGf$S77bB>;U@u6=sr)c^2Mdb&XUQ7mX7!`g^S6zgr|1N9}7-9zPXtl z(*qpngp7??HiAmrD)LOL<(enH*u{dG_+SXn!(!%THaNQogyh;8F>-+hy zJ1aD3M|u8`YvyldN`$Gg22nq=bRHpCq=I!_kCha|8V<-s+Swxtwbu_Drmm*cb~K(? zf*b`AfA58e!y86qUXr9=Bq?&x3oyGBC%y?aC@&1*Y;B4-T?HCuQ=mM`%*pBnX)|#& z>=;Fs%0D-f*OD*+Oi%&MUE(@9`GTdg&-|oWzcpJHb^qnD>VP4^cY5LpJd0En!1-i( z#87Cq&qi@$>{>Ejyfy|0(81bWO|2M%q8hUWwYCkrXr9_d+S@-$k_K@SQacB)uL3qc zrS7sZR=W%37$uDBPaPh8+L{Dg+81<86{lXsOb&Tc{aNcsbcHPp-Dh|Sx*U)6@xRMQ zF%i2{nk|^`zhl>y)DAPU6%M&)Z|@U`8#v5sT{qO!S*#Q&#!H(Gd&WO;EtS3*}@$3gq zMkBB9U4GvQT~6038`&@u-K=Z+MUdsj&le_Z5A35i(k9d;dJR7Ht0zy4$B$-wR*;&gw< zeG$F%x(>K*A2esnHr#PweWJxzs#_uG_Z4PL_JG^9ElkQfg41^}GTzwtUVAH3*N>W< zZU-4Dj`^~#0C|c%+{4eWnncre{{!mQ)N|yBg&3rrK9Uz^s3~^3A3xtk zf+Of>{F}X9yPi+J-!_vY2_%2*M3yCf-E&aY9dx?SjE%wODxLMSKF5XsaPj{Wjuq0F zhPw+)YbR>Xip9FRI>A~lqi4+Nh5`>YxW9V;V&U71xuP4$6Po}yvH)35T06G!)s(mS zTNzoyJ{_o=^Ks42;~pvj_#7zQPA5vU5`r8Bda*(Nv8>Opywxb{yGp_Tbt6dD|z`B6(oZ7(Ojl}$s`}hj@EjY>kSf* zyiwQVlu%yH=DJ4BJ%cm9X6bt_g8Pqm>`qRNC2u8xkC@ddxP5?9b3OPAFqMe8(;Q?Q z_H9FqpTufniw6N{?C`*|$O0;_ldtwOWqNdm zrFy4jzF^KxaQk!v-`LGI+pK9Kh9-yOodTYxMTLbkhPS^Gy+Ul9BA})=2P{LV+yRHq zt#DP9n_4PWD!u5)HbhXT3w8F)4Av@_@qZjj4`Gehnl62P-4xY87JVt!T+;}H-pgo` z$RiE(M&MO%C1~|J^->ldJc?M^5@ugFoM}8=J5u@K+&AD$OD77o?VIW=?5W6okC4t? ziTf9s!80Y$Se$-3pg*Dc)aT(6or}cd8N8!4e6giYUQ~W0yjt88Vzc<+JFO(`oR*W^ z$QFCFF{81DRZ;rNAAduLksKb>4k%`4UD6DsTxnRcWzAscsG1)(Q}X(w1MB!_a1Nr* zb$0sxfQasUzW{I`1KBJBh959Sj6vfDALl#&-q-WW+vl`)?tZd{-> zFM42Q=%@l%bjK{T|K}@z=Z3UE1Z>GWW@JjPw5<2-e3e_q=$^EX{iVJ`@F|fE~8{&Z(_BOzWPI%YnHCFjY7;sKUEM` z6W;d}JV8);!<2${k1%=!4qb(FI3K1;PbTG$=8eTA(GhLN?l5--^Y6=zy21U zmfy=p-eWDQQ0jQ0}N6nz4*9g#3 z>z}tCav3$>xgmsH;wn|do^5@TM!)%nii8I; zDX==aUduxr<}JEsJ?yHrD&Ia;O)39`T77kZ=QInz8<2RhTagADT0Xyd^Iv9N`#^0a zE;@)wvl1y8r~WAvE)Ya`;<6Q$g25_XkaVIoj=Y4Z(lm2hs9TChPRcC8mvg9 z!6mKGW{@yKna<6bUMCRx?W4vy_q;52VB9=)(8RN;5o=LWLduhDjZrOfwGU*O&p93P zumeKVKDVpJ_X(EEI6L<{E(hgF#pAvDALA1H(*S|6D;U8{DQ7m+QZ2{_Y(pq07UWkpg4y%Sz*A8-rj?>gDFn1@&G2(*J zLXp8gz1suQr!;urRqkbVWJGDt2MCmgm63TD~g*1FuW|J0J+ z{|B+zzS!c_+LnJ-ZJ`scSxe9I)^&RKI~kiQ&e7Ah=s?=7VngULE_>;HgRAP@tgF=o zA0MBX13lMOlp8!RtoDWgsA$X(dh*xS z=_CHe>B$J*AUDy!ye>)XKt~rBF1ZGp-Pe~5C^^#MDNY`mm_N?b?{t1fq@a&YwZ(~A zlYRMUD_73%u8C(TuQsBJW`0eG7VX>C<_G1nncZGNMk4$ShY?(@*?S4Lac&r|>w%OPwN; z7^1lF3(LirGgc>hMm7lK#`*fr6`BU$gq#gXs+M=TNH0hk7nL-&M0c2da z^4hn#f3aTW=1#tI{`;m*m-ly?W88+s-h+P@GYEU_; zRVJO^l9n@3(H-(n;_gA-BZS1-BQ&l;?>9*ef&MZkc(0Ir_B5+t`nsMV9g~tJ7E2-` z)6}oeZ^{A!{wJH=ixCiF4eUT_;ZPy;DKt&&s_&pl*s>ZPSnrf#=o%~4mp+_Dp6LfB z^N?$<`Fi*0Mj>Y~pSr;{*WhH3v9n6`)0DgT+F|C0ISu}TR)UcR{jc@NWiG*+&7M-C~^YPdVoCx%a4rA-Sv>|XN8C=31yvZf&5V!vkbJ3-Whx8*0E!-;k3 zv883G&qZSwl}=Ushuf?{LtG-Xd30{JX%iuypQnLwCdNq!Qgk=c#h!7C{~wTA`&{xX zF7uAg`r0s!^#o2KT?5=W8c+2FIE$m(R>m@l~id097 z=86lIG?RPLbof1^o#Siek~Q7Fs?+wYa+O?r6vQ^kC{I4Vc(GaV!WwGeoF_GVsdb_H#GB`4oGTT=Jcbad6KE`>+<5|mN^;%1rmS*@ zEnL@f4`3|pM2?4xjon8Wc$ooBdvIi~$kTJ9xo1jIDYT-wr((LOqC_XPth3+PO zSsAD9o-5180O8aJt`feCuQVU9a$@PHs*9HR+h+=U?*iNHnAKlLkbpKP2qspE7;SKp zii}*MyS=^SKkL)Ed$wxQ-yVB4v-rV(z)Ocy_nPWdYm40}MXCf^LF`t~e*OL{RVfBC zq{F8FyVSzjqKP|Yc>@*%5VZnLMP&I;l%M@>$)w*HtPGQ3ZA9url(iaWt2P_D8Y3>| z-nfUMg*hb%xt^<%5fWg&lM~)1-q`zX$ddpK4wnepw!^&&U?6swqMhm8!n5WXbxB%% zDeDleFo3t+6;e9LsLWXSyzpu7k2sJls7wb>XVvt!ZVC!s8W@r06fMQ_= z&|U`R*xC|%f+G$PUI_djoq7BUB<|hoEOm~NrI+3!}B;-c7 z-@B++Zp<-V`6b3`jyp@M@Zn`k^KoX6$8q;FZ6CV5l;1D8B7gszW&pZ_8jri-!PN9# z7<4_KYh;QS+~SzE!!#w@K1!J^c5vpbbF$Ojm0;I)&nf~9<68INK$*@ywJIW zi5)^)T#Q%UmyL99N z)t|S?`FoY@tNkvb2N@RpH-4bmAsEKUu<*OsEjLw8gB2V~!R(xHM5#;L&s%FLGzJP`ci&K=6W zPDrs|EK~Hj5Qr#oQ1dkjF6`svUcQ$@E^VC zRpiZh*rqx~6~VXj^w&!EzeqrfY+w)A~_&I%KYh=~f6vyoeNRs-@AOdTHD1!1a z5DZ)Gij!NezwE|=63nsZ|Y6S(q%tJ(l7r&1Vj*gpJvY0f@KP(X~TaWC^)WP zZ$Kt+0-18^Ba3vsCnD?e@A<%w9|iiV_sV|(I1zC0MJOgX;l`RQ%Mn${LSQjbnvGZP zoZY|Nq)nmuCCNxLPLa&dAK#fhWbtD_J9iuw%X?jTSb>$?8-M++t}HKp$um_uO-G~5 zs;cjlJ?bP1559d8-(0&76Gq3%Q^2?8vd~)O$`I~;SQjT&{$lVVd_&Bhx0&@ro=G_6 zR=02a=)0}>R@N~zsoa6yv|U3}$}FwbBoLu*D96_Qfhmv5FRjuXJhS%yoe zA(p@|N$ZisMgZ0Jy4@z^1$)rHV|yfM_Xqh~&wh{&phg~Uuj0*BdApMxJXv>^aJ-gR z?~IVL3FxjJbnY_VP(n+nzstIp+`Y{LVztGLL12}8dq%fI@%HuwB3-_ znNa5)9a2PksD5*CQt8!Wskko$^flF$pMT=m)^A1iT4n_PE*hW%l?1e!SB7`%RZoZL zRUA0DjCs=)8AIB?eRBu_OAcBP0b9gtT@#l!xA02Ky~%xAZP~R*8wkm-nA&64r3yMX z;7hVCwE$~TDz0G&rYgnO#K}E}mT74dX?fQO6bEAxmB|x}rgx?lRtxtaww^7bcu%%< z--4U2R06{-U))V-0p|}B^dgX||J?y&bHra$TW_A~44TFtecmh$&7q`AFIveamDFEk z&Ui5Vc?)8=);Rblm*~yeD-Dn>M-)Q&QH^H$d%jo@hg&11I_TK<}viq zZa=hV^!~^Dcv^PEi@KII?a$+Cnf`m^a&ZUrg=o3z)K7mn{{FMp$*s_i4?HPW_4|a~ z=#tv$>-sTrO$+LK2xRpW_wsF9QckB2YyBjtC@u6BBj~TT){aAJw-R)3@HJ@dzpi6o6d<1N;($6FD9)Pf%kV|SkEToNn!b%^j^z~5 zWFU!Spx#mk8@^l*4l@x7fob?v8@a4LUsX>Iibn_hXa$bN*nqi~Pxh-!KGO{?RA z$I*p{XF|83pYVS`p1~XnWF`L_Q;u(3-ihe|E{~$^x@e-@TQ9-M@5p%_KD{+Bd+Ks zh(fheYD%}na(>b7|0!bkzenx<-~PR_+(?^RhPD}f8vkO6NmCu+iOVoa{2VluP9;`# z6iA&zj(mI!LlE*W5n2&v{{voE!S`N)zp~OC-4sizpGTu!Ek9-c4tfS8Yd{3Ay8#s! zF!%m{dJO+q(!;pOqdN4lA_20t+6^)CB&L06!gKQnmP0JnOHBs#spD~cX=ioSRqbJH z?<`g4SvG_|-;v-#f0*veabRw%EBr`oD7f1rvmQfwUxL_Qht~N>*$;s~I^F+{Su$;o z{M6LoXV)N6OK;(3XSX1cemNj&A{JAi2YNvOA~N}(i}drn+A_dF>MYqL2W#qf2}PZu zq*7#uRkviL{-{k=17s;-%=|iQ!Fo5n^BwO@BTihvLB{#R$&-c#SMR)KWp~mBJQFp9 zXB4B-qn9a$)*`hvJL*`x7~?u^V&o?2JTJa z-yq5AD35`_UA#Z1-PXX+_g|0|-nEX41#^xmMlSWoeiv2Bxtp7iEoLpQ8U~lqQ3?Or z0dMRTp&b_G3iBm#d|29CsW*>2v-499iMfv_zi0`49aN>i zBY0?rW&z7qV>*SQTe4uSA-;*Qb!PclJlc@=(>OHZ%lV+X6U-mfUl=JJpW;pXqGXFp zz`o(-A`Eo-$xSkudRY9}5+|kimxvZd8>hs)F!%RRy_tU4<;Zd9p%>5*L%ruq^l&wx1{^jy$X}d}b<{ajmw3}HseI>N88xLFDj7;9pC!5HcpQSA`j$7b zU=%kxk?SVRDfMxXwFi2R{i=kX#7F!|UB{i!(;*wj{)zDrZ>36l(6*__5nW7ey&{VU znJxKD$}P1E{%eCaOy6Pxk6f3%7@ONme^{T5edo2e;2D}I9HWn6SEH8z=kkJEL5t-f zWEV$A`&0hg{3jR=m-D{FsF`g1kHql78~BGG&+Sm4zKU$)6$ZV1K31*SMV);kDxsv2 zZJeQVSDfy;m4SJK<}yt+rwA=q1C_a#%mB(lReK&pPwIY&_~w5pE83k_AhGxQ z_wU*Qv%$i0#bBWrN{7eqptvydaSu-9OlmdR09(8?iBk^X#$_A$R=fz$%T!OMx z&wD-Q5|255xpm_-PxZ5sv+pi7oU4l~)M@~da%48b7S(=|$-`2&`}bUEd$c{*K|UuNkv)R2mIV13){afM+etOK$e{efFj=lk z5^8EuuQ9potok&g*KuEZ>of@wZwf&shuI@+0d`W!AlL5nQuf;g?Wy`upYzxGt&DxY z)9Kt55qwYcxf}vac{Ok~f7#9T|M?U12BlUw&x+)f`*xkIkY{G=e)*$JC)&9{?YLn} zsqO>Ut*yCpGs?YJ&DbOw)bvsce8Q1Jq`g+7D)@>Fjv}qksgm%ivp{`|o|qIz2lit` ztA@1c#*Qizb)M2M1=D=xwuHRUr)1U0D1_F@%Vhh{U1>K6Qk6+ko zJ*qJi{pfz4);ViFw}xHP)5EAdVuF@~C0;mu!{^k*o@t<||Bta|aVMNX|Krap*N=QQ zt8Lcix~PG))xIk0R4@5*^M-vXi{?}MO8}6l`1V%~COGAKcxw)9O42sTb7sa&Ie44( z&DA!%(e*rBV}It$nTH0C)*1be^E-8Z#jn(uXMn~Q(v5ov`iI{@rxR)WEHzxG=9ME3 zbEcjj$nB1NiBST9(z8WMuPT_L^R&t`&HZvrL}<*o)%me@ zk*BP}_2GBxrtXGW)*WFuif;fs0B-fQRb@BoF@8l|k4P8qTj+q&=BX?`|3kOqad~X7 z=&{edW(hQAC--h@cth)LR*kfWfTojX8^S@=CxFM&{Br59xEYO#cH!g;S*r>-7V13R z3vGqgrReFcrxOP3W1;T#oT}0H!wo3O$k9=@La#

PhmgbBaqN|qVlj6XjC;v&^&LLffqmJ5{?zoDwlv{5LS2EsH zYRk9d)CzY~Wy$P<{25oy=!j>2o!_Q;db5`_-wm9G%o85*L;I&c?G zMw(ye=io>#W*Q1a<4*T4lVvkJ?r8R{6b3vX6l@GR7oUM$#7NdiVrf)yb+<0Dx42H8 zsXN_C z21!acB&v7dVjYYnW761L2iDGpSz`H;y&&^8zzy#(PHi{Aj*t-3RujM zADOZf7Lnt3^~7a!(VsI!mc_rM9IDeN3Wv^g1E;j8iwLriC>eMVz@GG@tpRKQ=IJNv z0QO;%G9AaqCrp_tT%3`HLmlYSu(f-nqETH8k9=g2Nyc*%ZWYO7bqNelzl+(WpcnEt z1`Bx+?}A1&PpH4}QA^iTZjG>%{O+RhOn|xMO9#a5VM^riG~X{pe4(LrfWxXJN+F{m z8^JR`ejX**Oo$Z~@Pkt_<3w zJrFwfYqnK>-J;w=Zck>h*FK4d$h5gxSZrVL)6Q0Mduwy0bf7t*KynmFod=&veVx{r z`?6vDhy94nKl?m?@g$fCs*)aCSe?MNB|^Cg5#ms0UtsRxxNY^Wr#K*HT9uV5WQ3OF z;*+_w!#%xxOoVnWV)V8H7N^t`PDu_x-L|Q^qu5=emTF;FWP0J-x_O#OgJ|&evm75G zV|Srd&)yQRG*%g=;#UuOgsN8ie`}sN*K1v+P)3!k?kTbDxnE*v^Ihlr@7rgOuo%g- z8n1sow$;Urf+5*Ssd9S=Rua%>3*7RyjV^mFSadX1%FJo~e&la`Q(HQRpTmpKnmytt z8`1PAejI4#9?*1`6qof);Ogk4QR$aTR@QdG+Rsr%Q9{k0cplEHX48s_kX2uLAhel) zvv{3dFI7`{>h8FEwo1zPcJcHJKe4i!I?>VGj#sm26$^iVCbQvr;LTK?fOTEJg8cM& zZ$ZCE;n?mQgv*dDb|x;GH|GyK-l8$)m5%O(A6-KDM(aK-yOZ$h)u9zw?3n+{2E`w; zCY#^LH>(EoePK&Oyu6iPiU(4Qqpv%x4Nj?-P3!h^DD4BmFnnuFg*yP$J=W4&?PkD1rBa{`uzlZ4C zdZPr>?QSnH39gjCb~Sbwy8GdENr1K^?-@gn*t?dTr?f^J?u&y2%YlaX4s`lgz+@Ae zgY8x?m1k`6(?ZYL__Cj$Oh;t4MiRG&NF1Yv0_?`gWmtH#SSK?gM60@STgEsIj%T_va|7 zmUh_k_4>oDDwVw-xO9tUw7GlU-^!1Sz8%oxpYb-*+r{S4z+ccK_~b?e`ZAJa8{K8h zY)!;WzMV)J&2aeDu_tw0nqG5G(I7-iLv1a^vgFtbDDL|w;go+VnzM1U5@TnzNLLDR z^Kfqn+Pp_qLD`x=ocpo3dRYc)N!!GZDAq1xpX&;O&oLr5N7 zTsP}QF+Rw#^{TdwmES%g6)owa%&Yy#=Dlf@QnY5K;SJWHiis=o@=4oMKT@;peGi8k z^*dTtT+W;wpj5S?;_{ekimRJWeqiKxxSBpAsCho)1=CYxsZfqJ&W+#{oZKuk?-d*2 z=`5G45I8#+hAS8mXl8EbFwcE9XZ?oW_X%j#P()46H6>l%`t9SzWTac&FD>+@pX8#) zIX5^nuH$HUJ>FAhuTj-JSC!*RaXe(p>tA{g|J-pfAJy&9glg7SSdchgHRi-$63IF9c`>^Y7C&QJfR z?d27+!fs}WhZh|i6ML|+`l>|g;2FA?QDKE5v=iC?j#nzq+13zGA6IB$FCQF1{3=sf|n1Rwck-%w+cGVum4tcQ${s(g}ux3ao|c(WqXe4%@c zN6`}>FxLW z))y|9WtStEvV0_mlsN|4c69{A~7gxc}e4|LsPrepK+qoxxRUnL6>9|2u<^~bs7<%ZAo z5>MI&0(+}0&Eyko9P8OM1unei3*XcHt!42HDdO9A86}Tp#<+dsv1>M?B=N}JF0bm5 zl4JaKZ>|_?HoEhO9&z@!kjD?md3u3g4n9Vy8cy_qS#7qW6{Wf!gQE9lst$9R64_H2 z`$4YmAYb>F9~OL)2#IZ)$GcfYs6U@7RQ8s)*5=~Q$~1veQtdF1DO31MAlBf+knqco zQSn<e=&_wsjr6VbULAiEh%s5Q0kuvzXp8x|)N0>IpwLH{}{O4AVfuY4K~&_TulaVi{mI z9sX)5Cx)gn6y(vzOYE=Iit%vT%gAMo6ckKM$lv?q(Q6Psl1LYlrpoa?LN*#9_tPkm z+EsOxgvRl{{v_B^&^W>s>Qm;TEph8fMU?LkUe!XXp;Fp1txQ-njUwh+%AwSn;+MCJ zlX@2glSVy8MIS~!HfO(|!~5#=9pF){Us9nYM7@jcnoX6xY3IW@nTCr)`dva&obvCB zuYWg77CIX%@WM}%fn}uUAKx*mocOTIfEXB|WX^+qLFK=u($4$wt&RIKn7 zIJp*?Y$Q5oJ z;mwz!t+YAw6DMo?`D#i=Y^7eNj{X$b)*PKbDmCXS5v>IuIVM}wdgjZ_Z_KBXFRoP% zDYcL78;%_vQCWCv^HZzrnJVkQ$3_1wBqkn7Ty0Xm(za&1EsI>NlFG{333bS^DKD^p z8Z0z<;ew_*|C6f*ejEn;bhPF^2gE1**uun7!b)s#Ml$Q?V*8>13?uJ2g;I=S=jntr97lYiW> z6!vSdZW68U?5L zw(mnyGQG?_v+AKcr-b(*m=XBK8H{dj79stu>^{UNZ;{3HPA#Wng8TDZ73IORVkcxv zwc8d9?WJ4bYZ8n5kj-BT)E9OWZHF&rUQB)#L`ZJ^=EOqs@6y#1vv;qMpbI~Lze0ap zX2l{7DMg0uL!yJz(Y3Nb5$tUZq^0Umo%>F-9O|C=q# zf2Mn(oyLY)K)Xv|9Ck7-IG_YkY})81X}36p8?!?`)E0<|wVh$>iPjMnylwuY^$DaN zTDUQCE)G%ZVR7lK&AasG3Qc|bBRm1(bC?hd4k9Alm(Sz71_5iD1pD0d;BodaDcp5Q z&-{7E^NBR`v#}>T!yG1<#}T*07tAlSmG`YYj8;tZz#G_1v4>xWoJ{ZQ8+{?s^Eddr ze{16EKjJ*2W($#?4GQB{I4RTN)9{$>R;%(kb*6mrQ;znYjPhq_qP^nxp4V{>D&5W` zRc{55GSTT1k}E0ZLZ`*VX=)v2j$fip&9@^T-!6i0&x4{cAs;ycE%jRPK4fVNK{+hm zyVR-j#|32of6e_Nd2a=I3+z$YhkPy0+lLH&oZO`;(D_D0kV7wHDW08R?Q!Nj`N4^7 zj>uJUCc*b1f~Ph2Azlc|naxcWR5bxj)e#D(ZY1xDE-i}9G@_vWyB6ob7a~Y#L*QRj0p25&>=I@D?M8=elS$iC z8JwTq=9wgT=ZSL54>)&xT=q4H7{Anjxu2h?(0ExW0?%Y*_NBJ~6h0Y0)ZP1f?x&mltcH0??>T-^`lLszQJ~HnE~{vT$6_b8xuqp84}CJ4jaX?< zC0nA$@}`DMfoiB_MNPjIsM(avD0^7tHODt;zoUXGS8~MH4U^b1QO^iZCeHS&D0uWW zn#_f=q{I%CaA}px&oW-boV6JeFM(PFyigtuA#pXrIng$lG5cFXa@d!nb)keToOw)t ztUTvn-b1O?O@*tn=hDT+FgKeVon!f?vq`u2uAxjx>U-DbClA*t*S#$)4^Hu{k(=gW zg`T^TrK+ob@jiqr>}g7X`1VVGh)PddofZXywUg%dK;W%k)*VA}^({M5MLg1EUAL=3 zR?B-==vOC-HrkoLj@(zhyO)3O*!pS+uM8z0{srbZFyZR)HYvU5{7t)$_(Gq8_dcbZ#vfO zcQ*Q#PRjHZe(n=lOGqWM4C(FOUEfg?pY1m_40v;fsnw>|YLAk8(idlItLyF!=U7XG z$D&UMYhwCChUE~Mvri!o zmG@O4ub&#|d|XQ|!LGa}8sXem5>v^N1kJa$cvByHweS)OuT6{svZGJzo5ZB&12y*N zv@kJVO&5sDuYM`s-qtyf>2(W{kwN(C$)ksAEVtB23wZSCY24$sV6y2{dktf*R!--m zsz*yAR^g}QPx%rJDy5n}shBj7#K9iuQP7i~Z^*4H6n2t)1@FV@a88{*B5eVGxTxlM zety2Cq3bX=PiOy|D}xH;)5%-@MD)s80{wPNl44b9dCd(vZX^u^c9WO45lwV z2YJU&X>}*QfRfV7)ZqzbqCsH2gZecBTa(j?@v=nWuu^+uDI)tPO;;3$p_%1zdPV(= zvU`#?9+uPFt;r)<(^)U;c*tJ;7t!n_(^eNss0K0V?Gs50@tWNHJ1NI%iuo2=3F;@0 zKwwXMkY}lb@Dl6hMB(YU7gTx_Oz&J0V~Tc?-Oj5$Q5U_$)D5}d z0(9D&;A5v7eEE8%rKpl5t+sgh82)lnf_HjBMzWPu8d7jN4AsEM9DRuvqXXGH^dF7H z|Bqc?^ysk*9%mpW`r`CvIdonj1Y{VjL^z`Ej6!fJGr?jXa*q%YNITw+7bNl~J8?$} zc+W&?@CVbYJn+BpoCs=}Ylm7Ul=dNS<4EcI5VMPDijdcC9u6HgM+zk@HTjArU$5wX zH2CB!mfBhMw0A5&h{qskTJc<+0r404Ben&$iv#B^$PUW+(tD4<_BK?|Z&dF-7;$?X}s0|Oz}@pv(Eg_-qq!S3d5og=w(r>MTX}Aj<^~T^RH%# z|2c;8|J3iu<0R{BQ!4N#1cT%tFGMhh>k8Ps|Dm#1y70vCY`l^7ReDA4uW#ETRuA(m zZG?c`6S0(cH4J-qJuD`5h&~xT7Q@BbS@xH`gH|OzP7AX8ANzPb@6ZXFMH&cio7qq( z+53~nohGUXb{$t!MWB8V%5r~jJlE>p;3Xb+X@kjGMY_#~4NR28KIFk?bWn8MsGCE$BPd%PV4)N5JG(*z72wlYijjSTUHlg6f@Cl*FaDb3G$LBHCm&!r_H zqQ@X@49;H_zy5#-1}i;-o$zI!pQPW1Oywpq5Z=6Pa}$Ck$}$KRVm+n7PyIs@u}0> zG5f;zx$*kjzrB3rzWMei7g+~l?Ifj}e%%_BLokv;o603U)0ak-{2V0(94eRkAD<+s z9o9TD_jcQzI>3?t8>a;9#MFm{(@!P0g8>>kJJ=f|gXR40|b&0bAczPW|$D2Cgw zj)2`PPHmm=CNJwZN@}o|Rcq zTZ8DS@Kd7;eh1C7Oh=x#9<}5&?^rvbeA}XSm3nln&^G?pvNfS)qdYvltS>xciKAV6 zI%e>e&(SC4@)nmeUhZ?(}i|bsW5m06S$uW(yJP&^^l|1J-`~u<#mex1WRswz+-C$mK z(!|D*6BOJNW-xi}Y@M^IZ;1ZzRPl4@$$`A2^Zu8xQ(r8O*fN{7P37<~9$#^Yv*e$o zqq_Y@7OgHnPVxP5`BOFCyVm_Saj01t4IfPs9fYoC=r@FDR$e*tnQr!dVmj!1SD3RW zWxR+kEsG*{ll(naT~}C2oYO)d%Tz^)tSfbnFl=Xq*JjfW*JuDoKm|2}7DfAzdHOmA zF!l6@Cl=A4v0?cebK==%cDosd-?Qj+1|#V%?M5L}IA3SieW@&y{H({NdGGi%Ul_G? z8eRmNP}=SZktHh#2C-Op5H8_Pg8ts)mZJLluTh1asR@3wn_XTI5|37 zWKkD~i~xOoo=L^!cR6Hx*dzKK3(1l(gihF6vD7J z*i)o<9>&|DcZ>bkwO<{XyL#lYI3M4XrOIY6`4;8H>+R+h1RmZ93mR=}=we$OaX{={ zV0O0jYMxD;lEBJb5{}MTFFB>1P@nu|vU!u(>W7B~!%B>TYwR7;Cfl;r(uPMqC0Z** zMSc}Bcz&XiM}`yvSwh<(hWpegnR3!l(i<4F-2^@HS73v=Y;%=Bf>rR*AFbdW3q%Fz zEAT$Oj)_+hLS3U|V(-J2p{GcbZSlxf`0MS<@4Vb5M+**@rPEJ+Kf>qu(}3OILM^6& zmJcX+m9Q{RMs&Jrs95-+=gsAyF0JKneg+n?N6`x zsh)X);&<5NpbjT9)yPhLkj}4TC*LTmEvg_a54o6`0vY3Z0qv=Ejt>d}27KHu=n>jJ z>=W%|{Nc8yRsUGW8%b9N1~#7tzU#^F_-X!jo;xUQd;LfuZ0kk;LsHD17qzPn+Vkkm z)>0#5jz@&a`Lfk7*LuXR3ABw%bU+xAKX`NQf_$2&oX93?ak;})#W2z55ATSzUKgaD zKC2CxR-C#;M{JEH3OMJsaf%oiupa|uXPGF=>8_niP9gBkCM}>EY>mOx=;0E@TTPgN zVB9_RTw8^n_l{3~v$?vYF6LheA!%t596+QYheGs%I!wj|P{AIy;27^115Y?YKTbt0 z-!#o(pYHzysxA97s$Ex3!e-CIjz7uh!&nu0${ELuvNk-J&1t}BkWS+z5n#_@lbunY zMT!2klix?iB1hV0@7zr5WiYgk`?2Z#v14ega7+1S5%~_Vkv}lNMm|H&)0c|>fr+)Z zebV(YlYD(Q{TJ-zK4k6oMW^kIeMk=idE4k47MRnSG@Hp)?R`jEQe9f%4dHqUA`>sY zoxKkU+jRp71W^}sEz#J{=<+!cBCZM!F+qXcw*lYX`2=>#v?j?CUf|Eyli}j zI*3I{sys^_RBj+Ht^l_N`ETE| z$_zY}VWi`JZ91G-75Q~|+9lGnup)a; z@s$gpN*jjwfc{!nPQq?YkNk0U+GRz^c_%V7awer(b;O<5sN{Heo`KJmY~O+6A@Z9O z9}F&+iU(zun~ULZm&S}0qurmdPZlNnKSF3a>dACjmL*&;^CRc^C*=@k2e6*L4E=ElztqIu+ z$P$GX5jnkwdM>{lqw$Nn9=Nl5HLvg3K@_>Ib5`#SkT_N!p;xhjJ~n9adx(Fgq{%cMYLAS8O$J8v_1gBt2AI1%wcsi4Xjh%A2zi%xlKWPhaz zyC%JW-dtj%z7W@}3%SC-mK(2^`BNmVW_mgfbXjL2S#?a`sEO{du4XQ73yT?UJ#G9`ZDCC7`=tLpImUBhC(?`=NUEl*Dlb&-t$rA)?m#q;JEu9aS=N~UHg!9 zCVTP|;6Xxj&_i5k3NsH%@aDM!_Pg)y*NzAdVH9>?y4<-5?@qrRK(2vNUN*h*)s6AG zV?l;-!JL|ai?pWxg(GA!yLCxne0czh4d}-#?AGp?nkQbExD`qlvGxwaof|bgnqsnP^zqQM=r53_RZBy7aIOl4(^voq&kaEX*!3nxOv8=)=T}cg~h(|XIDc+3Y-2j zWwif)crQEEIP4058H|iuDMUoWBuRBsPkQh8IJ!ms;$FdTr8t8fqi^iv)%d*tqTyKgX`KYx5?dQU{mt3C(&O=azL_u1G{^EFslW{IQ<=)f2$oU^BtF`N&;J0q5>@ zvIsdgt4;bAMwpV0ow?NqjQ$RK!*nR$=qtfdSu6?AnFJ$<2BAh73|6a3A84zOY;T zTV@~f`#lEPE8Go$mrw9ckWq&UAE^L8hG4NX>|QEoZeUrC%6M>x=GrToZ6EQ)MN$GN z$hmB{57}ZqKyvXrDtvkR??m@5$>og<@15XIzgeo2n{lVeG%t<{F5a$3WTT)CeAW^a z1Uz38Qov)sg6&G$&+J3O&}(;48v76=?LI`+WVfjSz9uve-^4LcLrtau4LV7*0O6;O z)z0Kz09y}wL1YwI&)?7>C8sU$>`~%3fX4?88uJ?txEN^;wWv|_i`H`vLp*hVl^-K5HW2y6n-pP!kM zss8p0(*E!@9kMdWY?*>VltYaXpHbm8a{G|`TyP5AP%n}WJrhInrdE_w!|ZnRho1+xo7MSGJ6->3&%%HI?w{ES{J(m9T#%>hBs|oox?WomVc|7u z*0@eip(Bn?Fs`37uQWKUEnlu>3%_h}D<%9|`85T^*x)7Z%VWY3=T4I)z?O)lv~ol! zysXB?A=dW=!z0EnI(nX?DNJA;Pvry9`A$}wlayfaUYzBWR=SzP6L*eV&YLXrutOk` zB>f6mV*LjCs^)Z_9a~j*Y4mzWWnZQrszi+a_k%EUQ^+Q}?@{uV^4I4=>n+&d2+$a? zX_Z50x@n3^FTw+T&k$<2$6TF`+wAJi^(NbV>B9%;W##@hU|^t)u=~gDc7Le|6vx%t zIaoP?c=oM*S**PKm}?||Uttnn`XHXYlBDuE@H><#>9m(dgPQ8i5M^K*j>_av_ zEOBCKm6szZyD)frqQT#WWcx@FkVMV?Oy zDtWM@ck2gUv5du0e|n)?kUPRvlN4v5LG{|hy)k*`$P#vozKW`A5rKCKHqi>NIgJ-L zzvOuB^Jp;Fk1&zeO>P$-`yVQ2{u=5VJj&FU{<_Y;w^|dlzlXeUXfrq4b8~a+xrmcVpjwiU|D{vEMUcYfhlS-NoE08NC7eYFnXTR z*!K^J|BpTd!-=G;1sFaPKCKT@SY*790&a4L4LFp|P+$;Q(v2s0fSE(<0vmo0yFp_j zw-H6Uy(5WuW07is*waFPO$C2;Xbt??a?HIy`wk%m%7k_1JHRvOZz`p$AJ7c=hDPSfo047#v>6k~a>7qbbf_#qd%*&-Dpl2QrV3)el^AGEspj4t(-=_6X z%YDeWj0H9Wk!q6`vUhs@B#`3(r|^FQCi(#fdczh|W{-C|7~TcILJw;qDV+Ax6>q09 z7rRPv$#{beVCes3@Y!@p>9~laB=pt3P4gQjjf0h}?Ky|Z;mLA$Hk z0|joK@{_l|#C4Ta=n=L36+~BGcA8-X2<0tIjP*z;S=1p<_oBe$B|K7vn+Z(u;HezQp1hi4=5)i&7gPP|X zU1~`wYNMFJ)G@-X?&2qRW%3q_kUJb8aE2~MK+o?(T(g#_ z*3ZD*P9z`H<^R*3l>h$s|Gu$cA!?D&s5d8_Ck|E;er=%$PFp@7_aUbQsyG93a!m6V z4(A`s#~JuFG+6zlUyVG>_c5Y$36CL(Ldk;hN|TIAw+ZX@msdkjJ}HYvY*mh!w6W60 zdyp@|XDfp(oi2zDgiO0I7rz8GIidi(HAvSuq}j?3-lF#NDwV!DbL?#Kdiv|9GQcen zl=Ft+*6`uU7T6)`+2m88YMWchoJild>@vC!v0Or&efccr93tMDE6%nJ)@a zZ0+y6Z*H`uP5d~7bC!s;np1qgn_HT9QaKoIve`8L{%7KD3NSMNuk1gyQ=hJGpE5IjFG%XHz%$j4>749F3z z{gEa56458&kWp1z>l_x88pitM(W7Zve&Hx29Ni#J0=u=I!sk%~*mrWm0S^#d=!V-h zk5xXY^eVAUh2FcEJ;QO27uPcr<-;D#^K5=N1?ox?-n-$!xb@<42Je~v-|*6s==57X zrMlV@s|D^py@ao{4)6&M-pzG*1l*Pj!Gkg(ZYAcEZ3d{PNcIi8A9^L9kYztf4zx5! ziG5ggvXWnyxaApUso@ZE%~4xXah`fn!U8xx|41_ZpzG|Oa#!d@b5qR$RA$@gIe)mk zBxzB-Xw93i;4skHQ=#+7o7RX3q_Uf%RDs6SqW+S}^YpCo(W{YNN{na9h9+Et+D}!* z8EK&M!&`wowLa;gYZYPQ?M1J&rKon>(}mdy@)L(%1P64*LAUEHE=`B*F#IWswAdyf z8x_#Slgl`q^ohku+aV{ETv~&JOO;;rPwk6A=`Ky|J0A~S=YHhZZPaO$Bo@(%gsBMI z-L|dz^e&t?I@x+qBB|Fo)Ox0M>Lk>1;!7SucH$tQNL?p?nEwN>{uX%GXj?pNmkK=0 z$b!>f6O2M2!V&0ehHp|p09HJ7dUD36i(I`ADF={#gZKD8BoZ15{1GR7!_ENvS2SU+ zhb&c9MH--e8;}yqF{B=N#ed=#JDpC+z?zy-SOJYc7GCeTPwhj<@ASAR3-FCQL;VH= z2T)_JMuWNuBT(}}^0gVZCU1w{q(}o#kV8aLbxwf0F%P7^D2@9Az1~j(PFauvFq(x; z2cZ=)lb}1`n>BieDkn{V{}4vw5n(1-FC8UZznO|(!s#-)L**$WHVr_|+K}+(i*%5Z z?5D*$XGAw{s@Tvc+`MM3May+DUWum;x(w_qlUQ#Fzy0DJL+o@p3&O47l2E=+C?qJdxEFxDc63sMj7T-&J`qiO&g z#YLWZ=-Urp6SPgd%Ojd4LMv&iI3hQ)pnF0J>e3C{1~FaAyIfb@J$T zjehJ>IF=gprpWj29K^C0kT35;rjdJ|yT^SmBXQ_G8I%d)uh*vD6bt*eN_2@=sbzSb?tH;*MUBXFup zjV^WefQ1OjzX01|>)W9|scE9%k6f-+^c`D+M1xhC202Zrr{#SDVEMG~X z_@P%d!ny6A7DxLHje2s6ul7{(F-LmnUp7)tw`T>V%qyilDsGiU73RbnDKEY)eeJa5 z?9UQD(k@?a)Nf?U2Eu{i2mb{U`Ts`>5iFQM)&Bqh)I}?pfVm0+B1q{mrDXd^UP?3f z*v?hixGud3YuNAj?RXK|DNW#_OKo#AlKu7}C+m5%OH4MLMy#pFxKgMC$df{Zy3i>E zvrQV8v7-Xe=NEybjz(Q2z3hM6ppG!m9)i)@=f~KOmKJJ`)bl6q>Gx})jk$F9z zbtKc$^Qzk96(~_h+38kE|LXGv0fe>HV9w{U_R{AUqq+V1fB))s{lg9|_wv8a(*I{d z6HYj;9rVeIar|ddeLL4S7ro$Z1@Lqkvb2hU}4Ww#(#t%E#XQZ+jf)B~a#*l-nbV0+Yt&`Y0zH)bvRyR3)BUFuOUO#f~? zx;2x^u+!|`g4p4ZgfDa1gTTGThXHKV*QSCwY!OV(`_&baymr9^JuD9bRgI91P6d2v z#0#=8EK~EeELV` zB?~tW5yMR3BE&w#QTc|sf)O-0i|1$bUOzM)Wejqbg~ec$?x5$(FtJpSHE6#MFw#;w z_&<1VAetkG;Z(`VoHQNLa@=+3i}hodH@u)_C|8dHyis%%;K+x7$pEbbEoDwN<3(;J z4N-2--G3VM^q!fXSoPW@!OGgNAKlp4T>)D=4enSoBnzLs!y|{@JMs;06KW=b}CMyC(H%!l2T z(y6D!pr@ysvA+Qac1axlFK{;?hHY1aA}FOF0sQ@Qt{`T;HF58TJzLdmL8#4^*jsaf z!!PSprP$yW_FXO0^Y=d*SUWnDP^%MN&zCxj-Habza|(v7-BQv$V9Wr!@}R&eJbCT5 zoAmCq6IdDi`N_d%C^h2weMoi~c$)Kr<*i*iB2{q|XAp7pFb~bLU;~k4u!x*gM&Uft z1T3XQMGD=v9e`b?1xPC;eph!Yf*g&7qK8<)3E@b2^1pzc@&o~>Pjn(svkB|aZ5?0i zoagGwgMA1e<^+1k6T88JkpMt7S}+ei>^KS5r<_;TKODyX<*@i44?nd6iy1?OQA+w4 zsY_5~{|4d@pa&C4Wg~%uN!N+-3h+G9x!MD^x6IilNa z?3ZlDYMbTw#|XjG$9W)^Ze2NT(TaHAo30sfN_$<0ntXbFP0_i+^GBvm&V0cR|KtHJ zsotz|x(_{*Hi{lLhi`Zke#0}g0L@nmMdIPaPuORN3u-rdS~znboRNVXFL17MBEK_5 z>@j9hBUpr6pgSTHB4An_3_S;?HQgkWTWS1~+^XyI`L3LImZF7^eV`Q*0=7>a#(&J& z^uJxa&hjwN7Q4m-09m0n82*rAPkB2QmZfQOGWg= zFY`W!UtudAnbqOOh*Y{6!x|TXp8TkynkTg4qF?zo_=XxMIaK!{uT$}F;Il*!lVVEA z;=pv&MF7)ruy7C6gkdkl%9onxhgZTDdoofx-pU<-&9GNijQxI_8HR>?8L(8$aZ15^ z%&UtxPQm;3&_lwxup%y5+dAQP;cWs)XSpr4c*cBLqHSNt#%z@@Ua@^PuOpIHoB9`| z31j!|om?|2h411HrgDpqBmqvv&|~5Lx<>hVBnPVdMX&FS_GAci?CVY6pTD& zjJQp~K;b)wYWucqDWOzOYR3{9{z}5}cWHqdosri>fnw6{yL3E${<*m`hpuL~(_X4? zYlN4uHB@6qk`cB_wtJ2qBXWj%1e@napDB~6?}Lyi5dC|0U}~Sk2sc(4sNG)WExO6v z9+UToFx|Q+BmUClQ$_W8icAqs|q}jFo>$!tuv@`V52wY(x-jqD$ zR#DXYu4QngP;=c$2v_?d!eRtpw}1&!(&qiZw!%i#c8w{~HILUm_gzE}1k!Ka$EPnX z{dHZ#Z|T2H67^1?54_Q`qyja>L{FNkofU*$+6BzMb)hi!>t6B>7(=i?R_2v}1K@+P zfoT0AdcHpoeGEOr51jfi=hBYkU4k|F1qunW!5~ae*DoN0EPmu0Fz)y5F*Bv{69Nz6 zfk8XI*YgO;RIOTB$_REtchJcnJ>%SsUD}0GnCx|NaB_r~^NoiH#wGh9=k$0My4 zDD$e7{sa2^^HB}tjwi+K(maaYDS1Y=8NQ}R2K0qF2EB1H(`kpliQ1IBclGVx`2FX& z7HI;eodxC(-vp*_L7xj?p8ru3k&Oc5du}ouzRZc;y(H!UrD{8cpqGAk?UbrdVRu-` zfY!SY=$)Q+vq?J`;2NCuN%rVB@V)z!ud!>q{qSWLPhiZ#Wv5oj@4}(fDg|n&9lCLH z2Wkh~ItFr=J(?c~?o=I3fSt^_fMF|j=_6&MLpRl%SAu}P=>oq({Xxx0iS*u4KvAV@ z=mSZHH}P1?tHhG0qzf|0&&3Zt;x_2v)gM+>#GU6?|B416!?)_Vc~1 z;v^5g>56UzK#D!N6iN;@vHpM9d-r%K`>t~Xj!MXOLTGC$B#CK5B24y4CB%p_46=_IGh=qg(X*!Oy3V`K`>N~yT=#pw&-1>Y z=a0@a9gO4n9qYH&cYW7)tsi;;mfWm*H~ukA65yMJwjw>6WbAvE=?t}$s?_FdP&#i# ze*$-xBKs`b={R|adY+4yF-Bm&78xR8!u?B$;n4v^)w`mWCz1jCEkR00Td$Fl~$11 zu~!x&>VuwixfJ|5lV$|?BJgsa-aKPmW?vVSMh_=({wM?wv0s-0`b_&y7s=(lme{ja z`1Xqfx`0wI8_YzSEjnS<)EWgJfRI%Ikem%`CR%7BlxLRFFeBiSlRuj3{98O%ufc_& zh4oxgNSiw4kM~)6dxt(Gcxvsg!7a~MHR7qRyX>v=c1KMTj~E`ay+b>VDS5k={}8N( z6h;^*WQyb&34qM2XEf3Wjlm<`xmKjhztsqHC#ICeH-9QSBinL>w4&|zflHaOv2BG- zRoK?VEO^-G2&&Xrb~RV8@(BqH^J!8@L1~F8AXZ<9_hDd=pB{m2R~Ar!m>>>q!b)nv z@HMhYC9n~;twXRO3KnDZKB$JkA;2b@ilC}f ztkm!40PP-^DO~cD%2%;M=jm8Q;5j=B!7#tU>XoF38nlhXLREQ)hacX|m%_hLC&AsH zJ8NKD@w4QnC3)sk-=v>B`tk6&-p0P-xlMQ2i-XhqA6BwAo%wA?_+sNF`!7vh%cvr$ z)4S3Dv%G>=YTil944Q>h8;{hY!5xqSPYeo9JUGBwo^Wqh&>)#yTovXVwP44Jn8AL) zp`!S+Z~%MTqQ@gKVLqAtdVPnFjf+j$_0t2D&UMs#+4aNN`Xg{)1wA1k zUJRK+wKYk^zAj7)^f(P#=qJcC=BvWj>8dt!Lw%06jJa=ec(<$PP{8t$Jj~*BC^D#t z!$Nhxv%oD1m_>=Ab9SwRr6y4%A%V0Gl5mzGA{qq`_`9+yPTZ!&;2nA|*qH$Uu60h&1&o2` zX!QcY43aFXU4%n;;UobSdk)rctB8bV6S}PG2!jitOptsp=p})p$R?ntVJmL%6XYW= zg?`9T8rL-Bfx$fI?dbw7QvTC~ThBsE&uGL>Rh_-1eEJtfPsSQH9y1?<`nbB6)QXD> zp66=kez+9yX2hLkACXH7cbIzNqt0LtL6OjvDsaI{|A5_nfWEw}bNRA# z%fyr>PY9+L-V{-adhZmfRMKej@ymBEY+hDF`}Cw|U)kc5oRo6;l^%ta34tOJD<!Rl?);ABzSp=} z{za0m7*iKj^OV7_GID}UD|U7;IkS(vDA6Wya{YoW!rd9|;$TM@l=B4exS~2L1n1}d zo~drCy;q`JcXFWBayGfGzw1Ty$^`jUvtCx!7k^3CC(6y)?qRrH@;3YA?Kc{Ay|kqQ zJlk)Sm19!&sc&Sr`mAvK>e%b2Mn1enKB4aK-P3W-v#%Y^GCuh#>M~;m3_mE4|K}4B zXnHwlTHzG`2b=Di`JeRcem3jX-M7CRC$>!T8fd#?6BVR&Fgbf+^c0;ZJBu0q$?0ZF zwl~K)F(ZmKe90v$vqlCA3e}F~$vbOaUbTDt`7Psk*>S}?(I@n-L$GW8z*XPQ+T2~E zp7QF=a_<)%hn?kCWznyjUK?SCbLlE>?)Q4fVwoRSu8>Q4DHn0SMhX- z;yX`pN6(PE47c^<`)4_>328vI+ciU{7mVWKla+v|P6b_hIkvg6AIa zk4tSJ_+($Pw!YgFNTF7IK2dhiZNHLdx<}w%N)Fu8XVbHg5W?i#JXg$CTUxZaWp82aoh7t&f+;Kys|u## zF(ZBFJ{mbS@vz%fTl3#G%F4_1>b~oDQIT6+9A+k8S8g5cI<$z|2I7zn&;Hh3a@-`W ziafs0?`9>{CtJ@xanx`Ik$+|fL)J}IE+*IOLi$MN6I1yPuWaZT3!jqT$MjS8R=s6xgZ2yr@U`uHgCx%d7;3(~$s8vFmH-Onf}tg?lZmQcArRtwHiTtl>6yxW`eYGG^`bp`2RT6{r}Lv&q=Sa3U84up@xYV z(d%ryHIsu=H!d!?w&a?<%tJHz`zy?k{9#(y?oCQ=p$%oRUHD~m>Q=#a>amO}*Rp9y_Z>zrp#lkMk*%bLwN#y#>?G?q1!pcK`Y6ma+);99 z&!o9$@GA@~gcNM9u6Pad?s+CKu>AmXB5uj!pAhzXY2ea{|&f3M|S&^)075l>GL*n(Jw-q=Zvuix;w8m>t z{e&+6>37gJ2~@J{vS9M+U4a4YJP@Z+H{RWyt z?n3;qG*5#-ZOF!}4Fs26BpXcV8qb1sX%YohOCUox^aUTLc>G>O z^L{b}=$~i|o;a3A5l7f~gKFiVnULR&-9?@oW8r>pMj*v7Q9+RnQg`PTpal?pc-vQ* zQ)F}o?|M5`IOn8+2!jy2$)UspPvV&9AT#m=Dp=cwUn&S{*s_x7YgAM!ModvW8URQ* zE*SDv#(pW+>s{NPL=z@h3EtBo;aNRZ06|SdGaU`~K)Ab8*`R6&4!}dc0WgAVoc7DB z_rRVE2-)fDalwkCl2BMqbNU5jAa@uGy$tyCAH2Nv&o0=_5Ts$s!i6a#M68&A>TLRf zrN;sH*yYHEJA(%xYHq*%^K?=7`p_nc0r2uVBtZ{B#bpTPDTEfutGy-?$-M?_` zRszSbG7F@D*Pbd`(qK9jKKVb`dIv-q#}2yZd-D+-p}6SCuM)pT=6Lwgjqm7#S~x6P z+44uZJ^McLoW>3cI{>T*(t*O;fPCerBFPNuudZg!*&?8_vBzuf1*|5I1jT9z5&)Xi zo<#yeyX^}U2QiJdj#Z8h@-w|YkO%*U&v1@b*!6Jt{ajY|dkq0cqq=;5lY!!nsGIRO=zP9k-jHgRo2ch3w=ZX4z+Yfv zy~|C%dykUw<(>(_j0yIaeH}4#Y7Ei_`AXdzqNMI1=*MKBf&L&dgx+;k(1Q-(&^e7U zTGQCO>10h8ofB|vk(rvVVi;e$t$`%6p4mZ@oDtMuFI4a%B_EgeGa8i*u_Z7o3ZT1A zUKvR+%1%PhE+uf6^w)yP3g^N;dFa8w&N(%cSo;GJYc_r&V)ZU|(Wqz#r?Mhl8v8I{`Z%L%3eqDf~U)f}~=Shv4*jUk)UVAd+|-xP#~LR#T#V@Q-UH z6xde5RLGQxdwp?Z546&;Pa4;!OLUlw&4F-WjeURBE4*AEowL(}Fu0T|TDOa;MCeL^ z6s2?}eCCmq?>PSq(Ro76ELeAoW-1WEM^Qj6_7)5yA&afcnt)dOvCrQwR+L|i;ntc-kVGkIKqa~RvdhnpVJ$s6_PFdMl*Rr_^p9anGS+V={~}Rj6DvtVoq0>(d8)9D#f%Y}BvOrlo+*Q1A}_iTh7Qjh z5IspuFO7yGLveG@IxYS)Fd_oj_rox(-tV?}KD-Aht;K7@p%cM=hrGab1%<<7;Ludw zCO$;JOJw+Rpb#&b!l?u$Q0afw{%wVbj=+K`4fVsW~XBAf$m=HXrncF}?iE<+^b z>~4E`9ey-#Yd}%-WxGy&DvP$~9nY0FG^@-yTx~T?zw_DV0M9@AXOEAOF!C*xx8&Sd zp!@8LpVB}>hSub@x%s0mLmsRmav7%c?m#`ye`uAq-p!l(OXn@CdR@6yHr_c&yrO@s zrKj||W!4rB3+u~vu`zlbN}RvuMfK-Gg#QLCkzU5+0b~=cc$8Bc;k-a_c*MTc;Fi-S zPeu}B!1$(o^`!?PUddEn#%n$M#!8uWK{5lBsju6m!x^F9n$FqFnJIh4$cc}86JMQ zte*cc!@bV5S+^VCx)$4F1qhRo$`q+F8XGy3As|3Cv_g@AdNLFdbm-$vy`cs`BG?L3 zg4sC9b!ISq(BOVo&G&O zw@6zSErdS(mf&_rVw1;U>ceQydCXS{WpnP?+@OqQmI5xTg#?d;J^P6Cn(t){#)B8m zCW+;?gD*+jo1|ZxloCVJYxCWLmOp(wSRkn(!pz^T_l+rKh9Jmhsru;c)uEd8D_Tc7t%3BGgS}^12Be2N8jP z7T(+UdHX@kqB{>gVcX1qlK$#OZ1ceBVMEH+07*>j6APLSaX(n;jxRQA7OwlriCrbflFtlbPuugJB838CWQ!qw%%oaxsDgG^WZ_;B_RR&QdzZ2 z1dx)(SP1DPd{9+19rY%4>GrK8wZG${(?=xhvC#+~=|;?^O2X{Ieh^hswmwk9R=q@{=B_Sm$?&n8rU36U$&@m&|Qfd;(aQL0e;IMQrl zfKIg-BYgnxYmNse{}HTrOVNn~%TD&~>tjR@>jrJ(Ejtr^R2c1~SKl2y#Ps>>H&;7rzjW*%hpjTI0KYLVq^^vUYZ%4jpEa8Z^6n&|pUZ}FJ z9Q8Lu+d2SICHwtv(L4Tm*Z*wr(-A>@xdU<`VC{YPf}$5s>T_!LkUhVsT28(lJ>~hn z-*za?JiD?Y$XDWrKF6jCGWp>s)n{ltYx4E7Wc+)dH9jBiJS~V`5Mz00Yvk=Hm5JwG z$aJ=xC2Uv}hYvwhtrVB4Fh;`LtZG2+LsGBtED0uE!hnz$3{v&c^q+DH51QB-(0>u0MKxL5-<}S zKnyql5=b`O9Y}KE!~Giwp8zRrE;=I6!iaOHV06G9@0uPu5*d=12x@s2HW5l#m;QaJ zpwp;8a{xR1_r?Sm&&y)pt1K?1xFX$H+`*mPlY6miEH?@}q zz(PouGmhMW7Y+FX50a*fRL{fn=Rgrc>8DqeFBEGdAwgU3NdO?R9A#o zN9Q`)V6)(d{iO+#Z4VYVy-WaViPVZs64L#7TE~b2g1KrjEJj?&ZKQbz z9#zu;^!QzS!s!>ks5KWJrG6QZkZw2A|0l(Ivf=cuBwr1zfC)bReFpZOj_=1ynOSTG zOh7|ST=Y!k37tt;o7PW~{P)P4Sp@zv9J<)>2U1`so<+opY5-5fMqzSDG}5>8uQ@*= zi2--oylMb4yZcNlo0FcA6 zSqG(A5<#qCw<=f~7Nz@fwzM#uMg7&)YzyQ?8b}U*zfY~83ha9pGJl=ZCjhv&Pzk3G zYJ!mft@h(A7q>qL30%V~{}Z*J3kAw&&t>c=(+x8!xwj0wv4QDM7TFu~Q6i;3Wt$o7cc{9`a!T_VFu)I$!;oNBGh# z^d#{;P`5!30&b5agX7Vh)qs`u!P-=qvo~QD#t@gG4L0=XdSlE&KOGHefZrGq&kB=V zCIh*@1wj=UtjEw(lq8^U2_&^ThyIIvUi&YEKv7IXXUxr!*3x37`Y&8KCE`%s(3c69 zR!o#Rzr1>Y!+3xAO2lrbQ;XBw_Ur|{3Gu4)jGIfA(E6+L>vk6_us53;j=YJgVYhU4{)$*7@`A!Zvonp%=hQy>l*{`GU?_AlU?7 zN1co=aTuewT*u6B5ct!=q?OPStKVSB!q_;h(1Xss?LPXk7286V;H0MCw-dwF@-|A~ zb1vmwqz^jN!4wWWz-pmLn^P<5@CMI5FEikmmkR?7*vsgh=uRI~#_jMQ3dKvs7}1d` zmNSN$ea26(l+!zry5_#oNa>9W>I3$N(A#VNWKbtSCjM!IWtTiJmzdn&3I zQEn}HK%O)(#G=agIXo}bZ{dH^TCVFU7kk5HPScw}$)fvaJJzne42M;AVw=&KSSem? zKJaSYc$U6pDO5itBqX)X{Ge|hf9qn3s?0DH_(1yOP7%)JT8SqkLs~QyK+2L>WHuNQ zSh5SP)?0h^XCF8V(>u)(yM9G^oj&}(m(-3lttolI$seyP~CRYhJ^Pww>`P$`K6xu z*_?xWfe3Zl@PH4jfTxciX}~P3{!y-XY$r$($nd`DT0rnu3m`sfY5`?61I%NS^2kXf zj3^;P9<)3V2SW&P(Rj``srI)5J(Dy!09g09G#2&SI~fE`P8%Mi5k{xIm3g`Ssp7(O>mJubDi0G z#}eH)uiPpp6FYzWS$F0-1Ga9NsZn8K!{)}0_e&R2-uQOfO<4MS?flaV^Qtp#Vx}e- zYrY;%<9*^PtV?T!_J>2R2ak77ep907f6iIVVhWXgs3HzHC9~WBdof5}s!32*_KBCmqk~sj?mH_w zI(FDu`w9DF0=Ao%W*Mn~*-;m0-SS005Y{e3pTzPX!B)DXtg5E?xwBe*#|tSjjp|(k#ip_>L_*G4Vwn za(zV&y)DxZOMinrB}<|)=$WIbz$Ya1n1UCM(`Y9E9rT{gT{2KdKgJZQO9#?88-Taf zeJkxgSVVk*@V?4qAiX;oNzve^%SAztOv$i`eal4#Z?y`7D(D!w23|xpOfxDmf z?jqrR71oQ{3WwO1->A4jT`y@E4!Tf+-6f0>Irqx~Z16Y)KNHHrs($HFhI6M547SAN zrZ+ncDRzC@yNH~_U43BcYRE6#hc+_on%3!_KJ2a7{U9-3=~~gmXgfOwoxo##g_Td%RkDMqcPQT#wI3$-FN6I)2ibrw~ z6pB=a2#@HJaKAD10>Y28kA&LS_TdsHU!@S+Qk2d&hW%vV4Btw@>Mf27Vnb~K zvgnZ7Ng@l=b9eHsB1~5yVL@_qMoNxjPww(_<4s?*rtTUDMhCexg1}h3@uS3sy{lkd z!6JtfRY%9>op8D;*Yaxl`4llT?IiQ|nCJ!Gg9kH;CI31vW@Yg8TLM6u;XgoB&-yATC^SL zX9ZE9Q|%W8#cIOoI$f8g^kgtN4BFan4AMSmA@wT*{GRKlC2c!c1df;?!HbQ~Fs1yH z228~mXu_k48MJee%J8+wnVL$u?|LVqTzvMGQSZ^KhrsD%8*vN$j0;?xxgK~S4SQ=W+;m|0~*)m zjsq2OEtoHpV_OL5X1_0}I@2!*fDkcc8FcOsB=yYXPJ(K|YVkhWWx_E7;hY=;(FhFP zaPJohH}N4z#nxZ_j@dlh-}Zs9Hz>%xux_t_RoJpGrXiLd>T4Lr|M z0G?)GGS$ulVgmeP4G8MuIHZ@6SqWg|DW!(9ALy5t1JmJ+8%ntp(z3u8e;;)^Zsa3@ zvsMeeK^~;(u8v6xxX5kJI`~`z7~G?@(=6aBujHqc#y;P& z%0y?m$LBwb)^x?Vt;?OZL~FIy4FGMv##M>)R>uqtE_`;;Q5n~BPxaG{gA+t{SZVqb zeqr(OaTBO}Jp6xqXyI>9)9$vos|7ZOpgG1*jdvQ(Y;~IN+Z}yQAu9cR>Wsdud6qGMdgr(b8`2iH#sQS0oO zt|3lbb&Rm=3T-#2%P8%uiZTcxrb_N@)7_tLc^;@+=BDJBa9nL;>^)i4IpU_kq`?JZ z(>{KzquEGO+4ec^xeo4DMzxI}6AykdH)@isN3UYa5-qkYzbCkG;%$NVZjJ+Us37o8 zl~!W;ET@>N@tj+@ZFeF@NioGbFntrjxebjxFR`0v*z_e^ay8|BuF>Q3^>d>FK5Hcj z&u2IGe6Bqz!@UnGt7aOUSw*WVQenxkKPTPkGZ_vEurxil$OM12D}Kg;gIDK9&V5~` zA#-+hCX(YaB*&sml>83m0%qv7rPs40TiFgZKI#Kj3!B}Z?sR#bPpuJNIW$dqYqbqi z=4_yx)9G;2l>vm2BNK-8a6!W9z2J(|2xbJ2c_YjF|Sb8zy+w7jEjP8k)$~ zC;<&<4($R-jaxf)aXL#^j$F8gMUc;_cJX@`^~RI^+EOnf|5%UgxfnBV=FFgp0tnoK zMmCXU7u#+XhD_rI9%Z5R-anMQq80IbHUZL6C6%a9opjJFVP9i^VKOzWM9b z?7S+HWV)p9#zO&skr%psPL8n`Q^P_=p+j17a#WH5Sn z3r-T_a2maE5U|6Yr@y+GuMOBLNx?LP9~7s;gkIq&SPYrrl#K&rpa-ux>sM)-ah z+Fvv@jk!qV^jZ6_`aLfzWLS{e( zw7LFtZb<+D@3`$9Oi>p+=JJ6e+WQg0m&^1reDyp<63enNdA-;Msa_d|l>%$hYv3%` zP7+ST769gt&ciP2`!k2O!@9i1izjb_+HR4r);XkWlOPOo)>TZ=AGvJRJV_K2q;>Hc z1(cB>FEFu>T8k8F8n~afwa2_V+s|W#&i7j<<1Ty8~`%DKQe<~q+k{D zy-a4$X(q?yBWyBrI@c@f7uT{iv0*%$P(1_FaO^aYB;b?~Mkkaf?1NSzFZ*QC^MiD* zMWey@QklKdRw0d4JbwxhnRU8*jrirjZVy$ir#vv74x4QGNEPY}4|R*N*NIX}5H2>I z4W>1j&Q%-8k|vp>lPA<~rTzkMDDN9y4B3ff0rTihxO|BFzEa4yxobO#uoXI8?!o_5(|nFj9kA zkU|NATC&j8(sK_KYGDE(rVohbPR(U+su&S)L`{SlN6n8FTrYp5*W7+sZ4 zq9nmU3G7PxDt7q*J*BNiK|{bS>ps)Ir^|FQciprwTGRC@HIEw`_4L2Pm=*kuFsuBR z(j1jix(c;}P(qu$^_oLJ;+e?a>L$s$uBjzXU-L<1r&4JUuE^fh;T)T}{%k{(-|NIS z>zdCl$JC$Pzzqi_@RZq?ogI0H4FWfsxOa05Gggb2IzL_gO)R3u&O;G5rbsEF6?=(r z*1Hqy57j5Qvj2FU14|&;OiwN00 z4MF-42JH8M)oDZd%Dw`5GAv2>Dx&}kx`)8EWV9szi*KOcK#Ds8kzH<)FprGXIJYVc zal@+}bza?YGNb$9s`&opt*afKR#jfsF8RcmR2a#U#ZL<`2e)fUMb#R~B~o&mBvvSc zuvxK707j}grJTxF%7^!tMOyA$jNxL#-gO{uhKCizy|a{K-*!A9nK})usVrGB3+hjS@Z%Ci?A4^AH@k5 zikRq0X#}ZuA`imeSxCA_7+gr;TH7BM|AADiG{Fa^(V^rhI;JIwv=@;2{keoLAaY9# z-m^)~AbT6~#!9GSTiro<0R%(f?qbDGKoz-QjTYkH3QjP`d`1mBK&v@fM1QS2N-HCA zY;x#g1qePV6+sd9J)}^2SGpU*SEWcxErre_>)JE~BN&aVB}jvX2YE7I`5D|`D1GC; zuQE1xaf;BsC$GXls3YxXeV8ScvWjNPimpIsApTXRB70lFdP#uQeMwiqK{41+wF77` zgM~%jQa#8GsnU`*r54pb+K0Fkgt|nmWCStJc4y%v@zhX+*Kr0wi@v$U8Y`eKj{yyI zB|`GlWJ0{CE)qbm<{0%QBj=k!M{|J52Y1z^XiKV7ZfwC1+uk}O>jvubLZ++Hou z%u)IFTyjkDq<1{sB2zIbV#@P9YT7BwURtcUG5ylBY(Cx8bQw}@#Rj02P2g&5<2<=h znZ4IyW@@}gD@kxN=v?dDq(6v;+l#f8O!Dq&%zvLig;y<<>7(<8q-TL_j2*5RHCx$D z{}oH;WH59U+$3oVY;Sc6DyLh3#=&s%8rY7o{gtvvF9PiF7?Br9*cylZN-0$|Q`&wS z_Xje7;m~V^!{2zz;Bq=|0D2PNGhS3gfN`P*R`tY25G5V>#>$Kv#g`kjAmzz3*mv_% zTKZZJJ>?rKDv(!f-F@z3N0kvb`TB9jwZI2oWZVweFYr5b*1eq;jc{zG^fjp-u^1{| z9$>+?4=eOpA9|I>-2K7K&DDDH;g-njC$+|ZjB|gw>+IdS*za!Oi*~aK`D|B|kXxJd2Ma>hf zSYbL$tPa7qZxuK(Fyd;m_%!GaTv`;zwg(}SRj^!H9kt>qQcq_Vbk_Kjkr0mGZN)6| z!U%%~&>o;PLIt;*{rQHOc_-dsW!K7& zp7V-lq{*KsywliJRO^GnuIakuM&-3ZxZRTLmwU$QKWWF}q~vAb)IC@?QKHL%?!brZ z=ijA&BBz=Bjlvu!|3a3OavtI|X$>Cz=!+qPfR_$s4~Sz?_w(TO#sfx*I=gb}&4@K<{j)*MxH~ z_=E)e5qb<4r-r7BaW;`V#jBXcuM|0+Z&zM2X~%3o!+EWzCGqNrSPp*WEpsQ@pg)|o zVvjyYh8(ylp-~UBi+IG^U9XQ4SB6g1eAPJ2I0A*cK6uK)hTe_E3iXE(frH&a|AS(W zwO?f#UeF2$+OxDUiv%hf+5qM-5qj=(Nmiq#TH&U8giKT}NDqN?6|B$;@HziUz6Rn! z7;-SE@fZ1;&Xd2X*Vg@Ay!QV!I#o6?=pBKx6kOLB49hdJMw3C543R7dPD(p1?R<RmGMC%Xl_Xi;$$?%WAbG`rk7|=b&#d>uoTa)q% z8jlV2SQX8Q*LloN-e8ojQ1@|TT=~Ev>m`SL)+pfS2k+`!l9^)@btn6sXvv+_OMfXh z{A=p=-T>TSLL$`GhdKq=Ten??^kUrc=|X-Zp_m)woGBc zy2F$->+P90xyx)HDW%(~6TO>3kQV>f;o=cvh~ zD|%#S(U%^3{ki2c7nhOsA5^Qa+mULXXkEB!4b2u!H8O})Bb8Ctw!ckC9hkRVe8`d? z=vG?7KcW8m*wvYzWj#$jdm=`Mqa6SduHD~`3wsh^IKl|w8O*A6b*!)x-MIhI@#7h< zX$uw~e%W?p&a8HM8McQ;2SuVZp4hPO30^5+itmEGcidmjFyD>jR5mOUC%ZFXSo9RE z(T`ZZk^o9dUn{2(q`7;i`<>SNR{Zn!HODT_>>hvW%$LHMXReZ^BiQrubSBM_@Gce(yW4vj{CKiXGZ_e3j8wAFbN|MkdhQOu1CD zuikY2fb;B7Tqribew}f4WWt%Hyv#|3A-7suFD-n0sXSp#?ZJWH@oSJ06L4AD;w>-$ zV+S@DP7&2W`t=?IALt8I{z%r5PcFw5!+zZJ3l-I-Qx_$&pMNtT^DbU5)_|j zHWe?F$g=4%Mjl>z#YTdpvLMx_WlwsWOakNAP2Qy!PCmg_U8pc_P4)aoC4DhA9WH~d zomrbYZIdeKQJ8j}#Ef-wVd?g@8|&Ataa*M3dFAn;?Mqh77}hv%uQgk?ScP2A9argE z3~?>QW8{8SDIOP+n1IIaOLVZ}r=D=yFz>~0S8ez18LeKu&wS0BfP;4iM3it-IKA|F zqt7s$8Z6wAq?A;w8s3@ns`Xj3a`&ZB=djNM&Gx;D0mfO#F{o*80x0)MjB9<`w;FrP z>^_6I#FLplr%d?&hYne^6<9%b-gXrmWI}doTteWi?j`Y1NI-Mbemae3Voo6PvNuCw z!EA@Yw!b*n&EV$)o@)u`o#~%#|9(_N`&t$x=!sOmVlH6s1MvXYIf^3)dM*VbLR-?W zF5aO@3bBG4TvG+(T8=7UqH|30@?C z=$fJU4))5QW1DxG!X}L+SHhi<&^ZaKASVAg2l4g@NfH@k2wA~V;CH&R$+gCV)7psR7Y8J6b9s$#;|NB2^9o~7mbDtz`;%pm@e|tod`dwPr)MY2K@Zm121(JQYCu%`SwT$y+pK``u)tp zKcE57{PcOk03;b$w8gKk6)@)_BgE0WC(7DWurnCE!pLR%2#}*+2AL-nyv!O#* zz`zowo2r4Lof<_S9Ong9QledutaJegXs{=pE1xyOz}86)1OGdPg36mbff;T@$h!yC zfg`zPyB`QK9=gp7FYSzc^X(n1EFrOw3SILBAow$eetES0>Kf5At|BrM<{#*z7 zzqcvU%*(`~wZ`zqqN95su6&_t)YF2iqD>Z1?4L9o%l5q1|7F7*3;yd{k9g}dp8-kG zH3b2h6q?i)7wZcMumg0<@H_z|%O5^p4LLT~PpPk^!H?O9Tbpn}?ggsD#IHsM7vQk-y!PaY;E!-DJnGwu^lfAmVegroZQvLl zULZhY;CWvaY%}2^!s~=vNt;5NejR!F=Bvy(;5}EY1wv7_M|3*~*oBvl<|~GPzNSm9nS~%g0n6DQ@WP~e6&VZEqdX)RDbdQ zmseS&FYK=}GbOPGETdv@Wq;}@Ps8A;m`h0WQpm_RXITs2f0~;r;O)X)+cKl69Fq;O zpPw6`Gjbb9pdx2r9}hN*$~y3pcsvYXyg(8u`ZT_j4qb~o*g+AEM1tltyMS(A3Jtmq zTvBX>{)Y}iZj~fl1i}acKb{dOK(MX!C{W^p1AM~B3HpA-kFx=+t#Bc>3|2Urg4L2_ zuOTmAr2{K}>6N2w8C;tlv=E4M6C65En+m?COB43J3K`z+?sN%QW~>U!0G0Mw*RigS zAlOD}L-eClUuB?B9l>!6*o}byP1~A?9|u30>5HI3U>uw5%M66tL9?Y!9nJ&DA_33# zJ%yYkxlI2Dg$!!RO@CKQPB!`l^BY5lb=24iA6W?f#*M?@t17o!wF4?tlcXNhk0hxP zx=sXRC8r3Y1=@6QReJ>ptoL#-&eU`%m;7^uWnLDWh0t=M4)Y_6rK!I5$T0T2A1_*d zG=V9(6u1_vTmzn4XE>VP6%hatFIyCbMLDDaL$C-B*!EEj8C`5q59bDo#_;Ik#VbFF z4BlBOf@%DlL~r&DoVZD)ffoxgF&sCL&t(E1Y1@PhydtBs8rh^lF)RsEM&LC`HLCpd zUtJyU!4E$pks8$we3gl|Wbn2a1S4G;u5`X?n3PA%V2_sy-wA`--mp*(Spv{=CxYee zzk+am?^CA{piMp=D@~HNhISpshNVLDu-aXi%Ij8Xo3*Al9PL_ffX3*uU-DHZu-uRSCi(7OjOWPUnYyD-kS;QufaFWZqG)T_E|OTOeK9a# zIByf3qs5SCzhuG@NNgBa=IqU?6)rR#56LEKDJ_c@7LvtHS`9pyIGiM|)T#^eTHnCe zhZhfMjz1kQ($;;9-XnBH4nPMj6CPgEi~fi#2@jeNwgsd_o%!CRA=sjeNZ=f@6QMM= zMz`-Fm7@SqSfQO2+W1v8@yrnBu!NGk4mOr=7DiEnf7ecYhQ z3X5^fSKYmDWW#Es*FWkivvB9A9J@j-Ak{J@(Jnt;%$E0fmI+C@M*Dtki)bw^BoN#A zZ;``A$BZjh4*L2F1XNq$OFi4-AmaBS=zy-pX3RPs?SdTR!96Jgc z+>Vi*80C1O76F*B0ckg(g+sg`4fQcSI2Rj@!iqmy7BBckcWR;I&!v`j?*y@Z-6YP6 zG-;nxYRW_OE}<)GfIbYbs+S9A!%YQJ35@eV#V}S)+W8}UTmzi*XV|Qd4#46Z%1X;G z1{9@Xfpmc9iX_0mtwb^|5G<>1hW#ho5!xWwhUWD$<{mnCbHbSIu2bu!g*|VofZBEb zFGMft7Ej1#2V)jU1&Jd6k`D!xmrYhp0l$6X2LF$mm4f5cCP5OSc0NbxJ{^=4sMnD@j~FOpi0h&L?CF zaFO81Ut+ZMz8R#JGRz#TmnI1}ubq1(k?Vn47{xcp+m|8=J(`oy?_VbxndM69E9+3 z&4j1H4t$2r`Ys_l+__r2A2A+Sk8Upv71dQwS^qq29O z7`CU4%{^)LTX)#3}=!t~0PDG}t<~ z^aF=U69V9+#^thTA~69nm=_ZAyKMN?r_wQly2N5bKs%}M(s5Q`h6}0em6#bR4B<~C zh}QH`A+Q~(M+Rln!PaA~1XrQ@L@T3T*ueTOQoqc8MHCSzTfdw=P7Wn!MEXttZ}GXE}5kQ6?1@B&CUoq z=V9zuZlG#RPIJ3)SRzY@X(mp|GR1@hc?A~$no)WE!z1Us!+!c;j3GrOO&~Jp@$+hsJ;KjAp$5$s7xLrc|2^VYSC1hu zTu<11a%4>WR<|+egy|0SKGKy|BHb2r?i$@s2sl;Yq98o!r)vL zEKJj%2Ad0_69u;X7YMW|&NOwfgcgE9btrg2jR(XONu5e1CBhz=GHCcb(sD96`XfzU z@2$P3(wwM3x34l2u_b#0{;22aKF^$e%%RCA#7;$Twz902QJEAuPK1#&0X1N)^6~tw zuo1}Rc%FzV(z7GjrJ+}cgn8-d7O7q}0Y+<#xOYs*vI z*lL***U#}C%1Wse9^Q99f3>RC$HoX&&`P9wRg-Bf*!}ygdkwZnE3fz0FHFs!-`(6~ zy6&BG(--%^9c|o}7h^NbJQhA5+!^=#n*+Z7olApR9!FZY<;3tjJ>@1JzBsYNyz2{B zxr3<)CmMBv&U(UgU}wzCN5U`*(@0DVpPxs&n`pb`hR&y_tnA{>H!(WiUZXDXcpxn9 z4^gsT^FXqBWGsv)r{|++?(ro>Cg+Ip>IsKVjGL>w)#fJAbushObxZG*JDF|;2~TMU zCw8Y6`{dLVuaVI>&MV0@QZyW_JmWG1P-Wql>kzvUv4*X|haPObPwiL-w%s0ag(HYg zGDUDFAJj5}Y6L!yj+vG$Y-c_>zLO?i+Wf zTsiPDPG;)V_O*;nPBf_fYKa)A7hW_iYoyO2XXY3BN(YDc5rK6*BzZ|7O%PnUY)`*h zq*JS*_4267;7hA}C;A5lbilwaqL?h|Fu;OIL`K@RQbV@fhCPnyuLmkCmuI?Wx}Nc% zRYmG%S*R~h{itic?1J&NXA_=&WMtS^n^;Mr?MOUOj4ZQndOxaXq_^_?-7N2IKJq8$ zoSD`08m|I#m)!BYz{|OlHv1AWv+e3wAvl_M69b0X{xF645zh*pmCGewK)QC-(Fb1P zQ5k!?gIM3D1}+iCX*5yNd!zke7R@o?$X}@b@io{&iBsW-)kXS~TMg~`R+@)L7sX!Y zSk1v59STsPRkJ7xyN|||KQup{7UgO_UV%s|Ei~?ANGO}IA`Q&LxoCufnYTqkjA(_j z&{3Xy-G$@tZos*ql+?=ot_?N4O&2`0-0ATqP-rMj`3%LzKSvq-_TAqVC@S#M(zBqU zLE1RnLxD!sorY8~>_BL;3S%RZ2tNjT24WF>>HCeKnF;&(DHXnXw?t1gn2wgs?1hR+ z;CeG9JL1cbZ?D`wD(Ia<^rz^ii~8B=PZi=lIfo9_YBMIqwg#6L9`>!y4 zxfa%^UwW|Z!G`hKhisg4#f!1#Yhx7@b$9BNVr{|t!g1__o6qjG+$Seq&ny0YMOmCz z^sD2l=VW!NF0FSrM>9-u?hZOf`BbHVg(Cm?$g1r}+g9A-Dm>`8ES{zqkkL*JH^ECG z{6wv~0GpA)n>M9w6Gn-4G_-@M84e>hugC|z2&c_GVnJN8Qf3h#J zbnh6jqL7pt%1rju8-DCN)Oyp@Qt#Eic>gme7A9M*eH7X+M=Nsg_~dW>ypirojj(C! zQ*qF1HM}e~`grMi!Yq!AF#OYTzZmcSi3jc5U5dbS(Kq!7S3WOr1JA}<}QwLAkp{U;L$o+X1{|AKTgQ98KWTfZDeZ&O0$jDxf&m0pCHU0d-oo{rQ&p3pMX9s;F8^*HF>kvk9b_7p08FXGs>}VkG6k#449%*k zadY(NQPRC*ZsIa4Qw;(MuhZ_rlm2;FqjkU^@MF;|ig<+}Ho{EQgS^NJV58l_(67NO};BN=Buk)GR`(MNTQ59;Za7(MjYml%(T0 zl$7exNhNe{6q=4yQ);G}n&abpkG=NZ*h~9!?a%eQuJ7-A?LS;=%{HpKRFbt$XMQY4+@Sm52!wAN36k-wLPI(5 zLkT5_kPTjZZ6MuOk_=p)#V`aDQLYMo+#peW5e1{kdI5frnR4E%f6^T6K+g?Hwqp~~ z&L!a@9=}~-3EL)ZN4Nv|vpz9=U0oK0#;9%J%`@w&JuIeih zg7yFqeX2>*eU7pCCHo#a*jRTUmR;WGzeno(Q9&iCh$xwm+uIoccJ12=ZwhqKedrMq z%iFK?eNSvqDovJaP+q`_0ejZOYDPw*GC21d>D+HER`?>bW&aYXeu4NRHVy4llf|hs zs-)|EI+Uh`WW&B&Y%MJXFArg>;Dx{g#NH}}i{=qQ$>JFbPgZ(rWx--30VeRSxx(q6 zr`boV)HXnh@8J62dd@6357ti{9Y(^70Gk@JgM`FCC=y8&7{Q49(&(Qond>(4g8H|T zQYmBPy`(`mG%Ubs`IS;SB<9y_kRlue$*Bu~o32U|1TAJbLl9t({+>O=& zKu7az5J1=G&X9&Rb!g;j>3iuhjOc$;Yj^vo|B?4fQg~cst(%-@*vPSRyd`)pzfSrFkIVb_L042e>_w z*>$%Q_PCwkRdJd>q4%(#7W>mBy{Z|zn|cj~6VQXg{XGYlE_JMq82jrMt%qqy(+CbI zDp2>OLD_saUmg6UOy;m0tn6B^gs+VcSQ|~qk}^mz6xM9>_R>O8-lg*n$C3izj`xm| zfKOqLmb%aRdv^Z1HJ_sE(eX(fQw8V!7L2>qb2zq`CeXrX!F24;20bKx_NbSIeF>70 zX^_iW<#WwT)Zjs>7tp_FTg>}ZO5<$ulLgZ(jKu@heDwRT!-Jwh7^@U)!v0fLAxP&% zz5dU1crb@DO+U!cG3c<30$SWd=a2DIK=f&+1jAkp-R zeU5QVa1AI3PJ-p@(DrHVM*X^&9*zr5HA^u}Pph)8E0N3JU;P>THg}&a2D?8$0G5#x zWCf+#j>xE&?}6X)Az+C02oZpH*Gej)jYT@sy+NAOPM})#9o>OF;is3J{E;(0u)+ps zK##q-*n@Kk`B{}Vwypq}5~N(Ee=;Rp{gWwy)mE^G=2FZoD-qJ)kX|5JG;s{rg5UYb zb%q{W7B{UbMudY9b<|$Th#f6`Ur#F~vXX~p4vgGz;SIMt{^#V9Pk>yK3>nXe7~&vN zqNx_t4+pn~izD>BF<~1e`aJ`MCKptsOhkvxgdsnca63u^VO>lTqJoJu4=s5;L>H)9 zgWeK+$1Vx1t=|h<84{9f#-ev+mdZt>aEv9npdlBgNTdM^M#1|ze(SJA~%Do z$tAH`N2=U975k@k>HF#$ZG(S(x^&-Vm&?9m1lwb(@=KlPoi5gHP;|ElW`0l4K-$1R zL-&?#y%J$`F5nN%oW{=yG3U34qBosaxH^|dYH!Q|Wq29!+Ir8mN%;kF&4U$&SKq(A zG3JKCdPMtGJq$;nH;NZ$qe4xc{f|hWuBI7ZSy3=Q>S&&#qiXJ%nqKCwS^eyjS?AgDH)4R3rLd$3Ulg}%j%W9o=??QrT)5Vq@a^zV% zS@sPt5)KxqT4N2L_S0W8S{uLumIUZT~CbeL`A4G*MZFx*D54 zbI)!3ppbJvzF*=;*(nZRa}Vu+28%&jeBM=zzTk|?D*S}qt^oG$P%Am z`B~J(|1qe+b^Z!!(EkKA*qAcXQTCiNyu=<%$1%G)gC7vslkY?Ha+TpvwwYQa; zdyqa$61`M2hfmRYy*LUP4lOHjB*}WDfDCzubK~M(_Afx1rybK$W7q6O#o2D@iW48 zw@bB)#$TbFEi0>p14rTe?DOsO48F*e#wH7I{k^LFV}XYE1y)hO_{OY|d9xjx-eo?# z6#ZzQ^Zjvl=DQIf9@l7D2*Kb2d~bZ*wxi^nn&7AlbMMCY)uIs}DdX^U-m&c};R!Xo zEosU%>50+Ty?0TLbgf$#h5>nwboKxTAE?DA>BLB==tnmQ%IkD0?rZJ&Be&a03wOM610rJ$SjN$?}P`q-cA!u1cQIa?!&6@ z6lKaFvjGd`t;vs)GG}0DCIlsQQ#0G(e6y3bI^7h(omZGcok$G|yEYfE0@rzq7{MWO z)ngTn&TQhOk8jQlphQi{#z{M=BtgP?2?%G&wN(iP(uY^l>Wct>f_V{P@euA#@R%VI z_yvOM0*FDX$DdjdYX||?c)gRsc9*d1^cUT4lfTGp$72{l3B1rpE9ve~gV|NO*C_SI zn=E?e?05JFqo(+RLz1Y&pK=-vH!Zle>-5<+&Ct$Q`VBe;OIjL@%7`!g zeHB!DSLJh=F24hwcaclJ0I@|x6Vj&%h*|1qGyY+MKn)5xC?flUPI_7u*2PGWC`gM; z1^&I*cKDmls*JBm;qOqFjOM4bP$tJBi+UFYeKfi(4#J7%L(4%4(?_=`U^WEyWf#%D zNw9lw2S-64Z?wOPWCS*l9^H<%S@3k6WFK#%jo0~b)vZ&2~umsQ7D z4m#$WfD<+UO0ExQIpGB@Rs7odk>TU-yAh~;!-Y#ci%J#_&FiEcNM&X!h(mHcB>s?U z40GC_h*qotlAQplE)4goPr$pSI|kgJp`GOhH1gt0T9aQgjpIDMRh~a%`Rng&TzdH4 zmL(mJr*O6$Nzo5Cr5~sjJI1r@C-4BcSU7YoxwAAy@%d?$3TEeBbKMyB_=JY}3GQ;c3Dkl`#4}kt z7l+4r7{1-~uH@bFp=qIqjAB~s&Wa&sj7TZQ^MZigtunSI(5F{Psk*y#+sO!4fgF21 z`@$LJdrJz+HM}Sb3&e-^8npV@_8*~*15bn242qN}SJ&~w@x6OgJ(DK(U7sIsd3}pc zjI{9(d~P@ZGa$^_sMKJm0|Z{CI2?JqN%;9idoZekjUXH{cfC~AuaS@>TXF=p$_9D@ z>yyG+goC_88Iw@1s?aEZYlo!Ghgjba9*9b(Ulf>&@&?#9lnOB7mm?5%|9$HHd*C$yjkVS`WKTXyL71? zac^LiVFxjRY&Xhlrbx!wU60jZZzl_DZk*a{Ra%H36>+pNSvvXV#myltjut0aURn08 za+g;T=P>RuqVXz(v!oa02_Q|j#3yUp?~$bz^N-KCvNYbY2$sF!(8j;BVc#fNhn8~@ zRxPBLSxmUq&YRsB?={9*&Qlm`^<5QW;4T((_UY@^QXqiFOI6qy9WL-MeG<)C9_?*{T?SvrD z4;$C&$Xl(wo~-*w&tzQdbRX(^_k@(_-6z~i>yr$~SMJ&e_>7-nH!sD{cJNKe{oT79 znVDXz`X6ojbxoo0%%;6vkF;Y{V{RsI&hE_cI`<0fAXT7}Nf!zc;h6MA;w`*mPm`S&CF`W(=b2-8 z`NsBjSuXX&45Iy-%j&zg?7si5`au3R;Qc=i2!Ru1`)n`G#}N)phH0f0)5d3=oN=d}|uJ;eUql+PC8+Nif9 zD<~t~et_3`;8iF`s|97S(C$f2cbq7qb+F!OkZz@dh7^d2GUxdqxz zEWZ1}1HJD=6dFDpArhkI-|sdVmQ9jj)MA5{j%NPEVQqf0-ebYBRX691qkc9$KI1T= zbbt_c0(;cqZCr>vjx9cdSv;4{n+4VC06py$3bLRCQIe+kU*5(|2R(bZs$+CBx~cJTOZRF$y(Kox278qyYEzX5_U(gBxf z0|R9}fc>PL^J&nWA%2-8cB8bSH)Q?5Uy6vV!wa8a!o^mQam6HXjVf6M1Qs z_s?{~lEh1XN)v9k1PKn}V>=ADy#;oYNL@b|j-NKNxDA|vo4Rw5GOQRRZO8!nSAm)y zDwjKiW&b9CTd63Xjg5* z)&0o)FEYF4)Emvw=ObI9zS7A4T|W8;Q84S#F4{SC(18W^#G9RdGte@kB#$hJFT-Dq z0qE@oRSt+@*j1uNf^g0KFEVk9(Z1ga!mS4fv&B&eM2J!?j)b^)q=YK*jRgXjS>ow{ z^FkgfUTYMsFPj4R$WNPL(tsAZ080*6Zv_iD3j@aXd*1GN0Xl4wc1ZRcX=n%JrxU_5clq&(_mj|A zNwjje2H+KmkD_}FmAt+m!%i5vy$+2j25;b9yw$sC>AgIGzwT^qf~Le+7p&Mx}_t6Wo~ z`q1a&Cz>oPZUmctk-)Jqnhg(_&cwr&NZ{y3u5F`=COg4!FK_&u)@_??b^Y;<4*JUp zOSLUcN6_R3er3B;DqE**yyQi)QX1Jk_1z2Fev|DR!m8Fd?~eVBC@C`+6-PLF0L+RB z7xnyr%H8dKlXY;%{m<_;1zW>yW@bL4S5wX-9A)5631LX#Asd<$X}EF?eC?$u*SNuB zw5#=h=THjm^`{#vey2HY>o_6~&juE24`9Hu{`sX#=(930nX?JI*f?5mi+KkTibem5 zUWsAh|B%o@5gnyEH`;Y1i6L1m%U^4Om*F)-T<^n%Rhg%}D|A8+As|-#)@TmD3|AbO zxXYckU!>B!^;`uLJIvV6I@5D2hC?nzLB3iMFNMk#efnM0g(A=}&=S?bw0xpJeEBe@ z*I6?tI={Shm#c(1w5ChR{RVAxo~3@mD4jJ?|7e{l|8MJz8TbSLBq#s>zI7&=c>&`P z{WgFFlta6_ds<*WM(TBV2=O|MyJ!(6k9Ioo!JPfB3}<9bZ4%p3+NH7PhQzrWvMZzF zZ$=ZrpX%3_oE^ZpH@hV?w3E(v!E+(vjCV?vW5ZEaCM+phTPF>^R7NE`vK7N!X_~{y z{ooZMG_)au<=CEQ3K_SrOiAal4`2xgs)tfgxsQj$5G?%fXvHax(P%;YI?Bf?>!pCN zq_c!HJ^bI$9GQ&XTjQiJVJY?qO9Xk9k`BdgY;`C^SW&+9XrBu>E~ZY2P!$k?T|x$c zx5}{I7UOvM0P7)m;5|C^1>@m?^x0aH{yoy;!TE;ZY}^ySn<|^DfM}KGS)qF)C>=uGIA_Me`j|wWCij-I zsxLA>#otDO=5}Y|$*TnU&xpvI3DegZrs5_$u;&;z`XnI}G(>NDNm!_4ZVU(5%LO+f1GY0C64g4r z#Ac`xdh-nDVK~)H;02nhZ@~Rr4Ch^6OlG$J8?4inEJnl;E?-3rU$+gUF@^KZL@5PI zKVWnz;blq1gwGJFL#L#mOJ5xQ5uTEXzu&=}iGbYLv#-*t)9wS17kPs@47=xD@bwN^ zG5BdJ=v%W6NGItX*fmc$oZ*Zj1Lo!Ws!yrZC z5{C5clFo`Y+JxceT0sSm0R__`4TmkmN{Y}B$k3DCHwakCXvMZ?Ft%{`^=zP5r-*s= zKosT(c~^K4?(N1M1~khO(RLns=XeK2979n?8C+UzCM26Gw&sB+v=)&p2!9*^&S`}W z+eLz!N_5PjC_1{bN;vcw9QT8)6vU-YOpPen@urjwA-rcy$oQ)l}LL9!tEmlfDwDwjO+abP3kimbB6;&jM6I z=A6DNO@~|dJEe=%K3E)2;9q^cGBV=$RKpibs1f<@6&^_EyUYR6EZCGa6Y?E~;f61R z3=QieK{6%<(2S{0NsnW)B?%kQqiD}!F8${$@;?gwb)jdnt#|V2Hczu7?%YzFif`#O zzF<3T-?Y#2o7E0hs5O=3==vGbHesv$YyScdvvVDEZ}$rEq+e=LdxWu-?|8WycI`jw zTB#EjdW2MOr}8aNlv0-Jw#Ybt>{aWl<1-If726~!M@E5P`7Q~lIHs|IN0AYXv7pnV zTaMz(C?w3mpuiv%FQ~##XI+u)2nc!z?PaiPONA>KP>3@tlO`I|1MZ-PHNF5XPld+S z=Kwj8*6EH8vgOb0S76;?H{gb32t>_DwKPC4Bjo|t1M$X2x-I>h-&l4q;XEemx2(?f zm>cEr)4Z{jS4ofe-D>@`7Bd@0&NCI``N_9GxE*yJNLsA2;C-1!{Kg|GP32=jtl*SV z4>`_eNn%yaqr5}1CgDovOv~`NVRCgpD~SIAjNEnTi|%B;vcZC#4A3AW`CP{I*B;HY z)XDSiathzK9ltU68kasZm)}n;rHt`rlA}y4Ryw#^td2N5<$8hVZs&u%M3d0YhE17U z8OzGH-%ARN&KGQM+BJ+W4H_?6@nN$wd;RYBTjrltGx%t#aX9$)A`SePg7{i|i8n&2 zpI66~1k`>WZtV}AS@HhUxYnaE_S8Xh+{DoZe-8UlsC`@7?yl)x1bumfC{Qb=Uo3u+ zmbhw|^3l)9=Gug^yv)*WrrF(`y&1218vo2Vi z#c7+z`p2&edusB!PAha7#PiNfK^)fq4rCD-x$$kWZ&uiPNi5kbk|#IyYe#>m3kM<} z!WLVvi&!V60bw;#Br^5FTS@K-u0u@9wkwTSx}A32UA@DyKCbhy(E`3h$rTl0z_ko} zrt+w^UdimXiYW2z#gIioD06yM zovx*%=ZEDMsZ;ydPu>@Wp3*k$j2rU!?(;SLPcZ4ET|)3R)+1~5xUoMrY85#1 zv+&17gyE&T&;|4)#03tsf3|sbeKcJxzYF72f}G&z}Y*=R^;7kIWva*Y0HTQgyEaEZSyEikYbo@jA86lMz+d zuk1BN@&kD98G3F3FYYF{3?K3@+q_6*c9iCMBtxqM2qg|V_Yk1Pp+EH!|20^WcRPh7 zNI6+$6@HP)gPET$uJ}uE(yPc;hb^~dPyNdCC^PBa59s8KuX)$ouE;KgYt8u3$ajZQ zX|78Usn6#o`2xPu`??id`I?Ji<2|{MtL;Y~$eg?)Gek2JPA)Kpu8eSdEok_a7O)CA z1@5a8wuQDPm+E8$r3OadrRn}VSX28LWh542m6eAa+SWY-n%#>ADiYr%CwQ;?bRpJ~ z1=xYUKjT(jD2bia3pG+Z`>2a0x6w|=I+Qg4v*om4H$Vzi4X&(WM> zu{qfM4fT`>5dJ8XGKZ%E)qy*u)k92$3r@h+SU%_>J}m|x;&)gs3CdZx^pjj5tJH!r z2J+xT0;9S0 z#2tT1l}xm=`L1IwZID?Olp-$rzXiN}&qb6EHX}hN+}-=F8f(!9&s%oaraYNEWsYi^ z-~Po*#w+ zwa%7oG&jjpNS^4Ib>#ek-;UoPm~lOVu<7w^acrg9xhDVUd28<~JUcnCN5X8(ezlC} zXde?fV$J+)pgU)Yt8KC)=>r*k+7DtiZ1TjvOV$V~f8LYFAwV1YIt3w@D#-E~0n%+P zkWxGj8riAMC0}H6>I4B>g?+{N<`YJgzqRREcW%sKUZip6voPK#E&QCL(s67W(zzMX zjyGh*CYxWeP; z@j1tc5i?(2kqHe+RN^>2cCrv{Ld)|LQ3gbm)$)!= z*xY;8xQNW){wBErfsP8aBm#iLRdgzJLPTp|OB3P#GhknJFUUW8lM)tl1I2a-0=ATo z+N0Qws=%NAq`&c^crou0ZDa~LL41wNn_;<&FkcGSDSZo><`?7{4~Ic@NWPq;0*kZq zo%_-JEB*%dylDX6B&rfhJS1auGTE`gdj<~&Elo0z znL;~Pr)eSscmkJQ@bJ^%;Z5>eq8%HWD&zL_v>mldG~J~WuwnBIn_H&E;y?JL1V3-S zBi&n}M6t!;pzxKeQpuC4$t%uBXv{X(8S`@LZFU?)sQ8@XL1X;fEil;6MJP_97c9K3 za0Ya#ULoUVmS(l7xaq4n4!R!^$7m&3k2Av)KLVyK>W_(<{h6qQeEV z8}lshdOsTu;wSpYyV>TZUv^xec+^F^{7hrZ`pU~b=L*$QRk5+_`lu2i0japz|5H@c zp-P~c3o`Qez;K(Jf&r;m3FR@Uv^=I{L_j$HMFuiY{ZPS|FMAH@9NP}!P7|mS)fkU9 zviQ6wQ#95Q)l9iH1uT#Pn4vyZpo6u+0ujzM2HGd@DZcX9p(K}(@Mr5GLLAJ#32->k z!IzVTBP;{llJ)kLqXMGGfs~Cdi21Lq%YS8E{wwPuSSY3XdJrQej8BDTDzl}q`**`h z#NFii|4Uhy@8Qi}vMd<0WpL_!6+*5@r=T6hFPOtb$b1~FOJZ*a0R?Q$wJNt;sho}C z8IavN;{jfAEGpc_BY~eQma1Sd+EI18f}bLz_lx_%510*UohiK@2zlr~Bk|kwHx9qO zBKPWAY1ZVgxhX~?Ii#Lt_~M*GVQPbT#Ul?#4D zD^~KQ4+DJzt8LWW@ht-&+Of!2+7D_s>Qx(u4oJ>9wF%Z&{E<)TT|k4#%gzB-$p<ooi2=!`1jyr@Lb#_=nZSS~MPV?4U~&SS>lIr7mLh85R6XDC6lAQe`Fh9;Y|+fh zz0&09oZGNK9jW+5GY?RISCR7Syq$t}_bifr-_NK5(^-DrG*-X*EdTg{u+jMbo^^N# z=F_G^n`{9Dw+YJ0;A>RK)?t0l*8wk!%uI%4Zhjg3@1@X@fDo=?G0HK?11m~t_QC@- z_1oy;5azFF-!Dv|fq~Zra1Q_3tmsip5vWLc*4~cCxF=2|i+7-f#5XR;P9ai18fHm_ zirTdn5Vb!WfKm+v=rMJqJ%1UG(C*ljBJoa?jXzu#4&-Fzr4Zo9EK$LWmx2GwwlMs*-g(pfbei=v%8#;8kk>EN?0OeNi z5IlD?WXzm1M#`9~hK{WSzRAjb#qHsZm7-r>cq~azxcvE`V9oF3J-b!PssuW>=EE&T zpxsw{Dd7apOkf@kfmV;x?lm#HYHrQn(OLJgr}tG#{Y@?V?I*o@dMnX6c^mxO(+SU2 zpCoEm`Fq}dRyqIn`m#5Bs*f1hLN(7feTFm;pua?uNBh9<6s}8AP(~}J4H6`1FGV=x z#Ez)w-j@zfVM_imd}V$t=Dw`3y+?bVkCuN*601^x z+}9NU>kh&nwU+&@!G&*jFK!vnR{9ut>Rzw)`=)-o$nl|fUQXy(tYGYvG1qMAHd1}( z+mzMzSFbh3Y9BL)ERrE%W?#}8f|xAS4-g}0GwWST8t)$#m#S93Mm#8+Uk|Xa1_VyWv3nm8Qk2 z^OjLAXO*pfu66{`e$HR}&n`qQ2;e%S#ip=aeZ27KILbL}2rj>U2w(olHuZLbm8bTe zE`6_;BY+cE{#znJcQxvRHtGn(-O#iy=3K|kj-zkkG(N2D5ejK*X}WEX4kV)Lf%R$| z)O103Rci4AxuBmCxs@zN6O2X%!4o-sf+>_{Z`Lbu(0;gCO?3#A9@wMZO*$+EI1B#C zK1k8R-x4@hE2~7~lkl*}l(n?m5Dr4T;DC{mClgMV_X8S)$PBphypyvuM?mEtO459qmfrBIvjXED}a3oef= zZ9yxtfxCMJEV+1jpX@&OFEYP*Kq(c}l#I2D9_{Lm27E?7*+mD=@h}Bx|Lv_9(YHc3 zoY+ECFf$7i$+!`O8jJ=kQ&t?oR74rzeAHZ`Eb>!#81o8qJ zxd{IQYDC6VDa_f-CX2EVc0g#>sO^AT`QUb_uZn^*ZyoqBn}X4jDuGe}IKXdbz{&QB zZnD-`*zM|D&(CT{E!M*IVal z9TksI{D2#Hv(~e-3nhPa``lHHZA!`-%8LxJs13_0A2=tl3ltM!tdF;ANlssf6E#u4 zh{7S|p|D!GOo=LYAP``brGA@WDiqP~`lQKjF>5xQaOW;9(BApVMtjKiu!6_Z6U0KI zV3sFMB*TQqOgRTeA%-po_gM(jdB|E?bQ=-73%&xZ2p)Xj2xhs$9!^?60`x@GtV{6; z2yH9&fL|i86lX&b_4X5pXz~VlMB8*R;0-{SK@iDR!RxRcpcN3Urhpe+M!OqQ(OQ+>UvAaTeM3*}URov?ZpxXLBgA!Qn~ycMN%wVXCTwE7fx2u3@i{*jAjc%gVOr&* zP`F40pF(Z+PK<*$c}+TH7}K2do-|ggHt*apJnd!aQ?N2&TTixgn!I%N(^4+hS*5%B zeoEKzWVN^uQL`a5H(JyV;V)oFYm~Z~-!MtO0e`IX0}<)lN0v-;B=>c7=qQZw_I+XS z=I&#?yW|6*OR9CdLQfyrGT_uWf9X!2hvA4dWpe~*eQqiOnkP%ruBkh7gU}U z5(EVBbLnzS@Yt%xZ#yyA;H>9D@ANv5)zhv!MbFGCx6TGvN4^H0Rg>YHxs*2vwLswv zv-|cC!o9tNCJPU7&)W{i;&IQpuoX1Ts_0lxHC5b5`jXWGCh zcxV!-JyBXg|0IsVUoI`<^!9`7@vb%nk;-B$%C3&~7*3=}1T00479Qp!ptduFRTI&- zIs3(N1vex#xXB1UDye`bT}H$;^r^I}PPd0c5zK1%+U7t12n|Xw&qxIUDJx)g{gQV9 zWL?AQaHv43(yu%gbJWWpuD}mlLG=*+{>VorXGJ8BGY3y`%IXN*{PIvip8Be`HmyQ8>Hx)|d*^XKBlx;+H*DYR^?mXrG z$;@NB;~&vBPHHb$8ibSf!4{6i8`F{C^=Q!xHi5tqX${ed&k~vi&ICksWT&DHcVEUIA=_+dy(|;pHDc0u>zS8mi5sd2Z=9cQ(%g<@Y6Bf zA6F))%}H69ao8n2i%+wT8oMU97x+0`IiwVZA{$gVo;>7IrMB>7Ly7nR*q=jb{_3z> zlPS6o8$#r#DY(V+Xfv<5r8vmMjie1Dze73tI4iLheE7^=35-(>*>sd^6fcK1I!>s$ zrAB<%>*B2oZ3Bv5QOW93|5KEC{O{jzns7?I#b@png#$`Mb}#6Hg|Scw@`eahl(ktu zykTUHb0mb1;c?7K{Y(fuIyY2ftS0xQ4Cil<+|Ip77-A=gE8F)23#i>SR|;pFA3P7` z3Qe@m$KyMW&>yb)+m4mIA+!U}@6>ppiCG^28TbbfeAI-%MjVTF`cQu5QWi%~R=s?+CMnDj=xf&e)nH>G4_dfLQ|W^;wid z?nhW@m~d9c=cnZFUp}M_=&jooLkSB!hRwh_X)Fq_1nu6Ko6;2kVGaUae;45g0$ncP zhU@G;&Ok2_c6dV-m4MKXvCd;cd4B?Bwcj*29PxMfQ*+3BF=}|dE`$NOnt-Ik2p?1L z1Oi}_R6rP@&sK-!CeSj452sY(7}!++wwrTx>A|!FgU1%Feudxgl@dxk1e0AM)PsYl zTALigSe!{*|-U1n2T8#6`|!-cuQ>WsXhwFGz05fK?5hxU9=i1m|x`Moycoe za0qUy$Bxu4*o-YH;Lhr9c%eKnb=|zq_;{0|6}zm(ytHiE4y3Opr{p zr4?ZUwRDsfSO&aLuLePtJx*2j!$s*y{=fcwJhWH`U%JcONCxlJ$~T&A+XY{@Z7r*`Sl{HmDPlB%`* zhipa5L5*g&w}pq6V7rstTegbY+G%3zp8GvdkNw%~PtJbWGF9+fJB2}29GY}fcv{S%a0AbKxPYI ze}OmSU{{S3VSLG8(f%fCTt$GUu6Wp5bl0Gt!`ZS zl~zH@xBHKO^xq`$m}`|>z-u3)s8j87j>bE3>Ob2~T)gt?71Q&+HFLeDyj0e3RkteP zMF8+RhQ(uhQIXCr98PqGJZvu0TLm@rkUR)6wTNsI{`4UDzgxd+Wli~SE9-w-SrgFi zC;x3_{ckI4w3Ied+Eihp+Q4suvsncqrHoZzH0B%px0Ut(fmT-S@GL-Ny#P#`kq?KE zb1L)KZ#!LoyquEGu7?Bmi1_xtCr)&pB6tyzI_Z#5ILv@kcAeJ$yiGNc+>wM&3b3B< zfY=D-Ku}?$lppG$k5sB+bMRvkwA)lz)gi3FD*U2P`oFoJ2aVoXhr}}G|0Zf!q#c8d z)Fgn^xlnjo=jRFojkSFeK}aavzK97vU+3&rvPk7NjC;%V4zfTK(izBmOq%(&Z{V|l z3lzCAMK~{;z}eUb=pg)^>6KXU{5YG%dmym7XAuBcvu0{qx!J~$=6L*uLWJt+h7<=9JDpCkNQ&0g9dB>Of|E@Hz|&p{7JunWX* zf=M89SqgtIQC^tH-Xj4D1@%>gG4MVA)olAWnr;8DH=ZW)+kgOrDhJy>8zP793GsY^ zG|m5aMK^PHG33rvU^jb!eW;c{*~ouLXqW7IeX%*4kJ%ctjqy!Y7l6S88VMU@|HnA2 z=P`bYlnP$7=Tp0WIzAIWGRqx`jYsaoeN-vnk@@DW6oEQA9c_XB-c$F}(ashgK{N~Q zwbm}#5AIgOqn#`Q5S^;`!PpxO#J6@(%M^qoM9G4UVn|(FmMuX=DtBQ+JghSU%9Z}( zuwBB8Vb`_L2BYxx1PK58oFLpVDcj1Q1?WLmmE^3R0;FHL;9XbJS;;pERC$(^Dg>W^ zLe`un37~WIXl-=CBA|b|;0)i~o(bRllS{d-VmXF5+y^a8#PtQ6Xi#DvBNexOYuh0` ze;XyYu}(T@>gAFEXR&%D&0G9~;5FT&Sq?WFxrDHQZcS6?@!fp%RW7qQ9oK`~31O## zb(PMC`!=|T15xb?;wah$l-CAfK;jbf(Jwoy?X&S{-|G*I@Y4q_!k~%)B-!Iz)#;Xw zi7(4BMYA9WRBM~+H18XUwiLkcIO~aM-+>SqKl>*R;*i*~FEU3Mc;va~aLFtH2Ar{O zEdaq5#KLbnNf#M{snSSlCrggQEZ(h^{@67pUK#?pUY6seL^e!k5#&6Qulz{mn%YK@ zwma(o+3xr`rEx96<-eVz|I%jq(@s)ipFr0^yt5{8yBtZaGL&1MeYsYO?(OOziex`so}F)wn|VTE7Y!y{-V`X)&AiTIeOeyU))y+cl#w^RU{QfFsXb>m^M1Co!PAtt zDZj>?TBEnL;NpJ>wOWddXq}5m#TUQw$h>mFn| z6RyOLhQwxBiV()J6h8>q3kh$=zpE0g>IZR8Q-r&LZYv2xJLQ2VUJwL;x*O;EC>P_f zqS)lVE|jzU&R03Y$F?}a<<6fS>=uXn74bo*20>5U*zR=T|ExQKPIKx} zXcJX9HTI-$O*N1yr5rxmLqYt&<@kpxT_YNfbl!6ZmKI2rkW{PrU2q<_mr{7cD0h6K z$qm>`t~D2Gi~y>(5)K;FOd^y!z*YKO{JrJyHs(L6|RA?-h=i*NE=b0-h#kn2t5Fa z@&ZF6P%)a1zMX_|-K_n75zYB{#=_4gFs@+fPKVjg|qZY z>aB)#h{@trQ2&QNT%HH}Pg52a!h^fO{pH3iAquqT!fZXr11EBI19?2m;0DN|^(~Uc z!|b!!a0mnettJt{!}W4;t#X)$s}vE+H4;)K_LA{_t|GD&(1pLI?}Q}e2vaej8dn?) z$o5L;C3uMTUz?;A<&kr2$K0u(z4eA5nRkD4s-LO;gTtJqe=IpbJyO_Q)49*5l@SqZ zeM9HC=`KB-^#16C1z~?^X|B1~q3QYVcn=MhD`!idE&!V_R>p2aTo=hpgMufkdheif{sX zP@fwL9PDsg)`mLpYc;3=)f8?k(FLp+Wb$jzSV>*%$ZKuT*%l(G_W_h$2NB69;n9=3 zW7(QGVQ5)`SQV9)SwZ7_g#{3`p9lD=I+fHx6UV5z^vL2D!ygy?^wLej-&9_p`K|;7 zHmNqYyTs)@(zp8&Zb8`=P$iv$zjM=mL_#PmLs&F>yJ9(Rwd})L_j@Sv_}nF7l7`6q z^qM^$YfWY=-g>s>_0jfa14==OrfVJXP~M<-)|pa9Mnk_6|7ilu-1n5U@*wo0M!}04 zVI9uvWn9veOE(7|zk7K(ai2Z<9kPbBB5poVIo9bA zOrzE;g9?W@SREB4XvQ#QmH;8}W9bMw+V#<4@lPGX3kSenCm#Ds7UIQL#Pk1veRJE+ zMg&7&VGL{efiJ8iSNjg+1IR%%U0SU$l150vKdAT0`{L_?ZNwMm=5`$a8FZLLL)Eqv z2`{JtUQ}6d9T}NY;31>{9IXn{V40Lwm{nGRet0;SmSA*!9gw6H`{4J(|AD$@8G+wr z!X`)pD#Wa%fBkk(huHgzOdx(x0E=q^+D?fwDu)s5l=3`CyRrnS!?1iJ13}Wf6drAz z&tZ&Rxn=P19Z7_zv+v5m&C^`YFR05IJ7s@R`YHXgC06T>m)f69nEYt7SK_-j!Tk4Q zm4BP#^|8QwQE@}!B^#~T3vN;$ztX8o-cU6CnZ@oZww?H509c+36;x=*cogu4z?uI6 zWr%6QU+ltweqs|c7G=m`lDY0ph>LE7?22P_G(iCbjV zGW#U8^5TL?SI5@%I4R4@S{9&_gRWVK691r92-oKfIB{`LmbyL?fSkm=F7S{#3BZPL;dSG7Dd*X?=)29>`dn zSEY|e%yWF(6xz}2{@~k>DfCaP+bES4cx3CnGx@+O_cY9k`TUsulXTxSzvY>?guU(+ z7t*>lu2s&N7&Hs9-f@C1&@zHuNv|YJZqc;Fk=H4rDX>uE19i<{aU5?a2*qGZnpi!N zmgmd`3_SYmy7516uT7)Eg#UF@Zk3{VF^M;9`RJ{1`d|0g7NkD~1`RDylEChzlLEjf zWt-u~KyvqYI$*?#g z*No7|efK$Xdy<&i{7G_xApC`q>L5>6GB}d_2%>^_+rl@miZZ&M_0+s_rweth=6cqx zr|R?bbUMBPc)<`42HS1oZ3 ze@ig>lRXGz_Kw&sV-1zk)ah(-+|VR#ctheDThI-?xXxBJ0g z&0q{41vfm*S5l5%XFP^qKLI3E3Ej(?pKT=Q4j-2ivS6C$fN%(&XMDzXGd@}&AF0by$mFbV`! zjQ1;sQW3LNsa#lgo0s^nqbw62fawoQk<5p&HFtVpCwA!(CiL)qCB2k3G;Y3BDtVr~ zBK~|B6OP~AC^k*$zNIu6>JyM~d|%|Q@>dVG>{vc@Jt{Z}^p-cOYDvyO!^-54QYL3H ze=VK|LsRqGDaCC2JsK~;DE@}C!HF3$4b09eH@;3vi~C%8eHDha6M6WW%ByRYt0pX4 z;huL&S+DYeWp9~M2Qo!`^d4WmjhB}jd-F;A@IJDp{;^-8ZuxifuXTj!zhEkSinSPe z@{YNY`e{L3WSYqu`qX=Kt<(C_l}C)s3Mf`jR@jE!?s9);(dRoQwz0a1Q*m_0QLQEF zt0!aD%{kOLEM?W8v!31k9_bnTl&zNU+;8`rbH*6@bg4Mo7nwOIW44E6rd!f!q=Q+C z43DQt#l^9d`>O^XQ|`PYYlY1+^BXx5*@J<@X32!Qvd)uP(vyZD)MV*CM>qxt2|SSk zeqM*%MiGZMV!R^Q&ztfOc+27>i?KMi2c|CYB>9vNdX1+SV8Cnzx(QysUjlnAPU`ms z2brV9^Zf4R$2|e7{Ag3rJaQe6RNst>y&X`7CcZJv#vj2Amtd?&m@HeJu+M&J1q-~X zKL?;G&HA{}O2Wtj+;z7NLmcT2rHU0&gX?A7dPz8!f_DW$Gz+WPhtT&4{KR~B{8^dQ za~Ph?218thZvgpKFRFB5_9<1`b+}YO0Z4-pC31x!1tT1IV$WEwu1v_-H&Lx9*Q0WLs$l{GoQzr4w`&mhzRjvP|bXM|a(eSeM0Nxun2Z*Xv_u>2a7)xJu9)5DGjxb$X%Ra{UtmZ-9WG zT|~3HUYkUg4~m{2`fNy0=Zo!z=_B z13%W@$CwKyP#gfA0*pH@oe)mpkPl0%C@I33$>^jSYn&t}cIU1}n;5vUL6zhP4Aw@y z&%9QO4E=VUM;0qJ*;dXwJ;5d7jgm=61$|$wpL4u>HswGa&)of4Sfcpp4aH1nE#8dV zTrGp7HO^WKOEV+I5syL6Ht5aYewu-*DQ?c9Tr5~JxGMI*0g)qieqi(6 zxYPbucWD&??B5_->9myh-p@Lv)rH0@O7>o8JUD_+4q;E1wM6{jU7)ELk~+wNE$Z0~S^jq9x;{PUZ zV9b_N6z!psO7@^cXw8VW3Y$U{Z8Q!Qni(Rb@vXd#`-v^Dxh}KhO8`e1EU+@ArNDF)zbid#`oh*L~gBeO=f4{azK)wfu;i zM~Tspw8t5b!uk~Cz8E%W%{bzBrfky8qb1r72M1Z*iiw&3 z!+?#ZyTAH!qD%N{kvefRqhuWZ*BwfuhaJNhfx7J6Ly7||E> zVzo4Ww%YH8#qz#|eQjGP`|vM2Ig;O9+)^1)wZB&0(i>@qi8g~`v3Coz zh-StQ4I7Wp^=<=Hm5n`g%cck*fC!=!EyD06DHc?&PO4dh6AVXJ&Dg%!>wN6{GF!Aw zCy|}WDpR!Wlo{1&Y-WI@Wn&0-_xu8+XWT&$gR^!wcEkJtSyk%6=Vl9u@a-TzNNSX_ z!t@c$V+#E{ft$&ypK;o25u*gSA*z+ETcQI8TkKi+7l;ZfkK+cy*BX^{S*pcJRp6oC z2ZFs8C9fNq`#2Gyj*8NLSCRlY;9w~6u14HcBHm6^Ei1xC(~6g&CNA;M4G-fM7?nU{MsE0%sXmK0IaqbBFsq_=pCIX)~scMM%RS& z36xfi0BPV9+7#{7pu4k;57d}uvYArd_~+Z_?wAlILlghdyR41@t^`^06^NVqA=FOG+^UF!y&+h5~ zB$agY<=ZHwNfA-sYc1X=as=l)BYEsK&Xbb2n%W~+P)@rf&~-w%7&j4_b97Qs%vSEOK9!>8LqU8SF7KmA)zULQ zSmmffPh2c_QCi#5NDt;28KD|usJn*>-D|NLhl061svV7lszU+|PqL>3GdneHMbB=BWEl<(cFb)eZvi!rmc>app^yqsJ8X^xlRq$Wm_<-Hi6>8w<*CfQ+1^ zdh*NgTS6L}>?uCC4N7gv-*a%EF{LNL)~=GZ!-q+43Bb>1H88{uPe=46%Ra}MJ%0CD zPHi&k5vlv~8Nx@j!P0Bh_t={_>U#z)c|p><5igXDtV7oG41$3kUFx*IRycNMrN<9( zOR*%3s;lN$hO!@$Rli^(nu2|)*TuGn@K<_LyoifVcX`x%ya z6{Q`AU8hGbH#v!(Et!Z?$%JZ2rdu&PSuz{ZV;fxBr}eUM8zOPA9?NAAttQ_z6piJ> zV`aje{wTwxrE)qw3=6)L^0*5RgIJEoYw z1)JfY0=droWrSMJmM!sEt0fP(O~K2xt!ry?2*%&LkiA`tZFI*4wLDjlDb|}3Y*;`i z^7=hm9B25{CoDF*O>nuRJ(=gqIkSCfY;=zBj_CS}2A$z@2oO#+t-M1bMqe?yGL;ZL zO#N84_H-TKE+Lqq1#WWYONVs5qi5v(McTK#yI;C3dW}HU7B_{qkmYU(@Kn7J?9|(H zUh`=5O-ea{c0vGzNO-W<4Ay~s5&Lqu`Nd}OG3u*-TfjD{b&s$_ao-s_pD+vfF3aaQ zdCoynrq9{y4VwNd$a*umc2r41n?t4D-?dvKQA?|KkOs+$Smb(lf=?apCy6p9s#Zap zYPDEv?jM^iMwWOmUI0R?DKzXo>Jd-Z;W1gWFXf5wJCvx}_820o z0yf%45DsgMP-n8YM-sYmUDOe5It2u|BPaKzr}Y4i7(Pf(>%va)KLF$-79g$cnuf2D z!!1onUlcMNb{q@R^-j0&emjd>p=jQj@7guwVU>L@Wb`HT+>r3wiu3W|oh8EeNVAqq z!-rdN-nXS&dm8Re>2CM_<`8$^hl7!EY`)FNOytfeV!MhIvb)a1%Q*Cza4^J#eeq@8 z4=JqKiE=z!OMAZ7!F7!ujJfqXxrv2VHz`}Z^j`qQQ`Aq{NeP*hw&65cbLWgFsr*6J zpzHGryZ^^zE3Q5x!|FU*=sQk+g88CRPDja%$#(p*k*| zF5zhA|0!tu`W)4pPm^aSo2CY7(YIakWx;7DSUse$S3=lCr= z@@Ou*>SHL?x)uEoT<|4>88yBo+K0GKk;d2m8*8~5G<+}Fw zaT9^+zW5)g?xs(u?)RAQHc{P&8hKEyz$Jd}3QBd*Yt1dP`6!O{^NZgi$UH^2htG}& zgPpOA8MOb>2G>k_wipaHxw&c~Jk6Nf;+7t1oTC>een@+r=x6{Vnc5i3Y<+{UaM<*Z z;od$8J&9+>S)#zu5utHgG}rcR(_?REq#~um&-`y%_2L7K6~64)kPaxt70cLgbBkSM zRaD4W&Gvb(*+5qw4E3xTe8GN~GEITj~}SwuN9=S7t2mttW(yx84DMJcivT*fm?^EO&jR!-=`G_mkJgVY9nM_1v_bdA-g^ z6ZnFncX`Q~jp&H#?*9|IbfSun*fu$IUHzY6;DRtpIg{g2U9cUutt1LA^e-(7RM?*_ z3-58@!~Vp9cMGm$T^C=)udbz3KPU5$fSPqd^Lq$}9vx`~=8s@+ zUPjK?k1`>u&Z=YC>jE~SH8ARXDPQ+_8DiBF`-{?v+`2n~cu#(vX$egz?mjISXG*`E zJ>}$-)2Ss#3&VHM-$bsf+tqD@^{?t$#pi+@J{=k_U+fxPHX!|acwSVdbf3rJO$~F! zs4DadHNkbYKc!m#2p5ToTqb9MTf@u#z9Qb#;gK`aU&&vu@yuCh<(>#m@H<~Uo*a;rIor>2q3V74|LMk zT`;1Yq&J6b;ChAS+K~<)qr0CZWO^5>xH1>+*y!iOt)U~9=I@c)C)EhT%}3k@_|mZH zv`VV6nnku4i@*w1@LnEwL0js$V8ld!mqY#|9%ImdNeFkx{iky7M`I2|F99e4E|pNX zkXu0$(bLQiAls*KvyPUA6V0`2FiH2FKIlyF2nMz&KU3OzMJ;%Bgb0%)(I*2uE3(LK zIK6w!!dF_9%XD4l;WlhNT`cFc2BIEzqBWY~`;TsdLPUV;ZfVIkj~tKb=^1#_zs+8Q z8zHgGQ-fOVh}w(tw`c8TueX=uO7^G3t_R|zm_QsurS;MW7up=jI7;M5)Z$l?qmsrY zfHjZs0H<|~vHX3$!(FmNTF3R=%!f``htnLvwfUEC*((TvYGUFlmS`Kk#yozRkJ^QQ zK~t zh1`65miXvrU68Rd=IOfP>rTwN`17vX?BSks8=9gXcN&#<<+|fcjcI&_A~d;@w{_ib z+SJk~@!``q8Qe&nJoK}iyB*h6(*tk`5k*pU&r7+sb16>hz4jG6T_-&DfN8;K6PDt} zk}d<8ROeyaMrT{yI}-Y{L(JiLLyI+7EO$L!0(yq7z3(4*5?j_h;s*AT>3%pEF`B4q z7G~U#?V%sd?Wr%Kt(?qtpJ$&aY2!=N*wY>1Y1AyTF5abQ0q1x2@Mk|Vt)meWZ(@^<$t*!;N>s*Z}V?t@@OYY zZGnko3)yS;a5X#lN8Q%H{==5OY?DXvftl*EkF|%b&wNDgJu5h{GP5`oPBW@mxRq0Y z+w-!T*^)x3rk@Ul>&tzMZ2nEw`IH(riUIfXbsguCHF48ugo{y}?yGDQ9l7DYShF4# zcj**?W^FCIsH=XY_>CcT6$v#DzAg;re;49|EwSzF1_TWglZ6Unc03emH`@@Z&e8v& zPwY=@mn(ZdBI^zOP_6X58m?YShO30>;ZG!La>DwA+hVX?+cPUkuw6$oCt!g5<8U{A zq{?7kte!!!J;Jc4SSDRi)Ob#+gm+1c*B)JOh{~x<_jLl|!6)nkLZOh6S9wkAD)7O3 zrv%|tjX_K@=(_lE4(n*w@OA(j=<~pyd6Xu5EjgA$UiEBdrq@baskAAMO8bk_t(*|% z-iSpAI^z+dcU@2EYXVr&k-3|euN+IKu@lQA(y9$3Cie7vz&GpF#6zRf;3u+20;XrG zs`=xh|N6dSg*4%{Bmsi%iRk@b8d0%?-fAn-wSNLD>tz^0Rn2K!!vw=z;ts~E4}4Jn zpIFg=Bz=DvBr-}huVh|CSE4S?@r>k_6LP_JJk1~n0dml!s%Jb5x$4(C5EG{1Jxrpf z;kA4*EoH9NaJ;VI(s0?0Lv6trlKHI89+|JF@I zO;csePgk%Kf;mS&!!j0r4`VDNRRg@p&UnhdFWOsKaES8f|E~bb4H!rvSN`x`3i-}F zGH(#3;@l0XcCcrF&Y9yI*uqxH?_2M@#@UfC7vdADX(=@!280t<<@a;%+Ew7eB~E{# zB+vM*=Z}YZ>y*5Y3iM?mb1Taqq{5`ICeAi1XOzTC4*ce)TlQc^!-~bR&!c1&wFWmV zlRGT3sP|Y!sD3MbAn)|6Ok(@0;}=6t@^wEJQC)vM!~|Hd^WT!%cBg2hQ={rc+|x5X zi|5`*6BbOn#Rz%ZgRyR>gRf6Yy;3sNJni5gqpBh|m&aWGs#Yv4 z&C6(y->-DS8r0yPX{Eh;A*!-kmG~&B!&FPZ0`Ej+cpGJW>z55Xq)NvCP-w|>J&PRp z^rmG*9S4`6ksjG3dpp-2oc&{Rz)#iV=CvCmZBE&h?=`Uh_2L)VE`74mednhL%!<47 zL>Oi_Gi~IFRaZ==Zzy~6I{l|{R^$^N>#QTRO=7fC9Y*nKdnno#RyW`%?i{w}WtoF* zd3ctyV^jKb>YizF+lBwL4Igr^3oD_F@RZWNF=WFmiLHu10q}d&9odOeV{8VbicP)v zpOIA|1eo=kyz)V65a9^VdJZYe8s|%npTn)HIhy@fshgi$6fZ=lZ3Ngy93ugWKTT)- zN%wDkpS5Kluf7$cizUZo6Hja$Tm3>_-~58VahAh2YV)dIg=R&I znq;y;N8Ju3o$7mQuiu;_8}n{jw6`cKjpLZ?8z&glP7hh5K5ZMY!RJZ->R(+00#;va zP@4Vz{Wa#*Z;ZS==UGL@TUl7@wvy78F!f2hw}n;I)05?widIG3(~Uhe>X)hYLDjuJ z)ScFT0_%SQ>wg04f6|?{uJ8oe?kBMR|JAzFe?{Ye0_(R@;>IeBO z${9C2kTa0b+op(K6d^ZApY*kf5bI%0PvAZ=>Mq(7$`Jf*Jw?0Xub)(+)tfN2U9zMt zJ+ETklm8nk(VxKjpTPS6$HDp$Is)a>S&xXiBl&D}-n5XO*N(8(!82@?7Y-HW4xLov zPd-L<%k^>;F6_vy9d%6rG}AR_8yd}tsAPjtf#JxGi1}>Uw11~gUeK?Z*hDDUT{?Lt zl9Zo8{}8HQ?L3iey$p?l$Pw%3aH)&@EYfrHv-5iYwKaT`z~IGZJ*Q6DKC(^*SS=!-S(9UgbI?!x4V64Yg==3aHmf zx%M>v-Oo-yXh7k~Y^x_#ovZ@G!8^#BlVy&`@wj$y(l;p9?2OHEW7F>`f8}~>+W_hN z$vb>NjQ*DrdO@=_PqBc!gS?)pDOe3-8am+wkaNs+Ch_n;4h?K3G9K|?p43}IPhNKz ziLTY*Y7}Yas!Q>Uo_B!Avrr`qBp^>05OojoQ4ftfD~}|VGehQJA)yrcNZpK|9Nxs< zKw(>T(80821Ca~eng6X)(eqHbi(Y}=(;uVpa7GUbZU$~PvB=G*r!J#ZbN9uq1%Jr1 z1hOm-z+$^2aok!EOjzq!K%n&X+>BAklTu7-L}U4QwV=YW9baLERDx@F>4#-;TX{I4 zG!GHtAe=#Hr^PgEhLQafp`WzgO zmqlo8XUb7)Lc@{`rpSV8Vn!1*CP|!0w)DZ*I`1rK5Qv&a9H$-lKn{O3_Gb)^n9H5N zT;E`LjzDAWV}%qGQijKDmZICPV!@;FGQ zRvPL<+$Xa7!1`C;coeD@{_mzdcdN{y_et@BrHD=o{HAhkgr*}8pnm6#_K8b!312xY z#0?!Eu`q-9F|C^1OBiJSRIUYX{yx&Gpo%oKd`p`5grI;KJ4A9P;vm8_C2!EApkptzdDe$_!3A6!TK}%>G)49gw4ei* zLh)S&1WlxEsW@ASw%~c&!r#y9&YDq~?Bbr}77-n&+#$Fl(O70!Vz2CyYkMuFSHia9 z&N8?P6d07O(KA>Wr*MB?o|+Os_i5F!ceEkTHik11`^9-@0!>JCs^QaoVu7_TB6?FL zs9WB-C#Wj6mk?El>CxDaV4ODbD^xGlQg@wGLx%{}p6osYJE#D06{K^ia(45jryt5R z7pAs7R&q{l2v6Jcg2eh?fqR(52knssX+YGKz|FdL@KTRh>nQ!X;$D)UPnYehjAM7t ze$cm1&s!Z!&U_58cc;yDM~9=eVO^aj+0S#fr$`g~(%|88(Kn?^im_UZ79Nrx96e95 z@nTWXy}GBu3)gJEZtCqmVW_jPu#;CO!8hJD zoC$k{zgWA3bc5&=T@@s(Aj`#jhvFKebf!_>Ky|0eiuV%Q+y_5dgFr#a@@XG@m0Uy zeEOqkkkgjZ({nv{g!mp98nSkc?UGf$ICV+#Jw0r*wZtOc{ix}|pZ!Kr_xlI^czD&A zNTMPJ9XhhG`l`Z{H%81J^0Z{y70s`{eH{1Y)3X)BgRf_@#>L&ACGVeg#l(AL#dkA; zXzQbjG@ED0vyESf;kDiOvWL%|{B%Ir1Hb;~ z4-ak^t(g`0Ayv8s4)M-9~d)b&S+Y(%7 zyv|u0`1YHao^yY^7W;?Y8#gEQ`f^#lt}a3_JRqHQ+V?Dc?vf_r$SRXw>H~>O9Xnnv zYA~9z(D!sikZwYb)hV0b``ITCaaQ^8Cl=aL=4ZaPTZ%=? z8l08m(2OvVK6pKFCs3>GkwoBWx{V#ohKF$tI(x$KN%PlJOgs0G!EnHTmiJNmC#wb|lVv6d zQ@-yh?MzgyD?|svA;jW#bFWF~ZCC#cB8|RIH%aB#rDQX>QMZZbc>d=a|GE9u_kZRq z61AZTcM*S7g_KftFR4AU)2j##T3p|An#5)dB6BsM?7v425KpTil^xC@3JQi}HE?gS zc6iq=D05xt_C}eWYJJVSc1sD3F)q?|_erQ?tjv-t2dKv|PbsFKRo^!+$YJU0D&s90rFQPa+0s{+57(*2CV~E82!MpQ?!j||1g;BayBzN_nmAZOLepT5f?~Gd zLNng(c%vaJ#H#xILfW0}t#FJpr2By^Zn|oD&*}4ouLex)IqkE*{wMBQ=QXcIqI06% zw@fQp5%lMnCa zapj4+i1=JqO9C}3+KG>z79`i!1IwJUmhRsCuHEoN1VgcEe)VVaUPRT8moNd#Wo$&x zqXhO$;1;yzcjdETDoW2_b1(8`b#qZQT1_*^J^7f?Jo`oovl=(NhmZE5nVqNmhJ4eR zo9e$ExGnBU-KNZDgnos!$UzQj(h4L%%+dg~d%J{wava)X5uvttFn_#aRpKQ=W6oXf zWY>vT#XO{6s=O5m%ob1Fh|O1SI89=%-rR93PiB$Nd9x+7HxBXj)9~9ftJ$5l`CBLm z91_|Zxz+}6-i53hcbY7-YQk}Xsc(YDk1n&BzYUYTxhkUood!S2SXvYih%JLqWy=&KP~*vl^gY{<*$7f|H);U zV&ORO>Gn8EbQO4NhL7`QCn0tu>aF2%j^((|hGBItrt0mndM6IXl@L`DHBc>SQtj74 z=AhHF@n$n|lhj(C7H5&oIHZ<2i(qGI)HII7hsS@{?z%6&ClY*i?AWo(fhu5f*zo=? zFHp=IWP)A18e2+eBq^8B!NE`2J30yTjl(L|ieDaEJ!145kK)it;>}X!G%Rx6BYeEe z^V3}a;og1asG^Fh{NLUZX$E5xwYK=5Y?u+s!vnhlOB-sTwCl6s9OjACEjTiz8qKbt z-*B}_V7B1^74D3N%x(;HDa)Km=If$$fpmKvW=ffN&U6FWuMy@KKRzY>drNDRzaYH(uiJ)XhEAwb*CknB4vO z#i5(I-uFFe+o^gV3ZJy_ESpa$XI#qHmaoK`nME$Paj71)A*7cFXWhEfD zaT_kJX5obfsw(Izo*|k8LFpNr>&84MD#*R&v~yb9i19PxHcRW*0yu6B?9HdU*7MXd zR8HidgITj9&IY*=nI}-MW#JP*dASB$CSR(1uy=5p*`HDuvMyw1{#yZD)3I5pq1aXc z%eHsizC4HCb6ue8gI{{ID83PG-%(^A*b0nw$;m6QKdz$h+mF&tzLde4qo9(f`>G61 zMJ1>ZXj|}c`+wAiXTr!0LInd^HS$GHtQt@g9i8IEM$T!kUC zDgw#G9Cr?vy@w;euJ?vVP_>_znt`+~HEZR=_ zh!CiT@UW2q%QVP{rCC_Dbu`PN{NwJgnf4r9 zI?BnA4?0*{?UM=ntZu&%2S z`z-hs6B3-v(=(WIko+8Rrs+{>qaPW`PPb6U!;vF`YUzb-UJ#Z_Ek!BoIbxcWD7dtk zvr?pNT3bsNcuPQl{$>ea?gG%Mi(n6Vmg;Dfyj2a1r7hKwe6@|}q-b)_=%>Oc& zyu68Vi_PI{VaJ!x%fBJ3T-6c;_oqqKaZ7mzSnI+P?9R`?S`s~lE1eDWgz!cOCv3S+ zQ~yeTpLU5#+5SMH_)cE>B#M8N)L0+w4L6ESbK*%N$5*viR!-@@#xKWBoYzY6vhq*0 z@sDBV$tJDr_742a<51W5eoGEt>0y_z>vEq9l$VD5f=^1VkZFO3_*^fWeewW>u#n!7 zL|ajn;+WRnw#9&6aU8WZQ6dgFG*FgF={}b-{Z#qrh#TQYw6y2Wh)D^YkR(dAa%Pi= z-Mw!56Mm@^e3gmCOT76f{(8Oq^|l#f$-FrV0kc}n^p4>=4M+G%TewVFf%OzM+?)B5 zEUNi2sq*s3uqAWvpCZe8XX2zz?s+-BmKFL~hltc@lIf@i2X3KfY=&bWatC~9R*|}n z

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

    y(Il#;f;Rvoj(Cw2DxHCaTGu^W#N1tEf` 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

    |dPXWN$9iKFi@B1OPRP{Zv;Kq0gh! z?n3NydOnZ&HNNp`5(Rq=X}D}(YEQd;(UKA0lGA0XIrIo(uK#BUx5p|?ozI*iQRPBa zLD^31nQ!vXiAjcLFI}U8H|Y;3k3dz#pSJ70rF8EOt=0lAV_1*Yq%&L_?Mj0)he{*7 zF59*AzO^(;_S~-fmQT5WLO!XjG!EMlu z16P&$Nt&+n8_H;YsLnI&o3P~~WT6%R4>>L!p3iq5`Wet+SxhHyDB%*A)ksBya@;)& zN>ityGvR>8Z>GGKm4s}QU#5e)hAB}ux*Wa9O>rq81)cfMUOil24=R#^}=EKwOoXxx0Ja*G3uu^|;;n&;_S?`MgvX-d|*BY7Oz;G>^0zhCmvH_=ZiTe zd;7TCupWL4kAo!Y+?#_(p!xlM6J@Ma=>-$iP(LrY?Ou!xuY>6)eH`BtzJ{5s=E zk)!g;eA=Z=nj*~0ze1ZCAg^!`slwDIv!nh3`5lkAQbW}r7ucbnM}7haSei3o?7thY zBxCXQX1!g>c5^xE{rw{v8k=XKV&E_7@3{QqV`(A$JIs6@W|=Akg1YYJ+W<~&2AxNW z>*>v-ZqvPB^-G)CXKt_b0W9apRO1DQi9-ED%uvauNE?GQf%k`J5<^$Ynze+}wQjUF zbA5AJ=b<-TaEBS`x+V-N+a18AleNutP)>`wN)u?H=ee3`o&+C?#t^e*KNxku-~Sss z{O8?)W;c=ZF*!AEoqj!gk9Cih#RKH$UvU9TvnVlea>}!Wl?YM zX8PP@>@V$^HvN?+9WeFOK}Wlk$86SA_r4`)TpV{OVoO4P&j&eZnPlhDInLhjG|zq! z&!ZgkxB6A#Njgr#+0WJDDx%14+%T19r72Pe>a0^k#RWbzHtCEIQ8Xx%(%;gSIeFPK zZj~+}vt<(b!FVN@=z1=Fn3nDVBi$L{FX2s#1s>DMLR?xknF|H!s_N$+i2L1$Hp?Ji z9!T6kQ$Xmr=H{K{%lwt+l{Tb=FXOH~;+ts?7L#*I>Ot_!OT(4r9hnQZs}*2E{ode7 zqr$>08{A>aNfJEL?C@l9I%gKWN%8Ss&F!eQD)ZKSfa3{g!@0U{uz)?0n6cY4X|qN7 zLozkK1hVw0yq*d@thw**=}Hy+Tn&{dq1(-)>R^H7@?&2_qQ%Hy=~F$%4cQQHn`3iF z9$n4PACbL}GhbPfQGW^>Q|)~x8{NUUdqai^3Tn zUM^Ez##%&*eZ-!@v{Wa(Hho6nuNA(I#`>v4rSaW{F|TsoWUhrlMgdZvzIr!E`*pIS zrajt~2o`#{(%rqVezcyB-s&@J0wzeBwyxZN8fk)Wtb|3>V9T7P#JXWBpXZa2G{kIkO+H!lmM1kG1BRQ$|~S%^#k-*7@Q+#GHcr;ntT zU(A|;94-PrEy&JaHMOCVZLT-u_}vbYe%#~X4wg`oGuz3f!Y&#wkF5VuUT2wr9(pb6 zL>Vx&e9GELPd)dEI@v!7dGkt8vk1&>^Op45v3Ph+KA>{UWfsBvZ0pV*6DM2AlGl|m zs_mr!5~07L*NGX8aM@SXEb1Zq#3zuD=XX#B|{9#I>Ktd?B81QH%Dt!Tu<=I&9=R)V4ath*R z-qg6G1%Kp7!45sM`R8IlnilEpk)A4vv#nqBZickl#*T#OJVNl0o(lI3)3R~QcdAX* znK2k?%d^PoX{FiI2a;s;Jjw~HbdeMSSQTCXQl{%~3_Hr=cH7I_eSK!cOE_zt2@w~& z^Z;S4Cam=7$jAp@dXJ@d7@&zps&za-8qbJy9*%L-4#+m=z^tm_;wg|SFr`)NHIRT2 zSkcn+_Es@+69vtpG?qJmo2>XvX607d&LI$8F~GsBr~>pC*x<%(5vOg+HW%74M#UwS zxO;#JCCmP#=)}^<8kR;!s9NW;WYaHw+72(n<{^z&LvMH?XXz{Vu(PGo*=oL1aOpzF zgmiIUS?YHX@Q{!MBRVr;++>q!;2z=KY366;J3dwtm7%o6)^VspC}VeO8hc-nNo6&$ zsj(T%;%Qd*({z-UocW3-FSVq)E*)P8S2W`$P1el67X<$x)g~Q*^vEkm-!7f`UBRYn zJhZ)d-7wF8Y}3Uu<)&al5SQ>ydON7jD?R;&Xfo|!OFnFmzQ)nl%}Ka~gr%T~cf_rK zk2!p$4Yl6*e!v$i7E6TlNJ3zcC92MVm-{K zg|l`fjHh-ovSjNu`O?Gcgqog^dJV3t-j&xb#NsI7x&JWu{ClmrMbgRw!F8K1_PWLR z-p<4axv9GaL|^SGKgA@3ug~W~g@JF-K#q@Mx=%84xOtRFS3=VG_dhG)EWmJhcCU{z zl{Dh%^Y%;a@Zy|rMkYw@5|sj#heb$*tuUV9;RDu+d&14)A57_(F4EgfdON?Jq~^sO1gyR^S7J?=qX=o&J5D#E zlZf9x|!g;f0)jg%fDcKuRn6gdyzMWk=+4*6|PXJ)c$2*b)dxDQA|Ev#yIrL7z3|m zsH7-tj1t!Cf7(OeFnETyQ1SwPu(sR0a zhBp%R5a3rljStXLxUC%y^2?NK%s{%l%F;hNR-mn_L^5lo1nq+CIL!=nzx&pk8_gj zG)bwbNxuFuECpr-5!LBI_Ce%7a6xFLurnJ>LbB8fYm-4@w?V3DM`MGQ_1VzKM1K5- z#-X;>RK>8MLC;g^f7&j>e{LMbt|(y|k*<_5=UsD>se-mT|9IA=<>i5gmEt{$iHgx| z1)|r<3Q^17UHL*&Lm|Jw{5lHHYLm3lqy*YGv+JAT+b3r;w6TIz@awsHCR zpxWzJgoaH*A4;B;YL}|qbb&!wK@#=cb4mRfon@|DKjFotdISlS9mQgpPU5ikB!>5G z7o{Mc3c)5`g2Sz!|5{9|zO#2NH6DU`6ZpzZmT7Wj;unuED(a2-5(~S$L3qSE3!)gY1WU1-s_77f0~>8*T4HeHJtYBYYb7~^o7=ErD0vUQl-%oTFj?a6Jci5@NuT3-+lVH zqApH9suz7+e{GY6D?u|Lj|g!?eHjbk^+)f$d8fQvElYmUIQmMM?&;h!5gt0LOMdC` z(!eo(oW(}M9v{Tv{EsjHUp+S%TWI{QL%qAoR)Ec^pUo)Q(OvEJC{0X>}+UcZ(Ygaq@F0>Voy>3j3mw{*$$B=B*U2-pn_VA^! zhQIo5XE&zk&kOm9sz~vP1IAx>4We!)&GCb%g5K^nD3jM&usfv#rFy;2fiQ`GCU`-E zmr};g7RhZD@tpe6CVBnAwC>&Ei(1^q_aI{DHm+g^`D^6(?vaZ(1+k-y{5^GcLy z03NVmUi*LURneW)!d-A-9I@Vj)ycv!mtsPiP@3^)W6BA#CKLL*mX~PzVGGJIU9`)? zV9SdUMRdVAH;~JX$*o3rMvnxL$8VTXJOWy@yME5;#;<`s``PP{m4AU;#8_P#+%^e( z@B^2q@8dzx=g2X7++8$7tk>ddw6S_>u~WLktbRiv-HfzWyXfr*kK@C})S(2ksAJnE zZt&uxS9zsgOF?!E2bom{gU_`ER#HPwI6P-NUSAj1ACahHx&Hz^pE&^k&TqJNy!Tpu zvnAkQh=c{uadQ$sh)&}TRo{KS3mOcw(ED}UV*g$tg~itj-AK8QM7aTayxa)32Jlk?@Mu?49y4DuR#nisM;&FjeLSiLf7bbxdzUO$WkNS+smFLGbw4g{jlTRb-Abr z;?#mL2w7k-=PkrbC6j0A>k5IoJI&2Lvu;kYbyjyFE4gTsk+lgQ0r_QgwYDB;t#>2_ zl{!&6d9J=|jDA@Eqcz?t-9AMSIjE636rb{NBdnIY_1Q`1{0(~LWL-bQ-PKVkcgoa! z$lcyk{`uKC*jKzMuI(+?qEK?+%Q_GU-A)}$+=X3@EWjFsdFKf2JJ<6!*C%r~Oj~Nc zb@a&-^ZUvfyr{$Z8v%HSwvR$Oh_I27ijL$JzU!^Z#J`Ng<{`aiZfd(|Ja@8#ysZ267tFXls5xaUqG zos_sH;L><&KCg-0yodg)q#v}x=>X?Oew3*X4 zpi))7P&9`-4<3&~4Lg^KSmMeQFN-tIs`nRl8V)X9Q*r~xTDPDqH3y&OMmZ?k0^mx#O&HT4ZJkjeUTpOe(R8+mYnQsUf3G?i987Jh9DB#1{&h$##?b%c5jx zDM7U^Mv2gZ?Y>S6R4{nrzfsHlKNS-O8CP$c{lQw#0(80=*u^p7y=gzw3mh$r`vT3ZygVjk|yeY36|>&^I-toW&zBLx)bY|tD4FV{WJn`Bp5tg^)@<1 zIY}OAP0A48Rby84Klft&e?7MQzj%WJnl>!b+LB0fg_O&e)9{DuJA@9l39INgh{&@~ zMB9sDBCbxukv17rsVu^z-wp@k0-}riXpIBPA4RhYQ@_{9_9$O_i@#*u4*!W=aHZv7 zfppHFEAi9M8b6oV;lRW!8$E?WeBhHuWkgZ;BB{QLlKRsD>JZjzrlJ9CI@BeFYYe5k>`xmG#18G5fcDsWtF}Y)#Tu!`BYD6%}NN{!AEl5W zoNiv*>B?EM+Ua{Z*m$#7{aS9D6t5TLJ#Em%QJ-;;!_bqr zu(wVTAr%xg+oBTzcD0Q}r8`Z0Tw^H^6c8ya88rD!cUs*;u>d3vqGE^kbnszA&#-DE zaS-sZAAE8688RHauOWr^>$SlLxaoEI4fPdK8@>4h>}W&N}g#%lt(51B^;!Pv4&H|m43)6H3N{`=g!_0e-fZz4tG>80}WMS2~;nz>y zUd>mhddkEnV$rJ&7F`x$S(m>8MRAdZJ6TBQGH{&jA^-c_P_<~ok}DEgyaQSTam*3g z_x%kR<}JN?2N$V>}Kb=Jfd z!q#Q`zz}mxb(o^7b@i@~jF=~^L6b{ktzVV9|20prVZiJ|HTS%)$~}pZK%7kn;qotl znRn&YN!g~fFw)zzJ4kywryxqoLX7qHD}Z*9Pf=J}Ern~odM$Lu+f8vObVrok-DfwEkv1(2vLSg$;CWI5)tNMHS$a` zl84R1X4Oootp`?n=>DDS-|LV2+<)BX+<)AEf4_fx&*yy4`JV6R{rbG$<17~<;Ca6M zP>L6Po|;=Os#838t`mC+=x|T?z8LJDMb@bfZ+7<4^YKy5@-fDMmSU6EJMRW5KxMTz zqJDv-=Ai)ANh+^i;iRz27Ee&(O@uCYYP2LPR(T#m+Or>iByp;sBArFVuabM-^%VO) z=Ha0375N717O!x0Bcjz$rv!anTBv;dR&d4<|MCh5ig<%N1DzrQMlRPKoQtFgK76?A zRUm>9?n%{<9!DE~eOed4qWuLRog%K)=-% zdG}3}&zZINl;x_Zf4#8hp=we$EfuFlc9WDUHIl@#UVmCjBcR3-y~XbqrI)xzZ(|5FbT)5}5#1u7sU7

    ~x!(?Ei2Uv027QsySNQ8Y6x z1*}z4QgpL%{(&6Mk4DGc+@(x@py83tpMv{)0U_I5rX#bTQn+|SgqJv9;EU8-SByP)<+y% zly$~iw0z5A)aZa|Zl4b3VsBVa@R6~cIQkTA`5r@&%*5Ds;Aouf6?}fl?C&<$=flpS z-uEcS-PXyg6Y75Cr5Wn0akvM03Yhq_Qe(B4A%J$hTGzpXHYnn{W9*WFyp~+fzO1QZ zMx{G*{IXW9834TySYV2vFzLG@f65q6>Ma&vy$+{Rc^l%Paf>oLlHHn6u3wpt~-p~5tQUAbAU zPYB#&ZV7jprl8A7{PW2um;^n|(A(eDI@|JS5@Em1tlQWM-+HJwDlj=4294|XsX0v|F5RLrU%D-2uPORou5W#K&|p za0a_qJ@%F2Cam zy#OIoe}Po9$LGZpACJt32cEXnq}MF^MLZg-zQo?CB8IQTq+!@-L!6L9P=F>n>0;Lc z2-;xsbHM0#^O%h*g_~Gc!^*tNOXK3AgNG|k60o6)EMSU&khrZ%%9>B@O>UMP0F=G; zXY2cQxVtco=5Yuwos->PtbXf1Ex6<3wR0#MYeiujsBOcA4JXrKSQTzy*sL*Q+_+8x zFUUNg|7v-{&})A_BLlh`^jYrgkmlFW^$=a`!M*ulUwjn|wh#MiZr>UciSj0#!^wn#gk z=tV-H3h!{pR}>8SYMHHkU!%B|)}XlfqGtu~J{kQXPOYWhzF?&IBx^_T6aCc=yF~;| z$^;54b(ax{g&J&X==pVnkH|;urfs3~0md$I@TUo(k@!vfEL3jCzueKLK5cy!{Bvsm z-cbD~9H(3TLXXO-FCmC~nx6Kj#{R;$|3-TJyZ*!f*Z)q({FiG2&bLkZmXR^sI9Pt% zExOsZaCw1XTs(8*eM4nQ!q(ZaD-p%f$XDZZVk8M=b7+^@r)G@q=2MY=7p(t`bO%0} z_f(32AwzS*nWpG0 zk%pI&;nZXbYW$z!jRkRCcJ~hsf`S4L?6wy8}uR5cR-1a>Ztzmo$+h9!Y;%q|4R&ii(p&%l literal 0 HcmV?d00001 diff --git a/BenchmarkScripts/ScanNet200/preprocess_scannet200.py b/BenchmarkScripts/ScanNet200/preprocess_scannet200.py new file mode 100644 index 0000000..6f0e2bb --- /dev/null +++ b/BenchmarkScripts/ScanNet200/preprocess_scannet200.py @@ -0,0 +1,133 @@ +import warnings +warnings.filterwarnings("ignore", category=DeprecationWarning) + +import sys +import os +import argparse +import glob +import json +from concurrent.futures import ProcessPoolExecutor +from itertools import repeat + +# Load external constants +from scannet200_constants import * +from scannet200_splits import * +from utils import * + +CLOUD_FILE_PFIX = '_vh_clean_2' +SEGMENTS_FILE_PFIX = '.0.010000.segs.json' +AGGREGATIONS_FILE_PFIX = '.aggregation.json' +CLASS_IDs = VALID_CLASS_IDS_200 + +def handle_process(scene_path, output_path, labels_pd, train_scenes, val_scenes): + + scene_id = scene_path.split('/')[-1] + mesh_path = os.path.join(scene_path, f'{scene_id}{CLOUD_FILE_PFIX}.ply') + segments_file = os.path.join(scene_path, f'{scene_id}{CLOUD_FILE_PFIX}{SEGMENTS_FILE_PFIX}') + aggregations_file = os.path.join(scene_path, f'{scene_id}{AGGREGATIONS_FILE_PFIX}') + info_file = os.path.join(scene_path, f'{scene_id}.txt') + + if scene_id in train_scenes: + output_file = os.path.join(output_path, 'train', f'{scene_id}.ply') + split_name = 'train' + elif scene_id in val_scenes: + output_file = os.path.join(output_path, 'val', f'{scene_id}.ply') + split_name = 'val' + else: + output_file = os.path.join(output_path, 'test', f'{scene_id}.ply') + split_name = 'test' + + print('Processing: ', scene_id, 'in ', split_name) + + # Rotating the mesh to axis aligned + info_dict = {} + with open(info_file) as f: + for line in f: + (key, val) = line.split(" = ") + info_dict[key] = np.fromstring(val, sep=' ') + + if 'axisAlignment' not in info_dict: + rot_matrix = np.identity(4) + else: + rot_matrix = info_dict['axisAlignment'].reshape(4, 4) + + pointcloud, faces_array = read_plymesh(mesh_path) + points = pointcloud[:, :3] + colors = pointcloud[:, 3:6] + alphas = pointcloud[:, -1] + + # Rotate PC to axis aligned + r_points = pointcloud[:, :3].transpose() + r_points = np.append(r_points, np.ones((1, r_points.shape[1])), axis=0) + r_points = np.dot(rot_matrix, r_points) + pointcloud = np.append(r_points.transpose()[:, :3], pointcloud[:, 3:], axis=1) + + # Load segments file + with open(segments_file) as f: + segments = json.load(f) + seg_indices = np.array(segments['segIndices']) + + # Load Aggregations file + with open(aggregations_file) as f: + aggregation = json.load(f) + seg_groups = np.array(aggregation['segGroups']) + + # Generate new labels + labelled_pc = np.zeros((pointcloud.shape[0], 1)) + instance_ids = np.zeros((pointcloud.shape[0], 1)) + for group in seg_groups: + segment_points, p_inds, label_id = point_indices_from_group(pointcloud, seg_indices, group, labels_pd, CLASS_IDs) + + labelled_pc[p_inds] = label_id + instance_ids[p_inds] = group['id'] + + labelled_pc = labelled_pc.astype(int) + instance_ids = instance_ids.astype(int) + + # Concatenate with original cloud + processed_vertices = np.hstack((pointcloud[:, :6], labelled_pc, instance_ids)) + + if (np.any(np.isnan(processed_vertices)) or not np.all(np.isfinite(processed_vertices))): + raise ValueError('nan') + + # Save processed mesh + save_plymesh(processed_vertices, faces_array, output_file, with_label=True, verbose=False) + + # Uncomment the following lines if saving the output in voxelized point cloud + # quantized_points, quantized_scene_colors, quantized_labels, quantized_instances = voxelize_pointcloud(points, colors, labelled_pc, instance_ids, faces_array) + # quantized_pc = np.hstack((quantized_points, quantized_scene_colors, quantized_labels, quantized_instances)) + # save_plymesh(quantized_pc, faces=None, filename=output_file, with_label=True, verbose=False) + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--dataset_root', required=True, help='Path to the ScanNet dataset containing scene folders') + parser.add_argument('--output_root', required=True, help='Output path where train/val folders will be located') + parser.add_argument('--label_map_file', required=True, help='path to scannetv2-labels.combined.tsv') + parser.add_argument('--num_workers', default=4, type=int, help='The number of parallel workers') + parser.add_argument('--train_val_splits_path', default='../../Tasks/Benchmark', help='Where the txt files with the train/val splits live') + config = parser.parse_args() + + # Load label map + labels_pd = pd.read_csv(config.label_map_file, sep='\t', header=0) + + # Load train/val splits + with open(config.train_val_splits_path + '/scannetv2_train.txt') as train_file: + train_scenes = train_file.read().splitlines() + with open(config.train_val_splits_path + '/scannetv2_val.txt') as val_file: + val_scenes = val_file.read().splitlines() + + # Create output directories + train_output_dir = os.path.join(config.output_root, 'train') + if not os.path.exists(train_output_dir): + os.makedirs(train_output_dir) + val_output_dir = os.path.join(config.output_root, 'val') + if not os.path.exists(val_output_dir): + os.makedirs(val_output_dir) + + # Load scene paths + scene_paths = sorted(glob.glob(config.dataset_root + '/*')) + + # Preprocess data. + pool = ProcessPoolExecutor(max_workers=config.num_workers) + print('Processing scenes...') + _ = list(pool.map(handle_process, scene_paths, repeat(config.output_root), repeat(labels_pd), repeat(train_scenes), repeat(val_scenes))) diff --git a/BenchmarkScripts/ScanNet200/scannet200_constants.py b/BenchmarkScripts/ScanNet200/scannet200_constants.py new file mode 100644 index 0000000..388c497 --- /dev/null +++ b/BenchmarkScripts/ScanNet200/scannet200_constants.py @@ -0,0 +1,277 @@ +### ScanNet Benchmark constants ### +VALID_CLASS_IDS_20 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 24, 28, 33, 34, 36, 39) + +CLASS_LABELS_20 = ('wall', 'floor', 'cabinet', 'bed', 'chair', 'sofa', 'table', 'door', 'window', + 'bookshelf', 'picture', 'counter', 'desk', 'curtain', 'refrigerator', + 'shower curtain', 'toilet', 'sink', 'bathtub', 'otherfurniture') + +SCANNET_COLOR_MAP_20 = { + 0: (0., 0., 0.), + 1: (174., 199., 232.), + 2: (152., 223., 138.), + 3: (31., 119., 180.), + 4: (255., 187., 120.), + 5: (188., 189., 34.), + 6: (140., 86., 75.), + 7: (255., 152., 150.), + 8: (214., 39., 40.), + 9: (197., 176., 213.), + 10: (148., 103., 189.), + 11: (196., 156., 148.), + 12: (23., 190., 207.), + 14: (247., 182., 210.), + 15: (66., 188., 102.), + 16: (219., 219., 141.), + 17: (140., 57., 197.), + 18: (202., 185., 52.), + 19: (51., 176., 203.), + 20: (200., 54., 131.), + 21: (92., 193., 61.), + 22: (78., 71., 183.), + 23: (172., 114., 82.), + 24: (255., 127., 14.), + 25: (91., 163., 138.), + 26: (153., 98., 156.), + 27: (140., 153., 101.), + 28: (158., 218., 229.), + 29: (100., 125., 154.), + 30: (178., 127., 135.), + 32: (146., 111., 194.), + 33: (44., 160., 44.), + 34: (112., 128., 144.), + 35: (96., 207., 209.), + 36: (227., 119., 194.), + 37: (213., 92., 176.), + 38: (94., 106., 211.), + 39: (82., 84., 163.), + 40: (100., 85., 144.), +} + +### ScanNet200 Benchmark constants ### +VALID_CLASS_IDS_200 = ( +1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 26, 27, 28, 29, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, +72, 73, 74, 75, 76, 77, 78, 79, 80, 82, 84, 86, 87, 88, 89, 90, 93, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 110, 112, 115, 116, 118, 120, 121, 122, 125, 128, 130, 131, 132, 134, 136, 138, 139, 140, 141, 145, 148, 154, +155, 156, 157, 159, 161, 163, 165, 166, 168, 169, 170, 177, 180, 185, 188, 191, 193, 195, 202, 208, 213, 214, 221, 229, 230, 232, 233, 242, 250, 261, 264, 276, 283, 286, 300, 304, 312, 323, 325, 331, 342, 356, 370, 392, 395, 399, 408, 417, +488, 540, 562, 570, 572, 581, 609, 748, 776, 1156, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191) + +CLASS_LABELS_200 = ( +'wall', 'chair', 'floor', 'table', 'door', 'couch', 'cabinet', 'shelf', 'desk', 'office chair', 'bed', 'pillow', 'sink', 'picture', 'window', 'toilet', 'bookshelf', 'monitor', 'curtain', 'book', 'armchair', 'coffee table', 'box', +'refrigerator', 'lamp', 'kitchen cabinet', 'towel', 'clothes', 'tv', 'nightstand', 'counter', 'dresser', 'stool', 'cushion', 'plant', 'ceiling', 'bathtub', 'end table', 'dining table', 'keyboard', 'bag', 'backpack', 'toilet paper', +'printer', 'tv stand', 'whiteboard', 'blanket', 'shower curtain', 'trash can', 'closet', 'stairs', 'microwave', 'stove', 'shoe', 'computer tower', 'bottle', 'bin', 'ottoman', 'bench', 'board', 'washing machine', 'mirror', 'copier', +'basket', 'sofa chair', 'file cabinet', 'fan', 'laptop', 'shower', 'paper', 'person', 'paper towel dispenser', 'oven', 'blinds', 'rack', 'plate', 'blackboard', 'piano', 'suitcase', 'rail', 'radiator', 'recycling bin', 'container', +'wardrobe', 'soap dispenser', 'telephone', 'bucket', 'clock', 'stand', 'light', 'laundry basket', 'pipe', 'clothes dryer', 'guitar', 'toilet paper holder', 'seat', 'speaker', 'column', 'bicycle', 'ladder', 'bathroom stall', 'shower wall', +'cup', 'jacket', 'storage bin', 'coffee maker', 'dishwasher', 'paper towel roll', 'machine', 'mat', 'windowsill', 'bar', 'toaster', 'bulletin board', 'ironing board', 'fireplace', 'soap dish', 'kitchen counter', 'doorframe', +'toilet paper dispenser', 'mini fridge', 'fire extinguisher', 'ball', 'hat', 'shower curtain rod', 'water cooler', 'paper cutter', 'tray', 'shower door', 'pillar', 'ledge', 'toaster oven', 'mouse', 'toilet seat cover dispenser', +'furniture', 'cart', 'storage container', 'scale', 'tissue box', 'light switch', 'crate', 'power outlet', 'decoration', 'sign', 'projector', 'closet door', 'vacuum cleaner', 'candle', 'plunger', 'stuffed animal', 'headphones', 'dish rack', +'broom', 'guitar case', 'range hood', 'dustpan', 'hair dryer', 'water bottle', 'handicap bar', 'purse', 'vent', 'shower floor', 'water pitcher', 'mailbox', 'bowl', 'paper bag', 'alarm clock', 'music stand', 'projector screen', 'divider', +'laundry detergent', 'bathroom counter', 'object', 'bathroom vanity', 'closet wall', 'laundry hamper', 'bathroom stall door', 'ceiling light', 'trash bin', 'dumbbell', 'stair rail', 'tube', 'bathroom cabinet', 'cd case', 'closet rod', +'coffee kettle', 'structure', 'shower head', 'keyboard piano', 'case of water bottles', 'coat rack', 'storage organizer', 'folded chair', 'fire alarm', 'power strip', 'calendar', 'poster', 'potted plant', 'luggage', 'mattress') + +SCANNET_COLOR_MAP_200 = { +0: (0., 0., 0.), +1: (174., 199., 232.), +2: (188., 189., 34.), +3: (152., 223., 138.), +4: (255., 152., 150.), +5: (214., 39., 40.), +6: (91., 135., 229.), +7: (31., 119., 180.), +8: (229., 91., 104.), +9: (247., 182., 210.), +10: (91., 229., 110.), +11: (255., 187., 120.), +13: (141., 91., 229.), +14: (112., 128., 144.), +15: (196., 156., 148.), +16: (197., 176., 213.), +17: (44., 160., 44.), +18: (148., 103., 189.), +19: (229., 91., 223.), +21: (219., 219., 141.), +22: (192., 229., 91.), +23: (88., 218., 137.), +24: (58., 98., 137.), +26: (177., 82., 239.), +27: (255., 127., 14.), +28: (237., 204., 37.), +29: (41., 206., 32.), +31: (62., 143., 148.), +32: (34., 14., 130.), +33: (143., 45., 115.), +34: (137., 63., 14.), +35: (23., 190., 207.), +36: (16., 212., 139.), +38: (90., 119., 201.), +39: (125., 30., 141.), +40: (150., 53., 56.), +41: (186., 197., 62.), +42: (227., 119., 194.), +44: (38., 100., 128.), +45: (120., 31., 243.), +46: (154., 59., 103.), +47: (169., 137., 78.), +48: (143., 245., 111.), +49: (37., 230., 205.), +50: (14., 16., 155.), +51: (196., 51., 182.), +52: (237., 80., 38.), +54: (138., 175., 62.), +55: (158., 218., 229.), +56: (38., 96., 167.), +57: (190., 77., 246.), +58: (208., 49., 84.), +59: (208., 193., 72.), +62: (55., 220., 57.), +63: (10., 125., 140.), +64: (76., 38., 202.), +65: (191., 28., 135.), +66: (211., 120., 42.), +67: (118., 174., 76.), +68: (17., 242., 171.), +69: (20., 65., 247.), +70: (208., 61., 222.), +71: (162., 62., 60.), +72: (210., 235., 62.), +73: (45., 152., 72.), +74: (35., 107., 149.), +75: (160., 89., 237.), +76: (227., 56., 125.), +77: (169., 143., 81.), +78: (42., 143., 20.), +79: (25., 160., 151.), +80: (82., 75., 227.), +82: (253., 59., 222.), +84: (240., 130., 89.), +86: (123., 172., 47.), +87: (71., 194., 133.), +88: (24., 94., 205.), +89: (134., 16., 179.), +90: (159., 32., 52.), +93: (213., 208., 88.), +95: (64., 158., 70.), +96: (18., 163., 194.), +97: (65., 29., 153.), +98: (177., 10., 109.), +99: (152., 83., 7.), +100: (83., 175., 30.), +101: (18., 199., 153.), +102: (61., 81., 208.), +103: (213., 85., 216.), +104: (170., 53., 42.), +105: (161., 192., 38.), +106: (23., 241., 91.), +107: (12., 103., 170.), +110: (151., 41., 245.), +112: (133., 51., 80.), +115: (184., 162., 91.), +116: (50., 138., 38.), +118: (31., 237., 236.), +120: (39., 19., 208.), +121: (223., 27., 180.), +122: (254., 141., 85.), +125: (97., 144., 39.), +128: (106., 231., 176.), +130: (12., 61., 162.), +131: (124., 66., 140.), +132: (137., 66., 73.), +134: (250., 253., 26.), +136: (55., 191., 73.), +138: (60., 126., 146.), +139: (153., 108., 234.), +140: (184., 58., 125.), +141: (135., 84., 14.), +145: (139., 248., 91.), +148: (53., 200., 172.), +154: (63., 69., 134.), +155: (190., 75., 186.), +156: (127., 63., 52.), +157: (141., 182., 25.), +159: (56., 144., 89.), +161: (64., 160., 250.), +163: (182., 86., 245.), +165: (139., 18., 53.), +166: (134., 120., 54.), +168: (49., 165., 42.), +169: (51., 128., 133.), +170: (44., 21., 163.), +177: (232., 93., 193.), +180: (176., 102., 54.), +185: (116., 217., 17.), +188: (54., 209., 150.), +191: (60., 99., 204.), +193: (129., 43., 144.), +195: (252., 100., 106.), +202: (187., 196., 73.), +208: (13., 158., 40.), +213: (52., 122., 152.), +214: (128., 76., 202.), +221: (187., 50., 115.), +229: (180., 141., 71.), +230: (77., 208., 35.), +232: (72., 183., 168.), +233: (97., 99., 203.), +242: (172., 22., 158.), +250: (155., 64., 40.), +261: (118., 159., 30.), +264: (69., 252., 148.), +276: (45., 103., 173.), +283: (111., 38., 149.), +286: (184., 9., 49.), +300: (188., 174., 67.), +304: (53., 206., 53.), +312: (97., 235., 252.), +323: (66., 32., 182.), +325: (236., 114., 195.), +331: (241., 154., 83.), +342: (133., 240., 52.), +356: (16., 205., 144.), +370: (75., 101., 198.), +392: (237., 95., 251.), +395: (191., 52., 49.), +399: (227., 254., 54.), +408: (49., 206., 87.), +417: (48., 113., 150.), +488: (125., 73., 182.), +540: (229., 32., 114.), +562: (158., 119., 28.), +570: (60., 205., 27.), +572: (18., 215., 201.), +581: (79., 76., 153.), +609: (134., 13., 116.), +748: (192., 97., 63.), +776: (108., 163., 18.), +1156: (95., 220., 156.), +1163: (98., 141., 208.), +1164: (144., 19., 193.), +1165: (166., 36., 57.), +1166: (212., 202., 34.), +1167: (23., 206., 34.), +1168: (91., 211., 236.), +1169: (79., 55., 137.), +1170: (182., 19., 117.), +1171: (134., 76., 14.), +1172: (87., 185., 28.), +1173: (82., 224., 187.), +1174: (92., 110., 214.), +1175: (168., 80., 171.), +1176: (197., 63., 51.), +1178: (175., 199., 77.), +1179: (62., 180., 98.), +1180: (8., 91., 150.), +1181: (77., 15., 130.), +1182: (154., 65., 96.), +1183: (197., 152., 11.), +1184: (59., 155., 45.), +1185: (12., 147., 145.), +1186: (54., 35., 219.), +1187: (210., 73., 181.), +1188: (221., 124., 77.), +1189: (149., 214., 66.), +1190: (72., 185., 134.), +1191: (42., 94., 198.), +} + +### For instance segmentation the non-object categories ### +VALID_PANOPTIC_IDS = (1, 3) + +CLASS_LABELS_PANOPTIC = ('wall', 'floor') \ No newline at end of file diff --git a/BenchmarkScripts/ScanNet200/scannet200_splits.py b/BenchmarkScripts/ScanNet200/scannet200_splits.py new file mode 100644 index 0000000..353d8c5 --- /dev/null +++ b/BenchmarkScripts/ScanNet200/scannet200_splits.py @@ -0,0 +1,5 @@ +### This file contains the HEAD - COMMON - TAIL split category ids for ScanNet 200 + +HEAD_CATS_SCANNET_200 = ['tv stand', 'curtain', 'blinds', 'shower curtain', 'bookshelf', 'tv', 'kitchen cabinet', 'pillow', 'lamp', 'dresser', 'monitor', 'object', 'ceiling', 'board', 'stove', 'closet wall', 'couch', 'office chair', 'kitchen counter', 'shower', 'closet', 'doorframe', 'sofa chair', 'mailbox', 'nightstand', 'washing machine', 'picture', 'book', 'sink', 'recycling bin', 'table', 'backpack', 'shower wall', 'toilet', 'copier', 'counter', 'stool', 'refrigerator', 'window', 'file cabinet', 'chair', 'wall', 'plant', 'coffee table', 'stairs', 'armchair', 'cabinet', 'bathroom vanity', 'bathroom stall', 'mirror', 'blackboard', 'trash can', 'stair rail', 'box', 'towel', 'door', 'clothes', 'whiteboard', 'bed', 'floor', 'bathtub', 'desk', 'wardrobe', 'clothes dryer', 'radiator', 'shelf'] +COMMON_CATS_SCANNET_200 = ["cushion", "end table", "dining table", "keyboard", "bag", "toilet paper", "printer", "blanket", "microwave", "shoe", "computer tower", "bottle", "bin", "ottoman", "bench", "basket", "fan", "laptop", "person", "paper towel dispenser", "oven", "rack", "piano", "suitcase", "rail", "container", "telephone", "stand", "light", "laundry basket", "pipe", "seat", "column", "bicycle", "ladder", "jacket", "storage bin", "coffee maker", "dishwasher", "machine", "mat", "windowsill", "bulletin board", "fireplace", "mini fridge", "water cooler", "shower door", "pillar", "ledge", "furniture", "cart", "decoration", "closet door", "vacuum cleaner", "dish rack", "range hood", "projector screen", "divider", "bathroom counter", "laundry hamper", "bathroom stall door", "ceiling light", "trash bin", "bathroom cabinet", "structure", "storage organizer", "potted plant", "mattress"] +TAIL_CATS_SCANNET_200 = ["paper", "plate", "soap dispenser", "bucket", "clock", "guitar", "toilet paper holder", "speaker", "cup", "paper towel roll", "bar", "toaster", "ironing board", "soap dish", "toilet paper dispenser", "fire extinguisher", "ball", "hat", "shower curtain rod", "paper cutter", "tray", "toaster oven", "mouse", "toilet seat cover dispenser", "storage container", "scale", "tissue box", "light switch", "crate", "power outlet", "sign", "projector", "candle", "plunger", "stuffed animal", "headphones", "broom", "guitar case", "dustpan", "hair dryer", "water bottle", "handicap bar", "purse", "vent", "shower floor", "water pitcher", "bowl", "paper bag", "alarm clock", "music stand", "laundry detergent", "dumbbell", "tube", "cd case", "closet rod", "coffee kettle", "shower head", "keyboard piano", "case of water bottles", "coat rack", "folded chair", "fire alarm", "power strip", "calendar", "poster", "luggage"] diff --git a/BenchmarkScripts/ScanNet200/utils.py b/BenchmarkScripts/ScanNet200/utils.py new file mode 100644 index 0000000..0c6b1f8 --- /dev/null +++ b/BenchmarkScripts/ScanNet200/utils.py @@ -0,0 +1,115 @@ +import os +import numpy as np +from plyfile import PlyData, PlyElement +import pandas as pd + +from scannet200_constants import * + +def read_plymesh(filepath): + """Read ply file and return it as numpy array. Returns None if emtpy.""" + with open(filepath, 'rb') as f: + plydata = PlyData.read(f) + if plydata.elements: + vertices = pd.DataFrame(plydata['vertex'].data).values + faces = np.array([f[0] for f in plydata["face"].data]) + return vertices, faces + +def save_plymesh(vertices, faces, filename, verbose=True, with_label=True): + """Save an RGB point cloud as a PLY file. + + Args: + points_3d: Nx6 matrix where points_3d[:, :3] are the XYZ coordinates and points_3d[:, 4:] are + the RGB values. If Nx3 matrix, save all points with [128, 128, 128] (gray) color. + """ + assert vertices.ndim == 2 + if with_label: + if vertices.shape[1] == 7: + python_types = (float, float, float, int, int, int, int) + npy_types = [('x', 'f4'), ('y', 'f4'), ('z', 'f4'), ('red', 'u1'), ('green', 'u1'), + ('blue', 'u1'), ('label', 'u4')] + + if vertices.shape[1] == 8: + python_types = (float, float, float, int, int, int, int, int) + npy_types = [('x', 'f4'), ('y', 'f4'), ('z', 'f4'), ('red', 'u1'), ('green', 'u1'), + ('blue', 'u1'), ('label', 'u4'), ('instance_id', 'u4')] + + else: + if vertices.shape[1] == 3: + gray_concat = np.tile(np.array([128], dtype=np.uint8), (vertices.shape[0], 3)) + vertices = np.hstack((vertices, gray_concat)) + elif vertices.shape[1] == 6: + python_types = (float, float, float, int, int, int) + npy_types = [('x', 'f4'), ('y', 'f4'), ('z', 'f4'), ('red', 'u1'), ('green', 'u1'), + ('blue', 'u1')] + else: + pass + + vertices_list = [] + for row_idx in range(vertices.shape[0]): + cur_point = vertices[row_idx] + vertices_list.append(tuple(dtype(point) for dtype, point in zip(python_types, cur_point))) + vertices_array = np.array(vertices_list, dtype=npy_types) + elements = [PlyElement.describe(vertices_array, 'vertex')] + + if faces is not None: + faces_array = np.empty(len(faces), dtype=[('vertex_indices', 'i4', (3,))]) + faces_array['vertex_indices'] = faces + elements += [PlyElement.describe(faces_array, 'face')] + + # Write + PlyData(elements).write(filename) + + if verbose is True: + print('Saved point cloud to: %s' % filename) + + +# Map the raw category id to the point cloud +def point_indices_from_group(points, seg_indices, group, labels_pd, CLASS_IDs): + group_segments = np.array(group['segments']) + label = group['label'] + + # Map the category name to id + label_ids = labels_pd[labels_pd['raw_category'] == label]['id'] + label_id = int(label_ids.iloc[0]) if len(label_ids) > 0 else 0 + + # Only store for the valid categories + if not label_id in CLASS_IDs: + label_id = 0 + + # get points, where segment indices (points labelled with segment ids) are in the group segment list + point_IDs = np.where(np.isin(seg_indices, group_segments)) + + return points[point_IDs], point_IDs[0], label_id + + +# Uncomment out if mesh voxelization is required +# import trimesh +# from trimesh.voxel import creation +# from sklearn.neighbors import KDTree +# import MinkowskiEngine as ME + + +# VOXELIZE the scene from sampling on the mesh directly instead of vertices +def voxelize_pointcloud(points, colors, labels, instances, faces, voxel_size=0.2): + + # voxelize mesh first and determine closest labels with KDTree search + trimesh_scene_mesh = trimesh.Trimesh(vertices=points, faces=faces) + voxel_grid = creation.voxelize(trimesh_scene_mesh, voxel_size) + voxel_cloud = np.asarray(voxel_grid.points) + orig_tree = KDTree(points, leaf_size=8) + _, voxel_pc_matches = orig_tree.query(voxel_cloud, k=1) + voxel_pc_matches = voxel_pc_matches.flatten() + + # match colors to voxel ids + points = points[voxel_pc_matches] / voxel_size + colors = colors[voxel_pc_matches] + labels = labels[voxel_pc_matches] + instances = instances[voxel_pc_matches] + + # Voxelize scene + quantized_scene, scene_inds = ME.utils.sparse_quantize(points, return_index=True) + quantized_scene_colors = colors[scene_inds] + quantized_labels = labels[scene_inds] + quantized_instances = instances[scene_inds] + + return quantized_scene, quantized_scene_colors, quantized_labels, quantized_instances From 49b2c12ff4de8ec429ad0953ffcf2fbe078fa1d7 Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Fri, 10 Jun 2022 22:06:22 +0200 Subject: [PATCH 33/41] Update README.md --- BenchmarkScripts/ScanNet200/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/BenchmarkScripts/ScanNet200/README.md b/BenchmarkScripts/ScanNet200/README.md index 811721e..b58fae6 100644 --- a/BenchmarkScripts/ScanNet200/README.md +++ b/BenchmarkScripts/ScanNet200/README.md @@ -1,13 +1,13 @@ # ScanNet200 Preprocessing Scripts and description We provide the preprocessing scripts and benchmark data for the ScanNet200 Benchmark. -The raw scans and annotations are shared with the original [ScanNet benchmark](http://kaldir.vc.in.tum.de/scannet_benchmark), only the way of parsing it is different. +The raw scans and annotations are shared with the original [ScanNet benchmark](http://kaldir.vc.in.tum.de/scannet_benchmark); these scripts provided output semantic and instance labeled meshes according to the ScanNet200 categories. Differences and similarities to the original benchmark - - The ScanNet200 benchmark contains 200 categories in contrast with the original set of 20 classical semantic labels. - - This new benchmark follows the original _train_/_val_/_test_ splits published in this repository, + - The ScanNet200 benchmark evaluates 200 categories, an order of magnitude larger than the original set of 20 classical semantic labels. + - This new benchmark follows the original _train_/_val_/_test_ scene splits published in this repository, - We presented a further split of the category sets into three sets based on their point and instance frequencies, namely **head**, **common**, and **tail**. The category splits can be found in `scannet200_split.py` file - - The raw annotations in the training set containing 550 distinct categories, many of those only appearing once, so we reduced this extended set to the more reasonable, yet realistic and challenging 200 category setting. The mapping of annotation category IDs to ScanNet200 valid categories can be found in `scannet200_constants.py`. + - The raw annotations in the training set containing 550 distinct categories, many of which appear only once, and were filtered to produce the large-vocabulary, challenging ScanNet200 setting. The mapping of annotation category IDs to ScanNet200 valid categories can be found in `scannet200_constants.py`. - This larger vocabulary includes a strong natural imbalance and diversity for evaluating modern 3D scene understanding methods in a challenging scenario. ![](docs/dataset_histograms.jpg) From 84178a87713b517dfdb05e0b7056493a627c24ff Mon Sep 17 00:00:00 2001 From: David Rozenberszki Date: Mon, 13 Jun 2022 11:17:22 +0200 Subject: [PATCH 34/41] Requirements for ScanNet200 --- BenchmarkScripts/ScanNet200/README.md | 25 +++++++++++++++++-- BenchmarkScripts/ScanNet200/requirements.txt | 15 +++++++++++ .../ScanNet200/scannet200_splits.py | 13 ++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 BenchmarkScripts/ScanNet200/requirements.txt diff --git a/BenchmarkScripts/ScanNet200/README.md b/BenchmarkScripts/ScanNet200/README.md index b58fae6..f175272 100644 --- a/BenchmarkScripts/ScanNet200/README.md +++ b/BenchmarkScripts/ScanNet200/README.md @@ -2,6 +2,11 @@ We provide the preprocessing scripts and benchmark data for the ScanNet200 Benchmark. The raw scans and annotations are shared with the original [ScanNet benchmark](http://kaldir.vc.in.tum.de/scannet_benchmark); these scripts provided output semantic and instance labeled meshes according to the ScanNet200 categories. +The ScanNet scene meshes are surface annotated, where every vertex is described with the raw category id. +These IDs can be parsed based on the mapping defined in the `scannetv2-labels.combined.tsv`. + +**Important Note:** The `scannetv2-labels.combined.tsv` file was updated with the introduction of the ScanNet200 benchmark, please download the latest version using the script obtained after filling the [Terms of Use form](https://github.com/ScanNet/ScanNet#scannet-data). + Differences and similarities to the original benchmark - The ScanNet200 benchmark evaluates 200 categories, an order of magnitude larger than the original set of 20 classical semantic labels. @@ -18,7 +23,17 @@ Additionally, helper functions such as mesh voxelization can be found in `utils. ### Running the preprocessing The scripts are developed and tested with Python 3, and basic libraries like _pandas_ and _plyfile_ are expected to be installed. -Additionally, we rely on _trimesh_ and _MinkowskiEngine_ for uniform mesh voxelization, but these libraries are not strictly necessary +Additionally, we rely on _trimesh_ and _MinkowskiEngine_ for uniform mesh voxelization, but these libraries are not strictly necessary + +For the installation of all required libraries + +``` +conda create -n scannet200 python=3.8 +pip install -r requirements.txt +``` + +For the optional MinkowskiEngine required in the voxelization script, please refer to the [installation guide](https://github.com/NVIDIA/MinkowskiEngine#anaconda) corresponding the specific GPU version. + The preprocessing can be started with @@ -28,8 +43,14 @@ python --dataset_root --label_map_file ``` -Additional options: +Where script options: ``` +--dataset_root: + Path to the ScanNet dataset containing scene folders +--output_root: + Output path where train/val folders will be located +--label_map_file: + path to the updated scannetv2-labels.combined.tsv --num_workers: The number of parallel workers for multiprocessing default=4 diff --git a/BenchmarkScripts/ScanNet200/requirements.txt b/BenchmarkScripts/ScanNet200/requirements.txt new file mode 100644 index 0000000..ccf5e0a --- /dev/null +++ b/BenchmarkScripts/ScanNet200/requirements.txt @@ -0,0 +1,15 @@ +certifi==2022.5.18.1 +joblib==1.1.0 +numpy==1.22.4 +pandas==1.4.2 +pip==21.2.4 +plyfile==0.7.4 +python-dateutil==2.8.2 +pytz==2022.1 +scikit-learn==1.1.1 +scipy==1.8.1 +setuptools==61.2.0 +six==1.16.0 +threadpoolctl==3.1.0 +trimesh==3.12.6 +wheel==0.37.1 diff --git a/BenchmarkScripts/ScanNet200/scannet200_splits.py b/BenchmarkScripts/ScanNet200/scannet200_splits.py index 353d8c5..cf3d134 100644 --- a/BenchmarkScripts/ScanNet200/scannet200_splits.py +++ b/BenchmarkScripts/ScanNet200/scannet200_splits.py @@ -3,3 +3,16 @@ HEAD_CATS_SCANNET_200 = ['tv stand', 'curtain', 'blinds', 'shower curtain', 'bookshelf', 'tv', 'kitchen cabinet', 'pillow', 'lamp', 'dresser', 'monitor', 'object', 'ceiling', 'board', 'stove', 'closet wall', 'couch', 'office chair', 'kitchen counter', 'shower', 'closet', 'doorframe', 'sofa chair', 'mailbox', 'nightstand', 'washing machine', 'picture', 'book', 'sink', 'recycling bin', 'table', 'backpack', 'shower wall', 'toilet', 'copier', 'counter', 'stool', 'refrigerator', 'window', 'file cabinet', 'chair', 'wall', 'plant', 'coffee table', 'stairs', 'armchair', 'cabinet', 'bathroom vanity', 'bathroom stall', 'mirror', 'blackboard', 'trash can', 'stair rail', 'box', 'towel', 'door', 'clothes', 'whiteboard', 'bed', 'floor', 'bathtub', 'desk', 'wardrobe', 'clothes dryer', 'radiator', 'shelf'] COMMON_CATS_SCANNET_200 = ["cushion", "end table", "dining table", "keyboard", "bag", "toilet paper", "printer", "blanket", "microwave", "shoe", "computer tower", "bottle", "bin", "ottoman", "bench", "basket", "fan", "laptop", "person", "paper towel dispenser", "oven", "rack", "piano", "suitcase", "rail", "container", "telephone", "stand", "light", "laundry basket", "pipe", "seat", "column", "bicycle", "ladder", "jacket", "storage bin", "coffee maker", "dishwasher", "machine", "mat", "windowsill", "bulletin board", "fireplace", "mini fridge", "water cooler", "shower door", "pillar", "ledge", "furniture", "cart", "decoration", "closet door", "vacuum cleaner", "dish rack", "range hood", "projector screen", "divider", "bathroom counter", "laundry hamper", "bathroom stall door", "ceiling light", "trash bin", "bathroom cabinet", "structure", "storage organizer", "potted plant", "mattress"] TAIL_CATS_SCANNET_200 = ["paper", "plate", "soap dispenser", "bucket", "clock", "guitar", "toilet paper holder", "speaker", "cup", "paper towel roll", "bar", "toaster", "ironing board", "soap dish", "toilet paper dispenser", "fire extinguisher", "ball", "hat", "shower curtain rod", "paper cutter", "tray", "toaster oven", "mouse", "toilet seat cover dispenser", "storage container", "scale", "tissue box", "light switch", "crate", "power outlet", "sign", "projector", "candle", "plunger", "stuffed animal", "headphones", "broom", "guitar case", "dustpan", "hair dryer", "water bottle", "handicap bar", "purse", "vent", "shower floor", "water pitcher", "bowl", "paper bag", "alarm clock", "music stand", "laundry detergent", "dumbbell", "tube", "cd case", "closet rod", "coffee kettle", "shower head", "keyboard piano", "case of water bottles", "coat rack", "folded chair", "fire alarm", "power strip", "calendar", "poster", "luggage"] + + +### Given the different size of the official train and val sets, not all ScanNet200 categories are present in the validation set. +### Here we list of categories with labels and IDs present in both train and validation set, and the remaining categories those are present in train, but not in val +### We dont evaluate on unseen validation categories in this benchmark + +VALID_CLASS_IDS_200_VALIDATION = ('wall', 'chair', 'floor', 'table', 'door', 'couch', 'cabinet', 'shelf', 'desk', 'office chair', 'bed', 'pillow', 'sink', 'picture', 'window', 'toilet', 'bookshelf', 'monitor', 'curtain', 'book', 'armchair', 'coffee table', 'box', 'refrigerator', 'lamp', 'kitchen cabinet', 'towel', 'clothes', 'tv', 'nightstand', 'counter', 'dresser', 'stool', 'cushion', 'plant', 'ceiling', 'bathtub', 'end table', 'dining table', 'keyboard', 'bag', 'backpack', 'toilet paper', 'printer', 'tv stand', 'whiteboard', 'blanket', 'shower curtain', 'trash can', 'closet', 'stairs', 'microwave', 'stove', 'shoe', 'computer tower', 'bottle', 'bin', 'ottoman', 'bench', 'board', 'washing machine', 'mirror', 'copier', 'basket', 'sofa chair', 'file cabinet', 'fan', 'laptop', 'shower', 'paper', 'person', 'paper towel dispenser', 'oven', 'blinds', 'rack', 'plate', 'blackboard', 'piano', 'suitcase', 'rail', 'radiator', 'recycling bin', 'container', 'wardrobe', 'soap dispenser', 'telephone', 'bucket', 'clock', 'stand', 'light', 'laundry basket', 'pipe', 'clothes dryer', 'guitar', 'toilet paper holder', 'seat', 'speaker', 'column', 'ladder', 'bathroom stall', 'shower wall', 'cup', 'jacket', 'storage bin', 'coffee maker', 'dishwasher', 'paper towel roll', 'machine', 'mat', 'windowsill', 'bar', 'toaster', 'bulletin board', 'ironing board', 'fireplace', 'soap dish', 'kitchen counter', 'doorframe', 'toilet paper dispenser', 'mini fridge', 'fire extinguisher', 'ball', 'hat', 'shower curtain rod', 'water cooler', 'paper cutter', 'tray', 'shower door', 'pillar', 'ledge', 'toaster oven', 'mouse', 'toilet seat cover dispenser', 'furniture', 'cart', 'scale', 'tissue box', 'light switch', 'crate', 'power outlet', 'decoration', 'sign', 'projector', 'closet door', 'vacuum cleaner', 'plunger', 'stuffed animal', 'headphones', 'dish rack', 'broom', 'range hood', 'dustpan', 'hair dryer', 'water bottle', 'handicap bar', 'vent', 'shower floor', 'water pitcher', 'mailbox', 'bowl', 'paper bag', 'projector screen', 'divider', 'laundry detergent', 'bathroom counter', 'object', 'bathroom vanity', 'closet wall', 'laundry hamper', 'bathroom stall door', 'ceiling light', 'trash bin', 'dumbbell', 'stair rail', 'tube', 'bathroom cabinet', 'closet rod', 'coffee kettle', 'shower head', 'keyboard piano', 'case of water bottles', 'coat rack', 'folded chair', 'fire alarm', 'power strip', 'calendar', 'poster', 'potted plant', 'mattress') + +CLASS_LABELS_200_VALIDATION = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 26, 27, 28, 29, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 82, 84, 86, 87, 88, 89, 90, 93, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 110, 112, 115, 116, 118, 120, 122, 125, 128, 130, 131, 132, 134, 136, 138, 139, 140, 141, 145, 148, 154, 155, 156, 157, 159, 161, 163, 165, 166, 168, 169, 170, 177, 180, 185, 188, 191, 193, 195, 202, 208, 213, 214, 229, 230, 232, 233, 242, 250, 261, 264, 276, 283, 300, 304, 312, 323, 325, 342, 356, 370, 392, 395, 408, 417, 488, 540, 562, 570, 609, 748, 776, 1156, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1175, 1176, 1179, 1180, 1181, 1182, 1184, 1185, 1186, 1187, 1188, 1189, 1191) + +VALID_CLASS_IDS_200_TRAIN_ONLY = ('bicycle', 'storage container', 'candle', 'guitar case', 'purse', 'alarm clock', 'music stand', 'cd case', 'structure', 'storage organizer', 'luggage') + +CLASS_LABELS_200_TRAIN_ONLY = (121, 221, 286, 331, 399, 572, 581, 1174, 1178, 1183, 1190) From 53f4d098e716f326e6ec40480e06363152ee9367 Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Thu, 24 Nov 2022 06:39:02 -0800 Subject: [PATCH 35/41] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index c3c0ef5..7cd10f1 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ ScanNet is an RGB-D video dataset containing 2.5 million views in more than 1500 ## ScanNet Data +Please note that our data server is currently down for maintenance (Nov. 24 - 25). + If you would like to download the ScanNet data, please fill out an agreement to the [ScanNet Terms of Use](http://kaldir.vc.in.tum.de/scannet/ScanNet_TOS.pdf) and send it to us at scannet@googlegroups.com. If you have not received a response within a week, it is likely that your email is bouncing - please check this before sending repeat requests. From 2be9d2cefff72dcce6719fd5c60e49e23692da9b Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Thu, 24 Nov 2022 06:43:29 -0800 Subject: [PATCH 36/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7cd10f1..07e7a74 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ScanNet is an RGB-D video dataset containing 2.5 million views in more than 1500 ## ScanNet Data -Please note that our data server is currently down for maintenance (Nov. 24 - 25). +### Please note that our data server is currently down for maintenance (Nov. 24 - 25). If you would like to download the ScanNet data, please fill out an agreement to the [ScanNet Terms of Use](http://kaldir.vc.in.tum.de/scannet/ScanNet_TOS.pdf) and send it to us at scannet@googlegroups.com. From 3e5726500896748521a6ceb81271b0f5b2c0e7d2 Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Mon, 28 Nov 2022 10:20:04 -0800 Subject: [PATCH 37/41] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 07e7a74..c3c0ef5 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,6 @@ ScanNet is an RGB-D video dataset containing 2.5 million views in more than 1500 ## ScanNet Data -### Please note that our data server is currently down for maintenance (Nov. 24 - 25). - If you would like to download the ScanNet data, please fill out an agreement to the [ScanNet Terms of Use](http://kaldir.vc.in.tum.de/scannet/ScanNet_TOS.pdf) and send it to us at scannet@googlegroups.com. If you have not received a response within a week, it is likely that your email is bouncing - please check this before sending repeat requests. From affdbfa9ead373c39e36f40a0fa3494a8b7911e9 Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Tue, 22 Aug 2023 14:24:19 +0200 Subject: [PATCH 38/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c3c0ef5..e773109 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ScanNet is an RGB-D video dataset containing 2.5 million views in more than 1500 If you would like to download the ScanNet data, please fill out an agreement to the [ScanNet Terms of Use](http://kaldir.vc.in.tum.de/scannet/ScanNet_TOS.pdf) and send it to us at scannet@googlegroups.com. -If you have not received a response within a week, it is likely that your email is bouncing - please check this before sending repeat requests. +If you have not received a response within a week, it is likely that your email is bouncing - please check this before sending repeat requests. Please do not reply to the noreply email - your email won't be seen. Please check the [changelog](http://www.scan-net.org/changelog) for updates to the data release. From d0a4b9e09dc38b2570ca4016d2ad4f2d373b46a5 Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Tue, 14 Nov 2023 14:10:21 +0100 Subject: [PATCH 39/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e773109..a5b6d96 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ScanNet is an RGB-D video dataset containing 2.5 million views in more than 1500 ## ScanNet Data -If you would like to download the ScanNet data, please fill out an agreement to the [ScanNet Terms of Use](http://kaldir.vc.in.tum.de/scannet/ScanNet_TOS.pdf) and send it to us at scannet@googlegroups.com. +If you would like to download the ScanNet data, please fill out an agreement to the [ScanNet Terms of Use](http://kaldir.vc.in.tum.de/scannet/ScanNet_TOS.pdf), using your institutional email addresses, and send it to us at scannet@googlegroups.com. If you have not received a response within a week, it is likely that your email is bouncing - please check this before sending repeat requests. Please do not reply to the noreply email - your email won't be seen. From fcaa1773a9e186b22a4228df632b6999a1633b79 Mon Sep 17 00:00:00 2001 From: Angela Dai Date: Sun, 5 May 2024 17:57:14 +0200 Subject: [PATCH 40/41] Add files via upload --- img/legend.png | Bin 275349 -> 206882 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/legend.png b/img/legend.png index d14e19ca0c20d2d6a8fc9cf66c62da04783d2e47..0354c93a471c80fa335cf5134b100c87c786862d 100644 GIT binary patch literal 206882 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

    `NxzKwIe5Qby7nW8^TEBes3!#|DzrQuuDP%fqCd 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 Date: Mon, 3 Nov 2025 13:14:27 +0100 Subject: [PATCH 41/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a5b6d96..17eed44 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ScanNet is an RGB-D video dataset containing 2.5 million views in more than 1500 ## ScanNet Data -If you would like to download the ScanNet data, please fill out an agreement to the [ScanNet Terms of Use](http://kaldir.vc.in.tum.de/scannet/ScanNet_TOS.pdf), using your institutional email addresses, and send it to us at scannet@googlegroups.com. +If you would like to download the ScanNet data, fill out an agreement to the [ScanNet Terms of Use](http://kaldir.vc.cit.tum.de/scannet/ScanNet_TOS.pdf), using your institutional email addresses, and send it to us at scannet@googlegroups.com. If you have not received a response within a week, it is likely that your email is bouncing - please check this before sending repeat requests. Please do not reply to the noreply email - your email won't be seen.

    dN^n!GWc)_N@IU$=8Gp)2 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 literal 275349 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 z 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 z !hvM}!64LrL~|EZ&pM2k1P>tW(0CX-Z>6um9*cy**qdM%CRP^kzFW|Gw(#2~fZ_Yy3wwwhg?%<4Px2&@zD#%3S zc6cn`5wHT<n&CfV6@y!MS1W35G%HPW_xm1 zhTIGh4G>bFQ8wsVPmYI|2U1JJvgmCh-qieU$)NX$837_jpOdU?&R zLYL%zd6oNm;|Die-4t(cs+|pSMb}XEXUuc+Jd5AC4YnDD95dg>F#)WDvFmU=JPvQy z{j3t;MuxwbABjpY$YkD9XbnHN^lkY_7;_K*lW;hs?x4(NaYZ+a`<+Rw;f+o0{hP(>SfO_9D{<(9!BR;Q4RRG*4?RTc&R#3>Z9tT) z&yT6F9x0!hoGw5WK;d-x`dNzOzH6&vDM^0Pki7!#!m*ov8Gk}_q3nh)8nx7!=6+08 zgkeup>K0s7OmEBmn&x_Bt_{L#c7if@LI94ZBdxOA-vv~O*{mYpBJL$RrqNq#cWs$F z!c