From 867cfa0036a0956ff6dcfb7559cd5db1d93c9aed Mon Sep 17 00:00:00 2001 From: Tang1705 <17301138@bjtu.edu.cn> Date: Mon, 6 Jul 2020 17:07:02 +0800 Subject: [PATCH] calibrate by gf4 --- Class/detection/Calibration.py | 266 ++++++++++++++++++ Class/detection/GFmatrix.py | 60 ++++ Class/detection/generate_projector_picture.py | 94 +++++++ Data/projector.png | Bin 0 -> 46824 bytes 4 files changed, 420 insertions(+) create mode 100644 Class/detection/Calibration.py create mode 100644 Class/detection/GFmatrix.py create mode 100644 Class/detection/generate_projector_picture.py create mode 100644 Data/projector.png diff --git a/Class/detection/Calibration.py b/Class/detection/Calibration.py new file mode 100644 index 0000000..3c71f8e --- /dev/null +++ b/Class/detection/Calibration.py @@ -0,0 +1,266 @@ +import time + +import cv2 +import numpy as np + + +class Calibration: + def __init__(self): + self.path_photos_from_camera = "data/data_for_calibration/" + self.font = cv2.FONT_ITALIC + + self.flag = np.zeros((1024, 1280)) + self.nx = [-1, -1, -1, 0, 0, 1, 1, 1] + self.ny = [1, 0, -1, 1, -1, 1, 0, -1] + + self.frame_time = 0 + self.frame_start_time = 0 + self.fps = 0 + + # 获取处理之后 stream 的帧数 + def update_fps(self): + now = time.time() + self.frame_time = now - self.frame_start_time + self.fps = 1.0 / self.frame_time + self.frame_start_time = now + + # 生成的 cv2 window 上面添加说明文字 + def draw_note(self, img_rd): + # 添加说明 + cv2.putText(img_rd, "Calibration", (20, 40), self.font, 1, (255, 255, 255), 1, cv2.LINE_AA) + cv2.putText(img_rd, "FPS: " + str(self.fps.__round__(2)), (20, 100), self.font, 0.8, (0, 255, 0), 1, + cv2.LINE_AA) + + cv2.putText(img_rd, "S: Calibrate Current Frame", (20, 400), self.font, 0.8, (255, 255, 255), 1, cv2.LINE_AA) + cv2.putText(img_rd, "Q: Quit", (20, 450), self.font, 0.8, (255, 255, 255), 1, cv2.LINE_AA) + + """ + get_candidate_points: + 将RGB图像转为单通道 + 计算每一个像素点横向和纵向的单通道色彩强度差,选择值最大的通道为该像素点的差值,将差值大于选定阈值的点视为候选点 + 在选定的窗口大小中进行计算,减少处理数据的数量 + 返回存有候选点数据的矩阵 + -1为候选点 + -3为非候选点 + """ + + def get_candidate_points(self, frame): + candidate = np.zeros((frame.shape[0], frame.shape[1])) # 初始化图像点位置矩阵为0 + b, g, r = cv2.split(frame) + i = 0 + while i < frame.shape[0] - 7: + j = 0 + while j < frame.shape[1] - 7: + sum = [0, 0, 0] # 存储r,g,b三个通道的差值结果 + tempxy = [0, 0, 0, 0, 0, 0] # 存储三个通道纵向和横向的临时求和结果 + k = -6 + while k < 7: # 十字掩码长度选择为菱形对角线长度的一半 + tempxy[0] = tempxy[0] + b[i + k][j] # b通道水平方向 + tempxy[1] = tempxy[1] + b[i][j + k] # b通道铅直方向 + tempxy[2] = tempxy[2] + g[i + k][j] # g通道水平方向 + tempxy[3] = tempxy[3] + g[i][j + k] # g通道铅直方向 + tempxy[4] = tempxy[4] + r[i + k][j] # r通道水平方向 + tempxy[5] = tempxy[5] + r[i][j + k] # r通道铅直方向 + k = k + 1 + sum[0] = sum[0] + abs(tempxy[0] - tempxy[1]) # r通道差值 + sum[1] = sum[1] + abs(tempxy[2] - tempxy[3]) # g通道差值 + sum[2] = sum[2] + abs(tempxy[4] - tempxy[5]) # b通道差值 + d = max(sum[0], sum[1], sum[2]) # 选择差值最大的通道 + # print(d) + if d > 350: # tq和zyy人工学习调参选阈值,阈值增大,候选点集中于球体中央 + candidate[i][j] = -1 # -1标记为候选点 + else: + candidate[i][j] = -3 # -3标记为非候选点 + j = j + 1 + i = i + 1 + return candidate + + """ + get_grid_points: + 将RGB图像根据公式Gray = 0.2989 * R + 0.5907 * G + 0.1140 * B 转为灰度图像 + 根据真正的角点具有严格的中心对称性,将相关系数大于选定阈值的点选做特征点 + 并根据P1和P2类型点的特征(左右或上下为模式元素)将特征点分类为两类特征点 + 白色背景的灰度值高于颜色元素的灰度值 + 圆邻域采用SUSAN角点检测法的圆邻域,直径为7 + 1为角点 + 2为非角点 + """ + + def get_grid_points(self, frame, candidate): + GrayImage = np.zeros((1024, 1280)) + b, g, r = cv2.split(frame) + + i = 0 + while i < frame.shape[0]: + j = 0 + while j < frame.shape[1]: + # 转灰度图像,提高绿色通道的比例,使得白色背景与绿色元素易于区分 + GrayImage[i][j] = 0.2989 * r[i][j] + 0.5907 * g[i][j] + 0.1140 * b[i][j] + j = j + 1 + i = i + 1 + + gridpoints = np.zeros((1024, 1280)) + circle_neighborhood = [[0, 0, 1, 1, 1, 0, 0], [0, 1, 1, 1, 1, 1, 0], [1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 0], [0, 0, 1, 1, 1, 0, 0]] + i = 0 + while i < frame.shape[0]: + j = 0 + while j < frame.shape[1]: + """ + element元素说明 + 便于计算圆形邻域的相关系数,引入变量element + 第一个元素:M_{Ci} * M_{Ci}'之和 + 第二个元素:M_{Ci}之和 + 第三个元素:M_{Ci}'之和 + 第四个元素:M_{Ci}^2之和 + 第五个元素:(M_{Ci}')^2之和 + """ + element = [0, 0, 0, 0, 0] + if candidate[i][j] == -1: + # 计算直径为7的圆邻域的色彩强度,与数据结构中数组和矩阵的关系相似 + p = -3 + while p < 4: + q = -3 + while q < 4: + if circle_neighborhood[p][q] == 1: + # 以圆心像素点为(0,0) + # 计算其余点的坐标和旋转180度后的坐标 + # 原坐标 + imgx = i + p + imgy = j + q + # 旋转180度后的坐标 + imgxp = i - p + imgyp = j - q + element[0] = element[0] + int(GrayImage[imgx][imgy]) * int(GrayImage[imgxp][imgyp]) + element[1] = element[1] + int(GrayImage[imgx][imgy]) + element[2] = element[2] + int(GrayImage[imgxp][imgyp]) + element[3] = element[3] + int(GrayImage[imgx][imgy] ** 2) + element[4] = element[4] + int(GrayImage[imgxp][imgyp] ** 2) + q = q + 1 + p = p + 1 + + pc = (37 * element[0] - element[1] * element[2]) / ( + np.sqrt(37 * element[3] - element[1] ** 2) * np.sqrt(37 * element[4] - element[2] ** 2)) + if pc > 0.1: # 相关系数足够大的点被判断为特征点(对称系数为0的为特征点——A Twofold...) + gridpoints[i][j] = 1 + + else: + gridpoints[i][j] = 0 + j = j + 1 + i = i + 1 + + return gridpoints + + """ + bfs8: + 8邻域广度优先搜索 + 确定唯一特征点位置 + """ + + def bfs8(self, frame, g, x, y): + counter = 1 + queue = [[x, y]] + ans = [0, 0] + self.flag[x][y] = 1 + ans[0] = 1.0 * x + ans[1] = 1.0 * y + while len(queue) > 0: + current = queue.pop(0) + self.flag[current[0]][current[1]] = 1 + i = 0 + while i < 8: + temp = [0, 0] + temp[0] = current[0] + self.nx[i] + temp[1] = current[1] + self.ny[i] + if temp[0] < 0 or temp[0] > frame.shape[0] or temp[1] < 0 or temp[1] > frame.shape[1]: + i = i + 1 + continue + if self.flag[int(temp[0])][int(temp[1])] or g[int(temp[0])][int(temp[1])] == 0: + i = i + 1 + continue + self.flag[int(temp[0])][int(temp[1])] = 1 + queue.append(temp) + ans[0] = ans[0] + 1.0 * temp[0] + ans[1] = ans[1] + 1.0 * temp[1] + counter = counter + 1 + i = i + 1 + ans[0] = ans[0] / counter + ans[1] = ans[1] / counter + return ans + + """ + get_feature_point: + 调用8邻域深度优先搜索 + 确定单一特征点位置 + """ + + def get_feature_point(self, frame, gps): + q = [] + i = 0 + while i < frame.shape[0]: + j = 0 + while j < frame.shape[1]: + if self.flag[i][j] == 1 or gps[i][j] == 0: + j = j + 1 + continue + temp = self.bfs8(frame, gps, i, j) + q.append(temp) + j = j + 1 + i = i + 1 + return q + + def process(self, stream): + while stream.isOpened(): + flag, img_rd = stream.read() # Get camera video stream + self.flag = np.zeros((img_rd.shape[0], img_rd.shape[1])) + + kk = cv2.waitKey(1) + + if kk == ord('q'): + break + else: + if kk == ord('s'): + stream.release() + cv2.destroyAllWindows() + + cv2.imwrite('testt.png',img_rd) + + # 1024*1280 -1候选点,-3非候选点 + candidate = self.get_candidate_points(frame=img_rd) + # 1024*1280 1角点,0非角点 + gridpoints = self.get_grid_points(frame=img_rd, candidate=candidate) + # 存有特征点的列表 -1特征点 + featurepoints_position = self.get_feature_point(frame=img_rd, gps=gridpoints) + # print(featurepoints_position) + + # 绘制特征点 + point_size = 1 + point_color = (0, 0, 255) + thickness = 0 # 可以为 0 、4、8 + + for point in featurepoints_position: + cv2.circle(img_rd, (int(point[1]), int(point[0])), point_size, point_color, thickness) + cv2.namedWindow("image") + cv2.imshow('image', img_rd) + cv2.waitKey(0) # 按0退出 + + self.draw_note(img_rd) + self.update_fps() + cv2.imshow("camera", img_rd) + + def run(self): + cap = cv2.VideoCapture(0) + self.process(cap) + + cap.release() + cv2.destroyAllWindows() + + +def main(): + Calibration_on = Calibration() + Calibration_on.run() + + +if __name__ == "__main__": + main() diff --git a/Class/detection/GFmatrix.py b/Class/detection/GFmatrix.py new file mode 100644 index 0000000..7c95b59 --- /dev/null +++ b/Class/detection/GFmatrix.py @@ -0,0 +1,60 @@ +# plus、multi、GF三个函数用于生成伪随机矩阵 +def plus(x, y): + if x == y: + return 0 + elif (x == 1 and y == 2) or (x == 2 and y == 1): + return 3 + elif (x == 1 and y == 3) or (x == 3 and y == 1): + return 2 + elif (x == 2 and y == 3) or (x == 3 and y == 2): + return 1 + elif x == 0: + return y + elif y == 0: + return x + + +def multi(x, y): + if x == 0 or y == 0: + return 0 + elif x == 1: + return y + elif y == 1: + return x + elif x == 2 and y == 2: + return 3 + elif x == 3 and y == 3: + return 2 + else: + return 1 + + +def GF(a, b, c, d, e, f): + data = [] + + for i in range(0, 4095): + data.append(0) + + data[0] = a + data[1] = b + data[2] = c + data[3] = d + data[4] = e + data[5] = f + + for i in range(6, 4095): + data[i] = plus(data[i - 1], multi(data[i - 2], 3)) + data[i] = plus(data[i], multi(data[i - 3], 2)) + data[i] = plus(data[i], multi(data[i - 4], 1)) + data[i] = plus(data[i], multi(data[i - 5], 1)) + data[i] = plus(data[i], multi(data[i - 6], 3)) + + res = [] + for i in range(0, 65): + res.append([]) + for j in range(0, 63): + res[i].append(0) + for i in range(0, 4095): + res[i % 65][i % 63] = data[i] + + return res \ No newline at end of file diff --git a/Class/detection/generate_projector_picture.py b/Class/detection/generate_projector_picture.py new file mode 100644 index 0000000..15a00e8 --- /dev/null +++ b/Class/detection/generate_projector_picture.py @@ -0,0 +1,94 @@ +import cv2 +import numpy as np +from PIL import Image +from GFmatrix import GF + + +# 生成一个菱形的填色像素坐标 +def set_matrix(dimension): + color = [] + + for i in range(0, dimension): + color.append([]) + for j in range(0, dimension): + color[i].append(0) + demission_temp = dimension - 1 + for i in range(0, dimension): + for j in range(0, dimension): + if i < demission_temp // 2: + if j >= demission_temp // 2 - i and j <= demission_temp // 2 + i or j == demission_temp // 2: + color[i][j] = 1 + elif i > demission_temp // 2: + temp = (demission_temp) - i + if j >= demission_temp // 2 - temp and j <= demission_temp // 2 + temp or j == demission_temp // 2: + color[i][j] = 1 + else: + color[i][j] = 1 + return color + + +if __name__ == '__main__': + # data = fileload() + data = GF(1, 1, 1, 1, 1, 1) + dimension = int(input("Please enter the length of the diagonal of the rhombus:")) + color = set_matrix(dimension) + + x = 912 + y = 1140 + bgcolor = 0xffffff # 投影图案是白色背景 + + c = Image.new("RGB", (x, y), bgcolor) + + start_row = end_row = 0 + start_column = end_column = 0 + + if 63 * dimension > 912: + start_row = 0 + end_row = 912 + else: + start_row = (912 - (63 * dimension)) // 2 + end_row = start_row + 63 * dimension + + if 65 * dimension > 1140: + start_column = 0 + end_column = 1140 + else: + start_column = (1140 - (65 * dimension)) // 2 + end_column = start_column + 65 * dimension + # 以13*13的菱形为例,暂时没有修改菱形超过图片大小的情况 + i = start_row + while i < end_row: + if i > end_row - dimension or i == end_row - dimension: + break + else: + t = (i - start_row) // dimension + j = start_column + while j < end_column: + if j > end_column - dimension or j == end_column - dimension: + break + else: + q = (j - start_column) // dimension + if data[q][t] == 0: + for k in range(0, dimension): + for m in range(0, dimension): + if color[k][m] == 1: + c.putpixel([i + k, j + m], (0, 0, 255)) # 蓝色 + elif data[q][t] == 1: + for k in range(0, dimension): + for m in range(0, dimension): + if color[k][m] == 1: + c.putpixel([i + k, j + m], (255, 0, 0)) # 红色 + elif data[q][t] == 2: + for k in range(0, dimension): + for m in range(0, dimension): + if color[k][m] == 1: + c.putpixel([i + k, j + m], (0, 255, 0)) # 绿色 + else: + for k in range(0, dimension): + for m in range(0, dimension): + if color[k][m] == 1: + c.putpixel([i + k, j + m], (0, 0, 0)) + j = j + dimension + i = i + dimension + c.show() + c.save("projector.png") diff --git a/Data/projector.png b/Data/projector.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a43c43ba2ba07bb29b1df6e7a525361842380a GIT binary patch literal 46824 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

Bl9#XA_ z+8?%T`9qyrDLwsA6z4WXZhbAifxWv!bCa?%Rrcbj!NF2TRpWb??c9XCdF%#+FJC^d zR{U&uZJ%R?zuKmeRA$TzA0EW*dAwdyZF)-R>d`p+6OuPgiRbuJCNd-{u7=+2p}r;0Eek^rr9E5fw{5NiZnM3)3jX?xs6Ray%Qz2KA_dXVgsm7iMjTw9@@<(xnG+%p9z1GOKZ76jFZ3%TlGW)xP{sP-=>5XCTdDz9=_ z_w1kYf#yGsh=n0j!yXI>{OACZzX4z)|NXot$`RnC z(hvkgXyZ>eEb22ar-qM&o2(9!DGKy7hoA#oZ_i9G1&W;g+M0}?`KYUVFrvcGNv+7T zoa5kt6gb22!D_25N^8}nFQcxvxk`t`;979K+Z$${Cv6E*0LSSZy-5>530FCZ4}QEz zM78T&?cQ@~iONQ*MdlNyGjH&tAyt#}u!T|mUDg*uDi_DsM_>za2rT$7eo}fTuZl)7 z^T>rr+U+WJG_){_yi;?82u^zacyazQav2&k{rEC*GFZ*SwBArX7B$S>L<=jCBnH7n zA_Nx;hNU#|03Jawj{SIU6=GPuA6J%BS_BwYrC)G=Ug`@6wQxWC~04W3B!qIuDdB`Fs&&G#j= zF%c2n5q&M)G7NjKFkFD@F5Eh(8?2^f)LEkLi(21oeymy|Nd%^K@B$4pKgM~yBI$xl ztR%WV&XjFqx7llv;PLPW8pZ~V3}w6^lWq{s*V1Zhfrf@8nNRt((-8Qa5ejxPJq#WL zgw7nWB6(cwoF@+&&*E4cB$70dcveK+MF`LwG@x~cjYezU_Ilq^Gzh;ys7k3l0tcgOIu-ebmZ`;!L ziK9m4mf1GjKZ9t!_3Rbw`BljCcKvYvu0V<2=TveD*`&v^Ypo!@OFD?|^JuS3O<{KO zx9RB{0xE0E>MkZgUdELNlXq(RU_{BlO@B-wU=_U7Gv@0VDGHQfrxFv!3S$j)hcZZY z#>vQ|!mV1JRrv9Jl|ygIG^q(uV$$*ycXYb{{5v5v0>vq;>YP@*2X+N_UmRR^Qp4Z{?enxcc2O^PO$72-abtyZK|Wxjj6 z@Fc^r8(9~SC&l2nYMg7AYrWg1cQnt=LLI=#7Fxs3`z{YrFRGhRoNby`*$WC7E0Zn z^_muPF3Pw;e15&}PVXfmY7Ux@3AA*sfG>7ECYdQtH|;T9ux9DaEuHfLPgv85Y9xZdLNF4la3=4IrDdA{hR_$wW9>UYZDI**uDR zLofIvVIEiCpi*v+U=hZ!I)Y54tPV30Z+l)RTk^dra0%MTI z>xLv6l%=E6Zrno9d-V8|H~%XtBADfRP4o!RBcc&z1@I^2WGc|?0C%l&-5%s@PIyph za<~Kl2^57O(7xV_5yCbM62vN1PV1GcE`laflS1xr&Uvwn8>li4g(D~^U5*mq+r?x4 zHK)$cQm6*f2!>xDraXkp*BfSoaA4Y_y~U|cLSny>iLiTL#W!FRZ+}(Tx!LT(1{LHq zzIF7k&phn9Dj1Y*_gX{{6A!GR?im z$z|t$Jc`TbqPnkGo@Zf{XlfrF^`T5P@Uz<%t7oL1C;vhuzDx=Fwl2dVB#RxCu$^g@ zpGV3N*r6okD5k1QHbPBfrjmN3t#F^|VOww>KWbAIA=M>EIjxjdN#DAuVnp|+sK@d% zto`;r#$9)m^U3GETzddw@LY};(|#%a^Uet~BM~F}=(Rk$5v;8x@8&kWBzeEtl5%9D zjSz0@Q2R{MmR;?e=qWyLL;;DQ(sri4Q}quG+7YHCeY~dYF{!5_^1q@HrRU{&2dwxM z>jzGhA>Q`%MqZ4X1>-Tr{F+HECRvk?C6~EFl98FO9?^5{6yLyoke#(J@fPsSF7Z8YS0&Y&xA1!GmwXRA|zj zL3aNp>cPCX@M`4jq*N%S9gDTzLL7;ltnZ9^Nt(L<-+>5^%A3sW@`DxowRWV0`1|dQ zmlVdRNw@vQt}hzu?(dUqeul9@f}kR8Z4mKxJ58&$IeM8@kHB z9_JnC;ZuC3cK~}|rd|Hkx)b5@CA`Kd%keT(0z)nGs!!nx&vG?ozNV$TYsHffuw(Uw z=ss=e# zDVC&M(tOE0)91IDZ_|TF+Ur^0^C#8JlV|1*w2w2x-wp)J-)m6VtlwQM`QAJCL8Q#{ z2j;7A^7Oj3hkr)CB>dMW-qd_KmInv{5Gq_fz$tM*+&1@2fo*d68N4EU%L*}@2jRATa07BZXUeC3JW97pin~DNHs&xW>`YF0yj8LermU|9$l*af z;0b%X&HxSp`MIPB={eUW#K8l9uS^lxaJ9W3s1zqW9`A)&()}AChYdpjgKR@k2{@i4 z4&IsDtw0>CO6Rr7{qNY)Z}8#!nT>oztE7Yn?yJgxV}qB$EG3;PHrlKYki#Esy4k^i zTLD_t9N~J(sD6T&G&EV(|E+Z3q?_Lv*34ISO8=ewOmem+-7E8@hBj5>=U1Qo`)0if z1`^5Xnmk9bfG+6%EQFWf-fwWtj8S|$sEagkl-&-n8f4!q(mm(O%EU(sy|a96;2m)N z4cp~Ap9e+~a?3lQ`xGD!N$H8#4zp>YHN~k#Pf0yp66HQVAL8&@xj~v9H-YQKf?J2f zip)2#)2d8}ZpUm^&#ntJ*|;7)1}VW5_0r}dOsppTXeJ6pAh#sPvS}|?vrQ_NZBghZ z?|1Mz02Z)1Q%s~>J#dP{?forJfuJQciUGv`F(e)9h)F+d?+Q%@Yo}?8lN|G0jg1FG zGpOVVFV`05+8KK~@}+8&GJtW_rnCRoSI#OEK_P+zopw|SVon;>Umzw8pTB!{^ix-# z_eL;a>Qu_Kl$|2Zf4JSG<>|nASM=8ThuO>+VH4t3fh#-6M{hlu(>;M1`{%ID?Y(94 z)FaJ>nC#+9LG5q**IIvezuV7@i7+B|-MO@*h-cjT{aO%x+;{f2CUb^b(o#6ZC`JGX zI0im@UDXU$Gst5fxpp*Su&Ys3eLu-jYR_v*ZHJww+O$A*v*L`-^_nz5L`G6he^Vup(6R zR`Sx3#7fE5?hP%>d2|6V2p~y7PIjk67cQsMJ7KEeUl4=7nJ44 zg4}v=|13%=b+i}llR!wPr}QG=pB8yMCc40IW1GlD00=0l3j z#pm-fVjz^7yruEl-+iw>1^US`eJx#J14T(3VquVqIM2uKNn6zBD>$z zsJ=jJ*Vw@y%jVr;g3N^>R8vUq7fF+1BxZ;u4}r3e>SId3m7S2m*`vw|6xyC+_CtVT znk5cN_TISEx4)H9gD=FP%Chq&{Y?(92W6pTh|N8k_7fF|r@tqgB+goL7l z5jVf-VN-Zy4#YfaYK@1#G zd8iJV`N|>_%O-gr_}&Mb6>ngFvs4;P`?Ws3o_)>aBwL89n?4m}VcfxdayG95rH}2| z=B&9aIvM z;sLdKDEv>BNwG4_XNUrPMzqyM`F=;~S_w&Ll&)r#ja31U0HSmI;XpV~r9v>eM&wKi3Wg*VT z|A}7LKzNkGJ>0Y&EQbid5;CL3&XI+f)nj=)gS-Q#pK=VZea(B?%+ik{^TLq4FbS#V zMM%^RdowkkCzp3XxAVDSsVn_qGizxjh8xs8d0uC%uZ&MPjb)PYPNG?Ybm+j4s zXl9+}=&AS7v(vhk1<7+jme>~svp2A>(EA=vyl~x|Mdsni98^h2l_DTO1A;8H1_=j` zpZbV5WL)qT$|AdPWH|7G8?Y1r(xZHnx}^mChwBd~{>-`B%zA^z0K)Un*$34z>)bG0 zB!nXI!B?41!#cziJ8UCS+j_jhvq+Z^^1~B`7q$n15nx4!wM2~({sYrN&>5fOG%OGQ z3<$=vOG8b@(a27LnJoWqX++3PDrs|YbGFD@y&!`E3=1->@0Q01{@aV29ZaRnGm?fl zdd6t(L#$tVI=)*TAUHiO`snay3_jIhUZ(yzyduA32EVs|W;ULG_e_x?X?C_%*VS;X?T8c3%`QbXkMecW_4bm;b}`Uo!E-h2{wVp~H~4Do44# zg)>94w7u00zh<%NyJaL(eAZDA5a|F66Ic*)6a-tCGegj5q{suZ0>60?Xf7c6Nx_mq zJ|ey97IOYXzCj{r>Gyw>aLeYuMA#5#YmsY65iCFtDB;okz)2Nx5$yU{F$md>%mk62 zKObNThO}u#pa@!G)+fOsi5!7E*uLMVVRHOkWko)6c-1Y0a#*YkaQ@8N)o=z+Du^TH z9>Rx;{z8b1znBpy17aj$m-eYtrlb8XIMKiBO>!edM?e??^MMS}avhN z@N0SgAcP0}0w*V1%0h9+c#(gnP)&d2k2iAh)^amE^WH@7gHN2q!0Q{m<4>n7Z2*K} zHQNFigrzpQ8W4XSV=+jH9SH>f!>y7H9hj~)Ti-&>w(|({c-iBg716-?&`Z#<{p21K)N#fWPcB- z^VR8W-s@Usrd4m=#Mfiq;co}pE)!LNH(?%jXsqNH(CJgG;uomFv-Z1K;ev{eH)408 z393mvQrp3i<{%GEmHe8__nEtQeOXzFsS11HrS@gz=}Z>D5tYM^?fBc?hDSN#9Poh_ zE#`Wc+u6akKsSmUW4EKzu|QYYo(zbDaWU&|R{zhdy2@CM93Br2{$RbUetf>RLm8*m zmiK@Rr5!JlY*9Blu9wv2#ZzF^HzM`E@BG6X%B{D!YkH6$Hh zXTEg>dC5&Dm-fFdt%@>ne+i zRB>vL+R9i(Mb6+Ap!wHQHx&#A(|X>+_|@Z;$EgBIU3FF z24y+MS})~Hd`;*KkZ7}nQJCvtRl*YF_e0(JUR)Dq4X3+sBcfnDWfduUZ` zTOHJNWa(uuU!m}7ojQ0u7)W|+<8s}OEkUQHH{+@`kR1S(Xs+86DIY}!L_(AT90_}} z3l-DeUp0=uU9Q4)D_me$H_lf+0LTtd)`8Y`5U2tVt|}Yx1c)3o)j~7#30dON3nScf zbw-i$VgIKye3{=KoK~!a+71&@%IWH~ci7|m5PC#)ucP0>_<$HO+*+E^x#^lI&xwJve@!)D6SyCjwY(KNBg{v!ZvdRYtqt-hZ}=h5*?%P; zAcArchFS3Ix(=xVU#^T*MMo}q@_pd+qoGREwO-?ZhxGK{&%Yr` z(KjE~{D;gpD-S#jB~J!tpB=@0vl!%2@7{Ecv1lk4C5JXq13qmBe#ad*q40%C!d#f0 zohL;M^~)uiM8UMAD;oim~Iqy-B4fSEGX4?lYP0i_7? zX!qLe&R!-1ki>}?^1Xesm(ZcR{aN<)k!^7wva+myt?XyYe_Po*!Q&GmiXq$4;*Ls8 zos6>4-{A-B46*^K@TdCpF6=F*RojBc%Nvq(S)A$)*toMkL>#8HEhm+Yup`3VSV{|T zMf}FO9Gdn_-76?savJWx9kdHxqL1%cw}V`ojEDcrE>8{~pTgCY4Q_S0h;xyK59w65 zC)HWnyQtb{uIxvak222b*Up`~ryrbNzD%~WgOHg`78I<2_dj4OPEe46vGYfvig+@1 zVLIx&X(GYtEbAGE3zY^#j$zjDI=7_+lVwYrpQmOZv?%c^7E;=UzCng$YjY8Hh+t|$ z2dBv6_qS!Lx^eUpnc=8`OUf(Xz>zLmrWc$(xV6PTAT4;K^LZe!rqbKG;0Y|TgP%nW8Vq*M1SA;nNkI^mofL;viA8s41!j_-%X>&Yf7dg_J+E?W z4E&d)!WFXK<#7T6I^$-N8{@M`-mPz_E3Q4tPQ4?blS=MzQ$tEUP&3?D2d2_qIK+j# ziT_3od1Fg;jMqpY-~ABg$&UKqmdzVO{#tX6^ZiNm`tk!Xk!7=UyMvNMUyO2#j~{wk|X6G zUJ;bZ6(a~4A~5e3AQx>)K#y32Vgy|0@I=8A`sxvON?eL!OfZNrT)p+|MyPuQrz#W$ zFD#%cR@2HU>KZI52Tu7JtaUNp|T1cLefWwnU^sd zh-Zgd%p!05<5(9n=G;Ss0((L07`Q%2sW0Ag^d|hp>ePDV8cD&d4ZHP=Ceh8kfdgh3 zA}|K0(nE)M@e(gHumK_Do>lq9me{sHq%fQ$ZdX1K$&5J|x?$Fh%?vCtzJ|syt0=d2 zrL*`K{P-VIUob|e-xc-{h2#<*^X+O;tWw4aL7+SjYRtz3T5Um+d_?hp9M{<6qJB_5 zogjur7q+h8Unki{&4)Wh-!0piF)O6%3VZ$xF^hlY;t+y9R1CYN*O@FfA2}iZJP@!p zA60uj^^jBOK|n){6=%wY8XZICpHqJ_02Sg9ww!2g9@v;S&A&AW za-IF2=M-X-KD)<36)VTI7pIf(Nxw}C``!)}5*iy@t8D*_u^`DTnC4)k>F zrqN!!;N^G9Na%nf_=RVN2)TWNsDJ*MpW1?+@ev*WVAk8Z#o%e5ektQ18w(NQ4=qtB zRkN1NQ1=}fiE+B1zl#(47G-DY0~#?OlQD-2qnI&Lf1S_xc)cmoiEIjwK>{x4$m-nR zvw`&&3=v|x>)+0*3TUQZkZ7&rpN}^oS&iKV<&tRN+U=_h3@ts~S#`!KkFOaE>-2&I zQR#1~RwTTYHLl;F?#rp~;4ITx;^!eC$;^jlH*#xGv>xy*_3@DOiXu#lqG6AZ}@`@pR4l=8R3lt?%!_Gv(5>0eLHwT|2SuW zhBxJ$#y2iZR+pANfX>(Q`p(_yc2&$u;N~p$pD4O9KkwYFK@h+ov+QFGn z#`8LC^1|YLYzu6aQ;en}WUiK;Uegr`(c6mD|bSH$YC ze>u&UVsiq+m0|;huaV&os$pH~j2+C1MX={-QTcxe3X@J9#B#qREiqR8;wkz1R-N&B zH%yV$fIJ`?x8L`S;XI~uF`LOt=j}j96FCqfYYZfj%a}gaQ5kXh61}Y$p%nQ881AzB zP!8X`{c)2gMB{el9zs|nm(bdfF|QwQe!Tkqn7AgETM-2HeUxmf74JY1SEJ*sRJ_MF zOc`m({EPsg;fw$pals83z%o=dVk<4eP7gidH5PhIT53~{6ji>jGSEbP ziWT-2Mg{>FkrGVRn0cNATEKy~ypJA436Aq@iIXMWJSe-*`pm78U{?ROOyuN+(~ZNE zKo7e4OO{4Dau3)NW7k>79S|a+`(}cPFt$j#2}uS-5}v#8hlwG01rQRy-6p7_Y>C5; zz(O=y11B+mAix+M4z-$aj7_nF=6m@%hfmwDD z`oFM_|BygSPk|I6b98O!T`9SpuB-a)Kl|tCUt#IS;Gke6XXYV|FyyAF@TdbpZR(^D z6Rp}n$r79bj`_0NO+Xq|ObMZ=MabO4^sBRp*Pq4vg_RYQ#k802 zfiL4f56R{D!$T9Fd5!eDb?gf8nEe|4<$J`|Oa>6*oJUo4=O&vb?bJ8Ps;5vMeO%H* zx)PNYQ-`T^egwyz)oh^=;2BT49(}yj`r1X9{r5JdU3+ILNgZ=zo!ef+usIs1F zKAANivCyglB7#tfsk9RC853!STHa8o5oN(D0OABtcEK9aJvi`5Gn?$3$#Bb(>L|6l zXP;!B*VTSzc0u=9s9_eu{0Uh)U;|&tB3Zt{D|R}*aekDaWV>SHRd7-d4R7Or3N_8V z1FA^5=EL+e9@+vaJCFtxq$_!D=?}B(K8nWRGSO1{OAxy{BK2Z`w{xCKtWMHBex4guTKX*;0;72JIs=GwE(3Q))ar;xo4 zt|HqJy6c=H!!2v7V;*e~c+(U1rwC>jN1<4Qo=tkea|m0oCz^@Jyt_aZ_F`SgOomgE z17%>yP~yP>Es#piO06?$8nP)!DF>L67EM;fr+*wIXR?l=u?$+E{+Okr#5*7x7U_NQ zL);lH?HwsdEeD)q@zty&)cBzZtwzV54g!D&p_#m@TpSXGfjOWR-%pRXmzDL;W?hFV zr|aOFva<7=ya2gqItt!9+LmI!&S-M5M^Sl2^WI4+$ysuvv82vxz?ZnadK^#VygYvd zIH|dHwL^Sz)Mt70rE5GoN|Yu;bAT*-$)x?-DcLiFSHSZ3RV+5O-}496NexOlV9JrM z6qmM@>c~-IkDDKPaEbI>{{Z%s%wu^K9Ok84u!48ya0_Qx6`FJFIA;UG%};ZUsW z(F5nDeHh;X2n8c9!>8DEt((WHINhVTs}=I*wOlVcitWq&RA4aS0x#s-dHa=(zzLRD z(q#oIeM;Vh;1lx6k?Q_;M=cNAMM0#tR5+q?VBF{Aj@{-vc8F0Q-`U=u|6tuICGY?7 z$m&Ip{MPnJaML(W03l6m=P~96?-|~OE-(&vhY?pj4ZSETF$c<;87#IP9r0AckTVpZPV?O#)_$xGLKKmVjD~Rl000bjXi)Qn0j(s1YX}W4LAbGol|pSCp778lq7a3}hlwAz?0t8q(_S2gW?E0MXIO(k6@!{J z5ca8JU7`96P6%ld7k}zr-TP4p50b;M*!sM@afkIf z)tr^`P@phX4rL18{yJaCK_jLd0*lbz5*%WM9MWcD;gU5v1H}-3gJS@sOPyvQH2@=1 zS=Bt28B-b19;os!j|Es2U7{%AQzfc{w@P$Hs(kRAm1yNiZ-wZJG5v2m1^3jDv+n0L%@cFRD`9fJzrD1 zaG7)(xrZPVoJ12e4HH@S;ym=!(8)p)SI~KE!RG_;VW;xnXwk+g#N~S~ivSj*LCDYh zD)L8uAk#RBlxqBTE|Jm=p{sUCZY<9P@h~Hc5dlCdfU5iaG8e>v8>YvO@Ai%^$Vpus zJCw~Gn%j@WoqgvRR39PshTY5S4a{Z#7=O6Pm)_PRts95N^Kn`Ym{Mj;NGS6;^pkk# zZ@b79-bL3oguD#+!XX1B7ic=cW7S_?!T+Cb`Spj{2r>}Y!p3|DO}C1df+p8Hm@~h_ zqUuZXSqG3HUBfhqycSp!Qg_bED%FqgCN4G|ponM$7I2?1Mi|%q>RWCan7^ox#-0hL z@Gb;tagLv?IKxY!mOx7i!ik87ImgDrlE{k!ftbh&8K6#N)qNx&6!2Gl^d0-5(L}GQ z*`h#fHzkTM6Tq8<)EOi~I{oa4alojmfnnCQMF9iQDwZU>K&%); z=Tg`d_cd5;RZwwvZr1M0r2IuuHNvZKfrSfaqjZX|R-*zN{2uqO{2dVo>*<+lK`*Qw zsYp~keYPwLT#KZ~{Tpq{7s5;wch~@;d^Bs^$RaCq`Y1iiI&kH5Hi2RLg&ReZ%j0l zXCx0Ed z4IguSokW`pf#?NvgTnC2FN_u_(1_3;zJ&C>phNxYe9ufxBd*930B+FlLmvqVA$Gk- zjb=Mi%4q@xvGXl6hb+1A2Z8<2u4j9@W$2U<-_3Zh0;CrQOy2>5w?SruPZ4lO^pj(~Vxq5h${Wlm&0^f>Tv`LpJlb4D`$Ff)b5pZ=OH!tW6pRF!#|$64Hw- zwqj@j=#VsC)y74yd!_NSmDG=A?eI-nzevW1p#>!xMxUGVmI3>=tC>N{PJRC315vA8 z09zpQ9x11>iD(`qKz>BNZA21iKuz0PkF$P`cjq_6EHasr-DC~OgG?Sv6Ix*)+ntn% zbdpF9UNk)yGkG?!We0r2yntjI^YDTo#tD0W%$&H=i?(#<6Cjzm%A`&>O9S|@bLbOd zw8Oe_Uvjx$k0wYMiA3g4pr- zY%3Uqex`04X<&T^S1mFK%gFU5NM^){Tm*ycKCJ4&sX4byeo1dyWDsL;0x8uv6+ev_ zRQS;jtL9T1^(EbRk&ML91o(V5lEfeVcrifn4^<1`S|J1a!0uZsYvk$Rn zRi$PusqE9byavaP-wT$}GHAw2oa7aluj@19)b)j{0NHL*Xytq_iTTc%D4hc7B9W#< zk*#Q0s6U9ZfrNmp-?Os_N-h?#&`JXBFoAS~1U3cIAQLDQcMC8SuR18IYaHiP=zK|(cTnaezL5$OZk`IIlJn6#0F+At#sKw`NT<-v1|~D5q8<^sX#1wUT!CI3KyfN@%_# zrsKCUg_WTi#YZZDtRj6b4lUL|OE@@{F&d7O%=cpJ$4?S&Tf7P%dBoGO%0md6dL5b- zN$!Pak!5q;ly_3hp7n;1WD#RhxS4L%avC^Zi`8LaE07gJF%<)@8p`y#s(z$l6GH0bzIHSmqvq+N&OjYFfA45wZlNWtE z0`P_*OID`W%;;BCu~{1^RzONNnsksJ5u~X`U`8O+326HX)Coz-bn8wF2|h$|eIF`kyWb-ya|vkDY5vB8c{z3vJH2kWCLWOqML*^ywn5I1a$la zqyc29wichzTEF@ckd4fOk`0$RfE7APJ^BbCV)wqDQ3*w8huK_6a&Z`unMDmYKxRUG zC*TcDI!Jp6653F21n3gy(ts{;frqT!w!MrWl@&w=r>7U}K^}aBG>2gM(VXtCq61e# z-2~8wtRT#zbK*8D(4xzxVO>vOEu>;2GZ1MFF&~NnQ3Be0NG}z#G)e!pR~VZyhn8z>rHik(S-KNLtK~Gj%)&w&3ACd2 z6S6C>p}dHUIkaQM_H1!6o29%5KiEV6MS2jA9yDP@TO-LKw(4YU?sg%Z{qYE`)|lyZ z^t-!iFN=9Z6L=C{BLF|3%_87*^#>DbUb05bj6TkC3tVu;v=?E{fNUAz8I(M92ng?e ziWoo%k&FSJQQlZ&>zS!ndnbwmt!^ji(6(J>;67JW2|TRCzlMYNzjky`SI$7GktsH zEqI$7C?!I$v*-U~XII+>o=RZKz=AWQy;cUb@6?94=Ww9dvPKj11>QS&?>ggrJ)zh+v)5mT8CC5Y! ze@HE-f)w%@>D1z;9ssB#53oz8tRFwn=l|;i#Y^a;*zfc6K}MA^>J(ELa&_1j!?Uw( zS?3l4FOvCJN)B7Jj(qs5ayFoj&lKUF^5X@of0$rC6rjs)6Q1fyr?}?WJHvx8$H6PQ z83&PBKu;!)H6%P}4c$GUYTg!Zj^2C>FHH2|Vd9(QGc7-(r5g6)rjX!ib zxv6DS!BxEIwCacN_8iyfd@wHAuS;sQdg*NvOm0;rBNXJ>YGDML`iz1nt|fPRaff9WbWB{B#Cxx_VSYyFgTi+;c%__7{2LYfV(EJA>=x|K)(=nm;a>o_v}N%wFL|fYM;|TT8Mp?S_C)jWdI%vZH`>h#Ef37DjUaqWJXtO; z?Xa_a?W0$_+ ze9tDMr=(y@(6gbq6c{BKM}*GDs0(lBGHM5#{C-d3HHAHt(KQgP<)l+C4;B+QDgXbW zh${wa3CFoXj3FIQbPTCvit{y?NJ+D%@P!WF{}s#|#~s|RUjPVmfss(fzz7;zmB@cM znL#uUj0cuDN$8JRlm=lmmVX zN5YWdDH{Z;S!_=5QOS>PmFnRD%&gw>I8x>v(@_{SY=x66=`6(78{DQ_8&kY8f%{Yz zlh74MzE=@1ZEt^t>8WPRW!G;J=WW^d;>H!mT2)=Od$CJ=&>Z+cWotDw6Y;^E7ya|$ zLR>`F4=3N+yHUBqe$YOn4}AL@!UXwuj?5W2tSB<%_AHbNJz0*oqOfQKE&pcRjlI?` zNv)w<@bDu`np_iJp4GLaqk|63{I;KLROG#Q6MK4SYe<)Y+c$K7_4s5tCQrgcYptF} z+68XE68b?ftQvV&KX)dfOMWrNGDcJkVXNg2qX@t zRU%6@1Vc8@c_%qsY_@-~AwjDf^RW=k7oRr$e0sJgS!B02ob^sJ;!^om)t32KQfbk& z6y+@RN}9e`HKLj?qW})#$pW$QzTig?&Uspi!2|SkGIW&#O79AG6tDVZ!7C%ZEvhY3 z=&>Z6<#pxAJPLledp&F-|-=FF@Feys}$FIt0&kBMM6BS1+H_ zL!;9%>qzvam4a57h)HjO!*PMq0oONqe_2MHm>Sow^c(+ZcD|7HII?$fl;*-GP5(kY_E}=*GLGMLV>p!ptpiT#@Rp)#B9u8JLFqlfFUIisY+;q}}=>J>zF7`a>_be)Iaz)|4 zi5*UCuRW0M#=C-Wj!=2X7v-N)tc1k~zE4B29x-TXqPE~0L=KZK4?T*p_~z_DP!ZsbhgQi) zmA)*zfB(njqHdoRme#zWK#xTiF!&u2LHtKKMkm!ke{NFHB&lfzH#S+51>tw8!7s{c z+Rr7Ifl-OYrTTRsieV1fy!6BP@<^MV52Suv--?^H5lh_nPG!N{v8xd9%J)B~$Pg?9 zoEdh%m=i)J7P)6NTK&oq5sSyFz!<9RB@1WwNe^P9v6=CMoi~WD`D67EoLff-FWks+ zMX`d761*BX0)FFx#RXr;F4mgKQWt?AaQzsfJJ3XfuGV%{Vk{{Pv07D7|7E z9wu2n+h%8lw5Wj@OcxmXE!D7`jV=R(8;m={465d31Kh85mcR}_doEGc!zCP9_pF&@1MR6IFm z2Xmw9n&&xbSBeTl{;~Rt76Y^zj2EM1*27^{Dk?D_>`e4;Cj~{S{U~5Sjc2nBDI1|s zsMot|%n1XnGOcKXS#{OUb^eE=u4}Gh?}*`U#yUCoucAt;b?38)iheV}47yB*gyB{< zRWBGtt}2^??t4pW4$_~~xm1YVguwC=;b&hWl90b!_&MRWY-V4jxZZWowIgyeT0(Swn3_Syq zHj)hc?|i)#t@21ikKz+>``4&ovEJWvYK0YoC>pt0b}^efp#{LLIQwm8h4}mY?Q0)0 zBuWTY+MTfF>}|i=@C^|#K)@amv+$|Jq4198AoKYqdpv^hn#YP#w(f8v4XF{lp(93D zd>;FtS^bUQbc>4*#~y_2k!)#4oUTdi^W!_NeB5D{Z#&%4L|*TX@4RO9zD-Vzu`|sX z_yi;wU22?^w3_I@i(T@Gd?Fv6h|hX|@w6P)4wSi@t~s^;G#lX{x)QigR3H&>e>2^u znD4>3B&*w3tN|klgM-Lvf*a+u2V#^WkQh_vO zA^V8|qEk$fu<=-e%b-3!M5;)ZS8h+7$Q@=*SP<}jdZ}_!w#)627L=s$C&tj~TN#4)xWG0FCh-yTjmQ2t%^Q-zp~y_;pCw5Kil zb(8qp|V{j8j*e9LgA?JphuyVN^Deg>c-!_$mmb=jpf+*-)|Vh>-+dW_p1``4E;Fdd5$` zjr5!dZm>UNsvtOsJ0vHAYg%Qb-DdUTSIKu#|9HeRj*3%aesaJYLm*_@VWj=u%C;*~ zt>qu@jlD22M3(|m6z{%M1lM#&qm?FS#x2ZMX57LP)8`cYf~$AbH=k$B6bg&t32hPs zXTG&k;2b#uedduP7`T2t+!UZrcIFcp#Qw?BN-K|SbRgPHG5(<;*>Eg5QU@ zWJ)0MrHCaF1&X$+hn-aw}rr?RIi zBKyzNAR~PscTpgFe(wa(9n`l&dnxdYV!0zKZjM$2K}&9=81A3~;ml_vW-k9wED&n< z#63)RVOi3@2^KOQlBf*!FXYe8tt31{CWQ7Fy#Csa?!w8fWKHP5=5VTX4mVh^Aeh5p z;%8p7W{C~$AaD7~2x)I~wI#c&~(agP;^5RA&gL>!|w&z=A}1hXxFDqUC^=T{^w z9$Joj1nHe=GMpDc*Z;}37%YTZvVYM|{8%Y z>c_Lqh0+C-f_y53#Kej{WB7~mll6{xfp={NS+?MMeTrEJ-sJCpMHGDzY-+;{{kz!I z_#(JL@y^1gqFO=JyOF252e?UoRU>YlJqIxCxV^*!%2WwvoW;ORp03-IASn1!jm46! zB!Vi#?RivAfRc|vLR^?^e-ThZT5c4c^o=v)J*>KUc}g-7RFFcegl!JmM;Iw8dY{g&n}EmAy~{^r9c%7YpaZu^Nuj4fS}T$ z8a$OZiGd}0@KBIq);dK2i5P2MJ1G0`jROo|Qsvp!3M*&;$;W#b1$=P-8I@~APx)87 z(Rj`-iGXx18Jq7#K5!60&vuUC7l&8a@2G@9O1G)78!Ok4p?yXU(bnPtNvonq+gt+7zjutP&eAbu;4Jq=?z<7TL~O4sgH(LU(F&Eh|v()APd9@zKD=+<4MTDa2+QjH8h^dzBo@I5MK0_sDV+SNv`%$ zc${Q<(Tzm)hiB)H|2Zx92xUM(u7L}Z0^frwFC~6nRKSB9TPh}*=Nsv<(sC~n1jHed z-NZi@$^C$KtmS;3*E%xZ{C>%*+rRIh6rM1rkvjr;pD`#%iw%iV#Xo$*`2!*bgeduW z?;q?nOWT<0l*NJ1!*Uttj8~_3=%n*saEC7S%}K7VTQ{USnJKxM6Ou6Yk|?j-`QHBk zO7q*YIo{QE2Rf_b1`kHf)(mxvc+>s8m8HC1s34{aysD^Wr*7nSf!i`TZj1pauB4fjfH=itd^v#{M_pYY8@tYpZWw|riQ2*kTINge$ z&6&iDU4O54=6H8 zEs;g%SK@e$w+|e5JRXy@|JLBmB-<%njT2LeJy&8mU2A6+9yxm#hizV1%GB-5_0^%a ziMdIC^!#L=KgJc9+y&n3{NcoPfp23r)HEe83)!!8RJ%@0(`-8`7nCjkE%Huo&Ddp* zgHP&PDltyzScY{-K0G_}V9}T|4SD*j1W%5DU%>=Hs)%G^2R{ni{o z91}vvAfw!adGPqprSWlw`Go?!BQ3!X5Gt0i>FH9?5DV5}1Vt9vljbJ!=4TP-L~0?l z2?0~r3L`H5VU(Z{Xl4lQ{VU2)+(RKEF1m&(2qG@DeZyA&bM7;j_7`Y0hWBrWboJ++ z4I+F=-?^I_Wj?8^NgEHbKGyqoOdw*_`132J{DghkrcE8hG6r1LdLD^Hw1{mx@lYU}Q1yEN_v%Y6vAvJ}NvR<`?A~L1%&+Dy;yOgyxjL_+)3% zn|=dBS5U%aLE#Ctq46@86*G8nO+ZrUEd?nv&1W-5aGOQ<^}QHdO$n2yX)A%f-0a_b z2#?-RT4NgL&@+_~CTA&@epPwM?fURPnh46TR|2^kagP!v6%;eXyrO*f8UK41!J<9m z3JxM#JRIEw3))SPczv6iqvNA@21}pBgq*KlsFmrMVuOPSo~A7mHM*cMaryLknY+8~ zIPgl?ZYu&*5`_kTCGtM|iIYJNa&**c9L4&%_b&iUTJ_|qgMa8R zJri`$McU7}9#erbK3`*FbHr#!akFAWI#WA=24Z;+VuM^2-S(kx9=0&%!W zn3Er;MIFs9NtH!Y;f$cE5XMeV)z#Q`$UgFDs*C*!&dr{C;iHT)YFFqF@eH@u0$|d& z5Ws+kBw4{Q7gcNpA15FzWozirt@02ntZfw3%7(c>6zn1~l<-3=3zgLku_Lh;?bD(T zXO~1i`}8_`Q)@1vOZJ{$!<%Pⅆ>4Nah4tvRH!4gh4oq>t&fXJ$u+4`>Ac|8-8sc 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 NSgZ3}%xcr4{|~#GV(